diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java index d199f91c4ce2f2baa5d0677c5b0f61f01c78e374..e74d9f438fb08033bf508b2abc9a94f78c3cc1d7 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java @@ -69,7 +69,7 @@ public class ContentCache implements IContentCache FileOperations.getInstance()); } - private final LockManager dataSetLockManager; + private final Map<String, Integer> dataSetLocks = new HashMap<String, Integer>(); private final LockManager fileLockManager; @@ -89,7 +89,6 @@ public class ContentCache implements IContentCache { fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER)); } - dataSetLockManager = new LockManager(); fileLockManager = new LockManager(); } @@ -97,21 +96,40 @@ public class ContentCache implements IContentCache public void lockDataSet(String sessionToken, String dataSetCode) { String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); - dataSetLockManager.lock(dataSetPath); + synchronized (dataSetLocks) + { + Integer count = dataSetLocks.get(dataSetPath); + if (count == null) + { + count = 0; + } + count++; + dataSetLocks.put(dataSetPath, count); + } } @Override public void unlockDataSet(String sessionToken, String dataSetCode) { String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); - dataSetLockManager.unlock(dataSetPath); + synchronized (dataSetLocks) + { + Integer count = dataSetLocks.remove(dataSetPath); + if (count != null && count > 1) + { + dataSetLocks.put(dataSetPath, count - 1); + } + } } @Override public boolean isDataSetLocked(String sessionToken, String dataSetCode) { String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); - return dataSetLockManager.isLocked(dataSetPath); + synchronized (dataSetLocks) + { + return dataSetLocks.containsKey(dataSetPath); + } } @Override @@ -261,12 +279,6 @@ public class ContentCache implements IContentCache } } - synchronized boolean isLocked(String path) - { - ReentrantLock lock = locks.get(path); - return lock != null && lock.isLocked(); - } - } }