@@ -62,12 +62,13 @@ func (m *msg) IsDeclaration() bool {
62
62
type peer struct {
63
63
mockedMethods map [string ]struct {}
64
64
mock.Mock
65
- id string
66
- peers map [string ]* peer
67
- sharedLock * sync.RWMutex
68
- msgChan chan Msg
69
- isLeaderFromCallback bool
70
- callbackInvoked bool
65
+ id string
66
+ peers map [string ]* peer
67
+ sharedLock * sync.RWMutex
68
+ msgChan chan Msg
69
+ leaderFromCallback bool
70
+ callbackInvoked bool
71
+ lock sync.RWMutex
71
72
LeaderElectionService
72
73
}
73
74
@@ -131,10 +132,24 @@ func (p *peer) Peers() []Peer {
131
132
}
132
133
133
134
func (p * peer ) leaderCallback (isLeader bool ) {
134
- p .isLeaderFromCallback = isLeader
135
+ p .lock .Lock ()
136
+ defer p .lock .Unlock ()
137
+ p .leaderFromCallback = isLeader
135
138
p .callbackInvoked = true
136
139
}
137
140
141
+ func (p * peer ) isLeaderFromCallback () bool {
142
+ p .lock .RLock ()
143
+ defer p .lock .RUnlock ()
144
+ return p .leaderFromCallback
145
+ }
146
+
147
+ func (p * peer ) isCallbackInvoked () bool {
148
+ p .lock .RLock ()
149
+ defer p .lock .RUnlock ()
150
+ return p .callbackInvoked
151
+ }
152
+
138
153
func createPeers (spawnInterval time.Duration , ids ... int ) []* peer {
139
154
peers := make ([]* peer , len (ids ))
140
155
peerMap := make (map [string ]* peer )
@@ -152,7 +167,7 @@ func createPeers(spawnInterval time.Duration, ids ...int) []*peer {
152
167
func createPeer (id int , peerMap map [string ]* peer , l * sync.RWMutex ) * peer {
153
168
idStr := fmt .Sprintf ("p%d" , id )
154
169
c := make (chan Msg , 100 )
155
- p := & peer {id : idStr , peers : peerMap , sharedLock : l , msgChan : c , mockedMethods : make (map [string ]struct {}), isLeaderFromCallback : false , callbackInvoked : false }
170
+ p := & peer {id : idStr , peers : peerMap , sharedLock : l , msgChan : c , mockedMethods : make (map [string ]struct {}), leaderFromCallback : false , callbackInvoked : false }
156
171
p .LeaderElectionService = NewLeaderElectionService (p , idStr , p .leaderCallback )
157
172
l .Lock ()
158
173
peerMap [idStr ] = p
@@ -192,7 +207,7 @@ func TestInitPeersAtSameTime(t *testing.T) {
192
207
leaders := waitForLeaderElection (t , peers )
193
208
isP0leader := peers [len (peers )- 1 ].IsLeader ()
194
209
assert .True (t , isP0leader , "p0 isn't a leader. Leaders are: %v" , leaders )
195
- assert .True (t , peers [len (peers )- 1 ].isLeaderFromCallback , "p0 didn't got leaderhip change callback invoked" )
210
+ assert .True (t , peers [len (peers )- 1 ].isLeaderFromCallback () , "p0 didn't got leaderhip change callback invoked" )
196
211
assert .Len (t , leaders , 1 , "More than 1 leader elected" )
197
212
}
198
213
@@ -274,12 +289,12 @@ func TestConvergence(t *testing.T) {
274
289
275
290
for _ , p := range combinedPeers {
276
291
if p .id == finalLeaders [0 ] {
277
- assert .True (t , p .isLeaderFromCallback , "Leadership callback result is wrong for " , p .id )
278
- assert .True (t , p .callbackInvoked , "Leadership callback wasn't invoked for " , p .id )
292
+ assert .True (t , p .isLeaderFromCallback () , "Leadership callback result is wrong for " , p .id )
293
+ assert .True (t , p .isCallbackInvoked () , "Leadership callback wasn't invoked for " , p .id )
279
294
} else {
280
- assert .False (t , p .isLeaderFromCallback , "Leadership callback result is wrong for " , p .id )
295
+ assert .False (t , p .isLeaderFromCallback () , "Leadership callback result is wrong for " , p .id )
281
296
if p .id == leaders2 [0 ] {
282
- assert .True (t , p .callbackInvoked , "Leadership callback wasn't invoked for " , p .id )
297
+ assert .True (t , p .isCallbackInvoked () , "Leadership callback wasn't invoked for " , p .id )
283
298
}
284
299
}
285
300
}
@@ -312,7 +327,7 @@ func TestPartition(t *testing.T) {
312
327
leaders := waitForLeaderElection (t , peers )
313
328
assert .Len (t , leaders , 1 , "Only 1 leader should have been elected" )
314
329
assert .Equal (t , "p0" , leaders [0 ])
315
- assert .True (t , peers [len (peers )- 1 ].isLeaderFromCallback , "Leadership callback result is wrong for %s" , peers [len (peers )- 1 ].id )
330
+ assert .True (t , peers [len (peers )- 1 ].isLeaderFromCallback () , "Leadership callback result is wrong for %s" , peers [len (peers )- 1 ].id )
316
331
317
332
for _ , p := range peers {
318
333
p .On ("Peers" ).Return ([]Peer {})
@@ -322,7 +337,7 @@ func TestPartition(t *testing.T) {
322
337
leaders = waitForMultipleLeadersElection (t , peers , 6 )
323
338
assert .Len (t , leaders , 6 )
324
339
for _ , p := range peers {
325
- assert .True (t , p .isLeaderFromCallback , "Leadership callback result is wrong for %s" , p .id )
340
+ assert .True (t , p .isLeaderFromCallback () , "Leadership callback result is wrong for %s" , p .id )
326
341
}
327
342
328
343
for _ , p := range peers {
@@ -337,10 +352,10 @@ func TestPartition(t *testing.T) {
337
352
assert .Equal (t , "p0" , leaders [0 ])
338
353
for _ , p := range peers {
339
354
if p .id == leaders [0 ] {
340
- assert .True (t , p .isLeaderFromCallback , "Leadership callback result is wrong for %s" , p .id )
355
+ assert .True (t , p .isLeaderFromCallback () , "Leadership callback result is wrong for %s" , p .id )
341
356
} else {
342
- assert .False (t , p .isLeaderFromCallback , "Leadership callback result is wrong for %s" , p .id )
343
- assert .True (t , p .callbackInvoked , "Leadership callback wasn't invoked for %s" , p .id )
357
+ assert .False (t , p .isLeaderFromCallback () , "Leadership callback result is wrong for %s" , p .id )
358
+ assert .True (t , p .isCallbackInvoked () , "Leadership callback wasn't invoked for %s" , p .id )
344
359
}
345
360
}
346
361
0 commit comments