123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- set server_path [tmpdir "server.rdb-encoding-test"]
- # Copy RDB with different encodings in server path
- exec cp tests/assets/encodings.rdb $server_path
- start_server [list overrides [list "dir" $server_path "dbfilename" "encodings.rdb"]] {
- test "RDB encoding loading test" {
- r select 0
- csvdump r
- } {"0","compressible","string","aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- "0","hash","hash","a","1","aa","10","aaa","100","b","2","bb","20","bbb","200","c","3","cc","30","ccc","300","ddd","400","eee","5000000000",
- "0","hash_zipped","hash","a","1","b","2","c","3",
- "0","list","list","1","2","3","a","b","c","100000","6000000000","1","2","3","a","b","c","100000","6000000000","1","2","3","a","b","c","100000","6000000000",
- "0","list_zipped","list","1","2","3","a","b","c","100000","6000000000",
- "0","number","string","10"
- "0","set","set","1","100000","2","3","6000000000","a","b","c",
- "0","set_zipped_1","set","1","2","3","4",
- "0","set_zipped_2","set","100000","200000","300000","400000",
- "0","set_zipped_3","set","1000000000","2000000000","3000000000","4000000000","5000000000","6000000000",
- "0","string","string","Hello World"
- "0","zset","zset","a","1","b","2","c","3","aa","10","bb","20","cc","30","aaa","100","bbb","200","ccc","300","aaaa","1000","cccc","123456789","bbbb","5000000000",
- "0","zset_zipped","zset","a","1","b","2","c","3",
- }
- }
- set server_path [tmpdir "server.rdb-startup-test"]
- start_server [list overrides [list "dir" $server_path]] {
- test {Server started empty with non-existing RDB file} {
- r debug digest
- } {0000000000000000000000000000000000000000}
- # Save an RDB file, needed for the next test.
- r save
- }
- start_server [list overrides [list "dir" $server_path]] {
- test {Server started empty with empty RDB file} {
- r debug digest
- } {0000000000000000000000000000000000000000}
- }
- start_server [list overrides [list "dir" $server_path]] {
- test {Test RDB stream encoding} {
- for {set j 0} {$j < 1000} {incr j} {
- if {rand() < 0.9} {
- r xadd stream * foo $j
- } else {
- r xadd stream * bar $j
- }
- }
- r xgroup create stream mygroup 0
- r xreadgroup GROUP mygroup Alice COUNT 1 STREAMS stream >
- set digest [r debug digest]
- r debug reload
- set newdigest [r debug digest]
- assert {$digest eq $newdigest}
- r del stream
- }
- }
- # Helper function to start a server and kill it, just to check the error
- # logged.
- set defaults {}
- proc start_server_and_kill_it {overrides code} {
- upvar defaults defaults srv srv server_path server_path
- set config [concat $defaults $overrides]
- set srv [start_server [list overrides $config]]
- uplevel 1 $code
- kill_server $srv
- }
- # Make the RDB file unreadable
- file attributes [file join $server_path dump.rdb] -permissions 0222
- # Detect root account (it is able to read the file even with 002 perm)
- set isroot 0
- catch {
- open [file join $server_path dump.rdb]
- set isroot 1
- }
- # Now make sure the server aborted with an error
- if {!$isroot} {
- start_server_and_kill_it [list "dir" $server_path] {
- test {Server should not start if RDB file can't be open} {
- wait_for_condition 50 100 {
- [string match {*Fatal error loading*} \
- [exec tail -1 < [dict get $srv stdout]]]
- } else {
- fail "Server started even if RDB was unreadable!"
- }
- }
- }
- }
- # Fix permissions of the RDB file.
- file attributes [file join $server_path dump.rdb] -permissions 0666
- # Corrupt its CRC64 checksum.
- set filesize [file size [file join $server_path dump.rdb]]
- set fd [open [file join $server_path dump.rdb] r+]
- fconfigure $fd -translation binary
- seek $fd -8 end
- puts -nonewline $fd "foobar00"; # Corrupt the checksum
- close $fd
- # Now make sure the server aborted with an error
- start_server_and_kill_it [list "dir" $server_path] {
- test {Server should not start if RDB is corrupted} {
- wait_for_condition 50 100 {
- [string match {*CRC error*} \
- [exec tail -10 < [dict get $srv stdout]]]
- } else {
- fail "Server started even if RDB was corrupted!"
- }
- }
- }
- start_server {} {
- test {Test FLUSHALL aborts bgsave} {
- r config set rdb-key-save-delay 1000
- r debug populate 1000
- r bgsave
- assert_equal [s rdb_bgsave_in_progress] 1
- r flushall
- after 200
- assert_equal [s rdb_bgsave_in_progress] 0
- # make sure the server is still writable
- r set x xx
- }
- }
- test {client freed during loading} {
- start_server [list overrides [list key-load-delay 10 rdbcompression no]] {
- # create a big rdb that will take long to load. it is important
- # for keys to be big since the server processes events only once in 2mb.
- # 100mb of rdb, 100k keys will load in more than 1 second
- r debug populate 100000 key 1000
- catch {
- r debug restart
- }
- set stdout [srv 0 stdout]
- while 1 {
- # check that the new server actually started and is ready for connections
- if {[exec grep -i "Server initialized" | wc -l < $stdout] > 1} {
- break
- }
- after 10
- }
- # make sure it's still loading
- assert_equal [s loading] 1
- # connect and disconnect 10 clients
- set clients {}
- for {set j 0} {$j < 10} {incr j} {
- lappend clients [redis_deferring_client]
- }
- foreach rd $clients {
- $rd debug log bla
- }
- foreach rd $clients {
- $rd read
- }
- foreach rd $clients {
- $rd close
- }
- # make sure the server freed the clients
- wait_for_condition 100 100 {
- [s connected_clients] < 3
- } else {
- fail "clients didn't disconnect"
- }
- # make sure it's still loading
- assert_equal [s loading] 1
- # no need to keep waiting for loading to complete
- exec kill [srv 0 pid]
- }
- }
|