File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -392,9 +392,9 @@ func (n *FullNode) IsRunning() bool {
392392
393393// ResignLeader transfers raft leadership before the node shuts down.
394394// It is a no-op when raft is not enabled or this node is not the leader.
395- func (n * FullNode ) ResignLeader () error {
395+ func (n * FullNode ) ResignLeader (ctx context. Context ) error {
396396 if n .raftNode == nil {
397397 return nil
398398 }
399- return n .raftNode .ResignLeader ()
399+ return n .raftNode .ResignLeader (ctx )
400400}
Original file line number Diff line number Diff line change @@ -84,14 +84,18 @@ func TestStartInstrumentationServer(t *testing.T) {
8484 }
8585}
8686
87- func TestFullNode_ResignLeader_NilRaftNode (t * testing.T ) {
88- n := & FullNode {} // raftNode is nil
89- assert .NoError (t , n .ResignLeader ())
90- }
91-
92- func TestFullNode_ResignLeader_NonLeaderRaftNode (t * testing.T ) {
93- // Empty *raftpkg.Node has nil raft field so IsLeader() returns false;
94- // ResignLeader() is a no-op and returns nil.
95- n := & FullNode {raftNode : & raftpkg.Node {}}
96- assert .NoError (t , n .ResignLeader ())
87+ func TestFullNode_ResignLeader_Noop (t * testing.T ) {
88+ cases := []struct {
89+ name string
90+ node * FullNode
91+ }{
92+ {name : "nil raftNode" , node : & FullNode {}},
93+ // Empty *raftpkg.Node has nil raft field so IsLeader() returns false.
94+ {name : "non-leader raftNode" , node : & FullNode {raftNode : & raftpkg.Node {}}},
95+ }
96+ for _ , tc := range cases {
97+ t .Run (tc .name , func (t * testing.T ) {
98+ assert .NoError (t , tc .node .ResignLeader (context .Background ()))
99+ })
100+ }
97101}
Original file line number Diff line number Diff line change 11package node
22
33import (
4+ "context"
5+
46 ds "github.com/ipfs/go-datastore"
57 "github.com/rs/zerolog"
68
@@ -25,7 +27,7 @@ type Node interface {
2527// in Raft leader election. Callers should type-assert to this interface and call
2628// ResignLeader before cancelling the node context on graceful shutdown.
2729type LeaderResigner interface {
28- ResignLeader () error
30+ ResignLeader (ctx context. Context ) error
2931}
3032
3133type NodeOptions struct {
Original file line number Diff line number Diff line change @@ -230,17 +230,14 @@ func StartNode(
230230 if resigner , ok := rollnode .(node.LeaderResigner ); ok {
231231 resignCtx , resignCancel := context .WithTimeout (context .Background (), 3 * time .Second )
232232 defer resignCancel ()
233- resignDone := make (chan error , 1 )
234- go func () { resignDone <- resigner .ResignLeader () }()
235- select {
236- case err := <- resignDone :
237- if err != nil {
238- logger .Warn ().Err (err ).Msg ("leadership resign on shutdown failed" )
233+ if err := resigner .ResignLeader (resignCtx ); err != nil {
234+ if errors .Is (err , context .DeadlineExceeded ) {
235+ logger .Warn ().Msg ("leadership resign timed out" )
239236 } else {
240- logger .Info ().Msg ("leadership resigned before shutdown" )
237+ logger .Warn ().Err ( err ). Msg ("leadership resign on shutdown failed " )
241238 }
242- case <- resignCtx . Done ():
243- logger .Warn ().Msg ("leadership resign timed out " )
239+ } else {
240+ logger .Info ().Msg ("leadership resigned before shutdown " )
244241 }
245242 }
246243 cancel ()
You can’t perform that action at this time.
0 commit comments