Blocked command woken while CLIENT PAUSE is being installed stalls the shard queue
Author: vyavdoshenkoCreated Sep 15, 2026Updated Sep 15, 2026
Labelsbug
CLIENT PAUSE sets the pause state on the threads one by one. A write that concludes on a shard thread that is not paused yet can wake a blocked command whose connection thread is already paused. The woken command parks in WaitOnWatch behind the pause while the shard keeps it as an awakened transaction, so the shard transaction queue stalls until the pause ends and every command touching that shard hangs, including reads from the admin port.
Repro (one shard on thread 0, all client connections on thread 1):
dragonfly --proactor_threads=2 --num_shards=1 --conn_io_threads=1 --conn_io_thread_start=1 --pause_wait_timeout=60 --admin_port=6380
# terminal 1
redis-cli BLPOP l 0
# terminal 2, open before the script starts
redis-cli
# terminal 3
redis-cli EVAL "for i=1,1e10 do end redis.call('RPUSH', KEYS[1], 'a')" 1 l
# terminal 2, while the script runs
CLIENT PAUSE 60000 WRITE
# terminal 4, after EVAL returns
redis-cli -p 6380 LLEN lExpected: LLEN returns 1 and BLPOP gets the element when the pause ends. Actual: LLEN hangs until the pause ends.
Source: dragonflydb/dragonfly