Skip to content

Commit feb9fe1

Browse files
committed
CLOUDSTACK-5451:Restart MS after migrating NFS image store to S3,
previous Ready template is not ready anymore.
1 parent eb64159 commit feb9fe1

2 files changed

Lines changed: 39 additions & 9 deletions

File tree

engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
4242
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
4343
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
44+
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
4445
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
4546
import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager;
4647
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
@@ -77,6 +78,7 @@
7778
import com.cloud.storage.ScopeType;
7879
import com.cloud.storage.Storage.TemplateType;
7980
import com.cloud.storage.StoragePool;
81+
import com.cloud.storage.VMTemplateStorageResourceAssoc;
8082
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
8183
import com.cloud.storage.VMTemplateVO;
8284
import com.cloud.storage.VMTemplateZoneVO;
@@ -281,7 +283,7 @@ public void handleTemplateSync(DataStore store) {
281283
GlobalLock syncLock = GlobalLock.getInternLock(lockString);
282284
try {
283285
if (syncLock.lock(3)) {
284-
try{
286+
try {
285287
Long zoneId = store.getScope().getScopeId();
286288

287289
Map<String, TemplateProp> templateInfos = listTemplate(store);
@@ -393,14 +395,20 @@ public void handleTemplateSync(DataStore store) {
393395
_templateDao.update(tmplt.getId(), tmlpt);
394396
associateTemplateToZone(tmplt.getId(), zoneId);
395397

396-
397398
}
398399
} else {
399400
s_logger.info("Template Sync did not find " + uniqueName + " on image store " + storeId + ", may request download based on available hypervisor types");
400401
if (tmpltStore != null) {
401-
s_logger.info("Removing leftover template " + uniqueName + " entry from template store table");
402-
// remove those leftover entries
403-
_vmTemplateStoreDao.remove(tmpltStore.getId());
402+
if (isRegionStore(store) && tmpltStore.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED
403+
&& tmpltStore.getState() == State.Ready
404+
&& tmpltStore.getInstallPath() == null) {
405+
s_logger.info("Keep fake entry in template store table for migration of previous NFS to object store");
406+
}
407+
else {
408+
s_logger.info("Removing leftover template " + uniqueName + " entry from template store table");
409+
// remove those leftover entries
410+
_vmTemplateStoreDao.remove(tmpltStore.getId());
411+
}
404412
}
405413
}
406414
}
@@ -430,6 +438,17 @@ public void handleTemplateSync(DataStore store) {
430438
continue;
431439
}
432440

441+
// if this is a region store, and there is already an DOWNLOADED entry there without install_path information, which
442+
// means that this is a duplicate entry from migration of previous NFS to staging.
443+
if (isRegionStore(store)) {
444+
TemplateDataStoreVO tmpltStore = _vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId());
445+
if (tmpltStore != null && tmpltStore.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED && tmpltStore.getState() == State.Ready
446+
&& tmpltStore.getInstallPath() == null) {
447+
s_logger.info("Skip sync template for migration of previous NFS to object store");
448+
continue;
449+
}
450+
}
451+
433452
if (availHypers.contains(tmplt.getHypervisorType())) {
434453
s_logger.info("Downloading template " + tmplt.getUniqueName() + " to image store "
435454
+ store.getName());
@@ -474,8 +493,7 @@ public void handleTemplateSync(DataStore store) {
474493

475494
}
476495
}
477-
}
478-
finally{
496+
} finally {
479497
syncLock.unlock();
480498
}
481499
}

engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525

2626
import javax.inject.Inject;
2727

28+
import org.apache.log4j.Logger;
29+
import org.springframework.stereotype.Component;
30+
2831
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
2932
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
3033
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -57,8 +60,6 @@
5760
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
5861
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
5962
import org.apache.cloudstack.storage.to.VolumeObjectTO;
60-
import org.apache.log4j.Logger;
61-
import org.springframework.stereotype.Component;
6263

6364
import com.cloud.agent.api.Answer;
6465
import com.cloud.agent.api.storage.ListVolumeAnswer;
@@ -1262,6 +1263,17 @@ public void handleVolumeSync(DataStore store) {
12621263
s_logger.info("Skip downloading volume " + volumeHost.getVolumeId() + " since no download url is specified.");
12631264
continue;
12641265
}
1266+
1267+
// if this is a region store, and there is already an DOWNLOADED entry there without install_path information, which
1268+
// means that this is a duplicate entry from migration of previous NFS to staging.
1269+
if (store.getScope().getScopeType() == ScopeType.REGION) {
1270+
if (volumeHost.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED
1271+
&& volumeHost.getInstallPath() == null) {
1272+
s_logger.info("Skip sync volume for migration of previous NFS to object store");
1273+
continue;
1274+
}
1275+
}
1276+
12651277
s_logger.debug("Volume " + volumeHost.getVolumeId() + " needs to be downloaded to " + store.getName());
12661278
// TODO: pass a callback later
12671279
VolumeInfo vol = volFactory.getVolume(volumeHost.getVolumeId());

0 commit comments

Comments
 (0)