From 2a4e77c234da17a2b6c38c2e9a40f7542e9b26a8 Mon Sep 17 00:00:00 2001
From: gpawel <gpawel>
Date: Fri, 21 Sep 2012 14:22:23 +0000
Subject: [PATCH] bugfix: make synchronization more smart

SVN: 26720
---
 .../OpenBISAuthenticationInterceptor.java     | 28 +++++++++++++------
 .../shared/dto/OpenBISSessionHolder.java      |  2 +-
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
index 20ba3af39e5..3f6c1e08e6c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/openbisauth/OpenBISAuthenticationInterceptor.java
@@ -101,19 +101,22 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor
 
     }
 
-    /**
-     * authenticate when the session has expired.
-     */
     @Override
-    public synchronized Object invoke(MethodInvocation invocation) throws Throwable
+    public Object invoke(MethodInvocation invocation) throws Throwable
     {
-        checkSessionToken();
+        String sessionToken = getSessionToken();
         try
         {
             return invocation.proceed();
         } catch (InvalidSessionException ise)
         {
-            authenticate();
+            synchronized (this)
+            {
+                if (sessionToken == sessionHolder.getSessionToken())
+                {
+                    authenticate();
+                }
+            }
             return invocation.proceed();
         }
     }
@@ -151,12 +154,21 @@ public class OpenBISAuthenticationInterceptor implements MethodInterceptor
         service.registerDataStoreServer(sessionToken, dataStoreServerInfo);
     }
 
-    private final void checkSessionToken()
+    /**
+     * authenticates when the session has expired.
+     */
+    private final String getSessionToken()
     {
         if (sessionHolder.getSessionToken() == null)
         {
-            authenticate();
+            synchronized (this)
+            {
+                if (sessionHolder.getSessionToken() == null)
+                    authenticate();
+            }
         }
+
+        return sessionHolder.getSessionToken();
     }
 
     public final void setPort(int port)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
index 1697e4afdcb..d858357f611 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/OpenBISSessionHolder.java
@@ -30,7 +30,7 @@ public class OpenBISSessionHolder implements Serializable, ISessionTokenProvider
 {
     private static final long serialVersionUID = 1L;
 
-    private String sessionToken;
+    private volatile String sessionToken;
 
     private String dataStoreCode;
 
-- 
GitLab