devmapper: don't create or reload thin-pool from snapshotter
Signed-off-by: Maksym Pavlenko <makpav@amazon.com>
This commit is contained in:
@@ -20,7 +20,6 @@ package devmapper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/containerd/containerd/log"
|
||||
@@ -54,60 +53,17 @@ func NewPoolDevice(ctx context.Context, config *Config) (*PoolDevice, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := openPool(ctx, config); err != nil {
|
||||
return nil, err
|
||||
// Make sure pool exists and available
|
||||
poolPath := dmsetup.GetFullDevicePath(config.PoolName)
|
||||
if _, err := dmsetup.Info(poolPath); err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to query pool %q", poolPath)
|
||||
}
|
||||
|
||||
return &PoolDevice{
|
||||
poolName: config.PoolName,
|
||||
metadata: poolMetaStore,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func openPool(ctx context.Context, config *Config) error {
|
||||
if err := config.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var (
|
||||
poolPath = dmsetup.GetFullDevicePath(config.PoolName)
|
||||
poolExists = false
|
||||
)
|
||||
|
||||
if _, err := os.Stat(poolPath); err != nil && !os.IsNotExist(err) {
|
||||
return errors.Wrapf(err, "failed to stat for %q", poolPath)
|
||||
} else if err == nil {
|
||||
poolExists = true
|
||||
}
|
||||
|
||||
// Create new pool if not exists
|
||||
if !poolExists {
|
||||
log.G(ctx).Debug("creating new pool device")
|
||||
if err := dmsetup.CreatePool(config.PoolName, config.DataDevice, config.MetadataDevice, config.DataBlockSizeSectors); err != nil {
|
||||
return errors.Wrapf(err, "failed to create thin-pool with name %q", config.PoolName)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Pool exists, check if it needs to be reloaded
|
||||
if config.DataDevice != "" && config.MetadataDevice != "" {
|
||||
log.G(ctx).Debugf("reloading existing pool %q", poolPath)
|
||||
if err := dmsetup.ReloadPool(config.PoolName, config.DataDevice, config.MetadataDevice, config.DataBlockSizeSectors); err != nil {
|
||||
return errors.Wrapf(err, "failed to reload pool %q", config.PoolName)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// If data and meta devices are not provided, use existing pool. Query info to make sure it's OK.
|
||||
if _, err := dmsetup.Info(poolPath); err != nil {
|
||||
return errors.Wrapf(err, "failed to query info for existing pool %q", poolPath)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// transition invokes 'updateStateFn' callback to perform devmapper operation and reflects device state changes/errors in meta store.
|
||||
// 'tryingState' will be set before invoking callback. If callback succeeded 'successState' will be set, otherwise
|
||||
// error details will be recorded in meta store.
|
||||
|
||||
Reference in New Issue
Block a user