Skip to content

Commit 2d3dc8e

Browse files
auricomclaude
andcommitted
fix(node): propagate context through LeaderResigner.ResignLeader interface
- LeaderResigner.ResignLeader() → ResignLeader(ctx context.Context) error - FullNode.ResignLeader passes ctx down to raft.Node.ResignLeader - run_node.go calls resigner.ResignLeader(resignCtx) directly — no wrapper goroutine/select needed; context.DeadlineExceeded vs other errors are logged distinctly - Merge TestFullNode_ResignLeader_NilRaftNode and TestFullNode_ResignLeader_NonLeaderRaftNode into single table-driven test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent fc023b8 commit 2d3dc8e

4 files changed

Lines changed: 25 additions & 22 deletions

File tree

node/full.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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
}

node/full_node_test.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff 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
}

node/node.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package node
22

33
import (
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.
2729
type LeaderResigner interface {
28-
ResignLeader() error
30+
ResignLeader(ctx context.Context) error
2931
}
3032

3133
type NodeOptions struct {

pkg/cmd/run_node.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff 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()

0 commit comments

Comments
 (0)