From f28a28dc779bd6c7f6598b6944056249eb677904 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Mon, 5 Aug 2013 17:12:52 +0530 Subject: [PATCH] CLOUDSTACK-3913 Private templates would now get copied to only one of image storage chosen randamly as was the case earlier. Dont throw an exception for uploading volumes when there are multiple image stores, instead choose one of them randomly Signed off by : nitin mehta --- .../cloudstack/storage/image/BaseImageStoreDriverImpl.java | 3 ++- .../src/com/cloud/template/HypervisorTemplateAdapter.java | 6 ++++++ server/src/com/cloud/template/TemplateManagerImpl.java | 7 +++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java index 13d19d35ece..fcbc5c90544 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java @@ -106,7 +106,8 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver { } @Override - public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback callback) { + public void + createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback callback) { CreateContext context = new CreateContext(callback, data); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher .create(this); diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 21a0f6e559e..de0ed7e51bc 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -18,6 +18,7 @@ package com.cloud.template; import java.net.MalformedURLException; import java.net.URL; +import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; @@ -180,6 +181,8 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { if ( imageStores == null || imageStores.size() == 0 ){ throw new CloudRuntimeException("Unable to find image store to download template "+ profile.getTemplate()); } + + Collections.shuffle(imageStores);// For private templates choose a random store. TODO - Have a better algorithm based on size, no. of objects, load etc. for (DataStore imageStore : imageStores) { TemplateInfo tmpl = this.imageFactory.getTemplate(template.getId(), imageStore); CreateTemplateContext context = new CreateTemplateContext(null, tmpl); @@ -187,6 +190,9 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { caller.setCallback(caller.getTarget().createTemplateAsyncCallBack(null, null)); caller.setContext(context); this.imageService.createTemplateAsync(tmpl, imageStore, caller); + if( !(profile.getIsPublic() || profile.getFeatured()) ){ // If private template then break + break; + } } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index fa591a00c08..2b52d765d8a 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -360,11 +360,10 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, if (storeUuid != null) { imageStore = _dataStoreMgr.getDataStore(storeUuid, DataStoreRole.Image); } else { - List stores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(zoneId)); - if (stores.size() > 1) { - throw new CloudRuntimeException("multiple image stores, don't know which one to use"); + imageStore = this._dataStoreMgr.getImageStore(zoneId); + if (imageStore == null) { + throw new CloudRuntimeException("cannot find an image store for zone " + zoneId); } - imageStore = stores.get(0); } return imageStore;