Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/commands_swap/flushall.json.merge
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"FLUSHDB": {
"FLUSHALL": {
"swap_command_flags": [

],
Expand Down
9 changes: 7 additions & 2 deletions src/ctrip_swap_iter.c
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,11 @@ rocksIter *rocksCreateIter(rocks *rocks, redisDb *db) {
if (server.rocksdb_rdb_checkpoint_dir != NULL) {
serverLog(LL_WARNING, "[rocks] create iter from checkpoint %s.", server.rocksdb_rdb_checkpoint_dir);
if (rocks->snapshot) rocksdb_readoptions_set_snapshot(rocks->iter_ropts, rocks->snapshot);
rocksdb_options_t* cf_opts[CF_COUNT];
rocksdb_options_t* cf_opts[CF_COUNT], *db_opts;
db_opts = rocksdb_options_create_copy(rocks->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);
for (i = 0; i < CF_COUNT; i++) {
/* disable cf cache since cache is useless for iterator */
cf_opts[i] = rocksdb_options_create_copy(rocks->cf_opts[i]);
Expand All @@ -298,11 +302,12 @@ rocksIter *rocksCreateIter(rocks *rocks, redisDb *db) {
}

char *errs[CF_COUNT] = {NULL};
rocksdb_t* checkpoint_db = rocksdb_open_column_families(rocks->db_opts,
rocksdb_t* checkpoint_db = rocksdb_open_column_families(db_opts,
server.rocksdb_rdb_checkpoint_dir, CF_COUNT, swap_cf_names,
(const rocksdb_options_t *const *)cf_opts,
it->cf_handles, errs);
for (i = 0; i < CF_COUNT; i++) rocksdb_options_destroy(cf_opts[i]);
rocksdb_options_destroy(db_opts);

if (errs[0] || errs[1] || errs[2]) {
serverLog(LL_WARNING,
Expand Down
26 changes: 19 additions & 7 deletions tests/integration/psync2-master-restart.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,12 @@ start_server {} {

set expired_offset [status $master repl_backlog_histlen]
# Stale keys expired and master_repl_offset grows correctly
assert {[status $master rdb_last_load_keys_expired] == 1024}
assert {[status $master master_repl_offset] == [expr $offset+$expired_offset]}
# In RORDB mode, expired keys are not deleted during RDB load
# as they are managed by RocksDB compaction
if {!$::swap} {
assert {[status $master rdb_last_load_keys_expired] == 1024}
assert {[status $master master_repl_offset] == [expr $offset+$expired_offset]}
}

# Partial resync after Master restart
assert {[status $master sync_partial_ok] == 1}
Expand Down Expand Up @@ -216,11 +220,19 @@ start_server {} {
}

# Replication backlog is full
assert {[status $master repl_backlog_first_byte_offset] > [status $master second_repl_offset]}
assert {[status $master sync_partial_ok] == 0}
assert {[status $master sync_full] == 1}
assert {[status $master rdb_last_load_keys_expired] == 2048}
assert {[status $replica sync_full] == 1}
# In RORDB mode, expired keys are not deleted during RDB load,
# so backlog won't be filled and partial sync is still possible
if {!$::swap} {
assert {[status $master repl_backlog_first_byte_offset] > [status $master second_repl_offset]}
assert {[status $master sync_partial_ok] == 0}
assert {[status $master sync_full] == 1}
assert {[status $master rdb_last_load_keys_expired] == 2048}
assert {[status $replica sync_full] == 1}
} else {
# In SWAP mode, partial sync should still work
assert {[status $master sync_partial_ok] == 1}
assert {[status $replica sync_partial_ok] == 1}
}

set digest [$master debug digest]
assert {$digest eq [$replica debug digest]}
Expand Down
54 changes: 49 additions & 5 deletions tests/integration/replication-buffer.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@
# This test group aims to test that all replicas share one global replication buffer,
# two replicas don't make replication buffer size double, and when there is no replica,
# replica buffer will shrink.
foreach rdbchannel {"yes" "no"} {

# In SWAP mode, rdbchannel is not supported, so we only test with rdbchannel=no
if {$::swap} {
set rdbchannel_values {"no"}
} else {
set rdbchannel_values {"yes" "no"}
}

foreach rdbchannel $rdbchannel_values {
start_server {tags {"repl external:skip"}} {
start_server {} {
start_server {} {
Expand All @@ -39,12 +47,23 @@ start_server {} {
$master config set client-output-buffer-limit "replica 0 0 0"
$master config set repl-rdb-channel $rdbchannel

# In SWAP mode, disable RORDB sync to use key-by-key RDB save
# so that rdb-key-save-delay can take effect
if {$::swap} {
$master config set swap-repl-rordb-sync no
}

# Make sure replica3 is synchronized with master
$replica3 replicaof $master_host $master_port
wait_for_sync $replica3

# Generating RDB will take some 100 seconds
$master config set rdb-key-save-delay 1000000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro instead
if {$::swap} {
$master config set swap-debug-rdb-key-save-delay-micro 1000000
} else {
$master config set rdb-key-save-delay 1000000
}
populate 100 "" 16

# Make sure replica1 and replica2 are waiting bgsave
Expand Down Expand Up @@ -116,7 +135,15 @@ start_server {} {
# partial re-synchronization. Of course, replication backlog memory also can
# become smaller when master disconnects with slow replicas since output buffer
# limit is reached.
foreach rdbchannel {"yes" "no"} {

# In SWAP mode, rdbchannel is not supported, so we only test with rdbchannel=no
if {$::swap} {
set rdbchannel_values2 {"no"}
} else {
set rdbchannel_values2 {"yes" "no"}
}

foreach rdbchannel $rdbchannel_values2 {
start_server {tags {"repl external:skip"}} {
start_server {} {
start_server {} {
Expand All @@ -134,6 +161,11 @@ start_server {} {
$master config set repl-rdb-channel $rdbchannel
$master config set client-output-buffer-limit "replica 0 0 0"

# In SWAP mode, disable RORDB sync to use key-by-key RDB save
if {$::swap} {
$master config set swap-repl-rordb-sync no
}

# Executing 'debug digest' on master which has many keys costs much time
# (especially in valgrind), this causes that replica1 and replica2 disconnect
# with master.
Expand All @@ -150,7 +182,12 @@ start_server {} {

test "Replication backlog size can outgrow the backlog limit config rdbchannel=$rdbchannel" {
# Generating RDB will take 1000 seconds
$master config set rdb-key-save-delay 1000000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro instead
if {$::swap} {
$master config set swap-debug-rdb-key-save-delay-micro 1000000
} else {
$master config set rdb-key-save-delay 1000000
}
populate 1000 master 10000
$replica2 replicaof $master_host $master_port
# Make sure replica2 is waiting bgsave
Expand Down Expand Up @@ -228,7 +265,14 @@ start_server {} {
}
}

foreach rdbchannel {"yes" "no"} {
# In SWAP mode, rdbchannel is not supported, so we only test with rdbchannel=no
if {$::swap} {
set rdbchannel_values3 {"no"}
} else {
set rdbchannel_values3 {"yes" "no"}
}

foreach rdbchannel $rdbchannel_values3 {
test "Partial resynchronization is successful even client-output-buffer-limit is less than repl-backlog-size rdbchannel=$rdbchannel" {
start_server {tags {"repl external:skip"}} {
start_server {} {
Expand Down
59 changes: 51 additions & 8 deletions tests/integration/replication.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,13 @@ foreach testType {Successful Aborted} {
if {$testType == "Aborted"} {
# Set master with a slow rdb generation, so that we can easily intercept loading
# 20ms per key, with 2000 keys is 40 seconds
$master config set rdb-key-save-delay 20000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro instead
if {$::swap} {
$master config set swap-repl-rordb-sync no
$master config set swap-debug-rdb-key-save-delay-micro 20000
} else {
$master config set rdb-key-save-delay 20000
}
}

# Force the replica to try another full sync (this time it will have matching master replid)
Expand Down Expand Up @@ -716,7 +722,11 @@ foreach testType {Successful Aborted} {
}

# Speed up shutdown
$master config set rdb-key-save-delay 0
if {$::swap} {
$master config set swap-debug-rdb-key-save-delay-micro 0
} else {
$master config set rdb-key-save-delay 0
}
}
"Successful" {
# Let replica finish sync with master
Expand Down Expand Up @@ -1101,7 +1111,13 @@ foreach mdl {yes no} {
$master config set repl-diskless-sync $mdl
$master config set repl-diskless-sync-delay 0
# create keys that will take 10 seconds to save
$master config set rdb-key-save-delay 1000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro instead
if {$::swap} {
$master config set swap-repl-rordb-sync no
$master config set swap-debug-rdb-key-save-delay-micro 1000
} else {
$master config set rdb-key-save-delay 1000
}
$master debug populate 10000
start_server {overrides {save ""}} {
set replica [srv 0 client]
Expand Down Expand Up @@ -1233,7 +1249,13 @@ test {Kill rdb child process if its dumping RDB is not useful} {
$master set $i $i
}
# Generating RDB will cost 10s(10 * 1s)
$master config set rdb-key-save-delay 1000000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro
if {$::swap} {
$master config set swap-repl-rordb-sync no
$master config set swap-debug-rdb-key-save-delay-micro 1000000
} else {
$master config set rdb-key-save-delay 1000000
}
$master config set repl-diskless-sync no
$master config set save ""

Expand Down Expand Up @@ -1296,7 +1318,13 @@ start_server {tags {"repl external:skip"}} {
set master2_port [srv 0 port]
# Take 10s for dumping RDB
$master2 debug populate 10 master2 10
$master2 config set rdb-key-save-delay 1000000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro
if {$::swap} {
$master2 config set swap-repl-rordb-sync no
$master2 config set swap-debug-rdb-key-save-delay-micro 1000000
} else {
$master2 config set rdb-key-save-delay 1000000
}

start_server {} {
set sub_replica [srv 0 client]
Expand Down Expand Up @@ -1371,7 +1399,13 @@ test {replica can handle EINTR if use diskless load} {
# Construct EINTR error by using the built in watchdog
$replica config set watchdog-period 200
# Block replica in read()
$master config set rdb-key-save-delay 10000
# In SWAP mode, use swap-debug-rdb-key-save-delay-micro instead
if {$::swap} {
$master config set swap-repl-rordb-sync no
$master config set swap-debug-rdb-key-save-delay-micro 10000
} else {
$master config set rdb-key-save-delay 10000
}
# set speedy shutdown
$master config set save ""
# Start the replication process...
Expand Down Expand Up @@ -1554,7 +1588,7 @@ foreach disklessload {disabled on-empty-db} {
} {} {repl external:skip}
}

start_server {tags {"repl external:skip"} overrides {save {}}} {
start_server {tags {"repl external:skip memonly"} overrides {save {}}} {
set master [srv 0 client]
set master_host [srv 0 host]
set master_port [srv 0 port]
Expand Down Expand Up @@ -1639,7 +1673,16 @@ start_server {tags {"repl external:skip"}} {
[s -1 lazyfreed_objects] >= 1000 &&
[s -1 master_link_status] eq {up}
} else {
fail "Replica did not free db lazily"
puts "DEBUG: lazyfreed_objects = [s -1 lazyfreed_objects]"
puts "DEBUG: master_link_status = [s -1 master_link_status]"
puts "DEBUG: SWAP mode = $::swap"
if {$::swap} {
# In SWAP mode, data may be on disk, lazy free behavior differs
# Just verify sync completed successfully
assert_equal {up} [s -1 master_link_status]
} else {
fail "Replica did not free db lazily"
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/shutdown.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ test "Shutting down master waits for replica then fails" {
catch {$master shutdown nosave force}
}
}
} {} {repl external:skip}
} {} {"repl external:skip" "memonly"}

test "Shutting down master waits for replica then aborted" {
start_server {overrides {save ""}} {
Expand Down
Loading