[#1944] metabase: Recreate static buckets instead of resetting

From the `Bucket.ForEach` doc:
```
The provided function must not modify the bucket; this will result in undefined behavior.
```

Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
Evgenii Stratonikov 2022-10-26 09:04:21 +03:00 committed by fyrchik
parent 3c6daa2995
commit e4bc3d0e9d
2 changed files with 9 additions and 18 deletions

View file

@ -106,15 +106,17 @@ func (db *DB) init(reset bool) error {
} }
} }
for k := range mStaticBuckets { for k := range mStaticBuckets {
b, err := tx.CreateBucketIfNotExists([]byte(k)) name := []byte(k)
if err != nil { if reset {
return fmt.Errorf("could not create static bucket %s: %w", k, err) err := tx.DeleteBucket(name)
if err != nil && !errors.Is(err, bbolt.ErrBucketNotFound) {
return fmt.Errorf("could not delete static bucket %s: %w", k, err)
}
} }
if reset { _, err := tx.CreateBucketIfNotExists(name)
if err = resetBucket(b); err != nil { if err != nil {
return fmt.Errorf("could not reset static bucket %s: %w", k, err) return fmt.Errorf("could not create static bucket %s: %w", k, err)
}
} }
} }

View file

@ -223,17 +223,6 @@ func objectKey(obj oid.ID, key []byte) []byte {
return key[:objectKeySize] return key[:objectKeySize]
} }
// removes all bucket elements.
func resetBucket(b *bbolt.Bucket) error {
return b.ForEach(func(k, v []byte) error {
if v != nil {
return b.Delete(k)
}
return b.DeleteBucket(k)
})
}
// if meets irregular object container in objs - returns its type, otherwise returns object.TypeRegular. // if meets irregular object container in objs - returns its type, otherwise returns object.TypeRegular.
// //
// firstIrregularObjectType(tx, cnr, obj) usage allows getting object type. // firstIrregularObjectType(tx, cnr, obj) usage allows getting object type.