mirror of https://github.com/redis/redis.git
				
				
				
			better random dataset creation function in test. master-slave replication test now is able to save the two datasets in CSV when an inconsistency is detected.
This commit is contained in:
		
							parent
							
								
									6171250871
								
							
						
					
					
						commit
						a0573260b0
					
				| 
						 | 
				
			
			@ -8,6 +8,19 @@ start_server {tags {"repl"}} {
 | 
			
		|||
 | 
			
		||||
        test {MASTER and SLAVE dataset should be identical after complex ops} {
 | 
			
		||||
            createComplexDataset r 10000
 | 
			
		||||
            after 500
 | 
			
		||||
            if {[r debug digest] ne [r -1 debug digest]} {
 | 
			
		||||
                set csv1 [csvdump r]
 | 
			
		||||
                set csv2 [csvdump {r -1}]
 | 
			
		||||
                set fd [open /tmp/repldump1.txt w]
 | 
			
		||||
                puts -nonewline $fd $csv1
 | 
			
		||||
                close $fd
 | 
			
		||||
                set fd [open /tmp/repldump2.txt w]
 | 
			
		||||
                puts -nonewline $fd $csv2
 | 
			
		||||
                close $fd
 | 
			
		||||
                puts "Master - Slave inconsistency"
 | 
			
		||||
                puts "Run diff -u against /tmp/repldump*.txt for more info"
 | 
			
		||||
            }
 | 
			
		||||
            assert_equal [r debug digest] [r -1 debug digest]
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ proc warnings_from_file {filename} {
 | 
			
		|||
 | 
			
		||||
# Return value for INFO property
 | 
			
		||||
proc status {r property} {
 | 
			
		||||
    if {[regexp "\r\n$property:(.*?)\r\n" [$r info] _ value]} {
 | 
			
		||||
    if {[regexp "\r\n$property:(.*?)\r\n" [{*}$r info] _ value]} {
 | 
			
		||||
        set _ $value
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -129,11 +129,11 @@ proc randomKey {} {
 | 
			
		|||
 | 
			
		||||
proc findKeyWithType {r type} {
 | 
			
		||||
    for {set j 0} {$j < 20} {incr j} {
 | 
			
		||||
        set k [$r randomkey]
 | 
			
		||||
        set k [{*}$r randomkey]
 | 
			
		||||
        if {$k eq {}} {
 | 
			
		||||
            return {}
 | 
			
		||||
        }
 | 
			
		||||
        if {[$r type $k] eq $type} {
 | 
			
		||||
        if {[{*}$r type $k] eq $type} {
 | 
			
		||||
            return $k
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -159,23 +159,23 @@ proc createComplexDataset {r ops} {
 | 
			
		|||
        } {
 | 
			
		||||
            randpath {set d +inf} {set d -inf}
 | 
			
		||||
        }
 | 
			
		||||
        set t [$r type $k]
 | 
			
		||||
        set t [{*}$r type $k]
 | 
			
		||||
 | 
			
		||||
        if {$t eq {none}} {
 | 
			
		||||
            randpath {
 | 
			
		||||
                $r set $k $v
 | 
			
		||||
                {*}$r set $k $v
 | 
			
		||||
            } {
 | 
			
		||||
                $r lpush $k $v
 | 
			
		||||
                {*}$r lpush $k $v
 | 
			
		||||
            } {
 | 
			
		||||
                $r sadd $k $v
 | 
			
		||||
                {*}$r sadd $k $v
 | 
			
		||||
            } {
 | 
			
		||||
                $r zadd $k $d $v
 | 
			
		||||
                {*}$r zadd $k $d $v
 | 
			
		||||
            } {
 | 
			
		||||
                $r hset $k $f $v
 | 
			
		||||
                {*}$r hset $k $f $v
 | 
			
		||||
            } {
 | 
			
		||||
                $r del $k
 | 
			
		||||
                {*}$r del $k
 | 
			
		||||
            }
 | 
			
		||||
            set t [$r type $k]
 | 
			
		||||
            set t [{*}$r type $k]
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switch $t {
 | 
			
		||||
| 
						 | 
				
			
			@ -183,35 +183,45 @@ proc createComplexDataset {r ops} {
 | 
			
		|||
                # Nothing to do
 | 
			
		||||
            }
 | 
			
		||||
            {list} {
 | 
			
		||||
                randpath {$r lpush $k $v} \
 | 
			
		||||
                        {$r rpush $k $v} \
 | 
			
		||||
                        {$r lrem $k 0 $v} \
 | 
			
		||||
                        {$r rpop $k} \
 | 
			
		||||
                        {$r lpop $k}
 | 
			
		||||
                randpath {{*}$r lpush $k $v} \
 | 
			
		||||
                        {{*}$r rpush $k $v} \
 | 
			
		||||
                        {{*}$r lrem $k 0 $v} \
 | 
			
		||||
                        {{*}$r rpop $k} \
 | 
			
		||||
                        {{*}$r lpop $k}
 | 
			
		||||
            }
 | 
			
		||||
            {set} {
 | 
			
		||||
                randpath {$r sadd $k $v} \
 | 
			
		||||
                        {$r srem $k $v} \
 | 
			
		||||
                randpath {{*}$r sadd $k $v} \
 | 
			
		||||
                        {{*}$r srem $k $v} \
 | 
			
		||||
                        {
 | 
			
		||||
                            set otherset [findKeyWithType r set]
 | 
			
		||||
                            if {$otherset ne {}} {
 | 
			
		||||
                                $r sunionstore $k2 $k $otherset
 | 
			
		||||
                                randpath {
 | 
			
		||||
                                    {*}$r sunionstore $k2 $k $otherset
 | 
			
		||||
                                } {
 | 
			
		||||
                                    {*}$r sinterstore $k2 $k $otherset
 | 
			
		||||
                                } {
 | 
			
		||||
                                    {*}$r sdiffstore $k2 $k $otherset
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
            }
 | 
			
		||||
            {zset} {
 | 
			
		||||
                randpath {$r zadd $k $d $v} \
 | 
			
		||||
                        {$r zrem $k $v} \
 | 
			
		||||
                randpath {{*}$r zadd $k $d $v} \
 | 
			
		||||
                        {{*}$r zrem $k $v} \
 | 
			
		||||
                        {
 | 
			
		||||
                            set otherzset [findKeyWithType r zset]
 | 
			
		||||
                            if {$otherzset ne {}} {
 | 
			
		||||
                                $r zunionstore $k2 2 $k $otherzset
 | 
			
		||||
                                randpath {
 | 
			
		||||
                                    {*}$r zunionstore $k2 2 $k $otherzset
 | 
			
		||||
                                } {
 | 
			
		||||
                                    {*}$r zinterstore $k2 2 $k $otherzset
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
            }
 | 
			
		||||
            {hash} {
 | 
			
		||||
                randpath {$r hset $k $f $v} \
 | 
			
		||||
                        {$r hdel $k $f}
 | 
			
		||||
                randpath {{*}$r hset $k $f $v} \
 | 
			
		||||
                        {{*}$r hdel $k $f}
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -227,33 +237,33 @@ proc formatCommand {args} {
 | 
			
		|||
 | 
			
		||||
proc csvdump r {
 | 
			
		||||
    set o {}
 | 
			
		||||
    foreach k [lsort [$r keys *]] {
 | 
			
		||||
        set type [$r type $k]
 | 
			
		||||
    foreach k [lsort [{*}$r keys *]] {
 | 
			
		||||
        set type [{*}$r type $k]
 | 
			
		||||
        append o [csvstring $k] , [csvstring $type] ,
 | 
			
		||||
        switch $type {
 | 
			
		||||
            string {
 | 
			
		||||
                append o [csvstring [$r get $k]] "\n"
 | 
			
		||||
                append o [csvstring [{*}$r get $k]] "\n"
 | 
			
		||||
            }
 | 
			
		||||
            list {
 | 
			
		||||
                foreach e [$r lrange $k 0 -1] {
 | 
			
		||||
                foreach e [{*}$r lrange $k 0 -1] {
 | 
			
		||||
                    append o [csvstring $e] ,
 | 
			
		||||
                }
 | 
			
		||||
                append o "\n"
 | 
			
		||||
            }
 | 
			
		||||
            set {
 | 
			
		||||
                foreach e [lsort [$r smembers $k]] {
 | 
			
		||||
                foreach e [lsort [{*}$r smembers $k]] {
 | 
			
		||||
                    append o [csvstring $e] ,
 | 
			
		||||
                }
 | 
			
		||||
                append o "\n"
 | 
			
		||||
            }
 | 
			
		||||
            zset {
 | 
			
		||||
                foreach e [$r zrange $k 0 -1 withscores] {
 | 
			
		||||
                foreach e [{*}$r zrange $k 0 -1 withscores] {
 | 
			
		||||
                    append o [csvstring $e] ,
 | 
			
		||||
                }
 | 
			
		||||
                append o "\n"
 | 
			
		||||
            }
 | 
			
		||||
            hash {
 | 
			
		||||
                set fields [$r hgetall $k]
 | 
			
		||||
                set fields [{*}$r hgetall $k]
 | 
			
		||||
                set newfields {}
 | 
			
		||||
                foreach {k v} $fields {
 | 
			
		||||
                    lappend newfields [list $k $v]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue