Mark faulty devices

Signed-off-by: Maksym Pavlenko <makpav@amazon.com>
This commit is contained in:
Maksym Pavlenko
2019-08-05 12:05:36 -07:00
parent 3741fd8591
commit 0a4bf1bd1e
4 changed files with 122 additions and 2 deletions

View File

@@ -61,10 +61,47 @@ func NewPoolDevice(ctx context.Context, config *Config) (*PoolDevice, error) {
return nil, errors.Wrapf(err, "failed to query pool %q", poolPath)
}
return &PoolDevice{
poolDevice := &PoolDevice{
poolName: config.PoolName,
metadata: poolMetaStore,
}, nil
}
if err := poolDevice.ensureDeviceStates(ctx); err != nil {
return nil, errors.Wrap(err, "failed to check devices state")
}
return poolDevice, nil
}
// ensureDeviceStates marks devices with incomplete states (after crash) as 'Faulty'
func (p *PoolDevice) ensureDeviceStates(ctx context.Context) error {
var devices []*DeviceInfo
if err := p.metadata.WalkDevices(ctx, func(info *DeviceInfo) error {
switch info.State {
case Activated, Suspended, Resumed, Deactivated, Removed, Faulty:
return nil
}
devices = append(devices, info)
return nil
}); err != nil {
return errors.Wrap(err, "failed to query devices from metastore")
}
var result *multierror.Error
for _, dev := range devices {
log.G(ctx).
WithField("dev_id", dev.DeviceID).
WithField("parent", dev.ParentName).
WithField("error", dev.Error).
Warnf("devmapper device %q has invalid state %q, marking as faulty", dev.Name, dev.State)
if err := p.metadata.MarkFaulty(ctx, dev.Name); err != nil {
result = multierror.Append(result, err)
}
}
return multierror.Prefix(result.ErrorOrNil(), "devmapper:")
}
// transition invokes 'updateStateFn' callback to perform devmapper operation and reflects device state changes/errors in meta store.