From f829cf72b85cb5542b74324ce63bf60e8f34956c Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Mon, 14 Jan 2013 11:04:10 +0000 Subject: [PATCH] SP-387, BIS-255: fixing bug in data set locking. SVN: 28079 --- .../generic/shared/content/ContentCache.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) 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 d199f91c4ce..e74d9f438fb 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(); - } - } } -- GitLab