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.
(ctx context.Context, deviceName string, tryingState DeviceState, successState DeviceState, updateStateFn func() error)
| 175 | // 'tryingState' will be set before invoking callback. If callback succeeded 'successState' will be set, otherwise |
| 176 | // error details will be recorded in meta store. |
| 177 | func (p *PoolDevice) transition(ctx context.Context, deviceName string, tryingState DeviceState, successState DeviceState, updateStateFn func() error) error { |
| 178 | // Set device to trying state |
| 179 | uerr := p.metadata.UpdateDevice(ctx, deviceName, func(deviceInfo *DeviceInfo) error { |
| 180 | deviceInfo.State = tryingState |
| 181 | return nil |
| 182 | }) |
| 183 | |
| 184 | if uerr != nil { |
| 185 | return fmt.Errorf("failed to set device %q state to %q: %w", deviceName, tryingState, uerr) |
| 186 | } |
| 187 | |
| 188 | var result []error |
| 189 | |
| 190 | // Invoke devmapper operation |
| 191 | err := updateStateFn() |
| 192 | |
| 193 | if err != nil { |
| 194 | result = append(result, err) |
| 195 | } |
| 196 | |
| 197 | // If operation succeeded transition to success state, otherwise save error details |
| 198 | uerr = p.metadata.UpdateDevice(ctx, deviceName, func(deviceInfo *DeviceInfo) error { |
| 199 | if err == nil { |
| 200 | deviceInfo.State = successState |
| 201 | deviceInfo.Error = "" |
| 202 | } else { |
| 203 | deviceInfo.Error = err.Error() |
| 204 | } |
| 205 | return nil |
| 206 | }) |
| 207 | |
| 208 | if uerr != nil { |
| 209 | result = append(result, uerr) |
| 210 | } |
| 211 | |
| 212 | return errors.Join(result...) |
| 213 | } |
| 214 | |
| 215 | // CreateThinDevice creates new devmapper thin-device with given name and size. |
| 216 | // Device ID for thin-device will be allocated from metadata store. |
no test coverage detected