From e823c78387cd7a3fb1d931ae8ac692a5fe1dae03 Mon Sep 17 00:00:00 2001 From: madness-inc Date: Wed, 20 Nov 2019 15:08:20 +0100 Subject: [PATCH] ATS-21 --- .../session/hazelcast/HazelcastStore.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java index cfd3dbb..3679d1d 100644 --- a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java +++ b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastStore.java @@ -195,28 +195,26 @@ public HazelcastPersistentManager getManager() { } public StandardSession load(String id) throws ClassNotFoundException, IOException { - byte[] data = getSessions().get(id); - if (null == data) { - return null; - } - - ClassLoader appContextLoader = getManager().getContext().getLoader().getClassLoader(); - try (ObjectInputStream ois = Utils.getObjectInputStream(appContextLoader, - manager.getContext().getServletContext(), data)) { - StandardSession session = (StandardSession) this.manager.createEmptySession(); - session.readObjectData(ois); - log.debug("loaded: " + id); - + StandardSession session = null; + try { // pessimistic lock block to prevent concurrency problems whilst finding sessions getSessions().lock(id); - try { - getSessions().remove(id); - getSessions().set(id, data); - } finally { - getSessions().unlock(id); + byte[] data = getSessions().get(id); + if (null == data) { + log.debug(String.format("Session %s not found in map %s", id, getMapNameInternal())); + } else { + ClassLoader appContextLoader = getManager().getContext().getLoader().getClassLoader(); + try (ObjectInputStream ois = Utils.getObjectInputStream(appContextLoader, + manager.getContext().getServletContext(), data)) { + session = (StandardSession) this.manager.createEmptySession(); + session.readObjectData(ois); + log.debug("loaded: " + id); + } } - return session; + } finally { + getSessions().unlock(id); } + return session; } public void remove(String id) throws IOException { @@ -237,7 +235,11 @@ public void clear() throws IOException { } private IMap getSessions() { - return instance.getMap(getManager().getName() + mapName); + return instance.getMap(getMapNameInternal()); + } + + private String getMapNameInternal() { + return getManager().getName() + mapName; } // getters and setters