Move timeout logic
This commit is contained in:
parent
fd23f4612e
commit
5e9adbdeb1
29
src/t_list.c
29
src/t_list.c
@ -817,20 +817,20 @@ int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkTimeout(redisClient *c, robj *object, time_t *timeout) {
|
int getTimeoutFromObjectOrReply(redisClient *c, robj *object, time_t *timeout) {
|
||||||
long long lltimeout;
|
long tval;
|
||||||
|
|
||||||
if (getLongLongFromObject(object, &lltimeout) != REDIS_OK) {
|
if (getLongFromObjectOrReply(c,object,&tval,
|
||||||
addReplyError(c, "timeout is not an integer");
|
"timeout is not an integer or out of range") != REDIS_OK)
|
||||||
|
return REDIS_ERR;
|
||||||
|
|
||||||
|
if (tval < 0) {
|
||||||
|
addReplyError(c,"timeout is negative");
|
||||||
return REDIS_ERR;
|
return REDIS_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lltimeout < 0) {
|
if (tval > 0) tval += time(NULL);
|
||||||
addReplyError(c, "timeout is negative");
|
*timeout = tval;
|
||||||
return REDIS_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
*timeout = lltimeout;
|
|
||||||
|
|
||||||
return REDIS_OK;
|
return REDIS_OK;
|
||||||
}
|
}
|
||||||
@ -841,9 +841,8 @@ void blockingPopGenericCommand(redisClient *c, int where) {
|
|||||||
time_t timeout;
|
time_t timeout;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
if (checkTimeout(c, c->argv[c->argc - 1], &timeout) != REDIS_OK) {
|
if (getTimeoutFromObjectOrReply(c,c->argv[c->argc-1],&timeout) != REDIS_OK)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
for (j = 1; j < c->argc-1; j++) {
|
for (j = 1; j < c->argc-1; j++) {
|
||||||
o = lookupKeyWrite(c->db,c->argv[j]);
|
o = lookupKeyWrite(c->db,c->argv[j]);
|
||||||
@ -894,7 +893,6 @@ void blockingPopGenericCommand(redisClient *c, int where) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If the list is empty or the key does not exists we must block */
|
/* If the list is empty or the key does not exists we must block */
|
||||||
if (timeout > 0) timeout += time(NULL);
|
|
||||||
blockForKeys(c, c->argv + 1, c->argc - 2, timeout, NULL);
|
blockForKeys(c, c->argv + 1, c->argc - 2, timeout, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -909,9 +907,8 @@ void brpopCommand(redisClient *c) {
|
|||||||
void brpoplpushCommand(redisClient *c) {
|
void brpoplpushCommand(redisClient *c) {
|
||||||
time_t timeout;
|
time_t timeout;
|
||||||
|
|
||||||
if (checkTimeout(c, c->argv[3], &timeout) != REDIS_OK) {
|
if (getTimeoutFromObjectOrReply(c,c->argv[3],&timeout) != REDIS_OK)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
robj *key = lookupKeyWrite(c->db, c->argv[1]);
|
robj *key = lookupKeyWrite(c->db, c->argv[1]);
|
||||||
|
|
||||||
@ -922,8 +919,6 @@ void brpoplpushCommand(redisClient *c) {
|
|||||||
* returns immediately. */
|
* returns immediately. */
|
||||||
addReply(c, shared.nullmultibulk);
|
addReply(c, shared.nullmultibulk);
|
||||||
} else {
|
} else {
|
||||||
if (timeout > 0) timeout += time(NULL);
|
|
||||||
|
|
||||||
/* The list is empty and the client blocks. */
|
/* The list is empty and the client blocks. */
|
||||||
blockForKeys(c, c->argv + 1, 1, timeout, c->argv[2]);
|
blockForKeys(c, c->argv + 1, 1, timeout, c->argv[2]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user