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:
Gabi Ganam
2023-01-16 18:40:35 +02:00
committed by Oran Agra
parent 61a1d4540d
commit 574a49b96c
2 changed files with 13 additions and 1 deletions
+3 -1
View File
@@ -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)
+10
View File
@@ -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}