This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 7.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 88bb3f358033060e297e5612327e98a9b99bc6e8 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu May 16 10:48:17 2019 +0100 Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=63441 Further streamline the processing of session creation messages in the DeltaManager to reduce the possibility of a session update message being processed before the session has been created. --- .../apache/catalina/ha/session/DeltaManager.java | 7 +++- .../apache/catalina/ha/session/DeltaSession.java | 49 ++++++++++------------ webapps/docs/changelog.xml | 10 +++++ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java b/java/org/apache/catalina/ha/session/DeltaManager.java index 06cf47d..fc4e065 100644 --- a/java/org/apache/catalina/ha/session/DeltaManager.java +++ b/java/org/apache/catalina/ha/session/DeltaManager.java @@ -484,12 +484,17 @@ public class DeltaManager extends ClusterManagerBase{ */ @Override public Session createEmptySession() { - return getNewDeltaSession() ; + return new DeltaSession(this); } /** * Get new session class to be used in the doLoad() method. + * + * @return a new session + * + * @deprecated Unused. This will be removed in Tomcat 10. */ + @Deprecated protected DeltaSession getNewDeltaSession() { return new DeltaSession(this); } diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java b/java/org/apache/catalina/ha/session/DeltaSession.java index c91494d..abafbf1 100644 --- a/java/org/apache/catalina/ha/session/DeltaSession.java +++ b/java/org/apache/catalina/ha/session/DeltaSession.java @@ -103,7 +103,9 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus */ public DeltaSession(Manager manager) { super(manager); - this.resetDeltaRequest(); + boolean recordAllActions = manager instanceof ClusterManagerBase && + ((ClusterManagerBase)manager).isRecordAllActions(); + deltaRequest = new DeltaRequest(getIdInternal(), recordAllActions); } // ----------------------------------------------------- ReplicatedMapEntry @@ -298,11 +300,11 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus public void setMaxInactiveInterval(int interval, boolean addDeltaRequest) { super.maxInactiveInterval = interval; - if (addDeltaRequest && (deltaRequest != null)) { + if (addDeltaRequest) { + lock(); try { - lock(); deltaRequest.setMaxInactiveInterval(interval); - }finally{ + } finally { unlock(); } } @@ -321,9 +323,9 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus public void setNew(boolean isNew, boolean addDeltaRequest) { super.setNew(isNew); - if (addDeltaRequest && (deltaRequest != null)){ + if (addDeltaRequest){ + lock(); try { - lock(); deltaRequest.setNew(isNew); }finally{ unlock(); @@ -346,10 +348,10 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus } public void setPrincipal(Principal principal, boolean addDeltaRequest) { - try { + try { lock(); super.setPrincipal(principal); - if (addDeltaRequest && (deltaRequest != null)) + if (addDeltaRequest) deltaRequest.setPrincipal(principal); } finally { unlock(); @@ -368,11 +370,12 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus } public void setAuthType(String authType, boolean addDeltaRequest) { - try { + try { lock(); super.setAuthType(authType); - if (addDeltaRequest && (deltaRequest != null)) + if (addDeltaRequest) { deltaRequest.setAuthType(authType); + } } finally { unlock(); } @@ -427,7 +430,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus ((ClusterManagerBase)manager).registerSessionAtReplicationValve(this); } } - + // ------------------------------------------------- Session Public Methods /** @@ -523,7 +526,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus lock(); try { super.addSessionListener(listener); - if (addDeltaRequest && deltaRequest != null && listener instanceof ReplicatedSessionListener) { + if (addDeltaRequest && listener instanceof ReplicatedSessionListener) { deltaRequest.addSessionListener(listener); } } finally { @@ -540,7 +543,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus lock(); try { super.removeSessionListener(listener); - if (addDeltaRequest && deltaRequest != null && listener instanceof ReplicatedSessionListener) { + if (addDeltaRequest && listener instanceof ReplicatedSessionListener) { deltaRequest.removeSessionListener(listener); } } finally { @@ -604,22 +607,14 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus public void resetDeltaRequest() { try { - lock(); - if (deltaRequest == null) { - boolean recordAllActions = manager instanceof ClusterManagerBase && - ((ClusterManagerBase)manager).isRecordAllActions(); - deltaRequest = new DeltaRequest(getIdInternal(), recordAllActions); - } else { - deltaRequest.reset(); - deltaRequest.setSessionId(getIdInternal()); - } - }finally{ + deltaRequest.reset(); + deltaRequest.setSessionId(getIdInternal()); + } finally{ unlock(); } } public DeltaRequest getDeltaRequest() { - if (deltaRequest == null) resetDeltaRequest(); return deltaRequest; } @@ -695,7 +690,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus try { lock(); super.setAttribute(name,value, notify); - if (addDeltaRequest && deltaRequest != null && !exclude(name, value)) { + if (addDeltaRequest && !exclude(name, value)) { deltaRequest.setAttribute(name, value); } } finally { @@ -825,7 +820,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus protected void writeObject(ObjectOutputStream stream) throws IOException { writeObject((ObjectOutput)stream); } - + private void writeObject(ObjectOutput stream) throws IOException { // Write the scalar instance variables (except Manager) stream.writeObject(Long.valueOf(creationTime)); @@ -902,7 +897,7 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus if (value == null) return; super.removeAttributeInternal(name,notify); - if (addDeltaRequest && deltaRequest != null && !exclude(name, null)) { + if (addDeltaRequest && !exclude(name, null)) { deltaRequest.removeAttribute(name); } diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index f6d5b6b..0afc589 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -110,6 +110,16 @@ </scode> </changelog> </subsection> + <subsection name="Cluster"> + <changelog> + <fix> + <bug>63441</bug>: Further streamline the processing of session creation + messages in the <code>DeltaManager</code> to reduce the possibility of a + session update message being processed before the session has been + created. (markt) + </fix> + </changelog> + </subsection> <subsection name="Other"> <changelog> <add> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org