From b92f57e0aea373b525f868c67f265bc4c0114a24 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Wed, 12 Jun 2024 13:32:22 +0200 Subject: [PATCH] invoices: add migration code that runs a full invoice DB SQL migration --- go.mod | 2 +- invoices/kv_sql_migration_test.go | 146 +++++++++++++++++++++++++++ invoices/sql_migration.go | 159 +++++++++++++++++++++++++++++- invoices/sql_store.go | 10 +- invoices/testdata/channel.db | Bin 0 -> 1048576 bytes 5 files changed, 311 insertions(+), 6 deletions(-) create mode 100644 invoices/kv_sql_migration_test.go create mode 100644 invoices/testdata/channel.db diff --git a/go.mod b/go.mod index ba53873e1..c660cbb5a 100644 --- a/go.mod +++ b/go.mod @@ -138,7 +138,7 @@ require ( github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opencontainers/runc v1.1.12 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.26.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect diff --git a/invoices/kv_sql_migration_test.go b/invoices/kv_sql_migration_test.go new file mode 100644 index 000000000..5d36b5c64 --- /dev/null +++ b/invoices/kv_sql_migration_test.go @@ -0,0 +1,146 @@ +package invoices_test + +import ( + "context" + "database/sql" + "testing" + "time" + + "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/clock" + invpkg "github.com/lightningnetwork/lnd/invoices" + "github.com/lightningnetwork/lnd/sqldb" + "github.com/lightningnetwork/lnd/sqldb/sqlc" + "github.com/stretchr/testify/require" +) + +// TestMigrationWithChannelDB tests the migration of invoices from a bolt backed +// channel.db to a SQL database. Note that this test does not attempt to be a +// complete migration test for all invoice types but rather is added as a tool +// for developers and users to debug invoice migration issues with an actual +// channel.db file. +func TestMigrationWithChannelDB(t *testing.T) { + // First create a shared Postgres instance so we don't spawn a new + // docker container for each test. + pgFixture := sqldb.NewTestPgFixture( + t, sqldb.DefaultPostgresFixtureLifetime, + ) + t.Cleanup(func() { + pgFixture.TearDown(t) + }) + + makeSQLDB := func(t *testing.T, sqlite bool) (*invpkg.SQLStore, + *sqldb.TransactionExecutor[*sqlc.Queries]) { + + var db *sqldb.BaseDB + if sqlite { + db = sqldb.NewTestSqliteDB(t).BaseDB + } else { + db = sqldb.NewTestPostgresDB(t, pgFixture).BaseDB + } + + invoiceExecutor := sqldb.NewTransactionExecutor( + db, func(tx *sql.Tx) invpkg.SQLInvoiceQueries { + return db.WithTx(tx) + }, + ) + + genericExecutor := sqldb.NewTransactionExecutor( + db, func(tx *sql.Tx) *sqlc.Queries { + return db.WithTx(tx) + }, + ) + + testClock := clock.NewTestClock(time.Unix(1, 0)) + + return invpkg.NewSQLStore(invoiceExecutor, testClock), + genericExecutor + } + + migrationTest := func(t *testing.T, kvStore *channeldb.DB, + sqlite bool) { + + sqlInvoiceStore, sqlStore := makeSQLDB(t, sqlite) + ctxb := context.Background() + + const batchSize = 11 + var opts sqldb.MigrationTxOptions + err := sqlStore.ExecTx( + ctxb, &opts, func(tx *sqlc.Queries) error { + return invpkg.MigrateInvoicesToSQL( + ctxb, kvStore.Backend, kvStore, tx, + batchSize, + ) + }, func() {}, + ) + require.NoError(t, err) + + // MigrateInvoices will check if the inserted invoice equals to + // the migrated one, but as a sanity check, we'll also fetch the + // invoices from the store and compare them to the original + // invoices. + query := invpkg.InvoiceQuery{ + IndexOffset: 0, + // As a sanity check, fetch more invoices than we have + // to ensure that we did not add any extra invoices. + // Note that we don't really have a way to know the + // exact number of invoices in the bolt db without first + // iterating over all of them, but for test purposes + // constant should be enough. + NumMaxInvoices: 9999, + } + result1, err := kvStore.QueryInvoices(ctxb, query) + require.NoError(t, err) + numInvoices := len(result1.Invoices) + + result2, err := sqlInvoiceStore.QueryInvoices(ctxb, query) + require.NoError(t, err) + require.Equal(t, numInvoices, len(result2.Invoices)) + + // Simply zero out the add index so we don't fail on that when + // comparing. + for i := 0; i < numInvoices; i++ { + result1.Invoices[i].AddIndex = 0 + result2.Invoices[i].AddIndex = 0 + + // We need to override the timezone of the invoices as + // the provided DB vs the test runners local time zone + // might be different. + invpkg.OverrideInvoiceTimeZone(&result1.Invoices[i]) + invpkg.OverrideInvoiceTimeZone(&result2.Invoices[i]) + + require.Equal( + t, result1.Invoices[i], result2.Invoices[i], + ) + } + } + + tests := []struct { + name string + dbPath string + }{ + { + "empty", + t.TempDir(), + }, + { + "testdata", + "testdata", + }, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + store := channeldb.OpenForTesting(t, test.dbPath) + + t.Run("Postgres", func(t *testing.T) { + migrationTest(t, store, false) + }) + + t.Run("SQLite", func(t *testing.T) { + migrationTest(t, store, true) + }) + }) + } +} diff --git a/invoices/sql_migration.go b/invoices/sql_migration.go index 47ee3e329..af0e4865f 100644 --- a/invoices/sql_migration.go +++ b/invoices/sql_migration.go @@ -4,15 +4,19 @@ import ( "bytes" "context" "encoding/binary" + "errors" "fmt" + "reflect" "strconv" "time" + "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/graph/db/models" "github.com/lightningnetwork/lnd/kvdb" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/sqldb" "github.com/lightningnetwork/lnd/sqldb/sqlc" + "github.com/pmezard/go-difflib/difflib" ) var ( @@ -48,6 +52,11 @@ var ( // // addIndexNo => invoiceKey addIndexBucket = []byte("invoice-add-index") + + // ErrMigrationMismatch is returned when the migrated invoice does not + // match the original invoice. + ErrMigrationMismatch = fmt.Errorf("migrated invoice does not match " + + "original invoice") ) // createInvoiceHashIndex generates a hash index that contains payment hashes @@ -60,7 +69,7 @@ var ( // a new index in the SQL database that maps each invoice key to its // corresponding payment hash. func createInvoiceHashIndex(ctx context.Context, db kvdb.Backend, - tx SQLInvoiceQueries) error { + tx *sqlc.Queries) error { return db.View(func(kvTx kvdb.RTx) error { invoices := kvTx.ReadBucket(invoiceBucket) @@ -399,3 +408,151 @@ func OverrideInvoiceTimeZone(invoice *Invoice) { } } } + +// MigrateInvoicesToSQL runs the migration of all invoices from the KV database +// to the SQL database. The migration is done in a single transaction to ensure +// that all invoices are migrated or none at all. This function can be run +// multiple times without causing any issues as it will check if the migration +// has already been performed. +func MigrateInvoicesToSQL(ctx context.Context, db kvdb.Backend, + kvStore InvoiceDB, tx *sqlc.Queries, batchSize int) error { + + log.Infof("Starting migration of invoices from KV to SQL") + + offset := uint64(0) + t0 := time.Now() + + // Create the hash index which we will use to look up invoice + // payment hashes by their add index during migration. + err := createInvoiceHashIndex(ctx, db, tx) + if err != nil && !errors.Is(err, ErrNoInvoicesCreated) { + log.Errorf("Unable to create invoice hash index: %v", + err) + + return err + } + log.Debugf("Created SQL invoice hash index in %v", time.Since(t0)) + + total := 0 + // Now we can start migrating the invoices. We'll do this in + // batches to reduce memory usage. + for { + t0 = time.Now() + query := InvoiceQuery{ + IndexOffset: offset, + NumMaxInvoices: uint64(batchSize), + } + + queryResult, err := kvStore.QueryInvoices(ctx, query) + if err != nil && !errors.Is(err, ErrNoInvoicesCreated) { + return fmt.Errorf("unable to query invoices: "+ + "%w", err) + } + + if len(queryResult.Invoices) == 0 { + log.Infof("All invoices migrated") + + break + } + + err = migrateInvoices(ctx, tx, queryResult.Invoices) + if err != nil { + return err + } + + offset = queryResult.LastIndexOffset + total += len(queryResult.Invoices) + log.Debugf("Migrated %d KV invoices to SQL in %v\n", total, + time.Since(t0)) + } + + // Clean up the hash index as it's no longer needed. + err = tx.ClearKVInvoiceHashIndex(ctx) + if err != nil { + return fmt.Errorf("unable to clear invoice hash "+ + "index: %w", err) + } + + log.Infof("Migration of %d invoices from KV to SQL completed", total) + + return nil +} + +func migrateInvoices(ctx context.Context, tx *sqlc.Queries, + invoices []Invoice) error { + + for i, invoice := range invoices { + var paymentHash lntypes.Hash + if invoice.Terms.PaymentPreimage != nil { + paymentHash = invoice.Terms.PaymentPreimage.Hash() + } else { + paymentHashBytes, err := + tx.GetKVInvoicePaymentHashByAddIndex( + ctx, int64(invoice.AddIndex), + ) + if err != nil { + // This would be an unexpected inconsistency + // in the kv database. We can't do much here + // so we'll notify the user and continue. + log.Warnf("Cannot migrate invoice, unable to "+ + "fetch payment hash (add_index=%v): %v", + invoice.AddIndex, err) + + continue + } + + copy(paymentHash[:], paymentHashBytes) + } + + err := MigrateSingleInvoice(ctx, tx, &invoices[i], paymentHash) + if err != nil { + return fmt.Errorf("unable to migrate invoice(%v): %w", + paymentHash, err) + } + + migratedInvoice, err := fetchInvoice( + ctx, tx, InvoiceRefByHash(paymentHash), + ) + if err != nil { + return fmt.Errorf("unable to fetch migrated "+ + "invoice(%v): %w", paymentHash, err) + } + + // Override the time zone for comparison. Note that we need to + // override both invoices as the original invoice is coming from + // KV database, it was stored as a binary serialized Go + // time.Time value which has nanosecond precision but might have + // been created in a different time zone. The migrated invoice + // is stored in SQL in UTC and selected in the local time zone, + // however in PostgreSQL it has microsecond precision while in + // SQLite it has nanosecond precision if using TEXT storage + // class. + OverrideInvoiceTimeZone(&invoice) + OverrideInvoiceTimeZone(migratedInvoice) + + // Override the add index before checking for equality. + migratedInvoice.AddIndex = invoice.AddIndex + + if !reflect.DeepEqual(invoice, *migratedInvoice) { + diff := difflib.UnifiedDiff{ + A: difflib.SplitLines( + spew.Sdump(invoice), + ), + B: difflib.SplitLines( + spew.Sdump(migratedInvoice), + ), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 3, + } + diffText, _ := difflib.GetUnifiedDiffString(diff) + + return fmt.Errorf("%w: %v.\n%v", ErrMigrationMismatch, + paymentHash, diffText) + } + } + + return nil +} diff --git a/invoices/sql_store.go b/invoices/sql_store.go index c9ffcc44c..8a819e5ba 100644 --- a/invoices/sql_store.go +++ b/invoices/sql_store.go @@ -138,6 +138,8 @@ type SQLInvoiceQueries interface { //nolint:interfacebloat GetKVInvoicePaymentHashByAddIndex(ctx context.Context, addIndex int64) ( []byte, error) + + ClearKVInvoiceHashIndex(ctx context.Context) error } var _ InvoiceDB = (*SQLStore)(nil) @@ -354,8 +356,8 @@ func (i *SQLStore) AddInvoice(ctx context.Context, // fetchInvoice fetches the common invoice data and the AMP state for the // invoice with the given reference. -func (i *SQLStore) fetchInvoice(ctx context.Context, - db SQLInvoiceQueries, ref InvoiceRef) (*Invoice, error) { +func fetchInvoice(ctx context.Context, db SQLInvoiceQueries, + ref InvoiceRef) (*Invoice, error) { if ref.PayHash() == nil && ref.PayAddr() == nil && ref.SetID() == nil { return nil, ErrInvoiceNotFound @@ -686,7 +688,7 @@ func (i *SQLStore) LookupInvoice(ctx context.Context, readTxOpt := NewSQLInvoiceQueryReadTx() txErr := i.db.ExecTx(ctx, &readTxOpt, func(db SQLInvoiceQueries) error { - invoice, err = i.fetchInvoice(ctx, db, ref) + invoice, err = fetchInvoice(ctx, db, ref) return err }, func() {}) @@ -1387,7 +1389,7 @@ func (i *SQLStore) UpdateInvoice(ctx context.Context, ref InvoiceRef, ref.refModifier = HtlcSetOnlyModifier } - invoice, err := i.fetchInvoice(ctx, db, ref) + invoice, err := fetchInvoice(ctx, db, ref) if err != nil { return err } diff --git a/invoices/testdata/channel.db b/invoices/testdata/channel.db new file mode 100644 index 0000000000000000000000000000000000000000..78741eae9c63a6284b389e9c6b14f71fa4d32aa9 GIT binary patch literal 1048576 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 z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL RKmY**5I_I{1pd