mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Find substrings to randomize when the client is created
This commit is contained in:
parent
d69a483556
commit
3c49070b35
@ -80,7 +80,8 @@ typedef struct _client {
|
|||||||
redisContext *context;
|
redisContext *context;
|
||||||
int state;
|
int state;
|
||||||
sds obuf;
|
sds obuf;
|
||||||
char *randptr;
|
char *randptr[10]; /* needed for MSET against 10 keys */
|
||||||
|
size_t randlen;
|
||||||
unsigned int written; /* bytes of 'obuf' already written */
|
unsigned int written; /* bytes of 'obuf' already written */
|
||||||
long long start; /* start time of a request */
|
long long start; /* start time of a request */
|
||||||
long long latency; /* request latency */
|
long long latency; /* request latency */
|
||||||
@ -145,29 +146,14 @@ static void resetClient(client c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void randomizeClientKey(client c) {
|
static void randomizeClientKey(client c) {
|
||||||
char *p, *newline;
|
|
||||||
char buf[32];
|
char buf[32];
|
||||||
long r;
|
size_t i, r;
|
||||||
|
|
||||||
if (c->randptr == NULL) return;
|
for (i = 0; i < c->randlen; i++) {
|
||||||
|
r = random() % config.randomkeys_keyspacelen;
|
||||||
/* Check if we have to randomize (only once per connection) */
|
snprintf(buf,sizeof(buf),"%012lu",r);
|
||||||
if (c->randptr == (void*)-1) {
|
memcpy(c->randptr[i],buf,12);
|
||||||
p = strstr(c->obuf,":rand:");
|
|
||||||
if (!p) {
|
|
||||||
c->randptr = NULL;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
newline = strstr(p,"\r\n");
|
|
||||||
assert(newline-(p+6) == 12); /* 12 chars for randomness */
|
|
||||||
c->randptr = p+6;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set random number in output buffer */
|
|
||||||
r = random() % config.randomkeys_keyspacelen;
|
|
||||||
snprintf(buf,sizeof(buf),"%012ld",r);
|
|
||||||
memcpy(c->randptr,buf,12);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clientDone(client c) {
|
static void clientDone(client c) {
|
||||||
@ -249,7 +235,7 @@ static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static client createClient() {
|
static client createClient(char *cmd, int len) {
|
||||||
client c = zmalloc(sizeof(struct _client));
|
client c = zmalloc(sizeof(struct _client));
|
||||||
if (config.hostsocket == NULL) {
|
if (config.hostsocket == NULL) {
|
||||||
c->context = redisConnectNonBlock(config.hostip,config.hostport);
|
c->context = redisConnectNonBlock(config.hostip,config.hostport);
|
||||||
@ -265,9 +251,22 @@ static client createClient() {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
c->state = CLIENT_CONNECTING;
|
c->state = CLIENT_CONNECTING;
|
||||||
c->obuf = NULL;
|
c->obuf = sdsnewlen(cmd,len);
|
||||||
c->randptr = (void*)-1;
|
c->randlen = 0;
|
||||||
c->written = 0;
|
c->written = 0;
|
||||||
|
|
||||||
|
/* Find substrings in the output buffer that need to be randomized. */
|
||||||
|
if (config.randomkeys) {
|
||||||
|
char *p = c->obuf, *newline;
|
||||||
|
while ((p = strstr(p,":rand:")) != NULL) {
|
||||||
|
newline = strstr(p,"\r\n");
|
||||||
|
assert(newline-(p+6) == 12); /* 12 chars for randomness */
|
||||||
|
assert(c->randlen < (signed)(sizeof(c->randptr)/sizeof(char*)));
|
||||||
|
c->randptr[c->randlen++] = p+6;
|
||||||
|
p = newline+2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
redisSetReplyObjectFunctions(c->context,NULL);
|
redisSetReplyObjectFunctions(c->context,NULL);
|
||||||
aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c);
|
aeCreateFileEvent(config.el,c->context->fd,AE_WRITABLE,writeHandler,c);
|
||||||
listAddNodeTail(config.clients,c);
|
listAddNodeTail(config.clients,c);
|
||||||
@ -279,9 +278,8 @@ static void createMissingClients(client c) {
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
while(config.liveclients < config.numclients) {
|
while(config.liveclients < config.numclients) {
|
||||||
client new = createClient();
|
client new = createClient(c->obuf,sdslen(c->obuf));
|
||||||
new->obuf = sdsdup(c->obuf);
|
if (config.randomkeys) randomizeClientKey(new);
|
||||||
if (config.randomkeys) randomizeClientKey(c);
|
|
||||||
|
|
||||||
/* Listen backlog is quite limited on most systems */
|
/* Listen backlog is quite limited on most systems */
|
||||||
if (++n > 64) {
|
if (++n > 64) {
|
||||||
@ -329,8 +327,7 @@ static void benchmark(char *title, char *cmd, int len) {
|
|||||||
config.title = title;
|
config.title = title;
|
||||||
config.donerequests = 0;
|
config.donerequests = 0;
|
||||||
|
|
||||||
c = createClient();
|
c = createClient(cmd,len);
|
||||||
c->obuf = sdsnewlen(cmd,len);
|
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
|
|
||||||
config.start = mstime();
|
config.start = mstime();
|
||||||
@ -458,8 +455,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
if (config.idlemode) {
|
if (config.idlemode) {
|
||||||
printf("Creating %d idle connections and waiting forever (Ctrl+C when done)\n", config.numclients);
|
printf("Creating %d idle connections and waiting forever (Ctrl+C when done)\n", config.numclients);
|
||||||
c = createClient(0); /* will never receive a reply */
|
c = createClient("",0); /* will never receive a reply */
|
||||||
c->obuf = sdsempty();
|
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
/* and will wait for every */
|
/* and will wait for every */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user