What changed, and why it matters
This change simply threads a request-scoped cancellation signal (a 'context') through a database helper that records closed Lightning channels. It does not fix a crash, stop an attacker, or change any user-visible behavior. The previous code used a placeholder context inside the SQL backend, which meant database operations could not be cancelled cleanly; now the caller's context is passed through so long-running operations can be aborted if the request is cancelled. This is a code-quality and maintainability improvement, not a security patch.
No security action required. Treat as a normal refactoring/reliability commit. If reviewing related work, verify that other Store methods also propagate context rather than using context.TODO().
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit refactors PutClosedScid signatures across the graphdb, discovery, and test packages to accept a context.Context parameter and propagate it to the SQL store. Previously, SQLStore.PutClosedScid created its own context.TODO(), losing any cancellation/timeout from the caller. KVStore currently ignores the context (uses ‘_’), so only the SQL backend benefits. No logic, authorization, or validation rules are altered; no bug or vulnerability is remediated.
Changed components
graph/db/sql_store.gograph/db/kv_store.gograph/db/graph.gograph/db/interfaces.godiscovery/gossiper.godiscovery/ban.godiscovery/mock_test.gograph/db/graph_test.goInspect captured patch +25 / −12
diff --git a/discovery/ban.go b/discovery/ban.go
index 5229c70..7100c2f 100644
--- a/discovery/ban.go
+++ b/discovery/ban.go
@@ -1,6 +1,7 @@
package discovery
import (
+ "context"
"errors"
"math"
"sync"
@@ -55,7 +56,7 @@ type ClosedChannelTracker interface {
type GraphCloser interface {
// PutClosedScid marks a channel as closed so that we won't validate
// channel announcements for it again.
- PutClosedScid(lnwire.ShortChannelID) error
+ PutClosedScid(context.Context, lnwire.ShortChannelID) error
// IsClosedScid checks if a short channel id is closed.
IsClosedScid(lnwire.ShortChannelID) (bool, error)
@@ -88,8 +89,10 @@ func NewScidCloserMan(graph GraphCloser,
// PutClosedScid marks scid as closed so the gossiper can ignore this channel
// in the future.
-func (s *ScidCloserMan) PutClosedScid(scid lnwire.ShortChannelID) error {
- return s.graph.PutClosedScid(scid)
+func (s *ScidCloserMan) PutClosedScid(ctx context.Context,
+ scid lnwire.ShortChannelID) error {
+
+ return s.graph.PutClosedScid(ctx, scid)
}
// IsClosedScid checks whether scid is closed so that the gossiper can ignore
diff --git a/discovery/gossiper.go b/discovery/gossiper.go
index d2375cb..11aa4ce 100644
--- a/discovery/gossiper.go
+++ b/discovery/gossiper.go
@@ -2877,7 +2877,9 @@ func (d *AuthenticatedGossiper) handleChanAnnouncement(ctx context.Context,
// expensive validation checks on it again.
// TODO: Populate the ScidCloser by using closed
// channel notifications.
- dbErr := d.cfg.ScidCloser.PutClosedScid(scid)
+ dbErr := d.cfg.ScidCloser.PutClosedScid(
+ ctx, scid,
+ )
if dbErr != nil {
log.Errorf("failed to mark scid(%v) "+
"as closed: %v", scid, dbErr)
diff --git a/discovery/mock_test.go b/discovery/mock_test.go
index 6bd93c2..87464c7 100644
--- a/discovery/mock_test.go
+++ b/discovery/mock_test.go
@@ -1,6 +1,7 @@
package discovery
import (
+ "context"
"errors"
"net"
"sync"
@@ -176,7 +177,9 @@ func newMockScidCloser(channelPeer bool) *mockScidCloser {
}
}
-func (m *mockScidCloser) PutClosedScid(scid lnwire.ShortChannelID) error {
+func (m *mockScidCloser) PutClosedScid(_ context.Context,
+ scid lnwire.ShortChannelID) error {
+
m.Lock()
m.m[scid] = struct{}{}
m.Unlock()
diff --git a/graph/db/graph.go b/graph/db/graph.go
index 66ab6d9..de10bac 100644
--- a/graph/db/graph.go
+++ b/graph/db/graph.go
@@ -772,8 +772,10 @@ func (c *ChannelGraph) NumZombies(ctx context.Context) (uint64, error) {
}
// PutClosedScid stores a SCID for a closed channel in the database.
-func (c *ChannelGraph) PutClosedScid(scid lnwire.ShortChannelID) error {
- return c.db.PutClosedScid(scid)
+func (c *ChannelGraph) PutClosedScid(ctx context.Context,
+ scid lnwire.ShortChannelID) error {
+
+ return c.db.PutClosedScid(ctx, scid)
}
// IsClosedScid checks whether a channel identified by the scid is closed.
diff --git a/graph/db/graph_test.go b/graph/db/graph_test.go
index d25289b..5dd84c4 100644
--- a/graph/db/graph_test.go
+++ b/graph/db/graph_test.go
@@ -5092,7 +5092,7 @@ func TestClosedScid(t *testing.T) {
// After we call PutClosedScid, the call to IsClosedScid should return
// true.
- err = graph.PutClosedScid(scid)
+ err = graph.PutClosedScid(t.Context(), scid)
require.Nil(t, err)
exists, err = graph.IsClosedScid(scid)
diff --git a/graph/db/interfaces.go b/graph/db/interfaces.go
index eb3f7e9..15b9b5f 100644
--- a/graph/db/interfaces.go
+++ b/graph/db/interfaces.go
@@ -348,7 +348,7 @@ type Store interface { //nolint:interfacebloat
// PutClosedScid stores a SCID for a closed channel in the database.
// This is so that we can ignore channel announcements that we know to
// be closed without having to validate them and fetch a block.
- PutClosedScid(scid lnwire.ShortChannelID) error
+ PutClosedScid(ctx context.Context, scid lnwire.ShortChannelID) error
// IsClosedScid checks whether a channel identified by the passed in
// scid is closed. This helps avoid having to perform expensive
diff --git a/graph/db/kv_store.go b/graph/db/kv_store.go
index 35842ec..96ea2f2 100644
--- a/graph/db/kv_store.go
+++ b/graph/db/kv_store.go
@@ -4437,7 +4437,9 @@ func (c *KVStore) NumZombies(_ context.Context) (uint64, error) {
// PutClosedScid stores a SCID for a closed channel in the database. This is so
// that we can ignore channel announcements that we know to be closed without
// having to validate them and fetch a block.
-func (c *KVStore) PutClosedScid(scid lnwire.ShortChannelID) error {
+func (c *KVStore) PutClosedScid(_ context.Context,
+ scid lnwire.ShortChannelID) error {
+
return kvdb.Update(c.db, func(tx kvdb.RwTx) error {
closedScids, err := tx.CreateTopLevelBucket(closedScidBucket)
if err != nil {
diff --git a/graph/db/sql_store.go b/graph/db/sql_store.go
index 78ef82c..a146a83 100644
--- a/graph/db/sql_store.go
+++ b/graph/db/sql_store.go
@@ -3271,9 +3271,10 @@ func (s *SQLStore) AddEdgeProof(ctx context.Context,
// having to validate them and fetch a block.
//
// NOTE: part of the Store interface.
-func (s *SQLStore) PutClosedScid(scid lnwire.ShortChannelID) error {
+func (s *SQLStore) PutClosedScid(ctx context.Context,
+ scid lnwire.ShortChannelID) error {
+
var (
- ctx = context.TODO()
chanIDB = channelIDToBytes(scid.ToUint64())
)
Why this scored 14/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.