Skip to content

Commit 6a530af

Browse files
committed
migration: add interceptor signal to cleanly shutdown.
1 parent 6e5810b commit 6a530af

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

cmd_migrate_db.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
_ "net/http/pprof" // Register pprof handlers
88
"os"
99
"path/filepath"
10+
"strings"
1011
"syscall"
1112
"time"
1213

@@ -20,6 +21,7 @@ import (
2021
"github.com/lightningnetwork/lnd/kvdb/sqlbase"
2122
"github.com/lightningnetwork/lnd/kvdb/sqlite"
2223
"github.com/lightningnetwork/lnd/lncfg"
24+
"github.com/lightningnetwork/lnd/signal"
2325
"github.com/lightningnetwork/lnd/watchtower/wtdb"
2426
"go.etcd.io/bbolt"
2527
)
@@ -196,6 +198,16 @@ func (x *migrateDBCommand) Execute(_ []string) error {
196198
}()
197199
}
198200

201+
// Hook interceptor for os signals. We need to except the case where
202+
// we call the function multiple times.
203+
shutdownInterceptor, err := signal.Intercept()
204+
if err != nil && !strings.Contains(err.Error(), "intercept "+
205+
"already started") {
206+
207+
_, _ = fmt.Fprintln(os.Stderr, err)
208+
os.Exit(1)
209+
}
210+
199211
for _, prefix := range allDBPrefixes {
200212
logger.Infof("Attempting to migrate DB with prefix %s", prefix)
201213

@@ -323,7 +335,7 @@ func (x *migrateDBCommand) Execute(_ []string) error {
323335
MetaDB: metaDB,
324336
}
325337

326-
migrator, err := migratekvdb.New(cfg)
338+
migrator, err := migratekvdb.New(cfg, shutdownInterceptor)
327339
if err != nil {
328340
return err
329341
}

migratekvdb/migration.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/btcsuite/btclog/v2"
1212
"github.com/lightningnetwork/lnd/kvdb"
13+
"github.com/lightningnetwork/lnd/signal"
1314
"go.etcd.io/bbolt"
1415
)
1516

@@ -114,10 +115,13 @@ type Migrator struct {
114115
lastVerifiedKeyCount int64
115116
migratedKeysSinceStart int64
116117
verifiedKeysSinceStart int64
118+
119+
// Interceptor is the interceptor to use for intercepting signals.
120+
interceptor signal.Interceptor
117121
}
118122

119123
// New creates a new Migrator with the given configuration.
120-
func New(cfg Config) (*Migrator, error) {
124+
func New(cfg Config, interceptor signal.Interceptor) (*Migrator, error) {
121125
// Validate and set defaults for the config.
122126
if err := validateConfig(&cfg); err != nil {
123127
return nil, fmt.Errorf("invalid config: %w", err)
@@ -128,6 +132,7 @@ func New(cfg Config) (*Migrator, error) {
128132
startTimeMigration: time.Now(),
129133
lastLogTime: time.Now(),
130134
logInterval: 5 * time.Second,
135+
interceptor: interceptor,
131136
}, nil
132137
}
133138

@@ -608,6 +613,8 @@ func (m *Migrator) migrateBucket(ctx context.Context,
608613
select {
609614
case <-ctx.Done():
610615
return ctx.Err()
616+
case <-m.interceptor.ShutdownChannel():
617+
return fmt.Errorf("shutdown signal received")
611618
default:
612619
}
613620

@@ -943,6 +950,8 @@ func (m *Migrator) walkAndCompare(ctx context.Context, srcBucket,
943950
select {
944951
case <-ctx.Done():
945952
return ctx.Err()
953+
case <-m.interceptor.ShutdownChannel():
954+
return fmt.Errorf("shutdown signal received")
946955
default:
947956
}
948957

migratekvdb/migration_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/btcsuite/btclog/v2"
1313
"github.com/lightningnetwork/lnd/kvdb"
14+
"github.com/lightningnetwork/lnd/signal"
1415
"github.com/stretchr/testify/require"
1516
"go.etcd.io/bbolt"
1617
)
@@ -71,7 +72,10 @@ func TestMigration(t *testing.T) {
7172
MetaDB: metaDb,
7273
}
7374

74-
migrator, err := New(cfg)
75+
interceptor, err := signal.Intercept()
76+
require.NoError(t, err)
77+
78+
migrator, err := New(cfg, interceptor)
7579
require.NoError(t, err)
7680

7781
err = migrator.Migrate(context.Background(), sourceDB, targetDB)

0 commit comments

Comments
 (0)