mirror of https://github.com/redis/redis.git
				
				
				
			
		
			
	
	
		
			201 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Tcl
		
	
	
	
		
		
			
		
	
	
			201 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Tcl
		
	
	
	
|  | set testmodule [file normalize tests/modules/rdbloadsave.so] | ||
|  | 
 | ||
|  | start_server {tags {"modules"}} { | ||
|  |     r module load $testmodule | ||
|  | 
 | ||
|  |     test "Module rdbloadsave sanity" { | ||
|  |         r test.sanity | ||
|  | 
 | ||
|  |         # Try to load non-existing file
 | ||
|  |         assert_error {*No such file or directory*} {r test.rdbload sanity.rdb} | ||
|  | 
 | ||
|  |         r set x 1 | ||
|  |         assert_equal OK [r test.rdbsave sanity.rdb] | ||
|  | 
 | ||
|  |         r flushdb | ||
|  |         assert_equal OK [r test.rdbload sanity.rdb] | ||
|  |         assert_equal 1 [r get x] | ||
|  |     } | ||
|  | 
 | ||
|  |     test "Module rdbloadsave test with pipelining" { | ||
|  |         r config set save "" | ||
|  |         r config set loading-process-events-interval-bytes 1024 | ||
|  |         r config set key-load-delay 50 | ||
|  |         r flushdb | ||
|  | 
 | ||
|  |         populate 3000 a 1024 | ||
|  |         r set x 111 | ||
|  |         assert_equal [r dbsize] 3001 | ||
|  | 
 | ||
|  |         assert_equal OK [r test.rdbsave blabla.rdb] | ||
|  |         r flushdb | ||
|  |         assert_equal [r dbsize] 0 | ||
|  | 
 | ||
|  |         # Send commands with pipeline. First command will call RM_RdbLoad() in
 | ||
|  |         # the command callback. While loading RDB, Redis can go to networking to
 | ||
|  |         # reply -LOADING. By sending commands in pipeline, we verify it doesn't
 | ||
|  |         # cause a problem.
 | ||
|  |         # e.g. Redis won't try to process next message of the current client
 | ||
|  |         # while it is in the command callback for that client   .
 | ||
|  |         set rd1 [redis_deferring_client] | ||
|  |         $rd1 test.rdbload blabla.rdb | ||
|  | 
 | ||
|  |         wait_for_condition 50 100 { | ||
|  |             [s loading] eq 1 | ||
|  |         } else { | ||
|  |             fail "Redis did not start loading or loaded RDB too fast" | ||
|  |         } | ||
|  | 
 | ||
|  |         $rd1 get x | ||
|  |         $rd1 dbsize | ||
|  | 
 | ||
|  |         assert_equal OK [$rd1 read] | ||
|  |         assert_equal 111 [$rd1 read] | ||
|  |         assert_equal 3001 [$rd1 read] | ||
|  |         r flushdb | ||
|  |         r config set key-load-delay 0 | ||
|  |     } | ||
|  | 
 | ||
|  |     test "Module rdbloadsave with aof" { | ||
|  |         r config set save "" | ||
|  | 
 | ||
|  |         # Enable the AOF
 | ||
|  |         r config set appendonly yes | ||
|  |         r config set auto-aof-rewrite-percentage 0 ; # Disable auto-rewrite.
 | ||
|  |         waitForBgrewriteaof r | ||
|  | 
 | ||
|  |         r set k v1 | ||
|  |         assert_equal OK [r test.rdbsave aoftest.rdb] | ||
|  | 
 | ||
|  |         r set k v2 | ||
|  |         r config set rdb-key-save-delay 10000000 | ||
|  |         r bgrewriteaof | ||
|  | 
 | ||
|  |         # RM_RdbLoad() should kill aof fork
 | ||
|  |         assert_equal OK [r test.rdbload aoftest.rdb] | ||
|  | 
 | ||
|  |         wait_for_condition 50 100 { | ||
|  |             [string match {*Killing*AOF*child*} [exec tail -20 < [srv 0 stdout]]] | ||
|  |         } else { | ||
|  |             fail "Can't find 'Killing AOF child' in recent log lines" | ||
|  |         } | ||
|  | 
 | ||
|  |         # Verify the value in the loaded rdb
 | ||
|  |         assert_equal v1 [r get k] | ||
|  | 
 | ||
|  |         r flushdb | ||
|  |         r config set rdb-key-save-delay 0 | ||
|  |         r config set appendonly no | ||
|  |     } | ||
|  | 
 | ||
|  |     test "Module rdbloadsave with bgsave" { | ||
|  |         r flushdb | ||
|  |         r config set save "" | ||
|  | 
 | ||
|  |         r set k v1 | ||
|  |         assert_equal OK [r test.rdbsave bgsave.rdb] | ||
|  | 
 | ||
|  |         r set k v2 | ||
|  |         r config set rdb-key-save-delay 500000 | ||
|  |         r bgsave | ||
|  | 
 | ||
|  |         # RM_RdbLoad() should kill RDB fork
 | ||
|  |         assert_equal OK [r test.rdbload bgsave.rdb] | ||
|  | 
 | ||
|  |         wait_for_condition 10 1000 { | ||
|  |             [string match {*Background*saving*terminated*} [exec tail -20 < [srv 0 stdout]]] | ||
|  |         } else { | ||
|  |             fail "Can't find 'Background saving terminated' in recent log lines" | ||
|  |         } | ||
|  | 
 | ||
|  |         assert_equal v1 [r get k] | ||
|  |         r flushall | ||
|  |         waitForBgsave r | ||
|  |         r config set rdb-key-save-delay 0 | ||
|  |     } | ||
|  | 
 | ||
|  |     test "Module rdbloadsave calls rdbsave in a module fork" { | ||
|  |         r flushdb | ||
|  |         r config set save "" | ||
|  |         r config set rdb-key-save-delay 500000 | ||
|  | 
 | ||
|  |         r set k v1 | ||
|  | 
 | ||
|  |         # Module will call RM_Fork() before calling RM_RdbSave()
 | ||
|  |         assert_equal OK [r test.rdbsave_fork rdbfork.rdb] | ||
|  |         assert_equal [s module_fork_in_progress] 1 | ||
|  | 
 | ||
|  |         wait_for_condition 10 1000 { | ||
|  |             [status r module_fork_in_progress] == "0" | ||
|  |         } else { | ||
|  |             fail "Module fork didn't finish" | ||
|  |         } | ||
|  | 
 | ||
|  |         r set k v2 | ||
|  |         assert_equal OK [r test.rdbload rdbfork.rdb] | ||
|  |         assert_equal v1 [r get k] | ||
|  | 
 | ||
|  |         r config set rdb-key-save-delay 0 | ||
|  |     } | ||
|  | 
 | ||
|  |     test "Unload the module - rdbloadsave" { | ||
|  |         assert_equal {OK} [r module unload rdbloadsave] | ||
|  |     } | ||
|  | 
 | ||
|  |     tags {repl} { | ||
|  |         test {Module rdbloadsave on master and replica} { | ||
|  |             start_server [list overrides [list loadmodule "$testmodule"]] { | ||
|  |                 set replica [srv 0 client] | ||
|  |                 set replica_host [srv 0 host] | ||
|  |                 set replica_port [srv 0 port] | ||
|  |                 start_server [list overrides [list loadmodule "$testmodule"]] { | ||
|  |                     set master [srv 0 client] | ||
|  |                     set master_host [srv 0 host] | ||
|  |                     set master_port [srv 0 port] | ||
|  | 
 | ||
|  |                     $master set x 10000 | ||
|  | 
 | ||
|  |                     # Start the replication process...
 | ||
|  |                     $replica replicaof $master_host $master_port | ||
|  | 
 | ||
|  |                     wait_for_condition 100 100 { | ||
|  |                         [status $master sync_full] == 1 | ||
|  |                     } else { | ||
|  |                         fail "Master <-> Replica didn't start the full sync" | ||
|  |                     } | ||
|  | 
 | ||
|  |                     # RM_RdbSave() is allowed on replicas
 | ||
|  |                     assert_equal OK [$replica test.rdbsave rep.rdb] | ||
|  | 
 | ||
|  |                     # RM_RdbLoad() is not allowed on replicas
 | ||
|  |                     assert_error {*supported*} {$replica test.rdbload rep.rdb} | ||
|  | 
 | ||
|  |                     assert_equal OK [$master test.rdbsave master.rdb] | ||
|  |                     $master set x 20000 | ||
|  | 
 | ||
|  |                     wait_for_condition 100 100 { | ||
|  |                         [$replica get x] == 20000 | ||
|  |                     } else { | ||
|  |                         fail "Replica didn't get the update" | ||
|  |                     } | ||
|  | 
 | ||
|  |                     # Loading RDB on master will drop replicas
 | ||
|  |                     assert_equal OK [$master test.rdbload master.rdb] | ||
|  | 
 | ||
|  |                     wait_for_condition 100 100 { | ||
|  |                         [status $master sync_full] == 2 | ||
|  |                     } else { | ||
|  |                         fail "Master <-> Replica didn't start the full sync" | ||
|  |                     } | ||
|  | 
 | ||
|  |                     wait_for_condition 100 100 { | ||
|  |                         [$replica get x] == 10000 | ||
|  |                     } else { | ||
|  |                         fail "Replica didn't get the update" | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |