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
cf0191dc
Commit
cf0191dc
authored
Jan 31, 2013
by
antirez
Browse files
TCP_NODELAY after SYNC: changes to the implementation.
parent
45b1b2f7
Changes
8
Hide whitespace changes
Inline
Side-by-side
redis.conf
View file @
cf0191dc
...
@@ -196,6 +196,21 @@ slave-read-only yes
...
@@ -196,6 +196,21 @@ slave-read-only yes
#
#
# repl-timeout 60
# repl-timeout 60
# Disable TCP_NODELAY on the slave socket after SYNC?
#
# If you select "yes" Redis will use a smaller number of TCP packets and
# less bandwidth to send data to slaves. But this can add a delay for
# the data to appear on the slave side, up to 40 milliseconds with
# Linux kernels using a default configuration.
#
# If you select "no" the delay for data to appear on the slave side will
# be reduced but more bandwidth will be used for replication.
#
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and slaves are many hops away, turning this to "yes" may
# be a good idea.
repl
-
disable
-
tcp
-
nodelay
no
# The slave priority is an integer number published by Redis in the INFO output.
# The slave priority is an integer number published by Redis in the INFO output.
# It is used by Redis Sentinel in order to select a slave to promote into a
# It is used by Redis Sentinel in order to select a slave to promote into a
# master if the master is no longer working correctly.
# master if the master is no longer working correctly.
...
...
src/anet.c
View file @
cf0191dc
...
@@ -75,9 +75,9 @@ int anetNonBlock(char *err, int fd)
...
@@ -75,9 +75,9 @@ int anetNonBlock(char *err, int fd)
return
ANET_OK
;
return
ANET_OK
;
}
}
static
int
_
anetTcpNoDelay
(
char
*
err
,
int
fd
,
int
yes
)
static
int
anet
Set
TcpNoDelay
(
char
*
err
,
int
fd
,
int
val
)
{
{
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
yes
,
sizeof
(
yes
))
==
-
1
)
if
(
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
val
,
sizeof
(
val
))
==
-
1
)
{
{
anetSetError
(
err
,
"setsockopt TCP_NODELAY: %s"
,
strerror
(
errno
));
anetSetError
(
err
,
"setsockopt TCP_NODELAY: %s"
,
strerror
(
errno
));
return
ANET_ERR
;
return
ANET_ERR
;
...
@@ -85,14 +85,14 @@ static int _anetTcpNoDelay(char *err, int fd, int yes)
...
@@ -85,14 +85,14 @@ static int _anetTcpNoDelay(char *err, int fd, int yes)
return
ANET_OK
;
return
ANET_OK
;
}
}
int
anetTcpNoDelay
(
char
*
err
,
int
fd
)
int
anet
Enable
TcpNoDelay
(
char
*
err
,
int
fd
)
{
{
return
_
anetTcpNoDelay
(
err
,
fd
,
1
);
return
anet
Set
TcpNoDelay
(
err
,
fd
,
1
);
}
}
int
anetTcpNoDelay
Off
(
char
*
err
,
int
fd
)
int
anet
Disable
TcpNoDelay
(
char
*
err
,
int
fd
)
{
{
return
_
anetTcpNoDelay
(
err
,
fd
,
0
);
return
anet
Set
TcpNoDelay
(
err
,
fd
,
0
);
}
}
...
...
src/anet.h
View file @
cf0191dc
...
@@ -51,8 +51,8 @@ int anetTcpAccept(char *err, int serversock, char *ip, int *port);
...
@@ -51,8 +51,8 @@ int anetTcpAccept(char *err, int serversock, char *ip, int *port);
int
anetUnixAccept
(
char
*
err
,
int
serversock
);
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
anet
Enable
TcpNoDelay
(
char
*
err
,
int
fd
);
int
anetTcpNoDelay
Off
(
char
*
err
,
int
fd
);
int
anet
Disable
TcpNoDelay
(
char
*
err
,
int
fd
);
int
anetTcpKeepAlive
(
char
*
err
,
int
fd
);
int
anetTcpKeepAlive
(
char
*
err
,
int
fd
);
int
anetPeerToString
(
int
fd
,
char
*
ip
,
int
*
port
);
int
anetPeerToString
(
int
fd
,
char
*
ip
,
int
*
port
);
...
...
src/config.c
View file @
cf0191dc
...
@@ -230,6 +230,10 @@ void loadServerConfigFromString(char *config) {
...
@@ -230,6 +230,10 @@ void loadServerConfigFromString(char *config) {
err
=
"repl-timeout must be 1 or greater"
;
err
=
"repl-timeout must be 1 or greater"
;
goto
loaderr
;
goto
loaderr
;
}
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"repl-disable-tcp-nodelay"
)
&&
argc
==
2
)
{
if
((
server
.
repl_disable_tcp_nodelay
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"masterauth"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"masterauth"
)
&&
argc
==
2
)
{
server
.
masterauth
=
zstrdup
(
argv
[
1
]);
server
.
masterauth
=
zstrdup
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-serve-stale-data"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-serve-stale-data"
)
&&
argc
==
2
)
{
...
@@ -378,8 +382,6 @@ void loadServerConfigFromString(char *config) {
...
@@ -378,8 +382,6 @@ void loadServerConfigFromString(char *config) {
if
((
server
.
stop_writes_on_bgsave_err
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
if
((
server
.
stop_writes_on_bgsave_err
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
}
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-tcp-nodelay-off"
)
&&
argc
==
2
)
{
server
.
slave_tcp_nodelay_off
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-priority"
)
&&
argc
==
2
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-priority"
)
&&
argc
==
2
)
{
server
.
slave_priority
=
atoi
(
argv
[
1
]);
server
.
slave_priority
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"sentinel"
))
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"sentinel"
))
{
...
@@ -699,10 +701,11 @@ void configSetCommand(redisClient *c) {
...
@@ -699,10 +701,11 @@ void configSetCommand(redisClient *c) {
if
(
yn
==
-
1
)
goto
badfmt
;
if
(
yn
==
-
1
)
goto
badfmt
;
server
.
rdb_checksum
=
yn
;
server
.
rdb_checksum
=
yn
;
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"
slav
e-tcp-nodelay
-off
"
))
{
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"
repl-disabl
e-tcp-nodelay"
))
{
i
f
(
getLongLongFromObject
(
o
,
&
ll
)
==
REDIS_ERR
)
goto
badfmt
;
i
nt
yn
=
yesnotoi
(
o
->
ptr
)
;
server
.
slave_tcp_nodelay_off
=
ll
;
if
(
yn
==
-
1
)
goto
badfmt
;
server
.
repl_disable_tcp_nodelay
=
yn
;
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"slave-priority"
))
{
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"slave-priority"
))
{
if
(
getLongLongFromObject
(
o
,
&
ll
)
==
REDIS_ERR
||
if
(
getLongLongFromObject
(
o
,
&
ll
)
==
REDIS_ERR
||
ll
<=
0
)
goto
badfmt
;
ll
<=
0
)
goto
badfmt
;
...
@@ -796,7 +799,6 @@ void configGetCommand(redisClient *c) {
...
@@ -796,7 +799,6 @@ void configGetCommand(redisClient *c) {
config_get_numerical_field
(
"repl-timeout"
,
server
.
repl_timeout
);
config_get_numerical_field
(
"repl-timeout"
,
server
.
repl_timeout
);
config_get_numerical_field
(
"maxclients"
,
server
.
maxclients
);
config_get_numerical_field
(
"maxclients"
,
server
.
maxclients
);
config_get_numerical_field
(
"watchdog-period"
,
server
.
watchdog_period
);
config_get_numerical_field
(
"watchdog-period"
,
server
.
watchdog_period
);
config_get_numerical_field
(
"slave-tcp-nodelay-off"
,
server
.
slave_tcp_nodelay_off
);
config_get_numerical_field
(
"slave-priority"
,
server
.
slave_priority
);
config_get_numerical_field
(
"slave-priority"
,
server
.
slave_priority
);
/* Bool (yes/no) values */
/* Bool (yes/no) values */
...
@@ -812,6 +814,8 @@ void configGetCommand(redisClient *c) {
...
@@ -812,6 +814,8 @@ void configGetCommand(redisClient *c) {
config_get_bool_field
(
"rdbcompression"
,
server
.
rdb_compression
);
config_get_bool_field
(
"rdbcompression"
,
server
.
rdb_compression
);
config_get_bool_field
(
"rdbchecksum"
,
server
.
rdb_checksum
);
config_get_bool_field
(
"rdbchecksum"
,
server
.
rdb_checksum
);
config_get_bool_field
(
"activerehashing"
,
server
.
activerehashing
);
config_get_bool_field
(
"activerehashing"
,
server
.
activerehashing
);
config_get_bool_field
(
"repl-disable-tcp-nodelay"
,
server
.
repl_disable_tcp_nodelay
);
/* Everything we can't handle with macros follows. */
/* Everything we can't handle with macros follows. */
...
...
src/networking.c
View file @
cf0191dc
...
@@ -58,7 +58,7 @@ redisClient *createClient(int fd) {
...
@@ -58,7 +58,7 @@ redisClient *createClient(int fd) {
* contexts (for instance a Lua script) we need a non connected client. */
* contexts (for instance a Lua script) we need a non connected client. */
if
(
fd
!=
-
1
)
{
if
(
fd
!=
-
1
)
{
anetNonBlock
(
NULL
,
fd
);
anetNonBlock
(
NULL
,
fd
);
anetTcpNoDelay
(
NULL
,
fd
);
anet
Enable
TcpNoDelay
(
NULL
,
fd
);
if
(
aeCreateFileEvent
(
server
.
el
,
fd
,
AE_READABLE
,
if
(
aeCreateFileEvent
(
server
.
el
,
fd
,
AE_READABLE
,
readQueryFromClient
,
c
)
==
AE_ERR
)
readQueryFromClient
,
c
)
==
AE_ERR
)
{
{
...
...
src/redis.c
View file @
cf0191dc
...
@@ -1160,7 +1160,7 @@ void initServerConfig() {
...
@@ -1160,7 +1160,7 @@ void initServerConfig() {
server
.
repl_serve_stale_data
=
1
;
server
.
repl_serve_stale_data
=
1
;
server
.
repl_slave_ro
=
1
;
server
.
repl_slave_ro
=
1
;
server
.
repl_down_since
=
time
(
NULL
);
server
.
repl_down_since
=
time
(
NULL
);
server
.
slav
e_tcp_nodelay
_off
=
1
;
server
.
repl_disabl
e_tcp_nodelay
=
0
;
server
.
slave_priority
=
REDIS_DEFAULT_SLAVE_PRIORITY
;
server
.
slave_priority
=
REDIS_DEFAULT_SLAVE_PRIORITY
;
/* Client output buffer limits */
/* Client output buffer limits */
...
...
src/redis.h
View file @
cf0191dc
...
@@ -616,7 +616,7 @@ struct redisServer {
...
@@ -616,7 +616,7 @@ struct redisServer {
int
repl_serve_stale_data
;
/* Serve stale data when link is down? */
int
repl_serve_stale_data
;
/* Serve stale data when link is down? */
int
repl_slave_ro
;
/* Slave is read only? */
int
repl_slave_ro
;
/* Slave is read only? */
time_t
repl_down_since
;
/* Unix time at which link with master went down */
time_t
repl_down_since
;
/* Unix time at which link with master went down */
int
slav
e_tcp_nodelay
_off
;
/* turn off slave's tcp nodelay
*/
int
repl_disabl
e_tcp_nodelay
;
/* Disable TCP_NODELAY after SYNC?
*/
int
slave_priority
;
/* Reported in INFO and used by Sentinel. */
int
slave_priority
;
/* Reported in INFO and used by Sentinel. */
/* Limits */
/* Limits */
unsigned
int
maxclients
;
/* Max number of simultaneous clients */
unsigned
int
maxclients
;
/* Max number of simultaneous clients */
...
...
src/replication.c
View file @
cf0191dc
...
@@ -118,14 +118,6 @@ void syncCommand(redisClient *c) {
...
@@ -118,14 +118,6 @@ void syncCommand(redisClient *c) {
/* ignore SYNC if already slave or in monitor mode */
/* ignore SYNC if already slave or in monitor mode */
if
(
c
->
flags
&
REDIS_SLAVE
)
return
;
if
(
c
->
flags
&
REDIS_SLAVE
)
return
;
if
(
server
.
slave_tcp_nodelay_off
)
{
redisLog
(
REDIS_NOTICE
,
"Turning off slave's :%d TCP NODELAY SETTING"
,
c
->
fd
);
char
err
[
1024
];
if
(
anetTcpNoDelayOff
(
err
,
c
->
fd
)
==
ANET_ERR
)
redisLog
(
REDIS_WARNING
,
"Can't turn off %d 's tcp nodelay setting: %s"
,
c
->
fd
,
err
);
}
/* Refuse SYNC requests if we are a slave but the link with our master
/* Refuse SYNC requests if we are a slave but the link with our master
* is not ok... */
* is not ok... */
if
(
server
.
masterhost
&&
server
.
repl_state
!=
REDIS_REPL_CONNECTED
)
{
if
(
server
.
masterhost
&&
server
.
repl_state
!=
REDIS_REPL_CONNECTED
)
{
...
@@ -180,6 +172,9 @@ void syncCommand(redisClient *c) {
...
@@ -180,6 +172,9 @@ void syncCommand(redisClient *c) {
}
}
c
->
replstate
=
REDIS_REPL_WAIT_BGSAVE_END
;
c
->
replstate
=
REDIS_REPL_WAIT_BGSAVE_END
;
}
}
if
(
server
.
repl_disable_tcp_nodelay
)
anetDisableTcpNoDelay
(
NULL
,
c
->
fd
);
/* Non critical if it fails. */
c
->
repldbfd
=
-
1
;
c
->
repldbfd
=
-
1
;
c
->
flags
|=
REDIS_SLAVE
;
c
->
flags
|=
REDIS_SLAVE
;
c
->
slaveseldb
=
0
;
c
->
slaveseldb
=
0
;
...
...
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