devmapper: don't create or reload thin-pool from snapshotter

Signed-off-by: Maksym Pavlenko <makpav@amazon.com>
This commit is contained in:
Maksym Pavlenko
2019-02-21 15:55:01 -08:00
parent 7efda48c53
commit adf5c640f4
5 changed files with 33 additions and 161 deletions

View File

@@ -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.