Return-Path: X-Original-To: apmail-tomcat-dev-archive@www.apache.org Delivered-To: apmail-tomcat-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8292490E5 for ; Wed, 18 Apr 2012 19:05:58 +0000 (UTC) Received: (qmail 69385 invoked by uid 500); 18 Apr 2012 19:05:57 -0000 Delivered-To: apmail-tomcat-dev-archive@tomcat.apache.org Received: (qmail 69327 invoked by uid 500); 18 Apr 2012 19:05:57 -0000 Mailing-List: contact dev-help@tomcat.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "Tomcat Developers List" Delivered-To: mailing list dev@tomcat.apache.org Received: (qmail 69317 invoked by uid 99); 18 Apr 2012 19:05:57 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Apr 2012 19:05:57 +0000 X-ASF-Spam-Status: No, hits=-0.7 required=5.0 tests=RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of knst.kolinko@gmail.com designates 209.85.213.45 as permitted sender) Received: from [209.85.213.45] (HELO mail-yw0-f45.google.com) (209.85.213.45) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Apr 2012 19:05:49 +0000 Received: by yhoo21 with SMTP id o21so4885139yho.18 for ; Wed, 18 Apr 2012 12:05:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; bh=nitn8KhZpRBsmr5iHQkaVPMyFo8XQcqQ1l6CuyBBf+M=; b=ImoQx4ETUQv+qTHofwuRHaT9Ry/r5iaRag1gLQXvdXNkI0j7g/+FhPpTzB9UUJkRhf 2Yy061mqwJcH/NbIXpTHD7Qa1jnHHuuqniQEitz6eV9KiAfQiREOsdTkyM66NhDSczTg 0IOJBb3+XgRAhI/tcTc5dU9QozmcQ+C/LAV2cn2/pajaJPWXuP4Zcfk+xv1jm8VH4fq2 YAMyUYYDSYqIvwTIEGWwc003gvilqG/IYOVwFfjVGopa3gxTre2t6VUxTZ13/XMyWqVC IP3ltT+D6ytb32gHKV1jiqBV0n8+mpkogM2iernamQKS2nyaz6q8EaqoccX6Ayff6QO6 ZcEA== MIME-Version: 1.0 Received: by 10.101.152.4 with SMTP id e4mr1083793ano.45.1334775928677; Wed, 18 Apr 2012 12:05:28 -0700 (PDT) Received: by 10.146.204.18 with HTTP; Wed, 18 Apr 2012 12:05:28 -0700 (PDT) In-Reply-To: <20120417062322.6BBA223889FD@eris.apache.org> References: <20120417062322.6BBA223889FD@eris.apache.org> Date: Wed, 18 Apr 2012 23:05:28 +0400 Message-ID: Subject: Re: svn commit: r1326941 - in /tomcat/tc7.0.x/trunk: java/org/apache/catalina/ha/session/ java/org/apache/catalina/tribes/tipis/ webapps/docs/ From: Konstantin Kolinko To: Tomcat Developers List Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable 2012/4/17 : > Author: kfujino > Date: Tue Apr 17 06:23:21 2012 > New Revision: 1326941 > > URL: http://svn.apache.org/viewvc?rev=3D1326941&view=3Drev > Log: > Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=3D53087. > In order to avoid that a backup node expire a session, replicate session = access time in BackupManager. > > Modified: > =A0 =A0tomcat/tc7.0.x/trunk/java/org/apache/catalina/ha/session/DeltaSess= ion.java > =A0 =A0tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/Abstrac= tReplicatedMap.java > =A0 =A0tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/Replica= tedMapEntry.java > =A0 =A0tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml > (...) > Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/Abst= ractReplicatedMap.java > URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/ca= talina/tribes/tipis/AbstractReplicatedMap.java?rev=3D1326941&r1=3D1326940&r= 2=3D1326941&view=3Ddiff > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractRe= plicatedMap.java (original) > +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractRe= plicatedMap.java Tue Apr 17 06:23:21 2012 > @@ -402,8 +402,10 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 if ( !entry.isSerializable() ) return; > =A0 =A0 =A0 =A0 if (entry.isPrimary() && entry.getBackupNodes()!=3D null = && entry.getBackupNodes().length > 0) { > =A0 =A0 =A0 =A0 =A0 =A0 Object value =3D entry.getValue(); > - =A0 =A0 =A0 =A0 =A0 =A0//check to see if we need to replicate this obje= ct isDirty()||complete > - =A0 =A0 =A0 =A0 =A0 =A0boolean repl =3D complete || ( (value instanceof= ReplicatedMapEntry) && ( (ReplicatedMapEntry) value).isDirty()); > + =A0 =A0 =A0 =A0 =A0 =A0//check to see if we need to replicate this obje= ct isDirty()||complete || isAccessReplicate() > + =A0 =A0 =A0 =A0 =A0 =A0boolean isDirty =3D ((value instanceof Replicate= dMapEntry) && ((ReplicatedMapEntry) value).isDirty()); > + =A0 =A0 =A0 =A0 =A0 =A0boolean isAccess =3D ((value instanceof Replicat= edMapEntry) && ((ReplicatedMapEntry) value).isAccessReplicate()); > + =A0 =A0 =A0 =A0 =A0 =A0boolean repl =3D complete || isDirty || isAccess= ; > > =A0 =A0 =A0 =A0 =A0 =A0 if (!repl) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( log.isTraceEnabled() ) > @@ -412,9 +414,9 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return; > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 //check to see if the message is diffable > - =A0 =A0 =A0 =A0 =A0 =A0boolean diff =3D ( (value instanceof ReplicatedM= apEntry) && ( (ReplicatedMapEntry) value).isDiffable()); > + =A0 =A0 =A0 =A0 =A0 =A0boolean diff =3D ((value instanceof ReplicatedMa= pEntry) && ((ReplicatedMapEntry) value).isDiffable()); > =A0 =A0 =A0 =A0 =A0 =A0 MapMessage msg =3D null; > - =A0 =A0 =A0 =A0 =A0 =A0if (diff) { > + =A0 =A0 =A0 =A0 =A0 =A0if (diff && isDirty) { What happens if "repl" variable is true because of "complete" being true? Shouldn't it be if (diff && (isDirty || complete)) ? I do not quite understand the code, but it seems that omitting "complete" here will change its behaviour. E.g. DeltaSession.isDiffable() always returns true, and thus I think the old "if(diff)" block was executed regardless of the value of "complete". > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ReplicatedMapEntry rentry =3D (Replicated= MapEntry)entry.getValue(); The above local variable could be moved outside this block, to avoid multiple (instanceof) checks above. > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 try { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rentry.lock(); > @@ -432,6 +434,12 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > > =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 =A0 =A0 =A0if (msg =3D=3D null && isAccess) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0//construct a access message > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0msg =3D new MapMessage(mapContextName, M= apMessage.MSG_ACCESS, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0false, (Serializable) en= try.getKey(), null, null, entry.getPrimary(), > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0entry.getBackupNodes()); > + =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 if (msg =3D=3D null) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 //construct a complete > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 msg =3D new MapMessage(mapContextName, Ma= pMessage.MSG_BACKUP, > @@ -442,6 +450,9 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 try { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( channel!=3Dnull && entry.getBackupNo= des()!=3D null && entry.getBackupNodes().length > 0 ) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if ((entry.getValue() instanceof= ReplicatedMapEntry)) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0((ReplicatedMapEntry)ent= ry.getValue()).setLastTimeReplicated(System.currentTimeMillis()); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 channel.send(entry.getBackupNodes= (), msg, channelSendOptions); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 =A0 =A0 } catch (ChannelException x) { > @@ -670,6 +681,17 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 =A0 =A0 } //end if > =A0 =A0 =A0 =A0 =A0 =A0 super.put(entry.getKey(), entry); > =A0 =A0 =A0 =A0 } //end if > + > + =A0 =A0 =A0 =A0if (mapmsg.getMsgType() =3D=3D MapMessage.MSG_ACCESS) { > + =A0 =A0 =A0 =A0 =A0 =A0MapEntry entry =3D (MapEntry)super.get(mapmsg.ge= tKey()); > + =A0 =A0 =A0 =A0 =A0 =A0if (entry !=3D null) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0entry.setBackupNodes(mapmsg.getBackupNod= es()); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0entry.setPrimary(mapmsg.getPrimary()); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (entry.getValue() instanceof Replicat= edMapEntry) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0((ReplicatedMapEntry) entry.getV= alue()).accessEntry(); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0} > + =A0 =A0 =A0 =A0 =A0 =A0} > + =A0 =A0 =A0 =A0} > =A0 =A0 } > > =A0 =A0 @Override > @@ -1277,6 +1299,7 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 public static final int MSG_INIT =3D 8; > =A0 =A0 =A0 =A0 public static final int MSG_COPY =3D 9; > =A0 =A0 =A0 =A0 public static final int MSG_STATE_COPY =3D 10; > + =A0 =A0 =A0 =A0public static final int MSG_ACCESS =3D 11; > > =A0 =A0 =A0 =A0 private byte[] mapId; > =A0 =A0 =A0 =A0 private int msgtype; > @@ -1314,6 +1337,7 @@ public abstract class AbstractReplicated > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case MSG_INIT: return "MSG_INIT"; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case MSG_STATE_COPY: return "MSG_STATE_CO= PY"; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 case MSG_COPY: return "MSG_COPY"; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0case MSG_ACCESS: return "MSG_ACCESS"; > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 default : return "UNKNOWN"; > =A0 =A0 =A0 =A0 =A0 =A0 } > =A0 =A0 =A0 =A0 } > Best regards, Konstantin Kolinko --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org For additional commands, e-mail: dev-help@tomcat.apache.org