Blocking command with a 0.001 seconds timeout blocks indefinitely (#11688)
Any value in the range of [0-1) turns to 0 when being cast from double to long long. This change rounds up instead of down for values that can't be stored precisely as long doubles.
(cherry picked from commit eef29b68a2)
This commit is contained in:
+3
-1
@@ -29,6 +29,8 @@
|
||||
#include "server.h"
|
||||
#include "cluster.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
/* ========================== Clients timeouts ============================= */
|
||||
|
||||
/* Check if this blocked client timedout (does nothing if the client is
|
||||
@@ -169,7 +171,7 @@ int getTimeoutFromObjectOrReply(client *c, robj *object, mstime_t *timeout, int
|
||||
if (getLongDoubleFromObjectOrReply(c,object,&ftval,
|
||||
"timeout is not a float or out of range") != C_OK)
|
||||
return C_ERR;
|
||||
tval = (long long) (ftval * 1000.0);
|
||||
tval = (long long) ceill(ftval * 1000.0);
|
||||
} else {
|
||||
if (getLongLongFromObjectOrReply(c,object,&tval,
|
||||
"timeout is not an integer or out of range") != C_OK)
|
||||
|
||||
@@ -1256,6 +1256,16 @@ foreach {pop} {BLPOP BLMPOP_LEFT} {
|
||||
$rd close
|
||||
}
|
||||
|
||||
test "$pop: with 0.001 timeout should not block indefinitely" {
|
||||
# Use a timeout of 0.001 and wait for the number of blocked clients to equal 0.
|
||||
# Validate the empty read from the deferring client.
|
||||
set rd [redis_deferring_client]
|
||||
bpop_command $rd $pop blist1 0.001
|
||||
wait_for_blocked_clients_count 0
|
||||
assert_equal {} [$rd read]
|
||||
$rd close
|
||||
}
|
||||
|
||||
test "$pop: second argument is not a list" {
|
||||
set rd [redis_deferring_client]
|
||||
r del blist1{t} blist2{t}
|
||||
|
||||
Reference in New Issue
Block a user