Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
0a546fc0
Commit
0a546fc0
authored
Nov 02, 2010
by
antirez
Browse files
Merge remote branch 'pietern/unixsocket'
parents
539fb438
b04ce2a3
Changes
11
Hide whitespace changes
Inline
Side-by-side
redis.conf
View file @
0a546fc0
...
@@ -20,7 +20,7 @@ daemonize no
...
@@ -20,7 +20,7 @@ daemonize no
# default. You can specify a custom pid file location here.
# default. You can specify a custom pid file location here.
pidfile
/
var
/
run
/
redis
.
pid
pidfile
/
var
/
run
/
redis
.
pid
# Accept connections on the specified port, default is 6379
# Accept connections on the specified port, default is 6379
.
port
6379
port
6379
# If you want you can bind a single interface, if the bind option is not
# If you want you can bind a single interface, if the bind option is not
...
@@ -28,6 +28,12 @@ port 6379
...
@@ -28,6 +28,12 @@ port 6379
#
#
# bind 127.0.0.1
# bind 127.0.0.1
# Specify the path for the unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
# unixsocket /tmp/redis.sock
# Close the connection after a client is idle for N seconds (0 to disable)
# Close the connection after a client is idle for N seconds (0 to disable)
timeout
300
timeout
300
...
...
src/anet.c
View file @
0a546fc0
...
@@ -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>
...
@@ -123,20 +124,31 @@ int anetResolve(char *err, char *host, char *ipbuf)
...
@@ -123,20 +124,31 @@ int anetResolve(char *err, char *host, char *ipbuf)
return
ANET_OK
;
return
ANET_OK
;
}
}
static
int
anetCreateSocket
(
char
*
err
,
int
domain
)
{
int
s
,
on
=
1
;
if
((
s
=
socket
(
domain
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"creating socket: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
}
/* Make sure connection-intensive things like the redis benckmark
* will be able to close/open sockets a zillion of times */
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
anetSetError
(
err
,
"setsockopt SO_REUSEADDR: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
}
return
s
;
}
#define ANET_CONNECT_NONE 0
#define ANET_CONNECT_NONE 0
#define ANET_CONNECT_NONBLOCK 1
#define ANET_CONNECT_NONBLOCK 1
static
int
anetTcpGenericConnect
(
char
*
err
,
char
*
addr
,
int
port
,
int
flags
)
static
int
anetTcpGenericConnect
(
char
*
err
,
char
*
addr
,
int
port
,
int
flags
)
{
{
int
s
,
on
=
1
;
int
s
;
struct
sockaddr_in
sa
;
struct
sockaddr_in
sa
;
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
if
((
s
=
anetCreateSocket
(
err
,
AF_INET
))
==
ANET_ERR
)
anetSetError
(
err
,
"creating socket: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
return
ANET_ERR
;
}
/* Make sure connection-intensive things like the redis benckmark
* will be able to close/open sockets a zillion of times */
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
));
sa
.
sin_family
=
AF_INET
;
sa
.
sin_family
=
AF_INET
;
sa
.
sin_port
=
htons
(
port
);
sa
.
sin_port
=
htons
(
port
);
...
@@ -177,6 +189,42 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port)
...
@@ -177,6 +189,42 @@ 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
=
anetCreateSocket
(
err
,
AF_LOCAL
))
==
ANET_ERR
)
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
)
...
@@ -207,53 +255,62 @@ int anetWrite(int fd, char *buf, int count)
...
@@ -207,53 +255,62 @@ int anetWrite(int fd, char *buf, int count)
return
totlen
;
return
totlen
;
}
}
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
)
static
int
anetListen
(
char
*
err
,
int
s
,
struct
sockaddr
*
sa
,
socklen_t
len
)
{
{
if
(
bind
(
s
,
sa
,
len
)
==
-
1
)
{
int
s
,
on
=
1
;
anetSetError
(
err
,
"bind: %s
\n
"
,
strerror
(
errno
));
struct
sockaddr_in
sa
;
close
(
s
);
if
((
s
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
-
1
)
{
anetSetError
(
err
,
"socket: %s
\n
"
,
strerror
(
errno
));
return
ANET_ERR
;
return
ANET_ERR
;
}
}
if
(
setsockopt
(
s
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
on
,
sizeof
(
on
))
==
-
1
)
{
if
(
listen
(
s
,
511
)
==
-
1
)
{
/* the magic 511 constant is from nginx */
anetSetError
(
err
,
"
setsockopt SO_REUSEADDR
: %s
\n
"
,
strerror
(
errno
));
anetSetError
(
err
,
"
listen
: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
close
(
s
);
return
ANET_ERR
;
return
ANET_ERR
;
}
}
return
ANET_OK
;
}
int
anetTcpServer
(
char
*
err
,
int
port
,
char
*
bindaddr
)
{
int
s
;
struct
sockaddr_in
sa
;
if
((
s
=
anetCreateSocket
(
err
,
AF_INET
))
==
ANET_ERR
)
return
ANET_ERR
;
memset
(
&
sa
,
0
,
sizeof
(
sa
));
memset
(
&
sa
,
0
,
sizeof
(
sa
));
sa
.
sin_family
=
AF_INET
;
sa
.
sin_family
=
AF_INET
;
sa
.
sin_port
=
htons
(
port
);
sa
.
sin_port
=
htons
(
port
);
sa
.
sin_addr
.
s_addr
=
htonl
(
INADDR_ANY
);
sa
.
sin_addr
.
s_addr
=
htonl
(
INADDR_ANY
);
if
(
bindaddr
)
{
if
(
bindaddr
&&
inet_aton
(
bindaddr
,
&
sa
.
sin_addr
)
==
0
)
{
if
(
inet_aton
(
bindaddr
,
&
sa
.
sin_addr
)
==
0
)
{
anetSetError
(
err
,
"Invalid bind address
\n
"
);
anetSetError
(
err
,
"Invalid bind address
\n
"
);
close
(
s
);
return
ANET_ERR
;
}
}
if
(
bind
(
s
,
(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
-
1
)
{
anetSetError
(
err
,
"bind: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
close
(
s
);
return
ANET_ERR
;
return
ANET_ERR
;
}
}
if
(
listen
(
s
,
511
)
==
-
1
)
{
/* the magic 511 constant is from nginx */
if
(
anetListen
(
err
,
s
,(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
ANET_ERR
)
anetSetError
(
err
,
"listen: %s
\n
"
,
strerror
(
errno
));
close
(
s
);
return
ANET_ERR
;
return
ANET_ERR
;
}
return
s
;
return
s
;
}
}
int
anet
Accept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
)
int
anet
UnixServer
(
char
*
err
,
char
*
path
)
{
{
int
fd
;
int
s
;
struct
sockaddr_in
sa
;
struct
sockaddr_un
sa
;
unsigned
int
saLen
;
if
((
s
=
anetCreateSocket
(
err
,
AF_LOCAL
))
==
ANET_ERR
)
return
ANET_ERR
;
memset
(
&
sa
,
0
,
sizeof
(
sa
));
sa
.
sun_family
=
AF_LOCAL
;
strncpy
(
sa
.
sun_path
,
path
,
sizeof
(
sa
.
sun_path
)
-
1
);
if
(
anetListen
(
err
,
s
,(
struct
sockaddr
*
)
&
sa
,
sizeof
(
sa
))
==
ANET_ERR
)
return
ANET_ERR
;
return
s
;
}
static
int
anetGenericAccept
(
char
*
err
,
int
s
,
struct
sockaddr
*
sa
,
socklen_t
*
len
)
{
int
fd
;
while
(
1
)
{
while
(
1
)
{
saLen
=
sizeof
(
sa
);
fd
=
accept
(
s
,
sa
,
len
);
fd
=
accept
(
serversock
,
(
struct
sockaddr
*
)
&
sa
,
&
saLen
);
if
(
fd
==
-
1
)
{
if
(
fd
==
-
1
)
{
if
(
errno
==
EINTR
)
if
(
errno
==
EINTR
)
continue
;
continue
;
...
@@ -264,7 +321,27 @@ int anetAccept(char *err, int serversock, char *ip, int *port)
...
@@ -264,7 +321,27 @@ int anetAccept(char *err, int serversock, char *ip, int *port)
}
}
break
;
break
;
}
}
return
fd
;
}
int
anetTcpAccept
(
char
*
err
,
int
s
,
char
*
ip
,
int
*
port
)
{
int
fd
;
struct
sockaddr_in
sa
;
socklen_t
salen
=
sizeof
(
sa
);
if
((
fd
=
anetGenericAccept
(
err
,
s
,(
struct
sockaddr
*
)
&
sa
,
&
salen
))
==
ANET_ERR
)
return
ANET_ERR
;
if
(
ip
)
strcpy
(
ip
,
inet_ntoa
(
sa
.
sin_addr
));
if
(
ip
)
strcpy
(
ip
,
inet_ntoa
(
sa
.
sin_addr
));
if
(
port
)
*
port
=
ntohs
(
sa
.
sin_port
);
if
(
port
)
*
port
=
ntohs
(
sa
.
sin_port
);
return
fd
;
return
fd
;
}
}
int
anetUnixAccept
(
char
*
err
,
int
s
)
{
int
fd
;
struct
sockaddr_un
sa
;
socklen_t
salen
=
sizeof
(
sa
);
if
((
fd
=
anetGenericAccept
(
err
,
s
,(
struct
sockaddr
*
)
&
sa
,
&
salen
))
==
ANET_ERR
)
return
ANET_ERR
;
return
fd
;
}
src/anet.h
View file @
0a546fc0
...
@@ -37,10 +37,14 @@
...
@@ -37,10 +37,14 @@
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
anetAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
);
int
anetUnixServer
(
char
*
err
,
char
*
path
);
int
anetTcpAccept
(
char
*
err
,
int
serversock
,
char
*
ip
,
int
*
port
);
int
anetUnixAccept
(
char
*
err
,
int
serversock
);
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
);
int
anetTcpNoDelay
(
char
*
err
,
int
fd
);
int
anetTcpNoDelay
(
char
*
err
,
int
fd
);
...
...
src/aof.c
View file @
0a546fc0
...
@@ -549,7 +549,8 @@ int rewriteAppendOnlyFileBackground(void) {
...
@@ -549,7 +549,8 @@ int rewriteAppendOnlyFileBackground(void) {
char
tmpfile
[
256
];
char
tmpfile
[
256
];
if
(
server
.
vm_enabled
)
vmReopenSwapFile
();
if
(
server
.
vm_enabled
)
vmReopenSwapFile
();
close
(
server
.
fd
);
if
(
server
.
ipfd
>
0
)
close
(
server
.
ipfd
);
if
(
server
.
sofd
>
0
)
close
(
server
.
sofd
);
snprintf
(
tmpfile
,
256
,
"temp-rewriteaof-bg-%d.aof"
,
(
int
)
getpid
());
snprintf
(
tmpfile
,
256
,
"temp-rewriteaof-bg-%d.aof"
,
(
int
)
getpid
());
if
(
rewriteAppendOnlyFile
(
tmpfile
)
==
REDIS_OK
)
{
if
(
rewriteAppendOnlyFile
(
tmpfile
)
==
REDIS_OK
)
{
_exit
(
0
);
_exit
(
0
);
...
...
src/config.c
View file @
0a546fc0
...
@@ -71,6 +71,8 @@ void loadServerConfig(char *filename) {
...
@@ -71,6 +71,8 @@ void loadServerConfig(char *filename) {
}
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"bind"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"bind"
)
&&
argc
==
2
)
{
server
.
bindaddr
=
zstrdup
(
argv
[
1
]);
server
.
bindaddr
=
zstrdup
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"unixsocket"
)
&&
argc
==
2
)
{
server
.
unixsocket
=
zstrdup
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"save"
)
&&
argc
==
3
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"save"
)
&&
argc
==
3
)
{
int
seconds
=
atoi
(
argv
[
1
]);
int
seconds
=
atoi
(
argv
[
1
]);
int
changes
=
atoi
(
argv
[
2
]);
int
changes
=
atoi
(
argv
[
2
]);
...
...
src/networking.c
View file @
0a546fc0
...
@@ -339,23 +339,11 @@ void addReplyBulkCString(redisClient *c, char *s) {
...
@@ -339,23 +339,11 @@ void addReplyBulkCString(redisClient *c, char *s) {
}
}
}
}
void
acceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
static
void
acceptCommonHandler
(
int
fd
)
{
int
cport
,
cfd
;
char
cip
[
128
];
redisClient
*
c
;
redisClient
*
c
;
REDIS_NOTUSED
(
el
);
if
((
c
=
createClient
(
fd
))
==
NULL
)
{
REDIS_NOTUSED
(
mask
);
REDIS_NOTUSED
(
privdata
);
cfd
=
anetAccept
(
server
.
neterr
,
fd
,
cip
,
&
cport
);
if
(
cfd
==
AE_ERR
)
{
redisLog
(
REDIS_VERBOSE
,
"Accepting client connection: %s"
,
server
.
neterr
);
return
;
}
redisLog
(
REDIS_VERBOSE
,
"Accepted %s:%d"
,
cip
,
cport
);
if
((
c
=
createClient
(
cfd
))
==
NULL
)
{
redisLog
(
REDIS_WARNING
,
"Error allocating resoures for the client"
);
redisLog
(
REDIS_WARNING
,
"Error allocating resoures for the client"
);
close
(
c
fd
);
/* May be already closed, just ingore errors */
close
(
fd
);
/* May be already closed, just ingore errors */
return
;
return
;
}
}
/* If maxclient directive is set and this is one client more... close the
/* If maxclient directive is set and this is one client more... close the
...
@@ -375,6 +363,38 @@ void acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -375,6 +363,38 @@ void acceptHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
server
.
stat_numconnections
++
;
server
.
stat_numconnections
++
;
}
}
void
acceptTcpHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
int
cport
,
cfd
;
char
cip
[
128
];
REDIS_NOTUSED
(
el
);
REDIS_NOTUSED
(
mask
);
REDIS_NOTUSED
(
privdata
);
cfd
=
anetTcpAccept
(
server
.
neterr
,
fd
,
cip
,
&
cport
);
if
(
cfd
==
AE_ERR
)
{
redisLog
(
REDIS_VERBOSE
,
"Accepting client connection: %s"
,
server
.
neterr
);
return
;
}
redisLog
(
REDIS_VERBOSE
,
"Accepted %s:%d"
,
cip
,
cport
);
acceptCommonHandler
(
cfd
);
}
void
acceptUnixHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
int
cfd
;
REDIS_NOTUSED
(
el
);
REDIS_NOTUSED
(
mask
);
REDIS_NOTUSED
(
privdata
);
cfd
=
anetUnixAccept
(
server
.
neterr
,
fd
);
if
(
cfd
==
AE_ERR
)
{
redisLog
(
REDIS_VERBOSE
,
"Accepting client connection: %s"
,
server
.
neterr
);
return
;
}
redisLog
(
REDIS_VERBOSE
,
"Accepted connection to %s"
,
server
.
unixsocket
);
acceptCommonHandler
(
cfd
);
}
static
void
freeClientArgv
(
redisClient
*
c
)
{
static
void
freeClientArgv
(
redisClient
*
c
)
{
int
j
;
int
j
;
for
(
j
=
0
;
j
<
c
->
argc
;
j
++
)
for
(
j
=
0
;
j
<
c
->
argc
;
j
++
)
...
...
src/rdb.c
View file @
0a546fc0
...
@@ -461,7 +461,8 @@ int rdbSaveBackground(char *filename) {
...
@@ -461,7 +461,8 @@ int rdbSaveBackground(char *filename) {
if
((
childpid
=
fork
())
==
0
)
{
if
((
childpid
=
fork
())
==
0
)
{
/* Child */
/* Child */
if
(
server
.
vm_enabled
)
vmReopenSwapFile
();
if
(
server
.
vm_enabled
)
vmReopenSwapFile
();
close
(
server
.
fd
);
if
(
server
.
ipfd
>
0
)
close
(
server
.
ipfd
);
if
(
server
.
sofd
>
0
)
close
(
server
.
sofd
);
if
(
rdbSave
(
filename
)
==
REDIS_OK
)
{
if
(
rdbSave
(
filename
)
==
REDIS_OK
)
{
_exit
(
0
);
_exit
(
0
);
}
else
{
}
else
{
...
...
src/redis-benchmark.c
View file @
0a546fc0
...
@@ -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
;
...
@@ -359,7 +360,11 @@ static client createClient(void) {
...
@@ -359,7 +360,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
);
...
@@ -455,6 +460,9 @@ void parseOptions(int argc, char **argv) {
...
@@ -455,6 +460,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
++
;
...
@@ -478,7 +486,8 @@ void parseOptions(int argc, char **argv) {
...
@@ -478,7 +486,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
"
);
...
@@ -537,6 +546,7 @@ int main(int argc, char **argv) {
...
@@ -537,6 +546,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-cli.c
View file @
0a546fc0
...
@@ -51,6 +51,7 @@
...
@@ -51,6 +51,7 @@
static
struct
config
{
static
struct
config
{
char
*
hostip
;
char
*
hostip
;
int
hostport
;
int
hostport
;
char
*
hostsocket
;
long
repeat
;
long
repeat
;
int
dbnum
;
int
dbnum
;
int
interactive
;
int
interactive
;
...
@@ -119,9 +120,17 @@ static int cliConnect(int force) {
...
@@ -119,9 +120,17 @@ static int cliConnect(int force) {
if
(
fd
==
ANET_ERR
||
force
)
{
if
(
fd
==
ANET_ERR
||
force
)
{
if
(
force
)
close
(
fd
);
if
(
force
)
close
(
fd
);
fd
=
anetTcpConnect
(
err
,
config
.
hostip
,
config
.
hostport
);
if
(
config
.
hostsocket
==
NULL
)
{
fd
=
anetTcpConnect
(
err
,
config
.
hostip
,
config
.
hostport
);
}
else
{
fd
=
anetUnixConnect
(
err
,
config
.
hostsocket
);
}
if
(
fd
==
ANET_ERR
)
{
if
(
fd
==
ANET_ERR
)
{
fprintf
(
stderr
,
"Could not connect to Redis at %s:%d: %s"
,
config
.
hostip
,
config
.
hostport
,
err
);
fprintf
(
stderr
,
"Could not connect to Redis at "
);
if
(
config
.
hostsocket
==
NULL
)
fprintf
(
stderr
,
"%s:%d: %s"
,
config
.
hostip
,
config
.
hostport
,
err
);
else
fprintf
(
stderr
,
"%s: %s"
,
config
.
hostsocket
,
err
);
return
-
1
;
return
-
1
;
}
}
anetTcpNoDelay
(
NULL
,
fd
);
anetTcpNoDelay
(
NULL
,
fd
);
...
@@ -362,6 +371,9 @@ static int parseOptions(int argc, char **argv) {
...
@@ -362,6 +371,9 @@ static int 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
],
"-r"
)
&&
!
lastarg
)
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-r"
)
&&
!
lastarg
)
{
config
.
repeat
=
strtoll
(
argv
[
i
+
1
],
NULL
,
10
);
config
.
repeat
=
strtoll
(
argv
[
i
+
1
],
NULL
,
10
);
i
++
;
i
++
;
...
@@ -410,7 +422,7 @@ static sds readArgFromStdin(void) {
...
@@ -410,7 +422,7 @@ static sds readArgFromStdin(void) {
}
}
static
void
usage
()
{
static
void
usage
()
{
fprintf
(
stderr
,
"usage: redis-cli [-iv] [-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] cmd arg1 arg2 arg3 ... argN
\n
"
);
fprintf
(
stderr
,
"usage: redis-cli [-iv] [-h host] [-p port]
[-s /path/to/socket]
[-a authpw] [-r repeat_times] [-n db_num] cmd arg1 arg2 arg3 ... argN
\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli -x [options] cmd arg1 arg2 ... arg(N-1)
\n\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli -x [options] cmd arg1 arg2 ... arg(N-1)
\n\n
"
);
fprintf
(
stderr
,
"example: cat /etc/passwd | redis-cli -x set my_passwd
\n
"
);
fprintf
(
stderr
,
"example: cat /etc/passwd | redis-cli -x set my_passwd
\n
"
);
fprintf
(
stderr
,
"example: redis-cli get my_passwd
\n
"
);
fprintf
(
stderr
,
"example: redis-cli get my_passwd
\n
"
);
...
@@ -497,6 +509,7 @@ int main(int argc, char **argv) {
...
@@ -497,6 +509,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
;
config
.
repeat
=
1
;
config
.
repeat
=
1
;
config
.
dbnum
=
0
;
config
.
dbnum
=
0
;
config
.
interactive
=
0
;
config
.
interactive
=
0
;
...
...
src/redis.c
View file @
0a546fc0
...
@@ -714,13 +714,16 @@ void createSharedObjects(void) {
...
@@ -714,13 +714,16 @@ void createSharedObjects(void) {
}
}
void
initServerConfig
()
{
void
initServerConfig
()
{
server
.
dbnum
=
REDIS_DEFAULT_DBNUM
;
server
.
port
=
REDIS_SERVERPORT
;
server
.
port
=
REDIS_SERVERPORT
;
server
.
bindaddr
=
NULL
;
server
.
unixsocket
=
NULL
;
server
.
ipfd
=
-
1
;
server
.
sofd
=
-
1
;
server
.
dbnum
=
REDIS_DEFAULT_DBNUM
;
server
.
verbosity
=
REDIS_VERBOSE
;
server
.
verbosity
=
REDIS_VERBOSE
;
server
.
maxidletime
=
REDIS_MAXIDLETIME
;
server
.
maxidletime
=
REDIS_MAXIDLETIME
;
server
.
saveparams
=
NULL
;
server
.
saveparams
=
NULL
;
server
.
logfile
=
NULL
;
/* NULL = log on standard output */
server
.
logfile
=
NULL
;
/* NULL = log on standard output */
server
.
bindaddr
=
NULL
;
server
.
glueoutputbuf
=
1
;
server
.
glueoutputbuf
=
1
;
server
.
daemonize
=
0
;
server
.
daemonize
=
0
;
server
.
appendonly
=
0
;
server
.
appendonly
=
0
;
...
@@ -795,9 +798,21 @@ void initServer() {
...
@@ -795,9 +798,21 @@ 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
);
server
.
ipfd
=
anetTcpServer
(
server
.
neterr
,
server
.
port
,
server
.
bindaddr
);
if
(
server
.
fd
==
-
1
)
{
if
(
server
.
ipfd
==
ANET_ERR
)
{
redisLog
(
REDIS_WARNING
,
"Opening TCP port: %s"
,
server
.
neterr
);
redisLog
(
REDIS_WARNING
,
"Opening port: %s"
,
server
.
neterr
);
exit
(
1
);
}
if
(
server
.
unixsocket
!=
NULL
)
{
unlink
(
server
.
unixsocket
);
/* don't care if this fails */
server
.
sofd
=
anetUnixServer
(
server
.
neterr
,
server
.
unixsocket
);
if
(
server
.
sofd
==
ANET_ERR
)
{
redisLog
(
REDIS_WARNING
,
"Opening socket: %s"
,
server
.
neterr
);
exit
(
1
);
}
}
if
(
server
.
ipfd
<
0
&&
server
.
sofd
<
0
)
{
redisLog
(
REDIS_WARNING
,
"Configured to not listen anywhere, exiting."
);
exit
(
1
);
exit
(
1
);
}
}
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
...
@@ -828,8 +843,10 @@ void initServer() {
...
@@ -828,8 +843,10 @@ void initServer() {
server
.
stat_keyspace_hits
=
0
;
server
.
stat_keyspace_hits
=
0
;
server
.
unixtime
=
time
(
NULL
);
server
.
unixtime
=
time
(
NULL
);
aeCreateTimeEvent
(
server
.
el
,
1
,
serverCron
,
NULL
,
NULL
);
aeCreateTimeEvent
(
server
.
el
,
1
,
serverCron
,
NULL
,
NULL
);
if
(
aeCreateFileEvent
(
server
.
el
,
server
.
fd
,
AE_READABLE
,
if
(
server
.
ipfd
>
0
&&
aeCreateFileEvent
(
server
.
el
,
server
.
ipfd
,
AE_READABLE
,
acceptHandler
,
NULL
)
==
AE_ERR
)
oom
(
"creating file event"
);
acceptTcpHandler
,
NULL
)
==
AE_ERR
)
oom
(
"creating file event"
);
if
(
server
.
sofd
>
0
&&
aeCreateFileEvent
(
server
.
el
,
server
.
sofd
,
AE_READABLE
,
acceptUnixHandler
,
NULL
)
==
AE_ERR
)
oom
(
"creating file event"
);
if
(
server
.
appendonly
)
{
if
(
server
.
appendonly
)
{
server
.
appendfd
=
open
(
server
.
appendfilename
,
O_WRONLY
|
O_APPEND
|
O_CREAT
,
0644
);
server
.
appendfd
=
open
(
server
.
appendfilename
,
O_WRONLY
|
O_APPEND
|
O_CREAT
,
0644
);
...
@@ -1453,7 +1470,10 @@ int main(int argc, char **argv) {
...
@@ -1453,7 +1470,10 @@ int main(int argc, char **argv) {
if
(
rdbLoad
(
server
.
dbfilename
)
==
REDIS_OK
)
if
(
rdbLoad
(
server
.
dbfilename
)
==
REDIS_OK
)
redisLog
(
REDIS_NOTICE
,
"DB loaded from disk: %ld seconds"
,
time
(
NULL
)
-
start
);
redisLog
(
REDIS_NOTICE
,
"DB loaded from disk: %ld seconds"
,
time
(
NULL
)
-
start
);
}
}
redisLog
(
REDIS_NOTICE
,
"The server is now ready to accept connections on port %d"
,
server
.
port
);
if
(
server
.
ipfd
>
0
)
redisLog
(
REDIS_NOTICE
,
"The server is now ready to accept connections on port %d"
,
server
.
port
);
if
(
server
.
sofd
>
0
)
redisLog
(
REDIS_NOTICE
,
"The server is now ready to accept connections at %s"
,
server
.
unixsocket
);
aeSetBeforeSleepProc
(
server
.
el
,
beforeSleep
);
aeSetBeforeSleepProc
(
server
.
el
,
beforeSleep
);
aeMain
(
server
.
el
);
aeMain
(
server
.
el
);
aeDeleteEventLoop
(
server
.
el
);
aeDeleteEventLoop
(
server
.
el
);
...
...
src/redis.h
View file @
0a546fc0
...
@@ -352,7 +352,10 @@ struct sharedObjectsStruct {
...
@@ -352,7 +352,10 @@ struct sharedObjectsStruct {
struct
redisServer
{
struct
redisServer
{
pthread_t
mainthread
;
pthread_t
mainthread
;
int
port
;
int
port
;
int
fd
;
char
*
bindaddr
;
char
*
unixsocket
;
int
ipfd
;
int
sofd
;
redisDb
*
db
;
redisDb
*
db
;
long
long
dirty
;
/* changes to DB from the last save */
long
long
dirty
;
/* changes to DB from the last save */
long
long
dirty_before_bgsave
;
/* used to restore dirty on failed BGSAVE */
long
long
dirty_before_bgsave
;
/* used to restore dirty on failed BGSAVE */
...
@@ -391,7 +394,6 @@ struct redisServer {
...
@@ -391,7 +394,6 @@ struct redisServer {
struct
saveparam
*
saveparams
;
struct
saveparam
*
saveparams
;
int
saveparamslen
;
int
saveparamslen
;
char
*
logfile
;
char
*
logfile
;
char
*
bindaddr
;
char
*
dbfilename
;
char
*
dbfilename
;
char
*
appendfilename
;
char
*
appendfilename
;
char
*
requirepass
;
char
*
requirepass
;
...
@@ -617,7 +619,8 @@ void *addDeferredMultiBulkLength(redisClient *c);
...
@@ -617,7 +619,8 @@ void *addDeferredMultiBulkLength(redisClient *c);
void
setDeferredMultiBulkLength
(
redisClient
*
c
,
void
*
node
,
long
length
);
void
setDeferredMultiBulkLength
(
redisClient
*
c
,
void
*
node
,
long
length
);
void
addReplySds
(
redisClient
*
c
,
sds
s
);
void
addReplySds
(
redisClient
*
c
,
sds
s
);
void
processInputBuffer
(
redisClient
*
c
);
void
processInputBuffer
(
redisClient
*
c
);
void
acceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
acceptTcpHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
acceptUnixHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
readQueryFromClient
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
readQueryFromClient
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
);
void
addReplyBulk
(
redisClient
*
c
,
robj
*
obj
);
void
addReplyBulk
(
redisClient
*
c
,
robj
*
obj
);
void
addReplyBulkCString
(
redisClient
*
c
,
char
*
s
);
void
addReplyBulkCString
(
redisClient
*
c
,
char
*
s
);
...
...
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