1# Check basic transactions on a replica.
2
3source "../tests/includes/init-tests.tcl"
4
5test "Create a primary with a replica" {
6    create_cluster 1 1
7}
8
9test "Cluster should start ok" {
10    assert_cluster_state ok
11}
12
13set primary [Rn 0]
14set replica [Rn 1]
15
16test "Can't read from replica without READONLY" {
17    $primary SET a 1
18    wait_for_ofs_sync $primary $replica
19    catch {$replica GET a} err
20    assert {[string range $err 0 4] eq {MOVED}}
21}
22
23test "Can read from replica after READONLY" {
24    $replica READONLY
25    assert {[$replica GET a] eq {1}}
26}
27
28test "Can perform HSET primary and HGET from replica" {
29    $primary HSET h a 1
30    $primary HSET h b 2
31    $primary HSET h c 3
32    wait_for_ofs_sync $primary $replica
33    assert {[$replica HGET h a] eq {1}}
34    assert {[$replica HGET h b] eq {2}}
35    assert {[$replica HGET h c] eq {3}}
36}
37
38test "Can MULTI-EXEC transaction of HGET operations from replica" {
39    $replica MULTI
40    assert {[$replica HGET h a] eq {QUEUED}}
41    assert {[$replica HGET h b] eq {QUEUED}}
42    assert {[$replica HGET h c] eq {QUEUED}}
43    assert {[$replica EXEC] eq {1 2 3}}
44}
45
46test "MULTI-EXEC with write operations is MOVED" {
47    $replica MULTI
48    catch {$replica HSET h b 4} err
49    assert {[string range $err 0 4] eq {MOVED}}
50    catch {$replica exec} err
51    assert {[string range $err 0 8] eq {EXECABORT}}
52}
53
54test "read-only blocking operations from replica" {
55    set rd [redis_deferring_client redis 1]
56    $rd readonly
57    $rd read
58    $rd XREAD BLOCK 0 STREAMS k 0
59
60    wait_for_condition 1000 50 {
61        [RI 1 blocked_clients] eq {1}
62    } else {
63        fail "client wasn't blocked"
64    }
65
66    $primary XADD k * foo bar
67    set res [$rd read]
68    set res [lindex [lindex [lindex [lindex $res 0] 1] 0] 1]
69    assert {$res eq {foo bar}}
70    $rd close
71}
72