From efc1ddd7e3341124a2ebbb8a358f44754b32f310 Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Tue, 6 Oct 2015 08:38:03 -0400 Subject: [PATCH 1/3] devmapper: Move base device creation in separate function This moves base device creation function in a separate function. Pure code reorganization. Makes reading code little easier. Signed-off-by: Vivek Goyal --- daemon/graphdriver/devmapper/deviceset.go | 59 +++++++++++++---------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index bdbd7720f..4d0923975 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -777,6 +777,38 @@ func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) error { return nil } +func (devices *DeviceSet) createBaseImage() error { + logrus.Debugf("Initializing base device-mapper thin volume") + + // Create initial device + info, err := devices.createRegisterDevice("") + if err != nil { + return err + } + + logrus.Debugf("Creating filesystem on base device-mapper thin volume") + + if err := devices.activateDeviceIfNeeded(info); err != nil { + return err + } + + if err := devices.createFilesystem(info); err != nil { + return err + } + + info.Initialized = true + if err := devices.saveMetadata(info); err != nil { + info.Initialized = false + return err + } + + if err := devices.saveBaseDeviceUUID(info); err != nil { + return fmt.Errorf("Could not query and save base device UUID:%v", err) + } + + return nil +} + func (devices *DeviceSet) setupBaseImage() error { oldInfo, _ := devices.lookupDeviceWithLock("") if oldInfo != nil && oldInfo.Initialized { @@ -817,34 +849,11 @@ func (devices *DeviceSet) setupBaseImage() error { } } - logrus.Debugf("Initializing base device-mapper thin volume") - - // Create initial device - info, err := devices.createRegisterDevice("") - if err != nil { + // Create new base image device + if err := devices.createBaseImage(); err != nil { return err } - logrus.Debugf("Creating filesystem on base device-mapper thin volume") - - if err := devices.activateDeviceIfNeeded(info); err != nil { - return err - } - - if err := devices.createFilesystem(info); err != nil { - return err - } - - info.Initialized = true - if err := devices.saveMetadata(info); err != nil { - info.Initialized = false - return err - } - - if err := devices.saveBaseDeviceUUID(info); err != nil { - return fmt.Errorf("Could not query and save base device UUID:%v", err) - } - return nil } From 69051ec0a58906e5252f902063ccead2075c8bed Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Tue, 6 Oct 2015 08:38:03 -0400 Subject: [PATCH 2/3] devmapper: Move thin pool related checks in a function Move thin pool related checks in a separate function. Pure code reorganization. Makes reading code easier. Signed-off-by: Vivek Goyal --- daemon/graphdriver/devmapper/deviceset.go | 27 ++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 4d0923975..3f2de920f 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -809,6 +809,22 @@ func (devices *DeviceSet) createBaseImage() error { return nil } +func (devices *DeviceSet) checkThinPool() error { + _, transactionID, dataUsed, _, _, _, err := devices.poolStatus() + if err != nil { + return err + } + if dataUsed != 0 { + return fmt.Errorf("Unable to take ownership of thin-pool (%s) that already has used data blocks", + devices.thinPoolDevice) + } + if transactionID != 0 { + return fmt.Errorf("Unable to take ownership of thin-pool (%s) with non-zero transaction ID", + devices.thinPoolDevice) + } + return nil +} + func (devices *DeviceSet) setupBaseImage() error { oldInfo, _ := devices.lookupDeviceWithLock("") if oldInfo != nil && oldInfo.Initialized { @@ -835,18 +851,9 @@ func (devices *DeviceSet) setupBaseImage() error { } if devices.thinPoolDevice != "" && oldInfo == nil { - _, transactionID, dataUsed, _, _, _, err := devices.poolStatus() - if err != nil { + if err := devices.checkThinPool(); err != nil { return err } - if dataUsed != 0 { - return fmt.Errorf("Unable to take ownership of thin-pool (%s) that already has used data blocks", - devices.thinPoolDevice) - } - if transactionID != 0 { - return fmt.Errorf("Unable to take ownership of thin-pool (%s) with non-zero transaction ID", - devices.thinPoolDevice) - } } // Create new base image device From 0fcd485626f110bbf39e8a6b1edc11b4ac6f7065 Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Tue, 6 Oct 2015 08:38:03 -0400 Subject: [PATCH 3/3] devmapper: Move UUID setup and verification code in a function Simplify setupBaseImage() even further. Move some more code in a separate function. Pure code reorganization. No functionality change. Signed-off-by: Vivek Goyal --- daemon/graphdriver/devmapper/deviceset.go | 47 +++++++++++++++-------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 3f2de920f..1484648b9 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -825,31 +825,48 @@ func (devices *DeviceSet) checkThinPool() error { return nil } -func (devices *DeviceSet) setupBaseImage() error { - oldInfo, _ := devices.lookupDeviceWithLock("") - if oldInfo != nil && oldInfo.Initialized { - // If BaseDeviceUUID is nil (upgrade case), save it and - // return success. - if devices.BaseDeviceUUID == "" { - if err := devices.saveBaseDeviceUUID(oldInfo); err != nil { - return fmt.Errorf("Could not query and save base device UUID:%v", err) - } - return nil - } - - if err := devices.verifyBaseDeviceUUID(oldInfo); err != nil { - return fmt.Errorf("Base Device UUID verification failed. Possibly using a different thin pool than last invocation:%v", err) +// Base image is initialized properly. Either save UUID for first time (for +// upgrade case or verify UUID. +func (devices *DeviceSet) setupVerifyBaseImageUUID(baseInfo *devInfo) error { + // If BaseDeviceUUID is nil (upgrade case), save it and return success. + if devices.BaseDeviceUUID == "" { + if err := devices.saveBaseDeviceUUID(baseInfo); err != nil { + return fmt.Errorf("Could not query and save base device UUID:%v", err) } return nil } - if oldInfo != nil && !oldInfo.Initialized { + if err := devices.verifyBaseDeviceUUID(baseInfo); err != nil { + return fmt.Errorf("Base Device UUID verification failed. Possibly using a different thin pool than last invocation:%v", err) + } + + return nil +} + +func (devices *DeviceSet) setupBaseImage() error { + oldInfo, _ := devices.lookupDeviceWithLock("") + + // base image already exists. If it is initialized properly, do UUID + // verification and return. Otherwise remove image and set it up + // fresh. + + if oldInfo != nil { + if oldInfo.Initialized { + if err := devices.setupVerifyBaseImageUUID(oldInfo); err != nil { + return err + } + + return nil + } + logrus.Debugf("Removing uninitialized base image") if err := devices.DeleteDevice(""); err != nil { return err } } + // If we are setting up base image for the first time, make sure + // thin pool is empty. if devices.thinPoolDevice != "" && oldInfo == nil { if err := devices.checkThinPool(); err != nil { return err