diff --git a/deps/rocksdb b/deps/rocksdb index 3e30654b509..6a369438d5d 160000 --- a/deps/rocksdb +++ b/deps/rocksdb @@ -1 +1 @@ -Subproject commit 3e30654b509b4c9b9ed6c0df9293113e117832a4 +Subproject commit 6a369438d5d90e67980bc4c4c9fef8cbd376dd8a diff --git a/src/ctrip_swap_iter.c b/src/ctrip_swap_iter.c index 092734c3bca..1bb2be9787a 100644 --- a/src/ctrip_swap_iter.c +++ b/src/ctrip_swap_iter.c @@ -289,6 +289,7 @@ rocksIter *rocksCreateIter(rocks *rocks, redisDb *db) { if (rocks->snapshot) rocksdb_readoptions_set_snapshot(rocks->iter_ropts, rocks->snapshot); rocksdb_options_t* cf_opts[CF_COUNT], *db_opts; db_opts = rocksdb_options_create_copy(rocks->db_opts); + rocksdb_options_set_db_log_dir(db_opts, ""); /* disable background jobs since child have no background threads */ rocksdb_options_set_max_background_jobs(db_opts, 0); rocksdb_options_set_max_background_compactions(db_opts, 0); diff --git a/src/ctrip_swap_rocks.c b/src/ctrip_swap_rocks.c index 13ff5f41bb3..f29bfae318c 100644 --- a/src/ctrip_swap_rocks.c +++ b/src/ctrip_swap_rocks.c @@ -425,7 +425,10 @@ void rocksReleaseCheckpoint(rocks *rocks) { serverLog(LL_NOTICE, "[rocks] releasing checkpoint in (%s).", server.rocksdb_checkpoint_dir); rocksdb_checkpoint_object_destroy(server.rocksdb_checkpoint); server.rocksdb_checkpoint = NULL; - rocksdb_destroy_db(rocks->db_opts, server.rocksdb_checkpoint_dir, &err); + rocksdb_options_t *db_opts = rocksdb_options_create_copy(rocks->db_opts); + rocksdb_options_set_db_log_dir(db_opts, ""); + rocksdb_destroy_db(db_opts, server.rocksdb_checkpoint_dir, &err); + rocksdb_options_destroy(db_opts); if (err != NULL) { serverLog(LL_WARNING, "[rocks] destory db fail: %s", server.rocksdb_checkpoint_dir); } diff --git a/tests/swap/integration/rocksdb_log_rotate.tcl b/tests/swap/integration/rocksdb_log_rotate.tcl new file mode 100644 index 00000000000..b9abec098d8 --- /dev/null +++ b/tests/swap/integration/rocksdb_log_rotate.tcl @@ -0,0 +1,144 @@ + +proc do_fullsync {slave master_host master_port} { + $slave slaveof no one + $slave set testing.fullsync 1 + after 100 + $slave slaveof $master_host $master_port + wait_for_sync $slave +} + + +proc count_old_logs {logs_dir} { + return [llength [glob -nocomplain "$logs_dir/*_LOG.old.*"]] +} + + +proc get_log_file {logs_dir} { + set list [glob -nocomplain "$logs_dir/*_LOG"] + if {[llength $list] != 1} { + return "" + } + return [lindex $list 0] +} + + +start_server {tags {"swap rocksdb-log-rotate"} overrides { + swap-repl-rordb-sync yes +}} { + start_server {overrides { + swap-repl-rordb-sync yes + }} { + set master [srv -1 client] + set master_host [srv -1 host] + set master_port [srv -1 port] + set master_dir [lindex [$master config get dir] 1] + set slave [srv 0 client] + set slave_dir [lindex [$slave config get dir] 1] + + + set master_logs_dir "$master_dir/logs.rocks" + set slave_logs_dir "$slave_dir/logs.rocks" + + $master mset k1 v1 k2 v2 k3 v3 + + test {rocksdb log rotate: step1 ror fullsync logs.rocks/LOG exist} { + $master set k1 v1 + $master set k2 v2 + + $slave slaveof $master_host $master_port + wait_for_sync $slave + + wait_for_condition 50 100 { + [get_log_file $master_logs_dir] != "" + } else { + fail "full sync logs.rocks/LOG exist fail" + } + + assert {[file size [get_log_file $master_logs_dir]] > 1} + assert {[file size [get_log_file $slave_logs_dir]] > 1} + } + + test {rocksdb log rotate:step2 ror fullsync slave LOG.old.* count<=12} { + + + for {set i 0} {$i < 13} {incr i} { + do_fullsync $slave $master_host $master_port + wait_for_condition 50 200 { + [status $master sync_full] == [expr {$i + 2}] + } else { + fail "sync_full not updated" + } + } + + after 500 + + assert {[get_log_file $master_logs_dir] != ""} + + assert {[file size [get_log_file $master_logs_dir]] > 1} + assert {[count_old_logs $master_logs_dir] == 0} + assert {[file size [get_log_file $slave_logs_dir]] > 1} + assert {[count_old_logs $slave_logs_dir] == 11} + } + + + } +} + + +start_server {tags {"swap rocksdb-log-rotate rdb fullsync"} overrides { + swap-repl-rordb-sync no +}} { + start_server {overrides { + swap-repl-rordb-sync no + }} { + set master [srv -1 client] + set master_host [srv -1 host] + set master_port [srv -1 port] + set master_dir [lindex [$master config get dir] 1] + set slave [srv 0 client] + set slave_dir [lindex [$slave config get dir] 1] + + + + set master_logs_dir "$master_dir/logs.rocks" + set slave_logs_dir "$slave_dir/logs.rocks" + + $master mset k1 v1 k2 v2 k3 v3 + + test {rocksdb log rotate: step1 rdb fullsync logs.rocks/LOG exist} { + $master set k1 v1 + $master set k2 v2 + + $slave slaveof $master_host $master_port + wait_for_sync $slave + + wait_for_condition 50 100 { + [get_log_file $master_logs_dir] != "" + } else { + fail "full sync logs.rocks/LOG exist fail" + } + + assert {[file size [get_log_file $master_logs_dir]] > 1} + assert {[file size [get_log_file $slave_logs_dir]] > 1} + } + + test {rocksdb log rotate:step2 rdb fullsync slave LOG.old.* count == 0} { + + for {set i 0} {$i < 13} {incr i} { + do_fullsync $slave $master_host $master_port + wait_for_condition 50 200 { + [status $master sync_full] == [expr {$i + 2}] + } else { + fail "sync_full not updated" + } + } + + assert {[get_log_file $master_logs_dir] != ""} + + assert {[file size [get_log_file $master_logs_dir]] > 1} + assert {[count_old_logs $master_logs_dir] == 0} + assert {[file size [get_log_file $slave_logs_dir]] > 1} + assert {[count_old_logs $slave_logs_dir] == 0} + } + } +} diff --git a/tests/swap/unit/ltrim_check.tcl b/tests/swap/unit/ltrim_check.tcl index 66279e5a86e..965360caee2 100644 --- a/tests/swap/unit/ltrim_check.tcl +++ b/tests/swap/unit/ltrim_check.tcl @@ -20,7 +20,7 @@ start_server {tags {"list" "repl"} overrides {save ""}} { $slave config set swap-debug-evict-keys -1 # Panic on replication error to detect the divergence immediately. - $slave config set propagation-error-behavior panic-on-replicas + # $slave config set propagation-error-behavior panic-on-replicas test {swap-list LTRIM cold-segment repl divergence: no panic and master/replica consistent} { set num_keys 4 diff --git a/tests/test_helper.tcl b/tests/test_helper.tcl index 10012cf7599..15d5b4c62e5 100644 --- a/tests/test_helper.tcl +++ b/tests/test_helper.tcl @@ -122,6 +122,7 @@ set ::disk_tests { swap/integration/expire_evict swap/integration/swap_load swap/integration/persist + swap/integration/rocksdb_log_rotate swap/unit/swap_mode swap/unit/absent_cache swap/unit/dbsize