CLOUDSTACK-7539: no return in synchronised block Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c3d28e1b Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c3d28e1b Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c3d28e1b
Branch: refs/heads/reporter Commit: c3d28e1b96163b62c9f56931eef3f1dc0a4784a4 Parents: 780816e Author: Daan Hoogland <d...@onecht.net> Authored: Fri Jul 17 11:07:57 2015 +0200 Committer: Daan Hoogland <d...@onecht.net> Committed: Fri Jul 17 11:07:57 2015 +0200 ---------------------------------------------------------------------- .../cache/manager/StorageCacheManagerImpl.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c3d28e1b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java index 6be3581..48e8af6 100644 --- a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java +++ b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java @@ -223,7 +223,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager { @Override public DataObject createCacheObject(DataObject data, DataStore store) { - DataObject objOnCacheStore; + DataObject objOnCacheStore = null; final Object lock; final DataObjectType type = data.getType(); final String typeName; @@ -249,6 +249,7 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager { } s_logger.debug("check " + typeName + " cache entry(id: " + dataId + ") on store(id: " + storeId + ")"); + DataObject existingDataObj = null; synchronized (lock) { DataObjectInStore obj = objectInStoreMgr.findObject(data, store); if (obj != null) { @@ -292,12 +293,22 @@ public class StorageCacheManagerImpl implements StorageCacheManager, Manager { s_logger.debug("there is already one in the cache store"); DataObject dataObj = objectInStoreMgr.get(data, store); dataObj.incRefCount(); - return dataObj; + existingDataObj = dataObj; } } - s_logger.debug("create " + typeName + " cache entry(id: " + dataId + ") on store(id: " + storeId + ")"); - objOnCacheStore = store.create(data); + if(existingDataObj == null) { + s_logger.debug("create " + typeName + " cache entry(id: " + dataId + ") on store(id: " + storeId + ")"); + objOnCacheStore = store.create(data); + } + lock.notifyAll(); + } + if (existingDataObj != null) { + return existingDataObj; + } + if (objOnCacheStore == null) { + s_logger.error("create " + typeName + " cache entry(id: " + dataId + ") on store(id: " + storeId + ") failed"); + return null; } AsyncCallFuture<CopyCommandResult> future = new AsyncCallFuture<CopyCommandResult>();