Skip to content

Commit 72a94d8

Browse files
committed
migration: add interceptor signal to cleanly shutdown.
1 parent 592b073 commit 72a94d8

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

@@ -21,6 +22,7 @@ import (
2122
"github.com/lightningnetwork/lnd/kvdb/sqlbase"
2223
"github.com/lightningnetwork/lnd/kvdb/sqlite"
2324
"github.com/lightningnetwork/lnd/lncfg"
25+
"github.com/lightningnetwork/lnd/signal"
2426
"github.com/lightningnetwork/lnd/watchtower/wtdb"
2527
"go.etcd.io/bbolt"
2628
)
@@ -197,6 +199,16 @@ func (x *migrateDBCommand) Execute(_ []string) error {
197199
}()
198200
}
199201

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

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

327-
migrator, err := migratekvdb.New(cfg)
339+
migrator, err := migratekvdb.New(cfg, shutdownInterceptor)
328340
if err != nil {
329341
return err
330342
}

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/btcsuite/btcwallet/walletdb"
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

@@ -941,6 +948,8 @@ func (m *Migrator) walkAndCompare(ctx context.Context, srcBucket,
941948
select {
942949
case <-ctx.Done():
943950
return ctx.Err()
951+
case <-m.interceptor.ShutdownChannel():
952+
return fmt.Errorf("shutdown signal received")
944953
default:
945954
}
946955

migratekvdb/migration_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/btcsuite/btclog/v2"
1313
"github.com/btcsuite/btcwallet/walletdb"
1414
"github.com/lightningnetwork/lnd/kvdb"
15+
"github.com/lightningnetwork/lnd/signal"
1516
"github.com/stretchr/testify/require"
1617
"go.etcd.io/bbolt"
1718
)
@@ -72,7 +73,10 @@ func TestMigration(t *testing.T) {
7273
MetaDB: metaDb,
7374
}
7475

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

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

0 commit comments

Comments
 (0)