Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
c61e6925
Commit
c61e6925
authored
Aug 01, 2010
by
Pieter Noordhuis
Browse files
Support for Redis to listen on a Unix socket
parent
0c7a9dec
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/anet.c
View file @
c61e6925
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <arpa/inet.h>
...
@@ -177,6 +178,43 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port)
...
@@ -177,6 +178,43 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port)
return
anetTcpGenericConnect
(
err
,
addr
,
port
,
ANET_CONNECT_NONBLOCK
);
return
anetTcpGenericConnect
(
err
,
addr
,
port
,
ANET_CONNECT_NONBLOCK
);
}
}
int
anetUnixGenericConnect
(
char
*
err
,
char
*
path
,
int
flags
)
{
int
s
;
struct
sockaddr_un
sa
;
if
((
s
=
socket
(
AF_LOCAL
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"creating socket: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
}
sa
.
sun_family
=
AF_LOCAL
;
strncpy
(
sa
.
sun_path
,
path
,
sizeof
(
sa
.
sun_path
)
-
1
);
if
(
flags
&
ANET_CONNECT_NONBLOCK
)
{
if
(
anetNonBlock
(
err
,
s
)
!=
ANET_OK
)
return
ANET_ERR
;
}
if
(
connect
(
s
,(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
if
(
errno
==
EINPROGRESS
&&
flags
&
ANET_CONNECT_NONBLOCK
)
return
s
;
anetSetError
(
err
,
"connect: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
return
s
;
}
int
anetUnixConnect
(
char
*
err
,
char
*
path
)
{
return
anetUnixGenericConnect
(
err
,
path
,
ANET_CONNECT_NONE
);
}
int
anetUnixNonBlockConnect
(
char
*
err
,
char
*
path
)
{
return
anetUnixGenericConnect
(
err
,
path
,
ANET_CONNECT_NONBLOCK
);
}
/* Like read(2) but make sure 'count' is read before to return
/* Like read(2) but make sure 'count' is read before to return
* (unless error or EOF condition is encountered) */
* (unless error or EOF condition is encountered) */
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
)
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
)
...
@@ -245,6 +283,31 @@ int anetTcpServer(char *err, int port, char *bindaddr)
...
@@ -245,6 +283,31 @@ int anetTcpServer(char *err, int port, char *bindaddr)
return
s
;
return
s
;
}
}
int
anetUnixServer
(
char
*
err
,
char
*
path
)
{
int
s
;
struct
sockaddr_un
sa
;
if
((
s
=
socket
(
AF_LOCAL
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"socket: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
}
memset
(
&
sa
,
0
,
sizeof
(
sa
));
sa
.
sun_family
=
AF_LOCAL
;
strncpy
(
sa
.
sun_path
,
path
,
sizeof
(
sa
.
sun_path
)
-
1
);
if
(
bind
(
s
,(
struct
sockaddr
*
)
&
sa
,
SUN_LEN
(
&
sa
))
==
-
1
)
{
anetSetError
(
err
,
"bind: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
if
(
listen
(
s
,
511
)
==
-
1
)
{
/* the magic 511 constant is from nginx */
anetSetError
(
err
,
"listen: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
}
return
s
;
}
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
)
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
)
{
{
int
fd
;
int
fd
;
...
...
src/anet.h
View file @
c61e6925
...
@@ -37,9 +37,12 @@
...
@@ -37,9 +37,12 @@
int
anetTcpConnect
(
char
*
err
,
char
*
addr
,
int
port
);
int
anetTcpConnect
(
char
*
err
,
char
*
addr
,
int
port
);
int
anetTcpNonBlockConnect
(
char
*
err
,
char
*
addr
,
int
port
);
int
anetTcpNonBlockConnect
(
char
*
err
,
char
*
addr
,
int
port
);
int
anetUnixConnect
(
char
*
err
,
char
*
path
);
int
anetUnixNonBlockConnect
(
char
*
err
,
char
*
path
);
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
);
int
anetRead
(
int
fd
,
char
*
buf
,
int
count
);
int
anetResolve
(
char
*
err
,
char
*
host
,
char
*
ipbuf
);
int
anetResolve
(
char
*
err
,
char
*
host
,
char
*
ipbuf
);
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
);
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
);
int
anetUnixServer
(
char
*
err
,
char
*
path
);
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
);
int
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
);
int
anetWrite
(
int
fd
,
char
*
buf
,
int
count
);
int
anetWrite
(
int
fd
,
char
*
buf
,
int
count
);
int
anetNonBlock
(
char
*
err
,
int
fd
);
int
anetNonBlock
(
char
*
err
,
int
fd
);
...
...
src/redis-benchmark.c
View file @
c61e6925
...
@@ -71,6 +71,7 @@ static struct config {
...
@@ -71,6 +71,7 @@ static struct config {
aeEventLoop
*
el
;
aeEventLoop
*
el
;
char
*
hostip
;
char
*
hostip
;
int
hostport
;
int
hostport
;
char
*
hostsocket
;
int
keepalive
;
int
keepalive
;
long
long
start
;
long
long
start
;
long
long
totlatency
;
long
long
totlatency
;
...
@@ -340,7 +341,11 @@ static client createClient(void) {
...
@@ -340,7 +341,11 @@ static client createClient(void) {
client
c
=
zmalloc
(
sizeof
(
struct
_client
));
client
c
=
zmalloc
(
sizeof
(
struct
_client
));
char
err
[
ANET_ERR_LEN
];
char
err
[
ANET_ERR_LEN
];
c
->
fd
=
anetTcpNonBlockConnect
(
err
,
config
.
hostip
,
config
.
hostport
);
if
(
config
.
hostsocket
==
NULL
)
c
->
fd
=
anetTcpNonBlockConnect
(
err
,
config
.
hostip
,
config
.
hostport
);
else
c
->
fd
=
anetUnixNonBlockConnect
(
err
,
config
.
hostsocket
);
if
(
c
->
fd
==
ANET_ERR
)
{
if
(
c
->
fd
==
ANET_ERR
)
{
zfree
(
c
);
zfree
(
c
);
fprintf
(
stderr
,
"Connect: %s
\n
"
,
err
);
fprintf
(
stderr
,
"Connect: %s
\n
"
,
err
);
...
@@ -436,6 +441,9 @@ void parseOptions(int argc, char **argv) {
...
@@ -436,6 +441,9 @@ void parseOptions(int argc, char **argv) {
}
else
if
(
!
strcmp
(
argv
[
i
],
"-p"
)
&&
!
lastarg
)
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-p"
)
&&
!
lastarg
)
{
config
.
hostport
=
atoi
(
argv
[
i
+
1
]);
config
.
hostport
=
atoi
(
argv
[
i
+
1
]);
i
++
;
i
++
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-s"
)
&&
!
lastarg
)
{
config
.
hostsocket
=
argv
[
i
+
1
];
i
++
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-d"
)
&&
!
lastarg
)
{
config
.
datasize
=
atoi
(
argv
[
i
+
1
]);
config
.
datasize
=
atoi
(
argv
[
i
+
1
]);
i
++
;
i
++
;
...
@@ -459,7 +467,8 @@ void parseOptions(int argc, char **argv) {
...
@@ -459,7 +467,8 @@ void parseOptions(int argc, char **argv) {
printf
(
"Wrong option '%s' or option argument missing
\n\n
"
,
argv
[
i
]);
printf
(
"Wrong option '%s' or option argument missing
\n\n
"
,
argv
[
i
]);
printf
(
"Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]
\n\n
"
);
printf
(
"Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]
\n\n
"
);
printf
(
" -h <hostname> Server hostname (default 127.0.0.1)
\n
"
);
printf
(
" -h <hostname> Server hostname (default 127.0.0.1)
\n
"
);
printf
(
" -p <hostname> Server port (default 6379)
\n
"
);
printf
(
" -p <port> Server port (default 6379)
\n
"
);
printf
(
" -s <socket> Server socket (overrides host and port)
\n
"
);
printf
(
" -c <clients> Number of parallel connections (default 50)
\n
"
);
printf
(
" -c <clients> Number of parallel connections (default 50)
\n
"
);
printf
(
" -n <requests> Total number of requests (default 10000)
\n
"
);
printf
(
" -n <requests> Total number of requests (default 10000)
\n
"
);
printf
(
" -d <size> Data size of SET/GET value in bytes (default 2)
\n
"
);
printf
(
" -d <size> Data size of SET/GET value in bytes (default 2)
\n
"
);
...
@@ -505,6 +514,7 @@ int main(int argc, char **argv) {
...
@@ -505,6 +514,7 @@ int main(int argc, char **argv) {
config
.
hostip
=
"127.0.0.1"
;
config
.
hostip
=
"127.0.0.1"
;
config
.
hostport
=
6379
;
config
.
hostport
=
6379
;
config
.
hostsocket
=
NULL
;
parseOptions
(
argc
,
argv
);
parseOptions
(
argc
,
argv
);
...
...
src/redis.c
View file @
c61e6925
...
@@ -773,9 +773,16 @@ void initServer() {
...
@@ -773,9 +773,16 @@ void initServer() {
createSharedObjects
();
createSharedObjects
();
server
.
el
=
aeCreateEventLoop
();
server
.
el
=
aeCreateEventLoop
();
server
.
db
=
zmalloc
(
sizeof
(
redisDb
)
*
server
.
dbnum
);
server
.
db
=
zmalloc
(
sizeof
(
redisDb
)
*
server
.
dbnum
);
server
.
fd
=
anetTcpServer
(
server
.
neterr
,
server
.
port
,
server
.
bindaddr
);
if
(
server
.
bindaddr
==
NULL
||
inet_aton
(
server
.
bindaddr
,
NULL
))
{
/* Either no address given, or it can be correctly parsed. */
server
.
fd
=
anetTcpServer
(
server
.
neterr
,
server
.
port
,
server
.
bindaddr
);
}
else
{
/* Bind to a socket */
unlink
(
server
.
bindaddr
);
/* don't care if this fails */
server
.
fd
=
anetUnixServer
(
server
.
neterr
,
server
.
bindaddr
);
}
if
(
server
.
fd
==
-
1
)
{
if
(
server
.
fd
==
-
1
)
{
redisLog
(
REDIS_WARNING
,
"Opening
TCP por
t: %s"
,
server
.
neterr
);
redisLog
(
REDIS_WARNING
,
"Opening
port/socke
t: %s"
,
server
.
neterr
);
exit
(
1
);
exit
(
1
);
}
}
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment