forked from TrueCloudLab/frostfs-node
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
|
package buckets
|
||
|
|
||
|
import (
|
||
|
"plugin"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-node/lib/buckets/boltdb"
|
||
|
"github.com/nspcc-dev/neofs-node/lib/buckets/fsbucket"
|
||
|
"github.com/nspcc-dev/neofs-node/lib/buckets/inmemory"
|
||
|
"github.com/nspcc-dev/neofs-node/lib/core"
|
||
|
"github.com/pkg/errors"
|
||
|
"github.com/spf13/viper"
|
||
|
"go.uber.org/zap"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// BoltDBBucket is a name of BoltDB bucket.
|
||
|
BoltDBBucket = "boltdb"
|
||
|
|
||
|
// InMemoryBucket is a name RAM bucket.
|
||
|
InMemoryBucket = "in-memory"
|
||
|
|
||
|
// FileSystemBucket is a name of file system bucket.
|
||
|
FileSystemBucket = "fsbucket"
|
||
|
|
||
|
bucketSymbol = "PrepareBucket"
|
||
|
)
|
||
|
|
||
|
// NewBucket is a bucket's constructor.
|
||
|
func NewBucket(name core.BucketType, l *zap.Logger, v *viper.Viper) (core.Bucket, error) {
|
||
|
bucket := v.GetString("storage." + string(name) + ".bucket")
|
||
|
|
||
|
l.Info("initialize bucket",
|
||
|
zap.String("name", string(name)),
|
||
|
zap.String("bucket", bucket))
|
||
|
|
||
|
switch strings.ToLower(bucket) {
|
||
|
case FileSystemBucket:
|
||
|
return fsbucket.NewBucket(name, v)
|
||
|
|
||
|
case InMemoryBucket:
|
||
|
return inmemory.NewBucket(name, v), nil
|
||
|
|
||
|
case BoltDBBucket:
|
||
|
opts, err := boltdb.NewOptions("storage."+name, v)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return boltdb.NewBucket(&opts)
|
||
|
default:
|
||
|
instance, err := plugin.Open(bucket)
|
||
|
if err != nil {
|
||
|
return nil, errors.Wrapf(err, "could not load bucket: `%s`", bucket)
|
||
|
}
|
||
|
|
||
|
sym, err := instance.Lookup(bucketSymbol)
|
||
|
if err != nil {
|
||
|
return nil, errors.Wrapf(err, "could not find bucket signature: `%s`", bucket)
|
||
|
}
|
||
|
|
||
|
return sym.(func(core.BucketType, *viper.Viper) (core.Bucket, error))(name, v)
|
||
|
}
|
||
|
}
|