@@ -92,33 +92,33 @@ func newTestRaft(t *testing.T, id string, fsm raft.FSM) (*raft.Raft, func()) {
9292 return rafts [0 ], shutdown
9393}
9494
95- func TestShardedTransactionManagerCommit (t * testing.T ) {
95+ func TestShardRouterCommit (t * testing.T ) {
9696 e := distribution .NewEngine ()
9797 e .UpdateRoute ([]byte ("a" ), []byte ("m" ), 1 )
9898 e .UpdateRoute ([]byte ("m" ), nil , 2 )
9999
100- stm := NewShardedTransactionManager (e )
100+ router := NewShardRouter (e )
101101
102102 // group 1
103103 s1 := store .NewRbMemoryStore ()
104104 l1 := store .NewRbMemoryStoreWithExpire (time .Minute )
105105 r1 , stop1 := newTestRaft (t , "1" , NewKvFSM (s1 , l1 ))
106106 defer stop1 ()
107- stm .Register (1 , NewTransaction (r1 ))
107+ router .Register (1 , NewTransaction (r1 ))
108108
109109 // group 2
110110 s2 := store .NewRbMemoryStore ()
111111 l2 := store .NewRbMemoryStoreWithExpire (time .Minute )
112112 r2 , stop2 := newTestRaft (t , "2" , NewKvFSM (s2 , l2 ))
113113 defer stop2 ()
114- stm .Register (2 , NewTransaction (r2 ))
114+ router .Register (2 , NewTransaction (r2 ))
115115
116116 reqs := []* pb.Request {
117117 {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("b" ), Value : []byte ("v1" )}}},
118118 {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("x" ), Value : []byte ("v2" )}}},
119119 }
120120
121- _ , err := stm .Commit (reqs )
121+ _ , err := router .Commit (reqs )
122122 if err != nil {
123123 t .Fatalf ("commit: %v" , err )
124124 }
@@ -133,34 +133,34 @@ func TestShardedTransactionManagerCommit(t *testing.T) {
133133 }
134134}
135135
136- func TestShardedTransactionManagerSplitAndMerge (t * testing.T ) {
136+ func TestShardRouterSplitAndMerge (t * testing.T ) {
137137 ctx := context .Background ()
138138
139139 e := distribution .NewEngine ()
140140 // start with single shard handled by group 1
141141 e .UpdateRoute ([]byte ("a" ), nil , 1 )
142142
143- stm := NewShardedTransactionManager (e )
143+ router := NewShardRouter (e )
144144
145145 // group 1
146146 s1 := store .NewRbMemoryStore ()
147147 l1 := store .NewRbMemoryStoreWithExpire (time .Minute )
148148 r1 , stop1 := newTestRaft (t , "1" , NewKvFSM (s1 , l1 ))
149149 defer stop1 ()
150- stm .Register (1 , NewTransaction (r1 ))
150+ router .Register (1 , NewTransaction (r1 ))
151151
152152 // group 2 (will be used after split)
153153 s2 := store .NewRbMemoryStore ()
154154 l2 := store .NewRbMemoryStoreWithExpire (time .Minute )
155155 r2 , stop2 := newTestRaft (t , "2" , NewKvFSM (s2 , l2 ))
156156 defer stop2 ()
157- stm .Register (2 , NewTransaction (r2 ))
157+ router .Register (2 , NewTransaction (r2 ))
158158
159159 // initial write routed to group 1
160160 req := []* pb.Request {
161161 {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("b" ), Value : []byte ("v1" )}}},
162162 }
163- if _ , err := stm .Commit (req ); err != nil {
163+ if _ , err := router .Commit (req ); err != nil {
164164 t .Fatalf ("commit group1: %v" , err )
165165 }
166166 v , err := s1 .Get (ctx , []byte ("b" ))
@@ -172,13 +172,13 @@ func TestShardedTransactionManagerSplitAndMerge(t *testing.T) {
172172 e2 := distribution .NewEngine ()
173173 e2 .UpdateRoute ([]byte ("a" ), []byte ("m" ), 1 )
174174 e2 .UpdateRoute ([]byte ("m" ), nil , 2 )
175- stm .engine = e2
175+ router .engine = e2
176176
177177 // write routed to group 2 after split
178178 req = []* pb.Request {
179179 {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("x" ), Value : []byte ("v2" )}}},
180180 }
181- if _ , err := stm .Commit (req ); err != nil {
181+ if _ , err := router .Commit (req ); err != nil {
182182 t .Fatalf ("commit group2: %v" , err )
183183 }
184184 v , err = s2 .Get (ctx , []byte ("x" ))
@@ -189,17 +189,66 @@ func TestShardedTransactionManagerSplitAndMerge(t *testing.T) {
189189 // merge shards back: all keys handled by group1
190190 e3 := distribution .NewEngine ()
191191 e3 .UpdateRoute ([]byte ("a" ), nil , 1 )
192- stm .engine = e3
192+ router .engine = e3
193193
194194 // write routed to group1 after merge
195195 req = []* pb.Request {
196196 {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("z" ), Value : []byte ("v3" )}}},
197197 }
198- if _ , err := stm .Commit (req ); err != nil {
198+ if _ , err := router .Commit (req ); err != nil {
199199 t .Fatalf ("commit after merge: %v" , err )
200200 }
201201 v , err = s1 .Get (ctx , []byte ("z" ))
202202 if err != nil || string (v ) != "v3" {
203203 t .Fatalf ("group1 value after merge: %v %v" , v , err )
204204 }
205205}
206+
207+ type fakeTM struct {
208+ commitErr bool
209+ commitCalls int
210+ abortCalls int
211+ }
212+
213+ func (f * fakeTM ) Commit (reqs []* pb.Request ) (* TransactionResponse , error ) {
214+ f .commitCalls ++
215+ if f .commitErr {
216+ return nil , fmt .Errorf ("commit fail" )
217+ }
218+ return & TransactionResponse {}, nil
219+ }
220+
221+ func (f * fakeTM ) Abort (reqs []* pb.Request ) (* TransactionResponse , error ) {
222+ f .abortCalls ++
223+ return & TransactionResponse {}, nil
224+ }
225+
226+ func TestShardRouterCommitFailure (t * testing.T ) {
227+ e := distribution .NewEngine ()
228+ e .UpdateRoute ([]byte ("a" ), []byte ("m" ), 1 )
229+ e .UpdateRoute ([]byte ("m" ), nil , 2 )
230+
231+ router := NewShardRouter (e )
232+
233+ ok := & fakeTM {}
234+ fail := & fakeTM {commitErr : true }
235+ router .Register (1 , ok )
236+ router .Register (2 , fail )
237+
238+ reqs := []* pb.Request {
239+ {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("b" ), Value : []byte ("v1" )}}},
240+ {IsTxn : false , Phase : pb .Phase_NONE , Mutations : []* pb.Mutation {{Op : pb .Op_PUT , Key : []byte ("x" ), Value : []byte ("v2" )}}},
241+ }
242+
243+ if _ , err := router .Commit (reqs ); err == nil {
244+ t .Fatalf ("expected error" )
245+ }
246+
247+ if fail .commitCalls == 0 || ok .commitCalls == 0 {
248+ t .Fatalf ("expected commits on both groups" )
249+ }
250+
251+ if ok .abortCalls != 0 {
252+ t .Fatalf ("unexpected abort on successful group" )
253+ }
254+ }
0 commit comments