X Tutup
Skip to content

Commit 95301fe

Browse files
Merge pull request containerd#3567 from renzhengeek/renzhen/devmapper
devmapper: activate dm device if snap device marked as activated
2 parents 4a75a63 + 4d11bb3 commit 95301fe

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

snapshots/devmapper/pool_device.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,41 @@ func NewPoolDevice(ctx context.Context, config *Config) (*PoolDevice, error) {
7373
return poolDevice, nil
7474
}
7575

76-
// ensureDeviceStates marks devices with incomplete states (after crash) as 'Faulty'
76+
// ensureDeviceStates updates devices to their real state:
77+
// - marks devices with incomplete states (after crash) as 'Faulty'
78+
// - activates devices if they are marked as 'Activated' but the dm
79+
// device is not active, which can happen to a stopped container
80+
// after a reboot
7781
func (p *PoolDevice) ensureDeviceStates(ctx context.Context) error {
78-
var devices []*DeviceInfo
82+
var faultyDevices []*DeviceInfo
83+
var activatedDevices []*DeviceInfo
7984

8085
if err := p.metadata.WalkDevices(ctx, func(info *DeviceInfo) error {
8186
switch info.State {
82-
case Activated, Suspended, Resumed, Deactivated, Removed, Faulty:
83-
return nil
87+
case Suspended, Resumed, Deactivated, Removed, Faulty:
88+
case Activated:
89+
activatedDevices = append(activatedDevices, info)
90+
default:
91+
faultyDevices = append(faultyDevices, info)
8492
}
85-
devices = append(devices, info)
8693
return nil
8794
}); err != nil {
8895
return errors.Wrap(err, "failed to query devices from metastore")
8996
}
9097

9198
var result *multierror.Error
92-
for _, dev := range devices {
99+
for _, dev := range activatedDevices {
100+
if p.IsActivated(dev.Name) {
101+
continue
102+
}
103+
104+
log.G(ctx).Warnf("devmapper device %q marked as %q but not active, activating it", dev.Name, dev.State)
105+
if err := p.activateDevice(ctx, dev); err != nil {
106+
result = multierror.Append(result, err)
107+
}
108+
}
109+
110+
for _, dev := range faultyDevices {
93111
log.G(ctx).
94112
WithField("dev_id", dev.DeviceID).
95113
WithField("parent", dev.ParentName).
@@ -350,19 +368,19 @@ func (p *PoolDevice) DeactivateDevice(ctx context.Context, deviceName string, de
350368
return nil
351369
}
352370

353-
// IsActivated returns true if thin-device is activated and not suspended
371+
// IsActivated returns true if thin-device is activated
354372
func (p *PoolDevice) IsActivated(deviceName string) bool {
355373
infos, err := dmsetup.Info(deviceName)
356374
if err != nil || len(infos) != 1 {
357375
// Couldn't query device info, device not active
358376
return false
359377
}
360378

361-
if devInfo := infos[0]; devInfo.Suspended {
362-
return false
379+
if devInfo := infos[0]; devInfo.TableLive {
380+
return true
363381
}
364382

365-
return true
383+
return false
366384
}
367385

368386
// IsLoaded returns true if thin-device is visible for dmsetup

snapshots/devmapper/pool_device_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,9 @@ func TestPoolDeviceMarkFaulty(t *testing.T) {
161161
err := store.AddDevice(testCtx, &DeviceInfo{Name: "1", State: Unknown})
162162
assert.NilError(t, err)
163163

164-
err = store.AddDevice(testCtx, &DeviceInfo{Name: "2", State: Activated})
164+
// Note: do not use 'Activated' here because pool.ensureDeviceStates() will
165+
// try to activate the real dm device, which will fail on a faked device.
166+
err = store.AddDevice(testCtx, &DeviceInfo{Name: "2", State: Deactivated})
165167
assert.NilError(t, err)
166168

167169
pool := &PoolDevice{metadata: store}
@@ -177,7 +179,7 @@ func TestPoolDeviceMarkFaulty(t *testing.T) {
177179
assert.Equal(t, Faulty, info.State)
178180
assert.Equal(t, "1", info.Name)
179181
case 2:
180-
assert.Equal(t, Activated, info.State)
182+
assert.Equal(t, Deactivated, info.State)
181183
assert.Equal(t, "2", info.Name)
182184
default:
183185
t.Error("unexpected walk call")

0 commit comments

Comments
 (0)
X Tutup