EXEC is not atomic under maxmemory: some queued writes apply while denyoom ones fail
Author: vyavdoshenkoCreated Sep 9, 2026Updated Sep 10, 2026
Labelsbug
Found while running the Valkey TCL suite (unit/multi) against Dragonfly. Under maxmemory, a denyoom command inside a MULTI is not rejected at queue time, so EXEC runs the transaction and fails only the denyoom commands individually while other queued writes still apply. Upstream rejects at queue time and returns EXECABORT, applying nothing.
Reproduce (single connection):
redis-cli set foo bar
redis-cli config set maxmemory 1
redis-cli <<'CMDS'
MULTI
SET big xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DEL foo
EXEC
CMDS
# EXEC returns: 1) (error) ERR Out of memory 2) (integer) 1
redis-cli config set maxmemory 0
redis-cli exists foo # 0 (DEL applied even though the transaction should have aborted)Source: dragonflydb/dragonfly