mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-02-24 22:58:18 +01:00
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
|
package migration33
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
|
||
|
"github.com/lightningnetwork/lnd/kvdb"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
// resultsKey is the fixed key under which the attempt results are
|
||
|
// stored.
|
||
|
resultsKey = []byte("missioncontrol-results")
|
||
|
|
||
|
// defaultMCNamespaceKey is the key of the default mission control store
|
||
|
// namespace.
|
||
|
defaultMCNamespaceKey = []byte("default")
|
||
|
)
|
||
|
|
||
|
// MigrateMCStoreNameSpacedResults reads in all the current mission control
|
||
|
// entries and re-writes them under a new default namespace.
|
||
|
func MigrateMCStoreNameSpacedResults(tx kvdb.RwTx) error {
|
||
|
log.Infof("Migrating Mission Control store to use namespaced results")
|
||
|
|
||
|
// Get the top level bucket. All the MC results are currently stored
|
||
|
// as KV pairs in this bucket
|
||
|
topLevelBucket := tx.ReadWriteBucket(resultsKey)
|
||
|
|
||
|
// If the results bucket does not exist then there are no entries in
|
||
|
// the mission control store yet and so there is nothing to migrate.
|
||
|
if topLevelBucket == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Create a new default namespace bucket under the top-level bucket.
|
||
|
defaultNSBkt, err := topLevelBucket.CreateBucket(defaultMCNamespaceKey)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Iterate through each of the existing result pairs, write them to the
|
||
|
// new namespaced bucket. Also collect the set of keys so that we can
|
||
|
// later delete them from the top level bucket.
|
||
|
var keys [][]byte
|
||
|
err = topLevelBucket.ForEach(func(k, v []byte) error {
|
||
|
// Skip the new default namespace key.
|
||
|
if bytes.Equal(k, defaultMCNamespaceKey) {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Collect the key.
|
||
|
keys = append(keys, k)
|
||
|
|
||
|
// Write the pair under the default namespace.
|
||
|
return defaultNSBkt.Put(k, v)
|
||
|
})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Finally, iterate through the set of keys and delete them from the
|
||
|
// top level bucket.
|
||
|
for _, k := range keys {
|
||
|
if err := topLevelBucket.Delete(k); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return err
|
||
|
}
|