Skip to content

Commit bfe4a08

Browse files
committed
channeldb/migration33: migrate MC store pairs to default namespace
In this commit, the mission control store is migrated such that all existing pairs which are currently stored directly in the top level results bucket are now instead moved to a "default" namespace bucket. Note that this migration is not yet invoked in this commit. The migration will be invoked in the same commit that starts writing and reading the new format.
1 parent 2dd9046 commit bfe4a08

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

channeldb/migration33/log.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package migration33
2+
3+
import (
4+
"github.com/btcsuite/btclog"
5+
)
6+
7+
// log is a logger that is initialized as disabled. This means the package will
8+
// not perform any logging by default until a logger is set.
9+
var log = btclog.Disabled
10+
11+
// UseLogger uses a specified Logger to output package logging info.
12+
func UseLogger(logger btclog.Logger) {
13+
log = logger
14+
}

channeldb/migration33/migration.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package migration33
2+
3+
import (
4+
"bytes"
5+
6+
"github.com/lightningnetwork/lnd/kvdb"
7+
)
8+
9+
var (
10+
// resultsKey is the fixed key under which the attempt results are
11+
// stored.
12+
resultsKey = []byte("missioncontrol-results")
13+
14+
// defaultMCNamespaceKey is the key of the default mission control store
15+
// namespace.
16+
defaultMCNamespaceKey = []byte("default")
17+
)
18+
19+
// MigrateMCStoreNameSpacedResults reads in all the current mission control
20+
// entries and re-writes them under a new default namespace.
21+
func MigrateMCStoreNameSpacedResults(tx kvdb.RwTx) error {
22+
log.Infof("Migrating Mission Control store to use namespaced results")
23+
24+
// Get the top level bucket. All the MC results are currently stored
25+
// as KV pairs in this bucket
26+
topLevelBucket := tx.ReadWriteBucket(resultsKey)
27+
28+
// If the results bucket does not exist then there are no entries in
29+
// the mission control store yet and so there is nothing to migrate.
30+
if topLevelBucket == nil {
31+
return nil
32+
}
33+
34+
// Create a new default namespace bucket under the top-level bucket.
35+
defaultNSBkt, err := topLevelBucket.CreateBucket(defaultMCNamespaceKey)
36+
if err != nil {
37+
return err
38+
}
39+
40+
// Iterate through each of the existing result pairs, write them to the
41+
// new namespaced bucket. Also collect the set of keys so that we can
42+
// later delete them from the top level bucket.
43+
var keys [][]byte
44+
err = topLevelBucket.ForEach(func(k, v []byte) error {
45+
// Skip the new default namespace key.
46+
if bytes.Equal(k, defaultMCNamespaceKey) {
47+
return nil
48+
}
49+
50+
// Collect the key.
51+
keys = append(keys, k)
52+
53+
// Write the pair under the default namespace.
54+
return defaultNSBkt.Put(k, v)
55+
})
56+
if err != nil {
57+
return err
58+
}
59+
60+
// Finally, iterate through the set of keys and delete them from the
61+
// top level bucket.
62+
for _, k := range keys {
63+
if err := topLevelBucket.Delete(k); err != nil {
64+
return err
65+
}
66+
}
67+
68+
return err
69+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package migration33
2+
3+
import (
4+
"testing"
5+
6+
"github.com/lightningnetwork/lnd/channeldb/migtest"
7+
"github.com/lightningnetwork/lnd/kvdb"
8+
)
9+
10+
var (
11+
// before represents the structure of the MC store before the migration.
12+
before = map[string]interface{}{
13+
"key1": "result1",
14+
"key2": "result2",
15+
"key3": "result3",
16+
"key4": "result4",
17+
}
18+
19+
// after represents the expected structure of the store after the
20+
// migration. It should be identical to before except all the kv pairs
21+
// are now under a new default namespace key.
22+
after = map[string]interface{}{
23+
string(defaultMCNamespaceKey): before,
24+
}
25+
)
26+
27+
// TestMigrateMCStoreNameSpacedResults tests that the MC store results are
28+
// correctly moved to be under a new default namespace bucket.
29+
func TestMigrateMCStoreNameSpacedResults(t *testing.T) {
30+
before := func(tx kvdb.RwTx) error {
31+
return migtest.RestoreDB(tx, resultsKey, before)
32+
}
33+
34+
after := func(tx kvdb.RwTx) error {
35+
return migtest.VerifyDB(tx, resultsKey, after)
36+
}
37+
38+
migtest.ApplyMigration(
39+
t, before, after, MigrateMCStoreNameSpacedResults, false,
40+
)
41+
}

0 commit comments

Comments
 (0)