Disable writing freelist to make the file robust against data corruptions

A bbolt database has a freelist to track all pages that are available
for allocation. However writing the list takes some time and reading
the list sometimes panics.

This commit sets NoFreelistSync true to skipping the freelist entirely,
following what etcd does.

https://github.com/etcd-io/etcd/blob/v3.5.2/server/mvcc/backend/config_linux.go#L31

Fixes #4838.

Signed-off-by: Kazuyoshi Kato <katokazu@amazon.com>
This commit is contained in:
Kazuyoshi Kato 2022-04-01 20:47:06 +00:00
parent 1ba613e200
commit 6da3183105

View File

@ -450,8 +450,16 @@ func LoadPlugins(ctx context.Context, config *srvconfig.Config) ([]*plugin.Regis
path := filepath.Join(ic.Root, "meta.db")
ic.Meta.Exports["path"] = path
options := *bolt.DefaultOptions
// Reading bbolt's freelist sometimes fails when the file has a data corruption.
// Disabling freelist sync reduces the chance of the breakage.
// https://github.com/etcd-io/bbolt/pull/1
// https://github.com/etcd-io/bbolt/pull/6
options.NoFreelistSync = true
// Without the timeout, bbolt.Open would block indefinitely due to flock(2).
options.Timeout = timeout.Get(boltOpenTimeout)
doneCh := make(chan struct{})
go func() {
t := time.NewTimer(10 * time.Second)