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