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();