This is an automated email from the ASF dual-hosted git repository.

Pearl1594 pushed a commit to branch clvm-ng-bitmap-incsnaps
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/clvm-ng-bitmap-incsnaps by 
this push:
     new dde3d73fb46 add lock holder lookup for bitmap deletion path for clvm 
pooll type
dde3d73fb46 is described below

commit dde3d73fb46ce2c6f832ec1845c6335df4b18b42
Author: Pearl1594 <[email protected]>
AuthorDate: Thu Nov 12 17:30:54 2026 -0500

    add lock holder lookup for bitmap deletion path for clvm pooll type
---
 .../storage/endpoint/DefaultEndPointSelector.java  |  7 +++-
 .../endpoint/DefaultEndPointSelectorTest.java      | 45 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index 0ce2cedb944..96a5aef5140 100644
--- 
a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ 
b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -651,7 +651,12 @@ public class DefaultEndPointSelector implements 
EndPointSelector {
             VirtualMachine attachedVM = volumeInfo.getAttachedVM();
             if (attachedVM.getHostId() != null) {
                 return getEndPointFromHostId(attachedVM.getHostId());
-            } else if (attachedVM.getLastHostId() != null) {
+            }
+            EndPoint clvmEp = tryRouteToClvmLockHolder(volumeInfo, 
_storagePoolDao.findById(volumeInfo.getPoolId()), "bitmap removal");
+            if (clvmEp != null) {
+                return clvmEp;
+            }
+            if (attachedVM.getLastHostId() != null) {
                 return getEndPointFromHostId(attachedVM.getLastHostId());
             }
         }
diff --git 
a/engine/storage/src/test/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelectorTest.java
 
b/engine/storage/src/test/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelectorTest.java
index ca124ec30f0..e9f759b0543 100644
--- 
a/engine/storage/src/test/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelectorTest.java
+++ 
b/engine/storage/src/test/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelectorTest.java
@@ -173,6 +173,51 @@ public class DefaultEndPointSelectorTest {
         Mockito.verify(defaultEndPointSelectorSpy, 
Mockito.times(1)).select(volumeInfoMock, false);
     }
 
+    private void mockClvmVolumeOfStoppedVm(Long lockHostId) {
+        Mockito.doReturn(STORE_ID).when(volumeInfoMock).getPoolId();
+        
Mockito.when(_storagePoolDao.findById(STORE_ID)).thenReturn(storagePoolVOMock);
+        
Mockito.when(storagePoolVOMock.getPoolType()).thenReturn(StoragePoolType.CLVM_NG);
+        
Mockito.doReturn(lockHostId).when(defaultEndPointSelectorSpy).getClvmLockHostId(volumeInfoMock);
+        Mockito.doReturn(true).when(volumeInfoMock).isAttachedVM();
+        
Mockito.doReturn(virtualMachineMock).when(volumeInfoMock).getAttachedVM();
+        Mockito.doReturn(null).when(virtualMachineMock).getHostId();
+        Mockito.doReturn(HOST_ID).when(virtualMachineMock).getLastHostId();
+    }
+
+    @Test
+    public void 
getEndPointForBitmapRemovalTestClvmVolumeOfStoppedVmRoutesToLockHolderInsteadOfLastHost()
 {
+        mockClvmVolumeOfStoppedVm(DEST_HOST_ID);
+        
Mockito.doReturn(endPointMock).when(defaultEndPointSelectorSpy).getEndPointFromHostId(DEST_HOST_ID);
+
+        EndPoint result = 
defaultEndPointSelectorSpy.getEndPointForBitmapRemoval(snapshotInfoMock, false);
+
+        assertEquals(endPointMock, result);
+        Mockito.verify(defaultEndPointSelectorSpy, 
Mockito.never()).getEndPointFromHostId(HOST_ID);
+    }
+
+    @Test
+    public void 
getEndPointForBitmapRemovalTestClvmVolumeOfStoppedVmWithoutLockHolderFallsBackToLastHost()
 {
+        mockClvmVolumeOfStoppedVm(null);
+        
Mockito.doReturn(endPointMock).when(defaultEndPointSelectorSpy).getEndPointFromHostId(HOST_ID);
+
+        EndPoint result = 
defaultEndPointSelectorSpy.getEndPointForBitmapRemoval(snapshotInfoMock, false);
+
+        assertEquals(endPointMock, result);
+    }
+
+    @Test
+    public void 
getEndPointForBitmapRemovalTestClvmVolumeOfRunningVmUsesVmHostWithoutLockLookup()
 {
+        Mockito.doReturn(true).when(volumeInfoMock).isAttachedVM();
+        
Mockito.doReturn(virtualMachineMock).when(volumeInfoMock).getAttachedVM();
+        Mockito.doReturn(HOST_ID).when(virtualMachineMock).getHostId();
+        
Mockito.doReturn(endPointMock).when(defaultEndPointSelectorSpy).getEndPointFromHostId(HOST_ID);
+
+        EndPoint result = 
defaultEndPointSelectorSpy.getEndPointForBitmapRemoval(snapshotInfoMock, false);
+
+        assertEquals(endPointMock, result);
+        Mockito.verify(defaultEndPointSelectorSpy, 
Mockito.never()).getClvmLockHostId(volumeInfoMock);
+    }
+
     @Test
     public void 
getEndPointForSnapshotOperationsInKvmTestVolumeIsNotAttachedToVMAndSnapshotOnPrimary()
 {
         Mockito.doReturn(null).when(volumeInfoMock).getAttachedVM();

Reply via email to