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:
4 files changed
+21
-3
No files matched your search
@@ -69,7 +69,7 @@ func randInvoice(value lnwire.MilliSatoshi) (*invpkg.Invoice, error) {
|
|||||||
i := &invpkg.Invoice{
|
i := &invpkg.Invoice{
|
||||||
CreationDate: testNow,
|
CreationDate: testNow,
|
||||||
Terms: invpkg.ContractTerm{
|
Terms: invpkg.ContractTerm{
|
||||||
Expiry: 4000,
|
Expiry: time.Duration(4000) * time.Second,
|
||||||
PaymentPreimage: &pre,
|
PaymentPreimage: &pre,
|
||||||
PaymentAddr: payAddr,
|
PaymentAddr: payAddr,
|
||||||
Value: value,
|
Value: value,
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ func (i *SQLStore) AddInvoice(ctx context.Context,
|
|||||||
CltvDelta: sqldb.SQLInt32(
|
CltvDelta: sqldb.SQLInt32(
|
||||||
newInvoice.Terms.FinalCltvDelta,
|
newInvoice.Terms.FinalCltvDelta,
|
||||||
),
|
),
|
||||||
Expiry: int32(newInvoice.Terms.Expiry),
|
Expiry: int32(newInvoice.Terms.Expiry.Seconds()),
|
||||||
// Note: keysend invoices don't have a payment request.
|
// Note: keysend invoices don't have a payment request.
|
||||||
PaymentRequest: sqldb.SQLStr(string(
|
PaymentRequest: sqldb.SQLStr(string(
|
||||||
newInvoice.PaymentRequest),
|
newInvoice.PaymentRequest),
|
||||||
@@ -1598,6 +1598,8 @@ func unmarshalInvoice(row sqlc.Invoice) (*lntypes.Hash, *Invoice,
|
|||||||
cltvDelta = row.CltvDelta.Int32
|
cltvDelta = row.CltvDelta.Int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expiry := time.Duration(row.Expiry) * time.Second
|
||||||
|
|
||||||
invoice := &Invoice{
|
invoice := &Invoice{
|
||||||
SettleIndex: uint64(settleIndex),
|
SettleIndex: uint64(settleIndex),
|
||||||
SettleDate: settledAt,
|
SettleDate: settledAt,
|
||||||
@@ -1606,7 +1608,7 @@ func unmarshalInvoice(row sqlc.Invoice) (*lntypes.Hash, *Invoice,
|
|||||||
CreationDate: row.CreatedAt.Local(),
|
CreationDate: row.CreatedAt.Local(),
|
||||||
Terms: ContractTerm{
|
Terms: ContractTerm{
|
||||||
FinalCltvDelta: cltvDelta,
|
FinalCltvDelta: cltvDelta,
|
||||||
Expiry: time.Duration(row.Expiry),
|
Expiry: expiry,
|
||||||
PaymentPreimage: preimage,
|
PaymentPreimage: preimage,
|
||||||
Value: lnwire.MilliSatoshi(row.AmountMsat),
|
Value: lnwire.MilliSatoshi(row.AmountMsat),
|
||||||
PaymentAddr: paymentAddr,
|
PaymentAddr: paymentAddr,
|
||||||
|
|||||||
@@ -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.
|
||||||
@@ -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;
|
||||||
Reference in new issue
Block a user