소스 검색

Merge pull request #16799 from rhvgoyal/code-reorg

devmapper: Break down setupBaseImage() function into smaller pieces
Vincent Batts 9 년 전
부모
커밋
670c48857a
1개의 변경된 파일73개의 추가작업 그리고 40개의 파일을 삭제
  1. 73 40
      daemon/graphdriver/devmapper/deviceset.go

+ 73 - 40
daemon/graphdriver/devmapper/deviceset.go

@@ -777,46 +777,7 @@ func (devices *DeviceSet) saveBaseDeviceUUID(baseInfo *devInfo) 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)
-		}
-		return nil
-	}
-
-	if oldInfo != nil && !oldInfo.Initialized {
-		logrus.Debugf("Removing uninitialized base image")
-		if err := devices.DeleteDevice(""); err != nil {
-			return err
-		}
-	}
-
-	if devices.thinPoolDevice != "" && oldInfo == nil {
-		_, 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)
-		}
-	}
-
+func (devices *DeviceSet) createBaseImage() error {
 	logrus.Debugf("Initializing base device-mapper thin volume")
 
 	// Create initial device
@@ -848,6 +809,78 @@ func (devices *DeviceSet) setupBaseImage() 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
+}
+
+// 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 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
+		}
+	}
+
+	// Create new base image device
+	if err := devices.createBaseImage(); err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func setCloseOnExec(name string) {
 	if fileInfos, _ := ioutil.ReadDir("/proc/self/fd"); fileInfos != nil {
 		for _, i := range fileInfos {