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
632e4c09
Commit
632e4c09
authored
May 29, 2011
by
Pieter Noordhuis
Committed by
antirez
May 30, 2011
Browse files
Make replication faster (biggest gain for small number of slaves)
parent
615e414c
Changes
2
Show whitespace changes
Inline
Side-by-side
src/redis.h
View file @
632e4c09
...
...
@@ -41,7 +41,6 @@
#define REDIS_MAXIDLETIME (60*5)
/* default client timeout */
#define REDIS_IOBUF_LEN 1024
#define REDIS_LOADBUF_LEN 1024
#define REDIS_STATIC_ARGS 8
#define REDIS_DEFAULT_DBNUM 16
#define REDIS_CONFIGLINE_MAX 1024
#define REDIS_MAX_SYNC_TIME 60
/* Slave can't take more to sync */
...
...
src/replication.c
View file @
632e4c09
...
...
@@ -10,38 +10,8 @@
void
replicationFeedSlaves
(
list
*
slaves
,
int
dictid
,
robj
**
argv
,
int
argc
)
{
listNode
*
ln
;
listIter
li
;
int
outc
=
0
,
j
;
robj
**
outv
;
/* We need 1+(ARGS*3) objects since commands are using the new protocol
* and we one 1 object for the first "*<count>\r\n" multibulk count, then
* for every additional object we have "$<count>\r\n" + object + "\r\n". */
robj
*
static_outv
[
REDIS_STATIC_ARGS
*
3
+
1
];
robj
*
lenobj
;
if
(
argc
<=
REDIS_STATIC_ARGS
)
{
outv
=
static_outv
;
}
else
{
outv
=
zmalloc
(
sizeof
(
robj
*
)
*
(
argc
*
3
+
1
));
}
int
j
;
lenobj
=
createObject
(
REDIS_STRING
,
sdscatprintf
(
sdsempty
(),
"*%d
\r\n
"
,
argc
));
lenobj
->
refcount
=
0
;
outv
[
outc
++
]
=
lenobj
;
for
(
j
=
0
;
j
<
argc
;
j
++
)
{
lenobj
=
createObject
(
REDIS_STRING
,
sdscatprintf
(
sdsempty
(),
"$%lu
\r\n
"
,
(
unsigned
long
)
stringObjectLen
(
argv
[
j
])));
lenobj
->
refcount
=
0
;
outv
[
outc
++
]
=
lenobj
;
outv
[
outc
++
]
=
argv
[
j
];
outv
[
outc
++
]
=
shared
.
crlf
;
}
/* Increment all the refcounts at start and decrement at end in order to
* be sure to free objects if there is no slave in a replication state
* able to be feed with commands */
for
(
j
=
0
;
j
<
outc
;
j
++
)
incrRefCount
(
outv
[
j
]);
listRewind
(
slaves
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
redisClient
*
slave
=
ln
->
value
;
...
...
@@ -49,7 +19,9 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
/* Don't feed slaves that are still waiting for BGSAVE to start */
if
(
slave
->
replstate
==
REDIS_REPL_WAIT_BGSAVE_START
)
continue
;
/* Feed all the other slaves, MONITORs and so on */
/* Feed slaves that are waiting for the initial SYNC (so these commands
* are queued in the output buffer until the intial SYNC completes),
* or are already in sync with the master. */
if
(
slave
->
slaveseldb
!=
dictid
)
{
robj
*
selectcmd
;
...
...
@@ -73,10 +45,9 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
addReply
(
slave
,
selectcmd
);
slave
->
slaveseldb
=
dictid
;
}
for
(
j
=
0
;
j
<
outc
;
j
++
)
addReply
(
slave
,
outv
[
j
]);
addReplyMultiBulkLen
(
slave
,
argc
);
for
(
j
=
0
;
j
<
argc
;
j
++
)
addReplyBulk
(
slave
,
argv
[
j
]);
}
for
(
j
=
0
;
j
<
outc
;
j
++
)
decrRefCount
(
outv
[
j
]);
if
(
outv
!=
static_outv
)
zfree
(
outv
);
}
void
replicationFeedMonitors
(
list
*
monitors
,
int
dictid
,
robj
**
argv
,
int
argc
)
{
...
...
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