sqldb+invoices: add migration to fix incorrectly stored invoice expiries

Previously, when using the native schema, invoice expiries were incorrectly
stored as 64-bit values (expiry in nanoseconds instead of seconds), causing
overflow issues. Since we cannot determine the original values, we will set
the expiries for existing invoices to 1 hour with this migration.
This commit is contained in:
Andras Banki-Horvath 2024-06-21 19:08:15 +02:00
parent 3526f82b5d
commit 323af946e0
No known key found for this signature in database
GPG Key ID: 80E5375C094198D8
4 changed files with 21 additions and 3 deletions

View File

@ -69,7 +69,7 @@ func randInvoice(value lnwire.MilliSatoshi) (*invpkg.Invoice, error) {
i := &invpkg.Invoice{
CreationDate: testNow,
Terms: invpkg.ContractTerm{
Expiry: 4000,
Expiry: time.Duration(4000) * time.Second,
PaymentPreimage: &pre,
PaymentAddr: payAddr,
Value: value,

View File

@ -233,7 +233,7 @@ func (i *SQLStore) AddInvoice(ctx context.Context,
CltvDelta: sqldb.SQLInt32(
newInvoice.Terms.FinalCltvDelta,
),
Expiry: int32(newInvoice.Terms.Expiry),
Expiry: int32(newInvoice.Terms.Expiry.Seconds()),
// Note: keysend invoices don't have a payment request.
PaymentRequest: sqldb.SQLStr(string(
newInvoice.PaymentRequest),
@ -1598,6 +1598,8 @@ func unmarshalInvoice(row sqlc.Invoice) (*lntypes.Hash, *Invoice,
cltvDelta = row.CltvDelta.Int32
}
expiry := time.Duration(row.Expiry) * time.Second
invoice := &Invoice{
SettleIndex: uint64(settleIndex),
SettleDate: settledAt,
@ -1606,7 +1608,7 @@ func unmarshalInvoice(row sqlc.Invoice) (*lntypes.Hash, *Invoice,
CreationDate: row.CreatedAt.Local(),
Terms: ContractTerm{
FinalCltvDelta: cltvDelta,
Expiry: time.Duration(row.Expiry),
Expiry: expiry,
PaymentPreimage: preimage,
Value: lnwire.MilliSatoshi(row.AmountMsat),
PaymentAddr: paymentAddr,

View File

@ -0,0 +1,2 @@
-- Given that all expiries are changed in this migration we won't be able to
-- roll back to the previous values.

View File

@ -0,0 +1,14 @@
-- Update the expiry for all records in the invoices table. This is needed as
-- previously we stored raw time.Duration values which are 64 bit integers and
-- are used to express duration in nanoseconds however the intent is to store
-- invoice expiry in seconds.
-- Update the expiry to 86400 seconds (24 hours) for non-AMP invoices.
UPDATE invoices
SET expiry = 86400
WHERE is_amp = FALSE;
-- Update the expiry to 2592000 seconds (30 days) for AMP invoices
UPDATE invoices
SET expiry = 2592000
WHERE is_amp = TRUE;