Author: fhanik Date: Tue Mar 21 08:12:56 2006 New Revision: 387567 URL: http://svn.apache.org/viewcvs?rev=387567&view=rev Log: added in proper locking to the ReplicatedMapEntry
Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java?rev=387567&r1=387566&r2=387567&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java Tue Mar 21 08:12:56 2006 @@ -201,15 +201,20 @@ boolean diff = ( (value instanceof ReplicatedMapEntry) && ( (ReplicatedMapEntry) value).isDiffable()); MapMessage msg = null; if (diff) { + ReplicatedMapEntry rentry = (ReplicatedMapEntry)entry.getValue(); try { + rentry.lock(); //construct a diff message msg = new MapMessage(mapContextName, MapMessage.MSG_BACKUP, true, (Serializable) entry.getKey(), null, - ( (ReplicatedMapEntry) entry.getValue()).getDiff(), + rentry.getDiff(), entry.getBackupNodes()); } catch (IOException x) { log.error("Unable to diff object. Will replicate the entire object instead.", x); + } finally { + rentry.unlock(); } + } if (msg == null) { //construct a complete @@ -387,9 +392,12 @@ ReplicatedMapEntry diff = (ReplicatedMapEntry) entry.getValue(); if (mapmsg.isDiff()) { try { + diff.lock(); diff.applyDiff(mapmsg.getDiffValue(), 0, mapmsg.getDiffValue().length); } catch (Exception x) { log.error("Unable to apply diff to key:" + entry.getKey(), x); + } finally { + diff.unlock(); } } else { entry.setValue(mapmsg.getValue()); @@ -522,7 +530,8 @@ } public boolean isDiffable() { - return (value instanceof ReplicatedMapEntry); + return (value instanceof ReplicatedMapEntry) && + ((ReplicatedMapEntry)value).isDiffable(); } public void setBackupNodes(Member[] nodes) { @@ -583,7 +592,13 @@ */ public void apply(byte[] data, int offset, int length, boolean diff) throws IOException, ClassNotFoundException { if (isDiffable() && diff) { - ( (ReplicatedMapEntry) value).applyDiff(data, offset, length); + ReplicatedMapEntry rentry = (ReplicatedMapEntry) value; + try { + rentry.lock(); + rentry.applyDiff(data, offset, length); + } finally { + rentry.unlock(); + } } else if (length == 0) { value = null; proxy = true; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]