channeldb: fix bug in migration from 0.4 to 0.5
In this commit, we fix a bug in the latest database migration when migrating from 0.4 to 0.5. There's an issue in bolt db where if one deletes a bucket that has a key with a nil value, it thinks that's a sub bucket and attempts a bucket deletion. This will fail as it's not actually a sub-bucket. We get around this by using a cursor to manually delete items in the bucket. Fixes #1907.
This commit is contained in:
parent
48d016bc78
commit
3b2c807288
@ -479,7 +479,8 @@ func migratePruneEdgeUpdateIndex(tx *bolt.Tx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve some buckets that will be needed later on. These should
|
// Retrieve some buckets that will be needed later on. These should
|
||||||
// already exist given the assumption that the buckets above do as well.
|
// already exist given the assumption that the buckets above do as
|
||||||
|
// well.
|
||||||
edgeIndex, err := edges.CreateBucketIfNotExists(edgeIndexBucket)
|
edgeIndex, err := edges.CreateBucketIfNotExists(edgeIndexBucket)
|
||||||
if edgeIndex == nil {
|
if edgeIndex == nil {
|
||||||
return fmt.Errorf("unable to create/fetch edge index " +
|
return fmt.Errorf("unable to create/fetch edge index " +
|
||||||
@ -515,16 +516,15 @@ func migratePruneEdgeUpdateIndex(tx *bolt.Tx) error {
|
|||||||
|
|
||||||
// With the existing edge policies gathered, we'll recreate the index
|
// With the existing edge policies gathered, we'll recreate the index
|
||||||
// and populate it with the correct entries.
|
// and populate it with the correct entries.
|
||||||
if err := edges.DeleteBucket(edgeUpdateIndexBucket); err != nil {
|
//
|
||||||
return fmt.Errorf("unable to remove existing edge update "+
|
// NOTE: In bolt DB, calling Delete() on an iterator will actually move
|
||||||
"index: %v", err)
|
// it to the NEXT item. As a result, we call First() here again to go
|
||||||
}
|
// back to the front after the item has been deleted.
|
||||||
edgeUpdateIndex, err = edges.CreateBucketIfNotExists(
|
updateCursor := edgeUpdateIndex.Cursor()
|
||||||
edgeUpdateIndexBucket,
|
for k, _ := updateCursor.First(); k != nil; k, _ = updateCursor.First() {
|
||||||
)
|
if err := updateCursor.Delete(); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return fmt.Errorf("unable to recreate edge update index: %v",
|
}
|
||||||
err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// For each edge key, we'll retrieve the policy, deserialize it, and
|
// For each edge key, we'll retrieve the policy, deserialize it, and
|
||||||
|
Loading…
Reference in New Issue
Block a user