Skip to content

Commit 4735e5e

Browse files
committedSep 27, 2024·
test: add more raft tests
1 parent 97a1aac commit 4735e5e

File tree

3 files changed

+445
-129
lines changed

3 files changed

+445
-129
lines changed
 

‎node/pkg/raft/raft.go

+41-18
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ func NewRaftNode(
3636
Mutex: sync.Mutex{},
3737

3838
MessageBuffer: make(chan *pubsub.Message, messageBuffer),
39-
Resign: make(chan interface{}),
4039
HeartbeatTimeout: HEARTBEAT_TIMEOUT,
4140

4241
LeaderJobTimeout: leaderJobTimeout,
4342
MissedHeartbeats: 0,
4443
CooldownPeriod: DefaultCooldownPeriod,
4544
LastElectionTime: time.Time{},
45+
46+
blacklist: make(map[string]struct{}),
47+
isDelayedNode: false,
4648
}
4749
return r
4850
}
@@ -102,6 +104,11 @@ func (r *Raft) subscribe(ctx context.Context) {
102104
// handler for incoming messages
103105

104106
func (r *Raft) handleMessage(ctx context.Context, msg Message) error {
107+
if _, ok := r.blacklist[msg.SentFrom]; ok {
108+
// blacklist for testing to simulate network partition
109+
return nil
110+
}
111+
105112
switch msg.Type {
106113
case Heartbeat:
107114
return r.handleHeartbeat(msg)
@@ -137,7 +144,7 @@ func (r *Raft) handleHeartbeat(msg Message) error {
137144
currentRole := r.Role
138145
currentTerm := r.Term
139146

140-
if r.Role == Follower {
147+
if r.Role != Leader {
141148
r.startElectionTimer()
142149
}
143150

@@ -162,7 +169,6 @@ func (r *Raft) handleHeartbeat(msg Message) error {
162169
r.LeaderID = heartbeatMessage.LeaderID
163170
}
164171
}
165-
166172
return nil
167173
}
168174

@@ -239,6 +245,10 @@ func (r *Raft) PublishMessage(ctx context.Context, msg Message) error {
239245
if err != nil {
240246
return err
241247
}
248+
249+
if r.isDelayedNode {
250+
time.Sleep(500 * time.Millisecond)
251+
}
242252
return r.Topic.Publish(ctx, data)
243253
}
244254

@@ -313,17 +323,16 @@ func (r *Raft) sendRequestVote(ctx context.Context) error {
313323
// utility functions
314324

315325
func (r *Raft) ResignLeader() {
316-
if r.Resign != nil {
317-
close(r.Resign)
318-
r.Resign = nil
319-
r.Role = Follower
320-
r.LeaderID = ""
321-
r.startElectionTimer()
322-
}
326+
r.Role = Follower
327+
r.LeaderID = ""
328+
329+
r.HeartbeatTicker.Stop()
330+
r.LeaderJobTicker.Stop()
331+
332+
r.startElectionTimer()
323333
}
324334

325335
func (r *Raft) setLeaderState() {
326-
r.Resign = make(chan interface{})
327336
r.ElectionTimer.Stop()
328337
r.Term++
329338
r.Role = Leader
@@ -343,13 +352,6 @@ func (r *Raft) becomeLeader(ctx context.Context) {
343352

344353
for {
345354
select {
346-
case <-r.Resign:
347-
r.Mutex.Lock()
348-
r.HeartbeatTicker.Stop()
349-
r.LeaderJobTicker.Stop()
350-
r.Mutex.Unlock()
351-
return
352-
353355
case <-r.HeartbeatTicker.C:
354356
err := r.sendHeartbeat(ctx)
355357
if err != nil {
@@ -445,3 +447,24 @@ func (r *Raft) unmarshalMessage(data []byte) (Message, error) {
445447
}
446448
return m, nil
447449
}
450+
451+
func (r *Raft) addBlacklist(id string) {
452+
// used for testing purposes
453+
r.Mutex.Lock()
454+
defer r.Mutex.Unlock()
455+
r.blacklist[id] = struct{}{}
456+
}
457+
458+
func (r *Raft) removeBlacklist(id string) {
459+
// used for testing purposes
460+
r.Mutex.Lock()
461+
defer r.Mutex.Unlock()
462+
delete(r.blacklist, id)
463+
}
464+
465+
func (r *Raft) setDelayedNode(isDelayed bool) {
466+
// used for testing purposes
467+
r.Mutex.Lock()
468+
defer r.Mutex.Unlock()
469+
r.isDelayedNode = isDelayed
470+
}

0 commit comments

Comments
 (0)