summaryrefslogtreecommitdiffstats
path: root/tests/cluster/tests/16-transactions-on-replica.tcl
blob: 8bec06ee4a954048a832ea9b6293c291e80988fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Check basic transactions on a replica.

source "../tests/includes/init-tests.tcl"

test "Create a primary with a replica" {
    create_cluster 1 1
}

test "Cluster should start ok" {
    assert_cluster_state ok
}

set primary [Rn 0]
set replica [Rn 1]

test "Can't read from replica without READONLY" {
    $primary SET a 1
    wait_for_ofs_sync $primary $replica
    catch {$replica GET a} err
    assert {[string range $err 0 4] eq {MOVED}}
}

test "Can't read from replica after READWRITE" {
    $replica READWRITE
    catch {$replica GET a} err
    assert {[string range $err 0 4] eq {MOVED}}
}

test "Can read from replica after READONLY" {
    $replica READONLY
    assert {[$replica GET a] eq {1}}
}

test "Can perform HSET primary and HGET from replica" {
    $primary HSET h a 1
    $primary HSET h b 2
    $primary HSET h c 3
    wait_for_ofs_sync $primary $replica
    assert {[$replica HGET h a] eq {1}}
    assert {[$replica HGET h b] eq {2}}
    assert {[$replica HGET h c] eq {3}}
}

test "Can MULTI-EXEC transaction of HGET operations from replica" {
    $replica MULTI
    assert {[$replica HGET h a] eq {QUEUED}}
    assert {[$replica HGET h b] eq {QUEUED}}
    assert {[$replica HGET h c] eq {QUEUED}}
    assert {[$replica EXEC] eq {1 2 3}}
}

test "MULTI-EXEC with write operations is MOVED" {
    $replica MULTI
    catch {$replica HSET h b 4} err
    assert {[string range $err 0 4] eq {MOVED}}
    catch {$replica exec} err
    assert {[string range $err 0 8] eq {EXECABORT}}
}

test "read-only blocking operations from replica" {
    set rd [redis_deferring_client redis 1]
    $rd readonly
    $rd read
    $rd XREAD BLOCK 0 STREAMS k 0

    wait_for_condition 1000 50 {
        [RI 1 blocked_clients] eq {1}
    } else {
        fail "client wasn't blocked"
    }

    $primary XADD k * foo bar
    set res [$rd read]
    set res [lindex [lindex [lindex [lindex $res 0] 1] 0] 1]
    assert {$res eq {foo bar}}
    $rd close
}

test "reply MOVED when eval from replica for update" {
    catch {[$replica eval {#!lua
        return redis.call('del','a')
        } 1 a
    ]} err
    assert {[string range $err 0 4] eq {MOVED}}
}