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