Skip to content

Commit def8838

Browse files
committed
migration: add interceptor signal to cleanly shutdown.
1 parent f8ff12f commit def8838

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

cmd_migrate_db.go

+13-1
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

@@ -351,7 +363,7 @@ func (x *migrateDBCommand) Execute(_ []string) error {
351363
MetaDB: metaDB,
352364
}
353365

354-
migrator, err := migratekvdb.New(cfg)
366+
migrator, err := migratekvdb.New(cfg, shutdownInterceptor)
355367
if err != nil {
356368
return err
357369
}

migratekvdb/migration.go

+10-1
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

@@ -636,6 +641,8 @@ func (m *Migrator) migrateBucket(ctx context.Context,
636641
select {
637642
case <-ctx.Done():
638643
return ctx.Err()
644+
case <-m.interceptor.ShutdownChannel():
645+
return fmt.Errorf("shutdown signal received")
639646
default:
640647
}
641648

@@ -980,6 +987,8 @@ func (m *Migrator) walkAndCompare(ctx context.Context, srcBucket,
980987
select {
981988
case <-ctx.Done():
982989
return ctx.Err()
990+
case <-m.interceptor.ShutdownChannel():
991+
return fmt.Errorf("shutdown signal received")
983992
default:
984993
}
985994

migratekvdb/migration_test.go

+5-1
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)