diff options
Diffstat (limited to 'examples/redis-unstable/tests/integration/aof-multi-part.tcl')
| -rw-r--r-- | examples/redis-unstable/tests/integration/aof-multi-part.tcl | 1538 |
1 files changed, 0 insertions, 1538 deletions
diff --git a/examples/redis-unstable/tests/integration/aof-multi-part.tcl b/examples/redis-unstable/tests/integration/aof-multi-part.tcl deleted file mode 100644 index 5a00250..0000000 --- a/examples/redis-unstable/tests/integration/aof-multi-part.tcl +++ /dev/null @@ -1,1538 +0,0 @@ -source tests/support/aofmanifest.tcl -set defaults {appendonly {yes} appendfilename {appendonly.aof} appenddirname {appendonlydir} auto-aof-rewrite-percentage {0}} -set server_path [tmpdir server.multi.aof] -set aof_dirname "appendonlydir" -set aof_basename "appendonly.aof" -set aof_dirpath "$server_path/$aof_dirname" -set aof_base1_file "$server_path/$aof_dirname/${aof_basename}.1$::base_aof_sufix$::aof_format_suffix" -set aof_base2_file "$server_path/$aof_dirname/${aof_basename}.2$::base_aof_sufix$::aof_format_suffix" -set aof_incr1_file "$server_path/$aof_dirname/${aof_basename}.1$::incr_aof_sufix$::aof_format_suffix" -set aof_incr2_file "$server_path/$aof_dirname/${aof_basename}.2$::incr_aof_sufix$::aof_format_suffix" -set aof_incr3_file "$server_path/$aof_dirname/${aof_basename}.3$::incr_aof_sufix$::aof_format_suffix" -set aof_manifest_file "$server_path/$aof_dirname/${aof_basename}$::manifest_suffix" -set aof_old_name_old_path "$server_path/$aof_basename" -set aof_old_name_new_path "$aof_dirpath/$aof_basename" -set aof_old_name_old_path2 "$server_path/${aof_basename}2" -set aof_manifest_file2 "$server_path/$aof_dirname/${aof_basename}2$::manifest_suffix" - -tags {"external:skip"} { - - # Test Part 1 - - # In order to test the loading logic of redis under different combinations of manifest and AOF. - # We will manually construct the manifest file and AOF, and then start redis to verify whether - # the redis behavior is as expected. - - test {Multi Part AOF can't load data when some file missing} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr2_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - append_to_manifest "file appendonly.aof.2.incr.aof seq 2 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "appendonly.aof.1.incr.aof .*No such file or directory"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the sequence not increase monotonically} { - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr2_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.2.incr.aof seq 2 type i\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "Found a non-monotonic sequence number"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when there are blank lines in the manifest file} { - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr3_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - append_to_manifest "\n" - append_to_manifest "file appendonly.aof.3.incr.aof seq 3 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "Invalid AOF manifest file format"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when there is a duplicate base file} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_base2_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.2.base.aof seq 2 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "Found duplicate base file information"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest format is wrong (type unknown)} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type x\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "Unknown AOF file type"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest format is wrong (missing key)} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "filx appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 2 [count_message_lines $server_path/stdout "Invalid AOF manifest file format"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest format is wrong (line too short)} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 3 [count_message_lines $server_path/stdout "Invalid AOF manifest file format"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest format is wrong (line too long)} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "The AOF manifest file contains too long line"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest format is wrong (odd parameter)} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i newkey\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 4 [count_message_lines $server_path/stdout "Invalid AOF manifest file format"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can't load data when the manifest file is empty} { - create_aof_manifest $aof_dirpath $aof_manifest_file { - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "Found an empty AOF manifest"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can start when no aof and no manifest} { - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - - set client [redis [srv host] [srv port] 0 $::tls] - - assert_equal OK [$client set k1 v1] - assert_equal v1 [$client get k1] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can start when we have en empty AOF dir} { - create_aof_dir $aof_dirpath - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - } - } - - test {Multi Part AOF can load data discontinuously increasing sequence} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof $aof_dirpath $aof_incr3_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - append_to_manifest "file appendonly.aof.3.incr.aof seq 3 type i\n" - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - assert_equal v3 [$client get k3] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can load data when manifest add new k-v} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof $aof_dirpath $aof_incr3_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b newkey newvalue\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - append_to_manifest "file appendonly.aof.3.incr.aof seq 3 type i\n" - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - assert_equal v3 [$client get k3] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can load data when some AOFs are empty} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - } - - create_aof $aof_dirpath $aof_incr3_file { - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - append_to_manifest "file appendonly.aof.3.incr.aof seq 3 type i\n" - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal "" [$client get k2] - assert_equal v3 [$client get k3] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can load data from old version redis (rdb preamble no)} { - create_aof $server_path $aof_old_name_old_path { - append_to_aof [formatCommand set k1 v1] - append_to_aof [formatCommand set k2 v2] - append_to_aof [formatCommand set k3 v3] - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - assert_equal v3 [$client get k3] - - assert_equal 0 [check_file_exist $server_path $aof_basename] - assert_equal 1 [check_file_exist $aof_dirpath $aof_basename] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - assert_equal OK [$client set k4 v4] - - $client bgrewriteaof - waitForBgrewriteaof $client - - assert_equal OK [$client set k5 v5] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - } - - set d1 [$client debug digest] - $client debug loadaof - set d2 [$client debug digest] - assert {$d1 eq $d2} - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can load data from old version redis (rdb preamble yes)} { - exec cp tests/assets/rdb-preamble.aof $aof_old_name_old_path - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - # k1 k2 in rdb header and k3 in AOF tail - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - assert_equal v3 [$client get k3] - - assert_equal 0 [check_file_exist $server_path $aof_basename] - assert_equal 1 [check_file_exist $aof_dirpath $aof_basename] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - assert_equal OK [$client set k4 v4] - - $client bgrewriteaof - waitForBgrewriteaof $client - - assert_equal OK [$client set k5 v5] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - } - - set d1 [$client debug digest] - $client debug loadaof - set d2 [$client debug digest] - assert {$d1 eq $d2} - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can continue the upgrade from the interrupted upgrade state} { - create_aof $server_path $aof_old_name_old_path { - append_to_aof [formatCommand set k1 v1] - append_to_aof [formatCommand set k2 v2] - append_to_aof [formatCommand set k3 v3] - } - - # Create a layout of an interrupted upgrade (interrupted before the rename). - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof seq 1 type b\n" - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - assert_equal v3 [$client get k3] - - assert_equal 0 [check_file_exist $server_path $aof_basename] - assert_equal 1 [check_file_exist $aof_dirpath $aof_basename] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can be loaded correctly when both server dir and aof dir contain old AOF} { - create_aof $server_path $aof_old_name_old_path { - append_to_aof [formatCommand set k1 v1] - append_to_aof [formatCommand set k2 v2] - append_to_aof [formatCommand set k3 v3] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof seq 1 type b\n" - } - - create_aof $aof_dirpath $aof_old_name_new_path { - append_to_aof [formatCommand set k4 v4] - append_to_aof [formatCommand set k5 v5] - append_to_aof [formatCommand set k6 v6] - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal 0 [$client exists k1] - assert_equal 0 [$client exists k2] - assert_equal 0 [$client exists k3] - - assert_equal v4 [$client get k4] - assert_equal v5 [$client get k5] - assert_equal v6 [$client get k6] - - assert_equal 1 [check_file_exist $server_path $aof_basename] - assert_equal 1 [check_file_exist $aof_dirpath $aof_basename] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - } - - clean_aof_persistence $aof_dirpath - catch {exec rm -rf $aof_old_name_old_path} - } - - test {Multi Part AOF can't load data when the manifest contains the old AOF file name but the file does not exist in server dir and aof dir} { - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof seq 1 type b\n" - } - - start_server_aof_ex [list dir $server_path] [list wait_ready false] { - wait_for_condition 100 50 { - ! [is_alive [srv pid]] - } else { - fail "AOF loading didn't fail" - } - - assert_equal 1 [count_message_lines $server_path/stdout "appendonly.aof .*No such file or directory"] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can upgrade when when two redis share the same server dir} { - create_aof $server_path $aof_old_name_old_path { - append_to_aof [formatCommand set k1 v1] - append_to_aof [formatCommand set k2 v2] - append_to_aof [formatCommand set k3 v3] - } - - create_aof $server_path $aof_old_name_old_path2 { - append_to_aof [formatCommand set k4 v4] - append_to_aof [formatCommand set k5 v5] - append_to_aof [formatCommand set k6 v6] - } - - start_server_aof [list dir $server_path] { - set redis1 [redis [srv host] [srv port] 0 $::tls] - - start_server [list overrides [list dir $server_path appendonly yes appendfilename appendonly.aof2]] { - set redis2 [redis [srv host] [srv port] 0 $::tls] - - test "Multi Part AOF can upgrade when when two redis share the same server dir (redis1)" { - wait_done_loading $redis1 - assert_equal v1 [$redis1 get k1] - assert_equal v2 [$redis1 get k2] - assert_equal v3 [$redis1 get k3] - - assert_equal 0 [$redis1 exists k4] - assert_equal 0 [$redis1 exists k5] - assert_equal 0 [$redis1 exists k6] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - $redis1 bgrewriteaof - waitForBgrewriteaof $redis1 - - assert_equal OK [$redis1 set k v] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - } - - set d1 [$redis1 debug digest] - $redis1 debug loadaof - set d2 [$redis1 debug digest] - assert {$d1 eq $d2} - } - - test "Multi Part AOF can upgrade when when two redis share the same server dir (redis2)" { - wait_done_loading $redis2 - - assert_equal 0 [$redis2 exists k1] - assert_equal 0 [$redis2 exists k2] - assert_equal 0 [$redis2 exists k3] - - assert_equal v4 [$redis2 get k4] - assert_equal v5 [$redis2 get k5] - assert_equal v6 [$redis2 get k6] - - assert_aof_manifest_content $aof_manifest_file2 { - {file appendonly.aof2 seq 1 type b} - {file appendonly.aof2.1.incr.aof seq 1 type i} - } - - $redis2 bgrewriteaof - waitForBgrewriteaof $redis2 - - assert_equal OK [$redis2 set k v] - - assert_aof_manifest_content $aof_manifest_file2 { - {file appendonly.aof2.2.base.rdb seq 2 type b} - {file appendonly.aof2.2.incr.aof seq 2 type i} - } - - set d1 [$redis2 debug digest] - $redis2 debug loadaof - set d2 [$redis2 debug digest] - assert {$d1 eq $d2} - } - } - } - } - - test {Multi Part AOF can handle appendfilename contains whitespaces} { - start_server [list overrides [list appendonly yes appendfilename "\" file seq \\n\\n.aof \""]] { - set dir [get_redis_dir] - set aof_manifest_name [format "%s/%s/%s%s" $dir "appendonlydir" " file seq \n\n.aof " $::manifest_suffix] - set redis [redis [srv host] [srv port] 0 $::tls] - - assert_equal OK [$redis set k1 v1] - - $redis bgrewriteaof - waitForBgrewriteaof $redis - - assert_aof_manifest_content $aof_manifest_name { - {file " file seq \n\n.aof .2.base.rdb" seq 2 type b} - {file " file seq \n\n.aof .2.incr.aof" seq 2 type i} - } - - set d1 [$redis debug digest] - $redis debug loadaof - set d2 [$redis debug digest] - assert {$d1 eq $d2} - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can create BASE (RDB format) when redis starts from empty} { - start_server_aof [list dir $server_path] { - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::base_aof_sufix}${::rdb_format_suffix}"] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - $client set foo behavior - - set d1 [$client debug digest] - $client debug loadaof - set d2 [$client debug digest] - assert {$d1 eq $d2} - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can create BASE (AOF format) when redis starts from empty} { - start_server_aof [list dir $server_path aof-use-rdb-preamble no] { - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::base_aof_sufix}${::aof_format_suffix}"] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - $client set foo behavior - - set d1 [$client debug digest] - $client debug loadaof - set d2 [$client debug digest] - assert {$d1 eq $d2} - } - - clean_aof_persistence $aof_dirpath - } - - # Test Part 2 - # - # To test whether the AOFRW behaves as expected during the redis run. - # We will start redis first, then perform pressure writing, enable and disable AOF, and manually - # and automatically run bgrewrite and other actions, to test whether the correct AOF file is created, - # whether the correct manifest is generated, whether the data can be reload correctly under continuous - # writing pressure, etc. - - - start_server {tags {"Multi Part AOF"} overrides {aof-use-rdb-preamble {yes} appendonly {no} save {}}} { - set dir [get_redis_dir] - set aof_basename "appendonly.aof" - set aof_dirname "appendonlydir" - set aof_dirpath "$dir/$aof_dirname" - set aof_manifest_name "$aof_basename$::manifest_suffix" - set aof_manifest_file "$dir/$aof_dirname/$aof_manifest_name" - - set master [srv 0 client] - set master_host [srv 0 host] - set master_port [srv 0 port] - - catch {exec rm -rf $aof_manifest_file} - - test "Make sure aof manifest $aof_manifest_name not in aof directory" { - assert_equal 0 [file exists $aof_manifest_file] - } - - test "AOF enable will create manifest file" { - r config set appendonly yes ; # Will create manifest and new INCR aof - r config set auto-aof-rewrite-percentage 0 ; # Disable auto-rewrite. - waitForBgrewriteaof r - - # Start write load - set load_handle0 [start_write_load $master_host $master_port 10] - - wait_for_condition 50 100 { - [r dbsize] > 0 - } else { - fail "No write load detected." - } - - # First AOFRW done - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - # Check we really have these files - assert_equal 1 [check_file_exist $aof_dirpath $aof_manifest_name] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::incr_aof_sufix}${::aof_format_suffix}"] - - r bgrewriteaof - waitForBgrewriteaof r - - # The second AOFRW done - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - } - - assert_equal 1 [check_file_exist $aof_dirpath $aof_manifest_name] - # Wait bio delete history - wait_for_condition 1000 10 { - [check_file_exist $aof_dirpath "${aof_basename}.1${::base_aof_sufix}${::rdb_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.1${::incr_aof_sufix}${::aof_format_suffix}"] == 0 - } else { - fail "Failed to delete history AOF" - } - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.2${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.2${::incr_aof_sufix}${::aof_format_suffix}"] - - stop_write_load $load_handle0 - wait_load_handlers_disconnected - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - } - - test "AOF multiple rewrite failures will open multiple INCR AOFs" { - # Start write load - r config set rdb-key-save-delay 10000000 - - set orig_size [r dbsize] - set load_handle0 [start_write_load $master_host $master_port 10] - - wait_for_condition 50 100 { - [r dbsize] > $orig_size - } else { - fail "No write load detected." - } - - # Let AOFRW fail three times - r bgrewriteaof - set pid1 [get_child_pid 0] - catch {exec kill -9 $pid1} - waitForBgrewriteaof r - - r bgrewriteaof - set pid2 [get_child_pid 0] - catch {exec kill -9 $pid2} - waitForBgrewriteaof r - - r bgrewriteaof - set pid3 [get_child_pid 0] - catch {exec kill -9 $pid3} - waitForBgrewriteaof r - - assert_equal 0 [check_file_exist $dir "temp-rewriteaof-bg-$pid1.aof"] - assert_equal 0 [check_file_exist $dir "temp-rewriteaof-bg-$pid2.aof"] - assert_equal 0 [check_file_exist $dir "temp-rewriteaof-bg-$pid3.aof"] - - # We will have four INCR AOFs - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - {file appendonly.aof.3.incr.aof seq 3 type i} - {file appendonly.aof.4.incr.aof seq 4 type i} - {file appendonly.aof.5.incr.aof seq 5 type i} - } - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.2${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.2${::incr_aof_sufix}${::aof_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.3${::incr_aof_sufix}${::aof_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.4${::incr_aof_sufix}${::aof_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.5${::incr_aof_sufix}${::aof_format_suffix}"] - - stop_write_load $load_handle0 - wait_load_handlers_disconnected - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - - r config set rdb-key-save-delay 0 - catch {exec kill -9 [get_child_pid 0]} - wait_for_condition 1000 10 { - [s rdb_bgsave_in_progress] eq 0 - } else { - fail "bgsave did not stop in time" - } - - # AOFRW success - r bgrewriteaof - waitForBgrewriteaof r - - # All previous INCR AOFs have become history - # and have be deleted - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.3.base.rdb seq 3 type b} - {file appendonly.aof.6.incr.aof seq 6 type i} - } - - # Wait bio delete history - wait_for_condition 1000 10 { - [check_file_exist $aof_dirpath "${aof_basename}.2${::base_aof_sufix}${::rdb_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.2${::incr_aof_sufix}${::aof_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.3${::incr_aof_sufix}${::aof_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.4${::incr_aof_sufix}${::aof_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.5${::incr_aof_sufix}${::aof_format_suffix}"] == 0 - } else { - fail "Failed to delete history AOF" - } - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.3${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.6${::incr_aof_sufix}${::aof_format_suffix}"] - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - } - - test "AOF rewrite doesn't open new aof when AOF turn off" { - r config set appendonly no - - r bgrewriteaof - waitForBgrewriteaof r - - # We only have BASE AOF, no INCR AOF - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.4.base.rdb seq 4 type b} - } - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.4${::base_aof_sufix}${::rdb_format_suffix}"] - wait_for_condition 1000 10 { - [check_file_exist $aof_dirpath "${aof_basename}.6${::incr_aof_sufix}${::aof_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.7${::incr_aof_sufix}${::aof_format_suffix}"] == 0 - } else { - fail "Failed to delete history AOF" - } - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - - # Turn on AOF again - r config set appendonly yes - waitForBgrewriteaof r - - # A new INCR AOF was created - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.5.base.rdb seq 5 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - # Wait bio delete history - wait_for_condition 1000 10 { - [check_file_exist $aof_dirpath "${aof_basename}.4${::base_aof_sufix}${::rdb_format_suffix}"] == 0 - } else { - fail "Failed to delete history AOF" - } - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.5${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::incr_aof_sufix}${::aof_format_suffix}"] - } - - test "AOF enable/disable auto gc" { - r config set aof-disable-auto-gc yes - - r bgrewriteaof - waitForBgrewriteaof r - - r bgrewriteaof - waitForBgrewriteaof r - - # We can see four history AOFs (Evolved from two BASE and two INCR) - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.7.base.rdb seq 7 type b} - {file appendonly.aof.2.incr.aof seq 2 type h} - {file appendonly.aof.6.base.rdb seq 6 type h} - {file appendonly.aof.1.incr.aof seq 1 type h} - {file appendonly.aof.5.base.rdb seq 5 type h} - {file appendonly.aof.3.incr.aof seq 3 type i} - } - - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.5${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.6${::base_aof_sufix}${::rdb_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.1${::incr_aof_sufix}${::aof_format_suffix}"] - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.2${::incr_aof_sufix}${::aof_format_suffix}"] - - r config set aof-disable-auto-gc no - - # Auto gc success - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.7.base.rdb seq 7 type b} - {file appendonly.aof.3.incr.aof seq 3 type i} - } - - # wait bio delete history - wait_for_condition 1000 10 { - [check_file_exist $aof_dirpath "${aof_basename}.5${::base_aof_sufix}${::rdb_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.6${::base_aof_sufix}${::rdb_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.1${::incr_aof_sufix}${::aof_format_suffix}"] == 0 && - [check_file_exist $aof_dirpath "${aof_basename}.2${::incr_aof_sufix}${::aof_format_suffix}"] == 0 - } else { - fail "Failed to delete history AOF" - } - } - - test "AOF can produce consecutive sequence number after reload" { - # Current manifest, BASE seq 7 and INCR seq 3 - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.7.base.rdb seq 7 type b} - {file appendonly.aof.3.incr.aof seq 3 type i} - } - - r debug loadaof - - # Trigger AOFRW - r bgrewriteaof - waitForBgrewriteaof r - - # Now BASE seq is 8 and INCR seq is 4 - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.8.base.rdb seq 8 type b} - {file appendonly.aof.4.incr.aof seq 4 type i} - } - } - - test "AOF enable during BGSAVE will not write data util AOFRW finish" { - r config set appendonly no - r config set save "" - r config set rdb-key-save-delay 10000000 - - r set k1 v1 - r bgsave - - wait_for_condition 1000 10 { - [s rdb_bgsave_in_progress] eq 1 - } else { - fail "bgsave did not start in time" - } - - # Make server.aof_rewrite_scheduled = 1 - r config set appendonly yes - assert_equal [s aof_rewrite_scheduled] 1 - - # Not open new INCR aof - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.8.base.rdb seq 8 type b} - {file appendonly.aof.4.incr.aof seq 4 type i} - } - - r set k2 v2 - r debug loadaof - - # Both k1 and k2 lost - assert_equal 0 [r exists k1] - assert_equal 0 [r exists k2] - - set total_forks [s total_forks] - assert_equal [s rdb_bgsave_in_progress] 1 - r config set rdb-key-save-delay 0 - catch {exec kill -9 [get_child_pid 0]} - wait_for_condition 1000 10 { - [s rdb_bgsave_in_progress] eq 0 - } else { - fail "bgsave did not stop in time" - } - - # Make sure AOFRW was scheduled - wait_for_condition 1000 10 { - [s total_forks] == [expr $total_forks + 1] - } else { - fail "aof rewrite did not scheduled" - } - waitForBgrewriteaof r - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.9.base.rdb seq 9 type b} - {file appendonly.aof.5.incr.aof seq 5 type i} - } - - r set k3 v3 - r debug loadaof - assert_equal v3 [r get k3] - } - - test "AOF will trigger limit when AOFRW fails many times" { - # Clear all data and trigger a successful AOFRW, so we can let - # server.aof_current_size equal to 0 - r flushall - r bgrewriteaof - waitForBgrewriteaof r - - r config set rdb-key-save-delay 10000000 - # Let us trigger AOFRW easily - r config set auto-aof-rewrite-percentage 1 - r config set auto-aof-rewrite-min-size 1kb - - # Set a key so that AOFRW can be delayed - r set k v - - # Let AOFRW fail 3 times, this will trigger AOFRW limit - r bgrewriteaof - catch {exec kill -9 [get_child_pid 0]} - waitForBgrewriteaof r - - r bgrewriteaof - catch {exec kill -9 [get_child_pid 0]} - waitForBgrewriteaof r - - r bgrewriteaof - catch {exec kill -9 [get_child_pid 0]} - waitForBgrewriteaof r - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.10.base.rdb seq 10 type b} - {file appendonly.aof.6.incr.aof seq 6 type i} - {file appendonly.aof.7.incr.aof seq 7 type i} - {file appendonly.aof.8.incr.aof seq 8 type i} - {file appendonly.aof.9.incr.aof seq 9 type i} - } - - # Write 1KB data to trigger AOFRW - r set x [string repeat x 1024] - - # Make sure we have limit log - wait_for_condition 1000 50 { - [count_log_message 0 "triggered the limit"] == 1 - } else { - fail "aof rewrite did not trigger limit" - } - assert_equal [status r aof_rewrite_in_progress] 0 - - # No new INCR AOF be created - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.10.base.rdb seq 10 type b} - {file appendonly.aof.6.incr.aof seq 6 type i} - {file appendonly.aof.7.incr.aof seq 7 type i} - {file appendonly.aof.8.incr.aof seq 8 type i} - {file appendonly.aof.9.incr.aof seq 9 type i} - } - - # Turn off auto rewrite - r config set auto-aof-rewrite-percentage 0 - r config set rdb-key-save-delay 0 - catch {exec kill -9 [get_child_pid 0]} - wait_for_condition 1000 10 { - [s aof_rewrite_in_progress] eq 0 - } else { - fail "aof rewrite did not stop in time" - } - - # We can still manually execute AOFRW immediately - r bgrewriteaof - waitForBgrewriteaof r - - # Can create New INCR AOF - assert_equal 1 [check_file_exist $aof_dirpath "${aof_basename}.10${::incr_aof_sufix}${::aof_format_suffix}"] - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.11.base.rdb seq 11 type b} - {file appendonly.aof.10.incr.aof seq 10 type i} - } - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - } - - start_server {overrides {aof-use-rdb-preamble {yes} appendonly {no} save {}}} { - set dir [get_redis_dir] - set aof_basename "appendonly.aof" - set aof_dirname "appendonlydir" - set aof_dirpath "$dir/$aof_dirname" - set aof_manifest_name "$aof_basename$::manifest_suffix" - set aof_manifest_file "$dir/$aof_dirname/$aof_manifest_name" - - set master [srv 0 client] - set master_host [srv 0 host] - set master_port [srv 0 port] - - test "AOF will open a temporary INCR AOF to accumulate data until the first AOFRW success when AOF is dynamically enabled" { - r config set save "" - # Increase AOFRW execution time to give us enough time to kill it - r config set rdb-key-save-delay 10000000 - - # Start write load - set load_handle0 [start_write_load $master_host $master_port 10] - - wait_for_condition 50 100 { - [r dbsize] > 0 - } else { - fail "No write load detected." - } - - # Enable AOF will trigger an initialized AOFRW - r config set appendonly yes - # Let AOFRW fail - assert_equal 1 [s aof_rewrite_in_progress] - set pid1 [get_child_pid 0] - catch {exec kill -9 $pid1} - - # Wait for AOFRW to exit and delete temp incr aof - wait_for_condition 1000 100 { - [count_log_message 0 "Removing the temp incr aof file"] == 1 - } else { - fail "temp aof did not delete" - } - - # Make sure manifest file is not created - assert_equal 0 [check_file_exist $aof_dirpath $aof_manifest_name] - # Make sure BASE AOF is not created - assert_equal 0 [check_file_exist $aof_dirpath "${aof_basename}.1${::base_aof_sufix}${::rdb_format_suffix}"] - - # Make sure the next AOFRW has started - wait_for_condition 1000 50 { - [s aof_rewrite_in_progress] == 1 - } else { - fail "aof rewrite did not scheduled" - } - - # Do a successful AOFRW - set total_forks [s total_forks] - r config set rdb-key-save-delay 0 - catch {exec kill -9 [get_child_pid 0]} - - # Make sure the next AOFRW has started - wait_for_condition 1000 10 { - [s total_forks] == [expr $total_forks + 1] - } else { - fail "aof rewrite did not scheduled" - } - waitForBgrewriteaof r - - assert_equal 2 [count_log_message 0 "Removing the temp incr aof file"] - - # BASE and INCR AOF are successfully created - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - stop_write_load $load_handle0 - wait_load_handlers_disconnected - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - - # Dynamic disable AOF again - r config set appendonly no - - # Disabling AOF does not delete previous AOF files - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - - assert_equal 0 [s rdb_changes_since_last_save] - r config set rdb-key-save-delay 10000000 - set load_handle0 [start_write_load $master_host $master_port 10] - wait_for_condition 50 100 { - [s rdb_changes_since_last_save] > 0 - } else { - fail "No write load detected." - } - - # Re-enable AOF - r config set appendonly yes - - # Let AOFRW fail - assert_equal 1 [s aof_rewrite_in_progress] - set pid1 [get_child_pid 0] - catch {exec kill -9 $pid1} - - # Wait for AOFRW to exit and delete temp incr aof - wait_for_condition 1000 100 { - [count_log_message 0 "Removing the temp incr aof file"] == 3 - } else { - fail "temp aof did not delete 3 times" - } - - # Make sure no new incr AOF was created - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - - # Make sure the next AOFRW has started - wait_for_condition 1000 50 { - [s aof_rewrite_in_progress] == 1 - } else { - fail "aof rewrite did not scheduled" - } - - # Do a successful AOFRW - set total_forks [s total_forks] - r config set rdb-key-save-delay 0 - catch {exec kill -9 [get_child_pid 0]} - - wait_for_condition 1000 10 { - [s total_forks] == [expr $total_forks + 1] - } else { - fail "aof rewrite did not scheduled" - } - waitForBgrewriteaof r - - assert_equal 4 [count_log_message 0 "Removing the temp incr aof file"] - - # New BASE and INCR AOF are successfully created - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i} - } - - stop_write_load $load_handle0 - wait_load_handlers_disconnected - - set d1 [r debug digest] - r debug loadaof - set d2 [r debug digest] - assert {$d1 eq $d2} - } - } - } - - # Test Part 3 - # - # Test if INCR AOF offset information is as expected - test {Multi Part AOF writes start offset in the manifest} { - set aof_dirpath "$server_path/$aof_dirname" - set aof_manifest_file "$server_path/$aof_dirname/${aof_basename}$::manifest_suffix" - - start_server_aof [list dir $server_path] { - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - # The manifest file has startoffset now - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i startoffset 0} - } - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF won't add the offset of incr AOF from old version} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i\n" - } - - start_server_aof [list dir $server_path] { - assert_equal 1 [is_alive [srv pid]] - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_equal v1 [$client get k1] - assert_equal v2 [$client get k2] - - $client set k3 v3 - catch {$client shutdown} - - # Should not add offset to the manifest since we also don't know the right - # starting replication of them. - set fp [open $aof_manifest_file r] - set content [read $fp] - close $fp - assert ![regexp {startoffset} $content] - - # The manifest file still have information from the old version - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.aof seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i} - } - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can update master_repl_offset with only startoffset info} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i startoffset 100\n" - } - - start_server [list overrides [list dir $server_path appendonly yes ]] { - wait_done_loading r - r select 0 - assert_equal v1 [r get k1] - assert_equal v2 [r get k2] - - # After loading AOF, redis will update the replication offset based on - # the information of the last INCR AOF, to avoid the rollback of the - # start offset of new INCR AOF. If the INCR file doesn't have an end offset - # info, redis will calculate the replication offset by the start offset - # plus the file size. - set file_size [file size $aof_incr1_file] - set offset [expr $file_size + 100] - assert_equal $offset [s master_repl_offset] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF can update master_repl_offset with endoffset info} { - create_aof $aof_dirpath $aof_base1_file { - append_to_aof [formatCommand set k1 v1] - } - - create_aof $aof_dirpath $aof_incr1_file { - append_to_aof [formatCommand set k2 v2] - } - - create_aof_manifest $aof_dirpath $aof_manifest_file { - append_to_manifest "file appendonly.aof.1.base.aof seq 1 type b\n" - append_to_manifest "file appendonly.aof.1.incr.aof seq 1 type i startoffset 100 endoffset 200\n" - } - - start_server [list overrides [list dir $server_path appendonly yes ]] { - wait_done_loading r - r select 0 - assert_equal v1 [r get k1] - assert_equal v2 [r get k2] - - # If the INCR file has an end offset, redis directly uses it as replication offset - assert_equal 200 [s master_repl_offset] - - # We should reset endoffset in manifest file - set fp [open $aof_manifest_file r] - set content [read $fp] - close $fp - assert ![regexp {endoffset} $content] - } - - clean_aof_persistence $aof_dirpath - } - - test {Multi Part AOF will add the end offset if we close gracefully the AOF} { - start_server_aof [list dir $server_path] { - set client [redis [srv host] [srv port] 0 $::tls] - wait_done_loading $client - - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i startoffset 0} - } - - $client set k1 v1 - $client set k2 v2 - # Close AOF gracefully when stopping appendonly, we should add endoffset - # in the manifest file, 'endoffset' should be 2 since writing 2 commands - r config set appendonly no - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.1.base.rdb seq 1 type b} - {file appendonly.aof.1.incr.aof seq 1 type i startoffset 0 endoffset 2} - } - r config set appendonly yes - waitForBgrewriteaof $client - - $client set k3 v3 - # Close AOF gracefully when shutting down server, we should add endoffset - # in the manifest file, 'endoffset' should be 3 since writing 3 commands - catch {$client shutdown} - assert_aof_manifest_content $aof_manifest_file { - {file appendonly.aof.2.base.rdb seq 2 type b} - {file appendonly.aof.2.incr.aof seq 2 type i startoffset 2 endoffset 3} - } - } - - clean_aof_persistence $aof_dirpath - } - - test {INCR AOF has accurate start offset when AOFRW} { - start_server [list overrides [list dir $server_path appendonly yes ]] { - r config set auto-aof-rewrite-percentage 0 - - # Start write load to let the master_repl_offset continue increasing - # since appendonly is enabled - set load_handle0 [start_write_load [srv 0 host] [srv 0 port] 10] - wait_for_condition 50 100 { - [r dbsize] > 0 - } else { - fail "No write load detected." - } - - # We obtain the master_repl_offset at the time of bgrewriteaof by pausing - # the redis process, sending pipeline commands, and then resuming the process - set rd [redis_deferring_client] - pause_process [srv 0 pid] - set buf "info replication\r\n" - append buf "bgrewriteaof\r\n" - $rd write $buf - $rd flush - resume_process [srv 0 pid] - # Read the replication offset and the start of the bgrewriteaof - regexp {master_repl_offset:(\d+)} [$rd read] -> offset1 - assert_match {*rewriting started*} [$rd read] - $rd close - - # Get the start offset from the manifest file after bgrewriteaof - waitForBgrewriteaof r - set fp [open $aof_manifest_file r] - set content [read $fp] - close $fp - set offset2 [lindex [regexp -inline {startoffset (\d+)} $content] 1] - - # The start offset of INCR AOF should be the same as master_repl_offset - # when we trigger bgrewriteaof - assert {$offset1 == $offset2} - stop_write_load $load_handle0 - wait_load_handlers_disconnected - } - } -} |
