You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2019/05/16 12:54:59 UTC

[tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit ab70de3278d5e506661faeb5febf71a061b89179
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu May 16 13:36:39 2019 +0100

    Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock
    
    Refactor the DeltaRequest serialization to reduce the window during
    which the DeltaSession is locked and to remove a potential cause of
    deadlocks during serialization.
---
 .../apache/catalina/ha/session/DeltaManager.java   | 19 ++++++++++++++-----
 .../apache/catalina/ha/session/DeltaSession.java   | 22 ++++++++++++++++++++++
 webapps/docs/changelog.xml                         |  6 ++++++
 3 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java b/java/org/apache/catalina/ha/session/DeltaManager.java
index 9f3abef..7f0df95 100644
--- a/java/org/apache/catalina/ha/session/DeltaManager.java
+++ b/java/org/apache/catalina/ha/session/DeltaManager.java
@@ -39,6 +39,7 @@ import org.apache.catalina.tribes.io.ReplicationStream;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.ExceptionUtils;
+import org.apache.tomcat.util.collections.SynchronizedStack;
 import org.apache.tomcat.util.res.StringManager;
 
 /**
@@ -88,6 +89,7 @@ public class DeltaManager extends ClusterManagerBase{
     private boolean receiverQueue = false ;
     private boolean stateTimestampDrop = true ;
     private volatile long stateTransferCreateSendTime;
+    private SynchronizedStack<DeltaRequest> deltaRequestPool = new SynchronizedStack<>();
 
     // -------------------------------------------------------- stats attributes
 
@@ -952,10 +954,10 @@ public class DeltaManager extends ClusterManagerBase{
      *            whether this method has been called during session expiration
      * @return a SessionMessage to be sent,
      */
-    @SuppressWarnings("null") // session can't be null when it is used
     public ClusterMessage requestCompleted(String sessionId, boolean expires) {
         DeltaSession session = null;
         SessionMessage msg = null;
+        DeltaRequest deltaRequest = null;
         try {
             session = (DeltaSession) findSession(sessionId);
             if (session == null) {
@@ -963,8 +965,12 @@ public class DeltaManager extends ClusterManagerBase{
                 // removed the session from the Manager.
                 return null;
             }
-            DeltaRequest deltaRequest = session.getDeltaRequest();
-            session.lock();
+            DeltaRequest newDeltaRequest = deltaRequestPool.pop();
+            if (newDeltaRequest == null) {
+                // Will be configured in replaceDeltaRequest()
+                newDeltaRequest = new DeltaRequest();
+            }
+            deltaRequest = session.replaceDeltaRequest(newDeltaRequest);
             if (deltaRequest.getSize() > 0) {
                 counterSend_EVT_SESSION_DELTA++;
                 byte[] data = serializeDeltaRequest(session,deltaRequest);
@@ -973,14 +979,17 @@ public class DeltaManager extends ClusterManagerBase{
                                              data,
                                              sessionId,
                                              sessionId + "-" + System.currentTimeMillis());
-                session.resetDeltaRequest();
             }
         } catch (IOException x) {
             log.error(sm.getString("deltaManager.createMessage.unableCreateDeltaRequest",
                     sessionId), x);
             return null;
         } finally {
-            if (session!=null) session.unlock();
+            if (deltaRequest != null) {
+                // Reset the instance before it is returned to the pool
+                deltaRequest.reset();
+                deltaRequestPool.push(deltaRequest);
+            }
         }
         if(msg == null) {
             if(!expires && !session.isPrimarySession()) {
diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java b/java/org/apache/catalina/ha/session/DeltaSession.java
index d25f622..8a186ce 100644
--- a/java/org/apache/catalina/ha/session/DeltaSession.java
+++ b/java/org/apache/catalina/ha/session/DeltaSession.java
@@ -608,6 +608,26 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus
         return deltaRequest;
     }
 
+    /**
+     * Replace the existing deltaRequest with the provided replacement.
+     *
+     * @param deltaRequest The new deltaRequest. Expected to be either a newly
+     *                     created object or an instance that has been reset.
+     *
+     * @return The old deltaRequest
+     */
+    DeltaRequest replaceDeltaRequest(DeltaRequest deltaRequest) {
+        lock();
+        try {
+            DeltaRequest oldDeltaRequest = this.deltaRequest;
+            this.deltaRequest = deltaRequest;
+            this.deltaRequest.setSessionId(getIdInternal());
+            return oldDeltaRequest;
+        } finally {
+            unlock();
+        }
+    }
+
 
     // ------------------------------------------------- HttpSession Properties
 
@@ -668,6 +688,8 @@ public class DeltaSession extends StandardSession implements Externalizable,Clus
 
     public void setAttribute(String name, Object value, boolean notify,boolean addDeltaRequest) {
 
+        log.info("setAttribute name [" + name + ", value [" + value + "]");
+
         // Name cannot be null
         if (name == null) throw new IllegalArgumentException(sm.getString("standardSession.setAttribute.namenull"));
 
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index cfd34e2..c08fa7e 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -132,6 +132,12 @@
   <subsection name="Cluster">
     <changelog>
       <fix>
+        <bug>62841</bug>: Refactor the <code>DeltaRequest</code> serialization
+        to reduce the window during which the <code>DeltaSession</code> is
+        locked and to remove a potential cause of deadlocks during
+        serialization. (markt)
+      </fix>
+      <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


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Mark Thomas <ma...@apache.org>.
On 23/05/2019 03:14, Keiichi Fujino wrote:
> 2019年5月22日(水) 20:27 Mark Thomas <markt@apache.org
> <ma...@apache.org>>:
> 
>     On 22/05/2019 07:37, Keiichi Fujino wrote:
> 
>     <snip/>
> 
>     > It seems that the recordAllActions flag is not set in the newly
>     created
>     > DeltaRequest.
> 
>     I reworked the patch multiple times and forgot that for this iteration.
>     Thanks for catching it. I've fixed this with an additional commit.
> 
>     > There are duplicated codes in DeltaManager#requestCompleted and
>     > DeltaSession#getDiff.
>     > It may be able to call getDiff method in the
>     DeltaManager#requestCompleted.
> 
>     Good call. Fixed.
> 
>     > The same is true for
>     DeltaManager#deserializeAndExecuteDeltaRequest and
>     > applyDiff.
> 
>     I couldn't see this. There are some similarities but don't see how this
>     could work.
> 
>     The unit tests passed so I plan to commit (and back-port) this unless
>     there are objections.
> 
> 
> I have no objection.
> Thanks.

Thanks for the review. Much appreciated.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Keiichi Fujino <kf...@apache.org>.
2019年5月22日(水) 20:27 Mark Thomas <ma...@apache.org>:

> On 22/05/2019 07:37, Keiichi Fujino wrote:
>
> <snip/>
>
> > It seems that the recordAllActions flag is not set in the newly created
> > DeltaRequest.
>
> I reworked the patch multiple times and forgot that for this iteration.
> Thanks for catching it. I've fixed this with an additional commit.
>
> > There are duplicated codes in DeltaManager#requestCompleted and
> > DeltaSession#getDiff.
> > It may be able to call getDiff method in the
> DeltaManager#requestCompleted.
>
> Good call. Fixed.
>
> > The same is true for DeltaManager#deserializeAndExecuteDeltaRequest and
> > applyDiff.
>
> I couldn't see this. There are some similarities but don't see how this
> could work.
>
> The unit tests passed so I plan to commit (and back-port) this unless
> there are objections.
>
>
I have no objection.
Thanks.



> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

-- 
Keiichi.Fujino

Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Mark Thomas <ma...@apache.org>.
On 22/05/2019 07:37, Keiichi Fujino wrote:

<snip/>

> It seems that the recordAllActions flag is not set in the newly created
> DeltaRequest.

I reworked the patch multiple times and forgot that for this iteration.
Thanks for catching it. I've fixed this with an additional commit.

> There are duplicated codes in DeltaManager#requestCompleted and
> DeltaSession#getDiff.
> It may be able to call getDiff method in the DeltaManager#requestCompleted.

Good call. Fixed.

> The same is true for DeltaManager#deserializeAndExecuteDeltaRequest and
> applyDiff.

I couldn't see this. There are some similarities but don't see how this
could work.

The unit tests passed so I plan to commit (and back-port) this unless
there are objections.

Mark

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Keiichi Fujino <kf...@apache.org>.
2019年5月22日(水) 6:43 Mark Thomas <ma...@apache.org>:

> On 21/05/2019 13:34, Mark Thomas wrote:
> > On 21/05/2019 09:03, Keiichi Fujino wrote:
> >> 2019年5月16日(木) 21:55 <markt@apache.org <ma...@apache.org>>:
> >>
> >>     This is an automated email from the ASF dual-hosted git repository.
> >>
> >>     markt pushed a commit to branch master
> >>     in repository https://gitbox.apache.org/repos/asf/tomcat.git
> >>
> >>     commit ab70de3278d5e506661faeb5febf71a061b89179
> >>     Author: Mark Thomas <markt@apache.org <ma...@apache.org>>
> >>     AuthorDate: Thu May 16 13:36:39 2019 +0100
> >>
> >>         Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss
> >>     deadlock
> >>
> >>         Refactor the DeltaRequest serialization to reduce the window
> during
> >>         which the DeltaSession is locked and to remove a potential
> cause of
> >>         deadlocks during serialization.
>
> <snip/>
> >> Do you have any plan for applying this for using BackupManager ?
> >> There are similar codes in AbstractReplicatedMap#replicate.
> >> Do we need to apply a similar fix to AbstractReplicatedMap#replicate ?
> >
> > Probably. I'll trace the call hierarchy back from
> > DeltaRequest.serialize() and ensure nothing is holding the session lock.
>
> This is proving much trickier than it first appeared.
>
> I've had to do a fair bit of refactoring to fix this for the
> DeltaManager. My first (untested) attempt is here:
>
> https://github.com/markt-asf/tomcat/commits/bz62481-backup-manager
> (the final 3 commits)
>
> It is a bit too invasive for me to be comfortable just committing it. I
> also want to run the unit tests (although they don't test this code much).
>
> Feedback welcome.
>
>
It seems that the recordAllActions flag is not set in the newly created
DeltaRequest.

There are duplicated codes in DeltaManager#requestCompleted and
DeltaSession#getDiff.
It may be able to call getDiff method in the DeltaManager#requestCompleted.
The same is true for DeltaManager#deserializeAndExecuteDeltaRequest and
applyDiff.



> Mark
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

-- 
Keiichi.Fujino

Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Mark Thomas <ma...@apache.org>.
On 21/05/2019 13:34, Mark Thomas wrote:
> On 21/05/2019 09:03, Keiichi Fujino wrote:
>> 2019年5月16日(木) 21:55 <markt@apache.org <ma...@apache.org>>:
>>
>>     This is an automated email from the ASF dual-hosted git repository.
>>
>>     markt pushed a commit to branch master
>>     in repository https://gitbox.apache.org/repos/asf/tomcat.git
>>
>>     commit ab70de3278d5e506661faeb5febf71a061b89179
>>     Author: Mark Thomas <markt@apache.org <ma...@apache.org>>
>>     AuthorDate: Thu May 16 13:36:39 2019 +0100
>>
>>         Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss
>>     deadlock
>>
>>         Refactor the DeltaRequest serialization to reduce the window during
>>         which the DeltaSession is locked and to remove a potential cause of
>>         deadlocks during serialization.

<snip/>
>> Do you have any plan for applying this for using BackupManager ?
>> There are similar codes in AbstractReplicatedMap#replicate.
>> Do we need to apply a similar fix to AbstractReplicatedMap#replicate ?
> 
> Probably. I'll trace the call hierarchy back from
> DeltaRequest.serialize() and ensure nothing is holding the session lock.

This is proving much trickier than it first appeared.

I've had to do a fair bit of refactoring to fix this for the
DeltaManager. My first (untested) attempt is here:

https://github.com/markt-asf/tomcat/commits/bz62481-backup-manager
(the final 3 commits)

It is a bit too invasive for me to be comfortable just committing it. I
also want to run the unit tests (although they don't test this code much).

Feedback welcome.

Mark

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Mark Thomas <ma...@homeinbox.net>.
On 21/05/2019 09:03, Keiichi Fujino wrote:
> 2019年5月16日(木) 21:55 <markt@apache.org <ma...@apache.org>>:
> 
>     This is an automated email from the ASF dual-hosted git repository.
> 
>     markt pushed a commit to branch master
>     in repository https://gitbox.apache.org/repos/asf/tomcat.git
> 
>     commit ab70de3278d5e506661faeb5febf71a061b89179
>     Author: Mark Thomas <markt@apache.org <ma...@apache.org>>
>     AuthorDate: Thu May 16 13:36:39 2019 +0100
> 
>         Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss
>     deadlock
> 
>         Refactor the DeltaRequest serialization to reduce the window during
>         which the DeltaSession is locked and to remove a potential cause of
>         deadlocks during serialization.

<snip/>

> In DeltaManager#serializeDeltaRequest, the session lock has been is
> obtained.
> Do we need to remove it? or replace to deltaRequest.serialize();

You are correct. The deadlock is still going to occur. I think we need
to deprecate serializeDeltaRequest().

> Do you have any plan for applying this for using BackupManager ?
> There are similar codes in AbstractReplicatedMap#replicate.
> Do we need to apply a similar fix to AbstractReplicatedMap#replicate ?

Probably. I'll trace the call hierarchy back from
DeltaRequest.serialize() and ensure nothing is holding the session lock.

Thanks for the review.

Mark

> 
> 
>  
> 
>          // -------------------------------------------------
>     HttpSession Properties
> 
>     @@ -668,6 +688,8 @@ public class DeltaSession extends
>     StandardSession implements Externalizable,Clus
> 
>          public void setAttribute(String name, Object value, boolean
>     notify,boolean addDeltaRequest) {
> 
>     +        log.info <http://log.info>("setAttribute name [" + name +
>     ", value [" + value + "]");
>     +
>              // Name cannot be null
>              if (name == null) throw new
>     IllegalArgumentException(sm.getString("standardSession.setAttribute.namenull"));
> 
>     diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
>     index cfd34e2..c08fa7e 100644
>     --- a/webapps/docs/changelog.xml
>     +++ b/webapps/docs/changelog.xml
>     @@ -132,6 +132,12 @@
>        <subsection name="Cluster">
>          <changelog>
>            <fix>
>     +        <bug>62841</bug>: Refactor the <code>DeltaRequest</code>
>     serialization
>     +        to reduce the window during which the
>     <code>DeltaSession</code> is
>     +        locked and to remove a potential cause of deadlocks during
>     +        serialization. (markt)
>     +      </fix>
>     +      <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
> 
> 
>     ---------------------------------------------------------------------
>     To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
>     <ma...@tomcat.apache.org>
>     For additional commands, e-mail: dev-help@tomcat.apache.org
>     <ma...@tomcat.apache.org>
> 
> 
> 
> -- 
> Keiichi.Fujino


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: [tomcat] 02/03: Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock

Posted by Keiichi Fujino <kf...@apache.org>.
2019年5月16日(木) 21:55 <ma...@apache.org>:

> This is an automated email from the ASF dual-hosted git repository.
>
> markt pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/tomcat.git
>
> commit ab70de3278d5e506661faeb5febf71a061b89179
> Author: Mark Thomas <ma...@apache.org>
> AuthorDate: Thu May 16 13:36:39 2019 +0100
>
>     Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=62841 poss deadlock
>
>     Refactor the DeltaRequest serialization to reduce the window during
>     which the DeltaSession is locked and to remove a potential cause of
>     deadlocks during serialization.
> ---
>  .../apache/catalina/ha/session/DeltaManager.java   | 19
> ++++++++++++++-----
>  .../apache/catalina/ha/session/DeltaSession.java   | 22
> ++++++++++++++++++++++
>  webapps/docs/changelog.xml                         |  6 ++++++
>  3 files changed, 42 insertions(+), 5 deletions(-)
>
> diff --git a/java/org/apache/catalina/ha/session/DeltaManager.java
> b/java/org/apache/catalina/ha/session/DeltaManager.java
> index 9f3abef..7f0df95 100644
> --- a/java/org/apache/catalina/ha/session/DeltaManager.java
> +++ b/java/org/apache/catalina/ha/session/DeltaManager.java
> @@ -39,6 +39,7 @@ import org.apache.catalina.tribes.io.ReplicationStream;
>  import org.apache.juli.logging.Log;
>  import org.apache.juli.logging.LogFactory;
>  import org.apache.tomcat.util.ExceptionUtils;
> +import org.apache.tomcat.util.collections.SynchronizedStack;
>  import org.apache.tomcat.util.res.StringManager;
>
>  /**
> @@ -88,6 +89,7 @@ public class DeltaManager extends ClusterManagerBase{
>      private boolean receiverQueue = false ;
>      private boolean stateTimestampDrop = true ;
>      private volatile long stateTransferCreateSendTime;
> +    private SynchronizedStack<DeltaRequest> deltaRequestPool = new
> SynchronizedStack<>();
>
>      // -------------------------------------------------------- stats
> attributes
>
> @@ -952,10 +954,10 @@ public class DeltaManager extends ClusterManagerBase{
>       *            whether this method has been called during session
> expiration
>       * @return a SessionMessage to be sent,
>       */
> -    @SuppressWarnings("null") // session can't be null when it is used
>      public ClusterMessage requestCompleted(String sessionId, boolean
> expires) {
>          DeltaSession session = null;
>          SessionMessage msg = null;
> +        DeltaRequest deltaRequest = null;
>          try {
>              session = (DeltaSession) findSession(sessionId);
>              if (session == null) {
> @@ -963,8 +965,12 @@ public class DeltaManager extends ClusterManagerBase{
>                  // removed the session from the Manager.
>                  return null;
>              }
> -            DeltaRequest deltaRequest = session.getDeltaRequest();
> -            session.lock();
> +            DeltaRequest newDeltaRequest = deltaRequestPool.pop();
> +            if (newDeltaRequest == null) {
> +                // Will be configured in replaceDeltaRequest()
> +                newDeltaRequest = new DeltaRequest();
> +            }
> +            deltaRequest = session.replaceDeltaRequest(newDeltaRequest);
>              if (deltaRequest.getSize() > 0) {
>                  counterSend_EVT_SESSION_DELTA++;
>                  byte[] data = serializeDeltaRequest(session,deltaRequest);
> @@ -973,14 +979,17 @@ public class DeltaManager extends ClusterManagerBase{
>                                               data,
>                                               sessionId,
>                                               sessionId + "-" +
> System.currentTimeMillis());
> -                session.resetDeltaRequest();
>              }
>          } catch (IOException x) {
>
>  log.error(sm.getString("deltaManager.createMessage.unableCreateDeltaRequest",
>                      sessionId), x);
>              return null;
>          } finally {
> -            if (session!=null) session.unlock();
> +            if (deltaRequest != null) {
> +                // Reset the instance before it is returned to the pool
> +                deltaRequest.reset();
> +                deltaRequestPool.push(deltaRequest);
> +            }
>          }
>          if(msg == null) {
>              if(!expires && !session.isPrimarySession()) {
> diff --git a/java/org/apache/catalina/ha/session/DeltaSession.java
> b/java/org/apache/catalina/ha/session/DeltaSession.java
> index d25f622..8a186ce 100644
> --- a/java/org/apache/catalina/ha/session/DeltaSession.java
> +++ b/java/org/apache/catalina/ha/session/DeltaSession.java
> @@ -608,6 +608,26 @@ public class DeltaSession extends StandardSession
> implements Externalizable,Clus
>          return deltaRequest;
>      }
>
> +    /**
> +     * Replace the existing deltaRequest with the provided replacement.
> +     *
> +     * @param deltaRequest The new deltaRequest. Expected to be either a
> newly
> +     *                     created object or an instance that has been
> reset.
> +     *
> +     * @return The old deltaRequest
> +     */
> +    DeltaRequest replaceDeltaRequest(DeltaRequest deltaRequest) {
> +        lock();
> +        try {
> +            DeltaRequest oldDeltaRequest = this.deltaRequest;
> +            this.deltaRequest = deltaRequest;
> +            this.deltaRequest.setSessionId(getIdInternal());
> +            return oldDeltaRequest;
> +        } finally {
> +            unlock();
> +        }
> +    }
> +
>
>
In DeltaManager#serializeDeltaRequest, the session lock has been is
obtained.
Do we need to remove it? or replace to deltaRequest.serialize();

Do you have any plan for applying this for using BackupManager ?
There are similar codes in AbstractReplicatedMap#replicate.
Do we need to apply a similar fix to AbstractReplicatedMap#replicate ?




>      // ------------------------------------------------- HttpSession
> Properties
>
> @@ -668,6 +688,8 @@ public class DeltaSession extends StandardSession
> implements Externalizable,Clus
>
>      public void setAttribute(String name, Object value, boolean
> notify,boolean addDeltaRequest) {
>
> +        log.info("setAttribute name [" + name + ", value [" + value +
> "]");
> +
>          // Name cannot be null
>          if (name == null) throw new
> IllegalArgumentException(sm.getString("standardSession.setAttribute.namenull"));
>
> diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
> index cfd34e2..c08fa7e 100644
> --- a/webapps/docs/changelog.xml
> +++ b/webapps/docs/changelog.xml
> @@ -132,6 +132,12 @@
>    <subsection name="Cluster">
>      <changelog>
>        <fix>
> +        <bug>62841</bug>: Refactor the <code>DeltaRequest</code>
> serialization
> +        to reduce the window during which the <code>DeltaSession</code> is
> +        locked and to remove a potential cause of deadlocks during
> +        serialization. (markt)
> +      </fix>
> +      <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
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

-- 
Keiichi.Fujino