@@ -21,16 +21,44 @@ import (
21
21
"time"
22
22
23
23
"github.com/stretchr/testify/require"
24
+ << << << < HEAD
24
25
"github.com/tikv/pd/pkg/storage/endpoint"
25
26
"github.com/tikv/pd/pkg/utils/etcdutil"
26
27
)
27
28
29
+ == == == =
30
+
31
+ "github.com/tikv/pd/pkg/election"
32
+ "github.com/tikv/pd/pkg/errs"
33
+ "github.com/tikv/pd/pkg/utils/etcdutil"
34
+ )
35
+
36
+ const (
37
+ testGroupID = uint32 (1 )
38
+ testLeaderKey = "test-leader-key"
39
+ testLeaderValue = "test-leader-value"
40
+ )
41
+
42
+ func prepare (t * testing.T ) (storage Storage , clean func (), leadership * election.Leadership ) {
43
+ _ , client , clean := etcdutil .NewTestEtcdCluster (t , 1 )
44
+ storage = NewStorageWithEtcdBackend (client )
45
+ leadership = election .NewLeadership (client , testLeaderKey , "storage_tso_test" )
46
+ err := leadership .Campaign (60 , testLeaderValue )
47
+ require .NoError (t , err )
48
+ return storage , clean , leadership
49
+ }
50
+
51
+ >> >> >> > fda80ebb9 (tso : enhance timestamp persistency with strong leader consistency (#9171 ))
28
52
func TestSaveLoadTimestamp (t * testing.T ) {
29
53
re := require .New (t )
30
- storage , clean := newTestStorage (t )
54
+ storage , clean , leadership := prepare (t )
31
55
defer clean ()
32
56
expectedTS := time .Now ().Round (0 )
57
+ << << << < HEAD
33
58
err := storage .SaveTimestamp (endpoint .TimestampKey , expectedTS )
59
+ == == == =
60
+ err := storage .SaveTimestamp (testGroupID , expectedTS , leadership )
61
+ >> >> >> > fda80ebb9 (tso : enhance timestamp persistency with strong leader consistency (#9171 ))
34
62
re .NoError (err )
35
63
ts , err := storage .LoadTimestamp ("" )
36
64
re .NoError (err )
@@ -67,23 +95,77 @@ func TestGlobalLocalTimestamp(t *testing.T) {
67
95
68
96
func TestTimestampTxn (t * testing.T ) {
69
97
re := require .New (t )
70
- storage , clean := newTestStorage (t )
98
+ storage , clean , leadership := prepare (t )
71
99
defer clean ()
72
100
globalTS1 := time .Now ().Round (0 )
101
+ << << << < HEAD
73
102
err := storage .SaveTimestamp (endpoint .TimestampKey , globalTS1 )
74
103
re .NoError (err )
75
104
76
105
globalTS2 := globalTS1 .Add (- time .Millisecond ).Round (0 )
77
106
err = storage .SaveTimestamp (endpoint .TimestampKey , globalTS2 )
107
+ == == == =
108
+ err := storage .SaveTimestamp (testGroupID , globalTS1 , leadership )
109
+ re .NoError (err )
110
+
111
+ globalTS2 := globalTS1 .Add (- time .Millisecond ).Round (0 )
112
+ err = storage .SaveTimestamp (testGroupID , globalTS2 , leadership )
113
+ >> >> >> > fda80ebb9 (tso : enhance timestamp persistency with strong leader consistency (#9171 ))
78
114
re .Error (err )
79
115
80
116
ts , err := storage .LoadTimestamp ("" )
81
117
re .NoError (err )
82
118
re .Equal (globalTS1 , ts )
83
119
}
84
120
121
+ << << << < HEAD
85
122
func newTestStorage (t * testing.T ) (Storage , func ()) {
86
123
_ , client , clean := etcdutil .NewTestEtcdCluster (t , 1 )
87
124
rootPath := path .Join ("/pd" , strconv .FormatUint (100 , 10 ))
88
125
return NewStorageWithEtcdBackend (client , rootPath ), clean
126
+ == == == =
127
+ func TestSaveTimestampWithLeaderCheck (t * testing .T ) {
128
+ re := require .New (t )
129
+ storage , clean , leadership := prepare (t )
130
+ defer clean ()
131
+
132
+ // testLeaderKey -> testLeaderValue
133
+ globalTS := time .Now ().Round (0 )
134
+ err := storage .SaveTimestamp (testGroupID , globalTS , leadership )
135
+ re .NoError (err )
136
+ ts , err := storage .LoadTimestamp (testGroupID )
137
+ re .NoError (err )
138
+ re .Equal (globalTS , ts )
139
+
140
+ err = storage .SaveTimestamp (testGroupID , globalTS .Add (time .Second ), & election.Leadership {})
141
+ re .True (errs .IsLeaderChanged (err ))
142
+ ts , err = storage .LoadTimestamp (testGroupID )
143
+ re .NoError (err )
144
+ re .Equal (globalTS , ts )
145
+
146
+ // testLeaderKey -> ""
147
+ storage .Save (leadership .GetLeaderKey (), "" )
148
+ err = storage .SaveTimestamp (testGroupID , globalTS .Add (time .Second ), leadership )
149
+ re .True (errs .IsLeaderChanged (err ))
150
+ ts , err = storage .LoadTimestamp (testGroupID )
151
+ re .NoError (err )
152
+ re .Equal (globalTS , ts )
153
+
154
+ // testLeaderKey -> non-existent
155
+ storage .Remove (leadership .GetLeaderKey ())
156
+ err = storage .SaveTimestamp (testGroupID , globalTS .Add (time .Second ), leadership )
157
+ re .True (errs .IsLeaderChanged (err ))
158
+ ts , err = storage .LoadTimestamp (testGroupID )
159
+ re .NoError (err )
160
+ re .Equal (globalTS , ts )
161
+
162
+ // testLeaderKey -> testLeaderValue
163
+ storage .Save (leadership .GetLeaderKey (), testLeaderValue )
164
+ globalTS = globalTS .Add (time .Second )
165
+ err = storage .SaveTimestamp (testGroupID , globalTS , leadership )
166
+ re .NoError (err )
167
+ ts , err = storage .LoadTimestamp (testGroupID )
168
+ re .NoError (err )
169
+ re .Equal (globalTS , ts )
170
+ >> >> >> > fda80ebb9 (tso : enhance timestamp persistency with strong leader consistency (#9171 ))
89
171
}
0 commit comments