channeldb: add migration for payment statuses for completed payments

This commit is contained in:
Vadym Popov 2018-08-12 16:15:24 +03:00 committed by Conner Fromknecht
parent 7f6fbd4533
commit f405376b8b
No known key found for this signature in database
GPG Key ID: E7D737B67FA592C7

@ -2,6 +2,7 @@ package channeldb
import (
"bytes"
"crypto/sha256"
"fmt"
"github.com/coreos/bbolt"
@ -373,3 +374,46 @@ func migrateEdgePolicies(tx *bolt.Tx) error {
return nil
}
// paymentStatusesMigration is a database migration intended for adding payment
// statuses for each existing payment entity in bucket to be able control
// transitions of statuses and prevent cases such as double payment
func paymentStatusesMigration(tx *bolt.Tx) error {
// Get the bucket dedicated to storing payments
bucket := tx.Bucket(paymentBucket)
if bucket == nil {
return nil
}
// Get the bucket dedicated to storing statuses of payments,
// where a key is payment hash, value is payment status
paymentStatuses, err := tx.CreateBucketIfNotExists(paymentStatusBucket)
if err != nil {
return err
}
log.Infof("Migration database adds to all existing payments " +
"statuses as Completed")
// For each payment in the bucket, fetch all data.
return bucket.ForEach(func(k, v []byte) error {
// Ignores if it is sub-bucket.
if v == nil {
return nil
}
r := bytes.NewReader(v)
payment, err := deserializeOutgoingPayment(r)
if err != nil {
return err
}
// Calculate payment hash for current payment.
paymentHash := sha256.Sum256(payment.PaymentPreimage[:])
// Tries to update status for current payment to completed
// if it fails - migration abort transaction and return payment bucket
// to previous state.
return paymentStatuses.Put(paymentHash[:], StatusCompleted.Bytes())
})
}