@@ -72,15 +72,19 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
7272 private SearchBuilder <SnapshotDataStoreVO > dataStoreAndInstallPathSearch ;
7373 private SearchBuilder <SnapshotDataStoreVO > storeAndSnapshotIdsSearch ;
7474 private SearchBuilder <SnapshotDataStoreVO > storeSnapshotDownloadStatusSearch ;
75- private SearchBuilder <SnapshotDataStoreVO > searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull ;
75+ private SearchBuilder <SnapshotDataStoreVO > searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull ;
7676 private SearchBuilder <SnapshotDataStoreVO > searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore ;
77+ private SearchBuilder <SnapshotDataStoreVO > searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq ;
7778
7879
7980 protected static final List <Hypervisor .HypervisorType > HYPERVISORS_SUPPORTING_SNAPSHOTS_CHAINING = List .of (Hypervisor .HypervisorType .XenServer );
8081
8182 @ Inject
8283 protected SnapshotDao snapshotDao ;
8384
85+ @ Inject
86+ protected ImageStoreDao imageStoreDao ;
87+
8488 private static final String FIND_OLDEST_OR_LATEST_SNAPSHOT = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where " +
8589 " store_role = ? and volume_id = ? and state = 'Ready'" +
8690 " order by created %s " +
@@ -163,18 +167,26 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
163167 storeSnapshotDownloadStatusSearch .and ("downloadState" , storeSnapshotDownloadStatusSearch .entity ().getDownloadState (), SearchCriteria .Op .IN );
164168 storeSnapshotDownloadStatusSearch .done ();
165169
166- searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull = createSearchBuilder ();
167- searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .and (VOLUME_ID , searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .entity ().getVolumeId (), SearchCriteria .Op .EQ );
168- searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .and (STATE , searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .entity ().getState (), SearchCriteria .Op .EQ );
169- searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .and (KVM_CHECKPOINT_PATH , searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .entity ().getKvmCheckpointPath (), SearchCriteria .Op .NNULL );
170- searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .done ();
170+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull = createSearchBuilder ();
171+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .and (VOLUME_ID , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .entity ().getVolumeId (), SearchCriteria .Op .EQ );
172+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .and (STATE , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .entity ().getState (), SearchCriteria .Op .EQ );
173+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .and (STORE_ROLE , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .entity ().getRole (), SearchCriteria .Op .EQ );
174+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .and (KVM_CHECKPOINT_PATH , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .entity ().getKvmCheckpointPath (), SearchCriteria .Op .NNULL );
175+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .and (STORE_ID , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .entity ().getDataStoreId (), SearchCriteria .Op .IN );
176+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .done ();
171177
172178 searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore = createSearchBuilder ();
173179 searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .and (STATE , searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .entity ().getState (), SearchCriteria .Op .EQ );
174180 searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .and (DOWNLOAD_URL , searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .entity ().getExtractUrl (), SearchCriteria .Op .NNULL );
175181 searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .and (URL_CREATED_BEFORE , searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .entity ().getExtractUrlCreated (), SearchCriteria .Op .LT );
176182 searchFilterStateAndDownloadUrlNotNullAndDownloadUrlCreatedBefore .done ();
177183
184+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq = createSearchBuilder ();
185+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .and (STATE , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .entity ().getState (), SearchCriteria .Op .EQ );
186+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .and (VOLUME_ID , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .entity ().getVolumeId (), SearchCriteria .Op .EQ );
187+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .and (STORE_ROLE , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .entity ().getRole (), SearchCriteria .Op .EQ );
188+ searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .and (STORE_ID , searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .entity ().getDataStoreId (), SearchCriteria .Op .IN );
189+
178190 return true ;
179191 }
180192
@@ -318,12 +330,23 @@ public SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long zon
318330 return null ;
319331 }
320332
321- SearchCriteria <SnapshotDataStoreVO > sc = searchFilteringStoreIdEqStateEqStoreRoleEqIdEqUpdateCountEqSnapshotIdEqVolumeIdEq .create ();
333+ SearchCriteria <SnapshotDataStoreVO > sc ;
334+ if (kvmIncrementalSnapshot && Hypervisor .HypervisorType .KVM .equals (hypervisorType )) {
335+ sc = searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .create ();
336+ } else {
337+ sc = searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEq .create ();
338+ }
339+
322340 sc .setParameters (VOLUME_ID , volumeId );
323341 sc .setParameters (STORE_ROLE , role .toString ());
324342 sc .setParameters (STATE , ObjectInDataStoreStateMachine .State .Ready .name ());
325- sc .setParametersIfNotNull (STORE_ID , storeId );
326- sc .setParametersIfNotNull ();
343+ if (storeId != null ) {
344+ sc .setParameters (STORE_ID , (Object ) new Long []{storeId });
345+ } else if (zoneId != null ) {
346+ List <ImageStoreVO > imageStores = imageStoreDao .listStoresByZoneId (zoneId );
347+ Object [] imageStoreIds = imageStores .stream ().map (ImageStoreVO ::getId ).toArray ();
348+ sc .setParameters (STORE_ID , imageStoreIds );
349+ }
327350
328351 List <SnapshotDataStoreVO > snapshotList = listBy (sc , new Filter (SnapshotDataStoreVO .class , CREATED , false , null , null ));
329352 if (CollectionUtils .isEmpty (snapshotList )) {
@@ -580,7 +603,7 @@ protected boolean isSnapshotChainingRequired(long volumeId, boolean kvmIncrement
580603
581604 @ Override
582605 public List <SnapshotDataStoreVO > listReadyByVolumeIdAndCheckpointPathNotNull (long volumeId ) {
583- SearchCriteria <SnapshotDataStoreVO > sc = searchFilteringVolumeIdEqAndStateEqAndKVMCheckpointPathNotNull .create ();
606+ SearchCriteria <SnapshotDataStoreVO > sc = searchFilteringStoreIdInVolumeIdEqStoreRoleEqStateEqKVMCheckpointNotNull .create ();
584607 sc .setParameters (VOLUME_ID , volumeId );
585608 sc .setParameters (STATE , State .Ready );
586609 return listBy (sc );
0 commit comments