You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by sa...@apache.org on 2015/04/14 12:39:08 UTC
git commit: updated refs/heads/master to 30604e9
Repository: cloudstack
Updated Branches:
refs/heads/master 8f4abbc7b -> 30604e973
CLOUDSTACK-8386: CS is returning sec. storage even if it is full and there are other sec. storage with free space.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/30604e97
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/30604e97
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/30604e97
Branch: refs/heads/master
Commit: 30604e973afab20bca87346208bf71e8c936ff3b
Parents: 8f4abbc
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Mon Apr 13 10:56:46 2015 +0530
Committer: Sanjay Tripathi <sa...@citrix.com>
Committed: Tue Apr 14 16:10:40 2015 +0530
----------------------------------------------------------------------
.../allocator/StorageCacheRandomAllocator.java | 20 ++++++++----------
.../manager/ImageStoreProviderManagerImpl.java | 22 ++++++++++++++++++++
.../storage/datastore/DataStoreManagerImpl.java | 7 ++-----
.../datastore/ImageStoreProviderManager.java | 2 ++
server/src/com/cloud/server/StatsCollector.java | 9 ++++++++
.../template/HypervisorTemplateAdapter.java | 13 +++++++++---
6 files changed, 54 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java
----------------------------------------------------------------------
diff --git a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java
index ba1ee3c..c9832bf 100644
--- a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java
+++ b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java
@@ -18,7 +18,6 @@
*/
package org.apache.cloudstack.storage.cache.allocator;
-import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
@@ -33,7 +32,9 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
+import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
+import com.cloud.server.StatsCollector;
import com.cloud.storage.ScopeType;
@Component
@@ -43,6 +44,10 @@ public class StorageCacheRandomAllocator implements StorageCacheAllocator {
DataStoreManager dataStoreMgr;
@Inject
ObjectInDataStoreManager objectInStoreMgr;
+ @Inject
+ ImageStoreProviderManager imageStoreMgr;
+ @Inject
+ StatsCollector statsCollector;
@Override
public DataStore getCacheStore(Scope scope) {
@@ -57,8 +62,7 @@ public class StorageCacheRandomAllocator implements StorageCacheAllocator {
return null;
}
- Collections.shuffle(cacheStores);
- return cacheStores.get(0);
+ return imageStoreMgr.getImageStore(cacheStores);
}
@Override
@@ -78,18 +82,12 @@ public class StorageCacheRandomAllocator implements StorageCacheAllocator {
if (cacheStores.size() > 1) {
for (DataStore store : cacheStores) {
DataObjectInStore obj = objectInStoreMgr.findObject(data, store);
- if (obj != null && obj.getState() == ObjectInDataStoreStateMachine.State.Ready) {
+ if (obj != null && obj.getState() == ObjectInDataStoreStateMachine.State.Ready && statsCollector.imageStoreHasEnoughCapacity(store)) {
s_logger.debug("pick the cache store " + store.getId() + " where data is already there");
return store;
}
}
-
- // otherwise, just random pick one
- Collections.shuffle(cacheStores);
}
- return cacheStores.get(0);
-
+ return imageStoreMgr.getImageStore(cacheStores);
}
-
-
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
index 882cf18..cb9a97e 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
@@ -19,7 +19,9 @@
package org.apache.cloudstack.storage.image.manager;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -41,6 +43,7 @@ import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager;
import org.apache.cloudstack.storage.image.store.ImageStoreImpl;
+import com.cloud.server.StatsCollector;
import com.cloud.storage.ScopeType;
import com.cloud.storage.dao.VMTemplateDao;
@@ -53,6 +56,8 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
VMTemplateDao imageDataDao;
@Inject
DataStoreProviderManager providerManager;
+ @Inject
+ StatsCollector _statsCollector;
Map<String, ImageStoreDriver> driverMaps;
@PostConstruct
@@ -137,4 +142,21 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager
}
return imageStores;
}
+
+ @Override
+ public DataStore getImageStore(List<DataStore> imageStores) {
+ if (imageStores.size() > 1) {
+ Collections.shuffle(imageStores); // Randomize image store list.
+ Iterator<DataStore> i = imageStores.iterator();
+ DataStore imageStore = null;
+ while(i.hasNext()) {
+ imageStore = i.next();
+ // Return image store if used percentage is less then threshold value i.e. 90%.
+ if (_statsCollector.imageStoreHasEnoughCapacity(imageStore)) {
+ return imageStore;
+ }
+ }
+ }
+ return imageStores.get(0);
+ }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
index d44fb42..aa23a43 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
@@ -18,7 +18,6 @@
*/
package org.apache.cloudstack.storage.datastore;
-import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
@@ -79,8 +78,7 @@ public class DataStoreManagerImpl implements DataStoreManager {
if (stores == null || stores.size() == 0) {
return null;
}
- Collections.shuffle(stores);
- return stores.get(0);
+ return imageDataStoreMgr.getImageStore(stores);
}
@Override
@@ -112,8 +110,7 @@ public class DataStoreManagerImpl implements DataStoreManager {
if (stores == null || stores.size() == 0) {
return null;
}
- Collections.shuffle(stores);
- return stores.get(0);
+ return imageDataStoreMgr.getImageStore(stores);
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
index 8afb3d9..70b7a7c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
@@ -41,4 +41,6 @@ public interface ImageStoreProviderManager {
List<DataStore> listImageCacheStores(Scope scope);
boolean registerDriver(String uuid, ImageStoreDriver driver);
+
+ DataStore getImageStore(List<DataStore> imageStores);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/server/src/com/cloud/server/StatsCollector.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java
index 60c25f0..9f3c8cb 100644
--- a/server/src/com/cloud/server/StatsCollector.java
+++ b/server/src/com/cloud/server/StatsCollector.java
@@ -212,6 +212,7 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
long autoScaleStatsInterval = -1L;
int vmDiskStatsInterval = 0;
List<Long> hostIds = null;
+ private double _imageStoreCapacityThreshold = 0.90;
String externalStatsPrefix = "";
String externalStatsHost = null;
@@ -1045,6 +1046,14 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
}
}
+ public boolean imageStoreHasEnoughCapacity(DataStore imageStore) {
+ StorageStats imageStoreStats = _storageStats.get(imageStore.getId());
+ if (imageStoreStats != null && (imageStoreStats.getByteUsed()/(imageStoreStats.getCapacityBytes()*1.0)) <= _imageStoreCapacityThreshold) {
+ return true;
+ }
+ return false;
+ }
+
public StorageStats getStorageStats(long id) {
return _storageStats.get(id);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/30604e97/server/src/com/cloud/template/HypervisorTemplateAdapter.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
index 42f4b55..e58edb9 100644
--- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
@@ -60,6 +60,7 @@ import com.cloud.event.UsageEventUtils;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.org.Grouping;
+import com.cloud.server.StatsCollector;
import com.cloud.storage.ScopeType;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.TemplateType;
@@ -83,8 +84,10 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
DownloadMonitor _downloadMonitor;
@Inject
AgentManager _agentMgr;
-
- @Inject TemplateDataStoreDao templateDataStoreDao;
+ @Inject
+ StatsCollector _statsCollector;
+ @Inject
+ TemplateDataStoreDao templateDataStoreDao;
@Inject
DataStoreManager storeMgr;
@Inject
@@ -164,13 +167,17 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
continue;
}
+ // Check if image store has enough capacity for template
+ if (!_statsCollector.imageStoreHasEnoughCapacity(imageStore)) {
+ s_logger.info("Image store doesn't has enough capacity, so skip downloading template to this image store " + imageStore.getId());
+ continue;
+ }
// We want to download private template to one of the image store in a zone
if(isPrivateTemplate(template) && zoneSet.contains(zoneId)){
continue;
}else {
zoneSet.add(zoneId);
}
-
}
TemplateInfo tmpl = imageFactory.getTemplate(template.getId(), imageStore);