mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Make replication faster (biggest gain for small number of slaves)
This commit is contained in:
parent
615e414c5d
commit
632e4c09ac
@ -41,7 +41,6 @@
|
|||||||
#define REDIS_MAXIDLETIME (60*5) /* default client timeout */
|
#define REDIS_MAXIDLETIME (60*5) /* default client timeout */
|
||||||
#define REDIS_IOBUF_LEN 1024
|
#define REDIS_IOBUF_LEN 1024
|
||||||
#define REDIS_LOADBUF_LEN 1024
|
#define REDIS_LOADBUF_LEN 1024
|
||||||
#define REDIS_STATIC_ARGS 8
|
|
||||||
#define REDIS_DEFAULT_DBNUM 16
|
#define REDIS_DEFAULT_DBNUM 16
|
||||||
#define REDIS_CONFIGLINE_MAX 1024
|
#define REDIS_CONFIGLINE_MAX 1024
|
||||||
#define REDIS_MAX_SYNC_TIME 60 /* Slave can't take more to sync */
|
#define REDIS_MAX_SYNC_TIME 60 /* Slave can't take more to sync */
|
||||||
|
@ -10,38 +10,8 @@
|
|||||||
void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
||||||
listNode *ln;
|
listNode *ln;
|
||||||
listIter li;
|
listIter li;
|
||||||
int outc = 0, j;
|
int 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));
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
listRewind(slaves,&li);
|
||||||
while((ln = listNext(&li))) {
|
while((ln = listNext(&li))) {
|
||||||
redisClient *slave = ln->value;
|
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 */
|
/* Don't feed slaves that are still waiting for BGSAVE to start */
|
||||||
if (slave->replstate == REDIS_REPL_WAIT_BGSAVE_START) continue;
|
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) {
|
if (slave->slaveseldb != dictid) {
|
||||||
robj *selectcmd;
|
robj *selectcmd;
|
||||||
|
|
||||||
@ -73,10 +45,9 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
|
|||||||
addReply(slave,selectcmd);
|
addReply(slave,selectcmd);
|
||||||
slave->slaveseldb = dictid;
|
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) {
|
void replicationFeedMonitors(list *monitors, int dictid, robj **argv, int argc) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user