diff --git a/src/timeout.c b/src/timeout.c index b62423a9e..eb971dcdc 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -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 @@ -175,7 +177,7 @@ int getTimeoutFromObjectOrReply(client *c, robj *object, mstime_t *timeout, int addReplyError(c, "timeout is out of range"); return C_ERR; } - tval = (long long) ftval; + tval = (long long) ceill(ftval); } else { if (getLongLongFromObjectOrReply(c,object,&tval, "timeout is not an integer or out of range") != C_OK) diff --git a/tests/unit/type/list.tcl b/tests/unit/type/list.tcl index f7e043f99..7a3768025 100644 --- a/tests/unit/type/list.tcl +++ b/tests/unit/type/list.tcl @@ -1263,6 +1263,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}