@@ -2215,7 +2215,7 @@ public void copyAsync(Map<VolumeInfo, DataStore> volumeDataStoreMap, VirtualMach
22152215 }
22162216 }
22172217
2218- handlePostMigration (success , srcVolumeInfoToDestVolumeInfo , vmTO , destHost );
2218+ handlePostMigration (success , srcVolumeInfoToDestVolumeInfo , vmTO , srcHost , destHost );
22192219
22202220 if (!success ) {
22212221 if (migrateAnswer == null ) {
@@ -2434,7 +2434,26 @@ String getVolumeBackingFile(VolumeInfo srcVolumeInfo) {
24342434 return null ;
24352435 }
24362436
2437- private void handlePostMigration (boolean success , Map <VolumeInfo , VolumeInfo > srcVolumeInfoToDestVolumeInfo , VirtualMachineTO vmTO , Host destHost ) {
2437+ private void sendClvmLockCommand (long hostId , StoragePoolVO pool , VolumeInfo volumeInfo ,
2438+ ClvmLockTransferCommand .Operation operation ) {
2439+ String vgName = pool .getPath ();
2440+ if (vgName .startsWith ("/" )) {
2441+ vgName = vgName .substring (1 );
2442+ }
2443+ String lvPath = String .format ("/dev/%s/%s" , vgName , volumeInfo .getPath ());
2444+ try {
2445+ Answer answer = agentManager .send (hostId ,
2446+ new ClvmLockTransferCommand (operation , lvPath , volumeInfo .getUuid ()));
2447+ if (answer == null || !answer .getResult ()) {
2448+ String details = answer != null ? answer .getDetails () : "null answer" ;
2449+ logger .warn ("CLVM lock command [{}] failed for LV [{}] on host [{}]: {}" , operation , lvPath , hostId , details );
2450+ }
2451+ } catch (AgentUnavailableException | OperationTimedoutException e ) {
2452+ logger .warn ("Exception sending CLVM lock command [{}] for LV [{}] on host [{}]: {}" , operation , lvPath , hostId , e .getMessage ());
2453+ }
2454+ }
2455+
2456+ private void handlePostMigration (boolean success , Map <VolumeInfo , VolumeInfo > srcVolumeInfoToDestVolumeInfo , VirtualMachineTO vmTO , Host srcHost , Host destHost ) {
24382457 if (!success ) {
24392458 try {
24402459 PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand (vmTO );
@@ -2453,6 +2472,17 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
24532472 catch (Exception e ) {
24542473 logger .debug ("Failed to disconnect one or more (original) dest volumes" , e );
24552474 }
2475+
2476+ if (srcHost != null && srcHost .getHypervisorType () == HypervisorType .KVM ) {
2477+ for (VolumeInfo srcVolumeInfo : srcVolumeInfoToDestVolumeInfo .keySet ()) {
2478+ StoragePoolVO srcPool = _storagePoolDao .findById (srcVolumeInfo .getPoolId ());
2479+ if (srcPool == null || !ClvmPoolManager .isClvmPoolType (srcPool .getPoolType ())) {
2480+ continue ;
2481+ }
2482+ sendClvmLockCommand (srcHost .getId (), srcPool , srcVolumeInfo ,
2483+ ClvmLockTransferCommand .Operation .ACTIVATE_EXCLUSIVE );
2484+ }
2485+ }
24562486 }
24572487
24582488 for (Map .Entry <VolumeInfo , VolumeInfo > entry : srcVolumeInfoToDestVolumeInfo .entrySet ()) {
@@ -2480,6 +2510,15 @@ private void handlePostMigration(boolean success, Map<VolumeInfo, VolumeInfo> sr
24802510
24812511 _volumeDao .update (volumeVO .getId (), volumeVO );
24822512
2513+ StoragePoolVO srcPoolVO = _storagePoolDao .findById (srcVolumeInfo .getPoolId ());
2514+ StoragePoolVO destPoolVO = _storagePoolDao .findById (destVolumeInfo .getPoolId ());
2515+ if (destPoolVO != null && ClvmPoolManager .isClvmPoolType (destPoolVO .getPoolType ())
2516+ && (srcPoolVO == null || srcPoolVO .getId () != destPoolVO .getId ())) {
2517+ sendClvmLockCommand (destHost .getId (), destPoolVO , destVolumeInfo ,
2518+ ClvmLockTransferCommand .Operation .ACTIVATE_EXCLUSIVE );
2519+ clvmPoolManager .setClvmLockHostId (destVolumeInfo .getId (), destHost .getId ());
2520+ }
2521+
24832522 _volumeService .copyPoliciesBetweenVolumesAndDestroySourceVolumeAfterMigration (Event .OperationSucceeded , null , srcVolumeInfo , destVolumeInfo , false );
24842523
24852524 // Update the volume ID for snapshots on secondary storage
0 commit comments