diff --git a/src/config.c b/src/config.c index e4122497f..60ba35b3d 100644 --- a/src/config.c +++ b/src/config.c @@ -3067,11 +3067,11 @@ standardConfig static_configs[] = { createBoolConfig("stop-writes-on-bgsave-error", NULL, MODIFIABLE_CONFIG, server.stop_writes_on_bgsave_err, 1, NULL, NULL), createBoolConfig("set-proc-title", NULL, IMMUTABLE_CONFIG, server.set_proc_title, 1, NULL, NULL), /* Should setproctitle be used? */ createBoolConfig("dynamic-hz", NULL, MODIFIABLE_CONFIG, server.dynamic_hz, 1, NULL, NULL), /* Adapt hz to # of clients.*/ - createBoolConfig("lazyfree-lazy-eviction", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_eviction, 0, NULL, NULL), - createBoolConfig("lazyfree-lazy-expire", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_expire, 0, NULL, NULL), - createBoolConfig("lazyfree-lazy-server-del", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_server_del, 0, NULL, NULL), - createBoolConfig("lazyfree-lazy-user-del", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_user_del, 0, NULL, NULL), - createBoolConfig("lazyfree-lazy-user-flush", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_user_flush, 0, NULL, NULL), + createBoolConfig("lazyfree-lazy-eviction", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_eviction, 1, NULL, NULL), + createBoolConfig("lazyfree-lazy-expire", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_expire, 1, NULL, NULL), + createBoolConfig("lazyfree-lazy-server-del", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_server_del, 1, NULL, NULL), + createBoolConfig("lazyfree-lazy-user-del", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_user_del, 1, NULL, NULL), + createBoolConfig("lazyfree-lazy-user-flush", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.lazyfree_lazy_user_flush, 1, NULL, NULL), createBoolConfig("repl-disable-tcp-nodelay", NULL, MODIFIABLE_CONFIG, server.repl_disable_tcp_nodelay, 0, NULL, NULL), createBoolConfig("repl-diskless-sync", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.repl_diskless_sync, 1, NULL, NULL), createBoolConfig("dual-channel-replication-enabled", NULL, DEBUG_CONFIG | MODIFIABLE_CONFIG, server.dual_channel_replication, 0, NULL, NULL), @@ -3083,7 +3083,7 @@ standardConfig static_configs[] = { createBoolConfig("aof-use-rdb-preamble", NULL, MODIFIABLE_CONFIG, server.aof_use_rdb_preamble, 1, NULL, NULL), createBoolConfig("aof-timestamp-enabled", NULL, MODIFIABLE_CONFIG, server.aof_timestamp_enabled, 0, NULL, NULL), createBoolConfig("cluster-replica-no-failover", "cluster-slave-no-failover", MODIFIABLE_CONFIG, server.cluster_replica_no_failover, 0, NULL, updateClusterFlags), /* Failover by default. */ - createBoolConfig("replica-lazy-flush", "slave-lazy-flush", MODIFIABLE_CONFIG, server.repl_replica_lazy_flush, 0, NULL, NULL), + createBoolConfig("replica-lazy-flush", "slave-lazy-flush", MODIFIABLE_CONFIG, server.repl_replica_lazy_flush, 1, NULL, NULL), createBoolConfig("replica-serve-stale-data", "slave-serve-stale-data", MODIFIABLE_CONFIG, server.repl_serve_stale_data, 1, NULL, NULL), createBoolConfig("replica-read-only", "slave-read-only", DEBUG_CONFIG | MODIFIABLE_CONFIG, server.repl_replica_ro, 1, NULL, NULL), createBoolConfig("replica-ignore-maxmemory", "slave-ignore-maxmemory", MODIFIABLE_CONFIG, server.repl_replica_ignore_maxmemory, 1, NULL, NULL), diff --git a/tests/unit/expire.tcl b/tests/unit/expire.tcl index ff97a475e..d85ce7ee6 100644 --- a/tests/unit/expire.tcl +++ b/tests/unit/expire.tcl @@ -368,7 +368,7 @@ start_server {tags {"expire"}} { {set foo10 bar} {pexpireat foo10 *} {set foo11 bar} - {del foo11} + {unlink foo11} {set foo12 bar} {pexpireat foo12 *} {set foo13 bar} @@ -500,7 +500,7 @@ start_server {tags {"expire"}} { {set foo3 bar} {pexpireat foo3 *} {pexpireat foo3 *} - {del foo3} + {unlink foo3} {set foo4 bar} {pexpireat foo4 *} {pexpireat foo4 *} @@ -629,7 +629,7 @@ start_server {tags {"expire"}} { r ttl foo } {-1} {needs:debug} - test {GETEX propagate as to replica as PERSIST, DEL, or nothing} { + test {GETEX propagate as to replica as PERSIST, UNLINK, or nothing} { # In the above tests, many keys with random expiration times are set, flush # the DBs to avoid active expiry kicking in and messing the replication streams. r flushall @@ -642,7 +642,7 @@ start_server {tags {"expire"}} { {select *} {set foo bar PXAT *} {persist foo} - {del foo} + {unlink foo} } close_replication_stream $repl } {} {needs:repl} @@ -784,7 +784,7 @@ start_server {tags {"expire"}} { assert_replication_stream $repl { {select *} - {del foo} + {unlink foo} {set x 1} } close_replication_stream $repl @@ -805,8 +805,8 @@ start_server {tags {"expire"}} { assert_replication_stream $repl { {select *} - {del foo*} - {del foo*} + {unlink foo*} + {unlink foo*} } close_replication_stream $repl assert_equal [r debug set-active-expire 1] {OK} @@ -826,8 +826,8 @@ start_server {tags {"expire"}} { assert_replication_stream $repl { {select *} - {del foo*} - {del foo*} + {unlink foo*} + {unlink foo*} } close_replication_stream $repl assert_equal [r debug set-active-expire 1] {OK} diff --git a/tests/unit/latency-monitor.tcl b/tests/unit/latency-monitor.tcl index 9e714c119..9048192a4 100644 --- a/tests/unit/latency-monitor.tcl +++ b/tests/unit/latency-monitor.tcl @@ -144,6 +144,7 @@ tags {"needs:debug"} { test {LATENCY of expire events are correctly collected} { r config set latency-monitor-threshold 20 + r config set lazyfree-lazy-expire no r flushdb if {$::valgrind} {set count 100000} else {set count 1000000} r eval { @@ -166,6 +167,7 @@ tags {"needs:debug"} { } r config set latency-monitor-threshold 200 + r config set lazyfree-lazy-expire yes } test {LATENCY HISTORY / RESET with wrong event name is fine} { diff --git a/tests/unit/maxmemory.tcl b/tests/unit/maxmemory.tcl index 75ec1ce02..d4e62246f 100644 --- a/tests/unit/maxmemory.tcl +++ b/tests/unit/maxmemory.tcl @@ -550,9 +550,9 @@ start_server {tags {"maxmemory" "external:skip"}} { {set asdf1 1} {set asdf2 2} {set asdf3 3} - {del asdf*} - {del asdf*} - {del asdf*} + {unlink asdf*} + {unlink asdf*} + {unlink asdf*} {set asdf4 4} } close_replication_stream $repl @@ -586,7 +586,7 @@ start_server {tags {"maxmemory" "external:skip"}} { {incr x} {incr x} {exec} - {del x} + {unlink x} } close_replication_stream $repl diff --git a/tests/unit/memefficiency.tcl b/tests/unit/memefficiency.tcl index 8a58aea17..d5a6a6efe 100644 --- a/tests/unit/memefficiency.tcl +++ b/tests/unit/memefficiency.tcl @@ -178,7 +178,7 @@ run_solo {defrag} { r config set key-load-delay 0 test "Active defrag eval scripts: $type" { - r flushdb + r flushdb sync r script flush sync r config resetstat r config set hz 100 @@ -264,7 +264,7 @@ run_solo {defrag} { } {OK} test "Active defrag big keys: $type" { - r flushdb + r flushdb sync r config resetstat r config set hz 100 r config set activedefrag no @@ -405,7 +405,7 @@ run_solo {defrag} { } {OK} test "Active defrag pubsub: $type" { - r flushdb + r flushdb sync r config resetstat r config set hz 100 r config set activedefrag no @@ -505,7 +505,7 @@ run_solo {defrag} { if {$type eq "standalone"} { ;# skip in cluster mode test "Active defrag big list: $type" { - r flushdb + r flushdb sync r config resetstat r config set hz 100 r config set activedefrag no @@ -617,7 +617,7 @@ run_solo {defrag} { # kept running and not move any allocation. # this test is more consistent on a fresh server with no history start_server {tags {"defrag"} overrides {save ""}} { - r flushdb + r flushdb sync r config resetstat r config set hz 100 r config set activedefrag no diff --git a/tests/unit/moduleapi/async_rm_call.tcl b/tests/unit/moduleapi/async_rm_call.tcl index e88e8cf35..d4ce8eaf4 100644 --- a/tests/unit/moduleapi/async_rm_call.tcl +++ b/tests/unit/moduleapi/async_rm_call.tcl @@ -374,7 +374,7 @@ start_server {tags {"modules"}} { # # Explanation of the second multi exec block: # {lpop l} - pop the value by our blocking command 'blpop_and_set_multiple_keys' - # {del string_foo} - lazy expiration of string_foo when 'blpop_and_set_multiple_keys' tries to write to it. + # {unlink string_foo} - lazy expiration of string_foo when 'blpop_and_set_multiple_keys' tries to write to it. # {set string_foo 1} - the action of our blocking command 'blpop_and_set_multiple_keys' # {set string_bar 2} - the action of our blocking command 'blpop_and_set_multiple_keys' # {incr expired} - the post notification job, registered after string_foo got expired @@ -398,7 +398,7 @@ start_server {tags {"modules"}} { {lpush l a} {multi} {lpop l} - {del string_foo} + {unlink string_foo} {set string_foo 1} {set string_bar 2} {incr expired} diff --git a/tests/unit/moduleapi/cluster.tcl b/tests/unit/moduleapi/cluster.tcl index 84c7e274c..5570f980f 100644 --- a/tests/unit/moduleapi/cluster.tcl +++ b/tests/unit/moduleapi/cluster.tcl @@ -210,7 +210,7 @@ start_cluster 2 2 [list config_lines $modules] { # the {lpush before_deleted count_dels_{4oi}} is a post notification job registered when 'count_dels_{4oi}' was removed assert_replication_stream $repl { {multi} - {del count_dels_{4oi}} + {unlink count_dels_{4oi}} {keyspace.incr_dels} {lpush before_deleted count_dels_{4oi}} {exec} diff --git a/tests/unit/moduleapi/postnotifications.tcl b/tests/unit/moduleapi/postnotifications.tcl index 7e48c7bc3..7aa1b9bc0 100644 --- a/tests/unit/moduleapi/postnotifications.tcl +++ b/tests/unit/moduleapi/postnotifications.tcl @@ -72,7 +72,7 @@ tags "modules" { {set x 1} {pexpireat x *} {multi} - {del x} + {unlink x} {lpush before_expired x} {incr expired} {exec} @@ -96,7 +96,7 @@ tags "modules" { {set x 1} {pexpireat x *} {multi} - {del x} + {unlink x} {lpush before_expired x} {incr expired} {exec} @@ -122,7 +122,7 @@ tags "modules" { {pexpireat x *} {multi} {set read_x 1} - {del x} + {unlink x} {lpush before_expired x} {incr expired} {exec} @@ -162,7 +162,7 @@ tags "modules" { {select *} {set x 1} {multi} - {del x} + {unlink x} {lpush before_evicted x} {incr evicted} {exec} diff --git a/tests/unit/moduleapi/propagate.tcl b/tests/unit/moduleapi/propagate.tcl index 90a369da2..89f79998f 100644 --- a/tests/unit/moduleapi/propagate.tcl +++ b/tests/unit/moduleapi/propagate.tcl @@ -112,19 +112,19 @@ tags "modules" { {incr notifications} {incr notifications} {incr testkeyspace:expired} - {del asdf*} + {unlink asdf*} {exec} {multi} {incr notifications} {incr notifications} {incr testkeyspace:expired} - {del asdf*} + {unlink asdf*} {exec} {multi} {incr notifications} {incr notifications} {incr testkeyspace:expired} - {del asdf*} + {unlink asdf*} {exec} } close_replication_stream $repl @@ -211,15 +211,15 @@ tags "modules" { {exec} {multi} {incr notifications} - {del asdf*} + {unlink asdf*} {exec} {multi} {incr notifications} - {del asdf*} + {unlink asdf*} {exec} {multi} {incr notifications} - {del asdf*} + {unlink asdf*} {exec} {multi} {incr notifications} @@ -257,11 +257,11 @@ tags "modules" { {exec} {multi} {incr notifications} - {del timer-maxmemory-volatile-*} + {unlink timer-maxmemory-volatile-*} {exec} {multi} {incr notifications} - {del timer-maxmemory-volatile-*} + {unlink timer-maxmemory-volatile-*} {exec} } close_replication_stream $repl @@ -588,7 +588,7 @@ tags "modules" { assert_replication_stream $repl { {multi} {select *} - {del k1} + {unlink k1} {propagate-test.incr k1} {exec} } @@ -619,9 +619,9 @@ tags "modules" { fail "Failed to wait for set to be replicated" } - # Currently the `del` command comes after the notification. + # Currently the `unlink` command comes after the notification. # When we fix spop to fire notification at the end (like all other commands), - # the `del` will come first. + # the `unlink` will come first. assert_replication_stream $repl { {multi} {select *} @@ -631,7 +631,7 @@ tags "modules" { {multi} {incr notifications} {incr notifications} - {del s} + {unlink s} {exec} } close_replication_stream $repl diff --git a/tests/unit/type/list.tcl b/tests/unit/type/list.tcl index 4773a5882..83a93bffb 100644 --- a/tests/unit/type/list.tcl +++ b/tests/unit/type/list.tcl @@ -1176,7 +1176,7 @@ foreach {pop} {BLPOP BLMPOP_LEFT} { {swapdb 1 9} {select 9} {set somekey1 someval1} - {del k} + {unlink k} {select 1} {set somekey2 someval2} } @@ -1220,7 +1220,7 @@ foreach {pop} {BLPOP BLMPOP_LEFT} { {rpush k hello} {pexpireat k *} {exec} - {del k} + {unlink k} } close_replication_stream $repl # Restore server and client state diff --git a/valkey.conf b/valkey.conf index 2f1d1315c..9c96bcdab 100644 --- a/valkey.conf +++ b/valkey.conf @@ -1277,29 +1277,32 @@ acllog-max-len 128 # its primary, the content of the whole database is removed in order to # load the RDB file just transferred. # -# In all the above cases the default is to delete objects in a blocking way, -# like if DEL was called. However you can configure each case specifically -# in order to instead release memory in a non-blocking way like if UNLINK -# was called, using the following configuration directives. +# In all the above cases the old default is to delete objects in a blocking way, +# like if DEL was called. Now the new default is release memory in a non-blocking +# way like if UNLINK was called. -lazyfree-lazy-eviction no -lazyfree-lazy-expire no -lazyfree-lazy-server-del no -replica-lazy-flush no +lazyfree-lazy-eviction yes +lazyfree-lazy-expire yes +lazyfree-lazy-server-del yes +replica-lazy-flush yes # It is also possible, for the case when to replace the user code DEL calls # with UNLINK calls is not easy, to modify the default behavior of the DEL # command to act exactly like UNLINK, using the following configuration # directive: -lazyfree-lazy-user-del no +lazyfree-lazy-user-del yes # FLUSHDB, FLUSHALL, SCRIPT FLUSH and FUNCTION FLUSH support both asynchronous and synchronous # deletion, which can be controlled by passing the [SYNC|ASYNC] flags into the # commands. When neither flag is passed, this directive will be used to determine # if the data should be deleted asynchronously. -lazyfree-lazy-user-flush no +# There are many problems with running flush synchronously. Even in single CPU +# environments, the thread managers should balance between the freeing and +# serving incoming requests. The default value is yes. + +lazyfree-lazy-user-flush yes ################################ THREADED I/O #################################