Skip to content

Commit 4d5a0e1

Browse files
committed
Mark faulty device in one transaction
Signed-off-by: Maksym Pavlenko <[email protected]>
1 parent 878a320 commit 4d5a0e1

3 files changed

Lines changed: 21 additions & 20 deletions

File tree

snapshots/devmapper/metadata.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"fmt"
2525
"strconv"
2626

27-
"github.com/hashicorp/go-multierror"
2827
"github.com/pkg/errors"
2928
bolt "go.etcd.io/bbolt"
3029
)
@@ -127,23 +126,25 @@ func (m *PoolMetadata) AddDevice(ctx context.Context, info *DeviceInfo) error {
127126
// The snapshotter might attempt to recreate a device in 'Faulty' state with another devmapper ID in
128127
// subsequent calls, and in case of success it's status will be changed to 'Created' or 'Activated'.
129128
// The devmapper dev ID will remain in 'deviceFaulty' state until manually handled by a user.
130-
func (m *PoolMetadata) MarkFaulty(ctx context.Context, info *DeviceInfo) error {
131-
var result error
129+
func (m *PoolMetadata) MarkFaulty(ctx context.Context, name string) error {
130+
return m.db.Update(func(tx *bolt.Tx) error {
131+
var (
132+
device = DeviceInfo{}
133+
devBucket = tx.Bucket(devicesBucketName)
134+
)
132135

133-
if err := m.UpdateDevice(ctx, info.Name, func(deviceInfo *DeviceInfo) error {
134-
deviceInfo.State = Faulty
135-
return nil
136-
}); err != nil {
137-
result = multierror.Append(result, err)
138-
}
136+
if err := getObject(devBucket, name, &device); err != nil {
137+
return err
138+
}
139139

140-
if err := m.db.Update(func(tx *bolt.Tx) error {
141-
return markDeviceID(tx, info.DeviceID, deviceFaulty)
142-
}); err != nil {
143-
result = multierror.Append(result, err)
144-
}
140+
device.State = Faulty
141+
142+
if err := putObject(devBucket, name, &device, true); err != nil {
143+
return err
144+
}
145145

146-
return result
146+
return markDeviceID(tx, device.DeviceID, deviceFaulty)
147+
})
147148
}
148149

149150
// getNextDeviceID finds the next free device ID by taking a cursor

snapshots/devmapper/metadata_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func TestPoolMetadata_MarkFaulty(t *testing.T) {
162162
err := store.AddDevice(testCtx, info)
163163
assert.NilError(t, err)
164164

165-
err = store.MarkFaulty(testCtx, info)
165+
err = store.MarkFaulty(testCtx, "test")
166166
assert.NilError(t, err)
167167

168168
saved, err := store.GetDevice(testCtx, info.Name)

snapshots/devmapper/pool_device.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func (p *PoolDevice) CreateThinDevice(ctx context.Context, deviceName string, vi
132132
if delErr != nil {
133133
// Failed to rollback, mark the device as faulty and keep metadata in order to
134134
// preserve the faulty device ID
135-
retErr = multierror.Append(retErr, delErr, p.metadata.MarkFaulty(ctx, info))
135+
retErr = multierror.Append(retErr, delErr, p.metadata.MarkFaulty(ctx, info.Name))
136136
return
137137
}
138138

@@ -147,7 +147,7 @@ func (p *PoolDevice) CreateThinDevice(ctx context.Context, deviceName string, vi
147147

148148
// We're unable to create the devmapper device, most likely something wrong with the deviceID
149149
if devErr != nil {
150-
retErr = multierror.Append(retErr, p.metadata.MarkFaulty(ctx, info))
150+
retErr = multierror.Append(retErr, p.metadata.MarkFaulty(ctx, info.Name))
151151
return
152152
}
153153
}()
@@ -223,7 +223,7 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
223223
if delErr != nil {
224224
// Failed to rollback, mark the device as faulty and keep metadata in order to
225225
// preserve the faulty device ID
226-
retErr = multierror.Append(retErr, delErr, p.metadata.MarkFaulty(ctx, snapInfo))
226+
retErr = multierror.Append(retErr, delErr, p.metadata.MarkFaulty(ctx, snapInfo.Name))
227227
return
228228
}
229229

@@ -238,7 +238,7 @@ func (p *PoolDevice) CreateSnapshotDevice(ctx context.Context, deviceName string
238238

239239
// We're unable to create the devmapper device, most likely something wrong with the deviceID
240240
if devErr != nil {
241-
retErr = multierror.Append(retErr, p.metadata.MarkFaulty(ctx, snapInfo))
241+
retErr = multierror.Append(retErr, p.metadata.MarkFaulty(ctx, snapInfo.Name))
242242
return
243243
}
244244
}()

0 commit comments

Comments
 (0)