Return-Path: X-Original-To: apmail-cloudstack-commits-archive@www.apache.org Delivered-To: apmail-cloudstack-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2875517460 for ; Tue, 14 Apr 2015 10:39:14 +0000 (UTC) Received: (qmail 81241 invoked by uid 500); 14 Apr 2015 10:39:09 -0000 Delivered-To: apmail-cloudstack-commits-archive@cloudstack.apache.org Received: (qmail 81208 invoked by uid 500); 14 Apr 2015 10:39:09 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 81198 invoked by uid 99); 14 Apr 2015 10:39:09 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 14 Apr 2015 10:39:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id D93B1E0063; Tue, 14 Apr 2015 10:39:08 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sanjaytripathi@apache.org To: commits@cloudstack.apache.org Message-Id: <83c3f888bf9a4d88bf537c2aeb1d6c9b@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: git commit: updated refs/heads/master to 30604e9 Date: Tue, 14 Apr 2015 10:39:08 +0000 (UTC) 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 Authored: Mon Apr 13 10:56:46 2015 +0530 Committer: Sanjay Tripathi 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 driverMaps; @PostConstruct @@ -137,4 +142,21 @@ public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager } return imageStores; } + + @Override + public DataStore getImageStore(List imageStores) { + if (imageStores.size() > 1) { + Collections.shuffle(imageStores); // Randomize image store list. + Iterator 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 listImageCacheStores(Scope scope); boolean registerDriver(String uuid, ImageStoreDriver driver); + + DataStore getImageStore(List 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 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);