payments/migration1: wire KV→SQL migration in the main pkg
Hook the payments KV→SQL migration into the SQL migration config. The migration is still only available when building with the build tag "test_native_sql". Moreover a tombstone protection similar to the invoice migration is added to prevent re-runningi with the KV backend once migration completes.
This commit is contained in:
4 files changed
+145
No files matched your search
@@ -0,0 +1,71 @@
|
||||
package paymentsdb
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/lightningnetwork/lnd/kvdb"
|
||||
)
|
||||
|
||||
var (
|
||||
// paymentsBucketTombstone is the key used to mark the payments bucket
|
||||
// as permanently closed after a successful migration.
|
||||
paymentsBucketTombstone = []byte("payments-tombstone")
|
||||
)
|
||||
|
||||
// SetPaymentsBucketTombstone sets the tombstone key in the payments bucket to
|
||||
// mark the bucket as permanently closed. This prevents it from being reopened
|
||||
// in the future.
|
||||
func SetPaymentsBucketTombstone(db kvdb.Backend) error {
|
||||
return kvdb.Update(db, func(tx kvdb.RwTx) error {
|
||||
// Access the top-level payments bucket.
|
||||
payments := tx.ReadWriteBucket(paymentsRootBucket)
|
||||
|
||||
// In case the bucket doesn't exist, because we start
|
||||
// immediately with the native SQL schema, we create it as well
|
||||
// to make sure the user cannot switch back to the KV store.
|
||||
if payments == nil {
|
||||
var err error
|
||||
payments, err = tx.CreateTopLevelBucket(
|
||||
paymentsRootBucket,
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create payments "+
|
||||
"bucket: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Add the tombstone key to the payments bucket.
|
||||
err := payments.Put(paymentsBucketTombstone, []byte("1"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to set tombstone: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}, func() {})
|
||||
}
|
||||
|
||||
// GetPaymentsBucketTombstone checks if the tombstone key exists in the payments
|
||||
// bucket. It returns true if the tombstone is present and false otherwise.
|
||||
func GetPaymentsBucketTombstone(db kvdb.Backend) (bool, error) {
|
||||
var tombstoneExists bool
|
||||
|
||||
err := kvdb.View(db, func(tx kvdb.RTx) error {
|
||||
// Access the top-level payments bucket.
|
||||
payments := tx.ReadBucket(paymentsRootBucket)
|
||||
if payments == nil {
|
||||
tombstoneExists = false
|
||||
return nil
|
||||
}
|
||||
|
||||
// Check if the tombstone key exists.
|
||||
tombstone := payments.Get(paymentsBucketTombstone)
|
||||
tombstoneExists = tombstone != nil
|
||||
|
||||
return nil
|
||||
}, func() {})
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return tombstoneExists, nil
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package paymentsdb
|
||||
import (
|
||||
"github.com/btcsuite/btclog/v2"
|
||||
"github.com/lightningnetwork/lnd/build"
|
||||
paymentsmig1 "github.com/lightningnetwork/lnd/payments/db/migration1"
|
||||
)
|
||||
|
||||
// log is a logger that is initialized with no output filters. This
|
||||
@@ -29,4 +30,5 @@ func DisableLog() {
|
||||
// using btclog.
|
||||
func UseLogger(logger btclog.Logger) {
|
||||
log = logger
|
||||
paymentsmig1.UseLogger(logger)
|
||||
}
|
||||
Reference in new issue
Block a user