diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java index 625cc297274..a0561521a93 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java @@ -46,4 +46,6 @@ public interface VolumeDataStoreDao extends GenericDao, List listVolumeDownloadUrls(); void expireDnldUrlsForZone(Long dcId); + + List listUploadedVolumesByStoreId(long id); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java index 2e29ad79cf7..b71eb2c2324 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java @@ -52,6 +52,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase cacheSearch; private SearchBuilder storeVolumeSearch; private SearchBuilder downloadVolumeSearch; + private SearchBuilder uploadVolumeSearch; private static final String EXPIRE_DOWNLOAD_URLS_FOR_ZONE = "update volume_store_ref set download_url_created=? where store_id in (select id from image_store where data_center_id=?)"; @@ -95,6 +96,12 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase listUploadedVolumesByStoreId(long id) { + SearchCriteria sc = uploadVolumeSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + return listIncludingRemovedBy(sc); + } + + @Override public void expireDnldUrlsForZone(Long dcId){ TransactionLegacy txn = TransactionLegacy.currentTxn(); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 174874aeb86..edb50b2833f 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -26,6 +26,7 @@ import java.util.Map; import javax.inject.Inject; +import com.cloud.storage.RegisterVolumePayload; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; @@ -1370,7 +1371,7 @@ public class VolumeServiceImpl implements VolumeService { return; } - List dbVolumes = _volumeStoreDao.listByStoreId(storeId); + List dbVolumes = _volumeStoreDao.listUploadedVolumesByStoreId(storeId); List toBeDownloaded = new ArrayList(dbVolumes); for (VolumeDataStoreVO volumeStore : dbVolumes) { VolumeVO volume = _volumeDao.findById(volumeStore.getVolumeId()); @@ -1467,6 +1468,8 @@ public class VolumeServiceImpl implements VolumeService { s_logger.debug("Volume " + volumeHost.getVolumeId() + " needs to be downloaded to " + store.getName()); // TODO: pass a callback later VolumeInfo vol = volFactory.getVolume(volumeHost.getVolumeId()); + RegisterVolumePayload payload = new RegisterVolumePayload(volumeHost.getDownloadUrl(), volumeHost.getChecksum(), vol.getFormat().toString()); + vol.addPayload(payload); createVolumeAsync(vol, store); } } diff --git a/server/src/com/cloud/storage/download/DownloadListener.java b/server/src/com/cloud/storage/download/DownloadListener.java index 4f9a5605e33..814ce3c44be 100755 --- a/server/src/com/cloud/storage/download/DownloadListener.java +++ b/server/src/com/cloud/storage/download/DownloadListener.java @@ -298,10 +298,14 @@ public class DownloadListener implements Listener { } }*/ else if (cmd instanceof StartupSecondaryStorageCommand) { - List imageStores = _storeMgr.getImageStoresByScope(new ZoneScope(agent.getDataCenterId())); - for (DataStore store : imageStores) { - _volumeSrv.handleVolumeSync(store); - _imageSrv.handleTemplateSync(store); + try{ + List imageStores = _storeMgr.getImageStoresByScope(new ZoneScope(agent.getDataCenterId())); + for (DataStore store : imageStores) { + _volumeSrv.handleVolumeSync(store); + _imageSrv.handleTemplateSync(store); + } + }catch (Exception e){ + s_logger.error("Caught exception while doing template/volume sync ", e); } } }