feat: support custom timeout for blot open

Signed-off-by: haoyun <yun.hao@daocloud.io>
This commit is contained in:
haoyun 2021-12-13 17:02:37 +08:00
parent 7020719646
commit dd26d3d092

View File

@ -60,6 +60,14 @@ import (
"google.golang.org/grpc/credentials"
)
const (
boltOpenTimeout = "io.containerd.timeout.bolt.open"
)
func init() {
timeout.Set(boltOpenTimeout, 0) // set to 0 means to wait indefinitely for bolt.Open
}
// CreateTopLevelDirectories creates the top-level root and state directories.
func CreateTopLevelDirectories(config *srvconfig.Config) error {
switch {
@ -418,8 +426,21 @@ func LoadPlugins(ctx context.Context, config *srvconfig.Config) ([]*plugin.Regis
path := filepath.Join(ic.Root, "meta.db")
ic.Meta.Exports["path"] = path
db, err := bolt.Open(path, 0644, nil)
options := *bolt.DefaultOptions
options.Timeout = timeout.Get(boltOpenTimeout)
doneCh := make(chan struct{})
go func() {
t := time.NewTimer(10 * time.Second)
defer t.Stop()
select {
case <-t.C:
log.G(ctx).WithField("plugin", "bolt").Warn("waiting for response from boltdb open")
case <-doneCh:
return
}
}()
db, err := bolt.Open(path, 0644, &options)
close(doneCh)
if err != nil {
return nil, err
}