|
37 | 37 | import com.cloud.agent.api.PrepareForMigrationAnswer; |
38 | 38 | import com.cloud.resource.ResourceManager; |
39 | 39 | import com.cloud.storage.clvm.ClvmPoolManager; |
| 40 | +import org.apache.cloudstack.storage.clvm.command.ClvmLockTransferCommand; |
40 | 41 | import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; |
41 | 42 | import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; |
42 | 43 | import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; |
@@ -2027,6 +2028,7 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach |
2027 | 2028 | String errMsg = null; |
2028 | 2029 | boolean success = false; |
2029 | 2030 | Map<VolumeInfo, VolumeInfo> srcVolumeInfoToDestVolumeInfo = new HashMap<>(); |
| 2031 | + List<VolumeInfo> samePoolClvmVolumes = new ArrayList<>(); |
2030 | 2032 |
|
2031 | 2033 | try { |
2032 | 2034 | if (srcHost.getHypervisorType() != HypervisorType.KVM) { |
@@ -2056,6 +2058,13 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach |
2056 | 2058 | continue; |
2057 | 2059 | } |
2058 | 2060 |
|
| 2061 | + if (sourceStoragePool.getId() == destStoragePool.getId() && |
| 2062 | + ClvmPoolManager.isClvmPoolType(destStoragePool.getPoolType())) { |
| 2063 | + logger.info("Same-pool CLVM migration for volume [{}]: skipping data copy.", srcVolumeInfo.getUuid()); |
| 2064 | + samePoolClvmVolumes.add(srcVolumeInfo); |
| 2065 | + continue; |
| 2066 | + } |
| 2067 | + |
2059 | 2068 | if (!shouldMigrateVolume(sourceStoragePool, destHost, destStoragePool)) { |
2060 | 2069 | continue; |
2061 | 2070 | } |
@@ -2148,6 +2157,23 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach |
2148 | 2157 | throw new AgentUnavailableException("Operation timed out", destHost.getId()); |
2149 | 2158 | } |
2150 | 2159 |
|
| 2160 | + for (VolumeInfo vol : samePoolClvmVolumes) { |
| 2161 | + StoragePoolVO samePoolClvmPool = _storagePoolDao.findById(vol.getPoolId()); |
| 2162 | + String vgName = samePoolClvmPool.getPath(); |
| 2163 | + if (vgName.startsWith("/")) vgName = vgName.substring(1); |
| 2164 | + String lvPath = String.format("/dev/%s/%s", vgName, vol.getPath()); |
| 2165 | + logger.info("Activating CLVM volume [{}] in shared mode on dest host [{}] for same-pool migration.", |
| 2166 | + vol.getUuid(), destHost.getId()); |
| 2167 | + Answer activateAnswer = agentManager.send(destHost.getId(), |
| 2168 | + new ClvmLockTransferCommand(ClvmLockTransferCommand.Operation.ACTIVATE_SHARED, lvPath, vol.getUuid())); |
| 2169 | + if (activateAnswer == null || !activateAnswer.getResult()) { |
| 2170 | + throw new CloudRuntimeException(String.format( |
| 2171 | + "Failed to activate CLVM volume [%s] in shared mode on dest host [%s]: %s", |
| 2172 | + vol.getUuid(), destHost.getId(), |
| 2173 | + activateAnswer != null ? activateAnswer.getDetails() : "null answer")); |
| 2174 | + } |
| 2175 | + } |
| 2176 | + |
2151 | 2177 | VMInstanceVO vm = _vmDao.findById(vmTO.getId()); |
2152 | 2178 | boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); |
2153 | 2179 |
|
|
0 commit comments