Due to the issues I had with the TreeCacheView class, I wrote a command line 
implementation of TreeCacheListener.  In doing so, I happened upon a quirk.  It 
turns out that TreeCacheListener instances are not notified when the 
remove(fqn, key) method is invoked on remote instances.  I have not tested with 
a listener that is local to the cache, but in looking at the code, I think that 
the result might be the same.

Using the JBossCache 1.1 tagged version of TreeCache I tracked the actual 
removal (on a remote instance from the remove invocation) to line 2517.  In the 
latest revision, the line is 2576.  The method containing these lines of code 
never issues a nodeModified event to the listeners, however it is a bit more 
complicated because the method does issue nodeRemoved events.  They are 
suppressed for the context of this call due to a boolean parameter on the 
method itself.

Should invocations of remove(fqn, key) cause nodeModification events?  It seems 
like they should, but the presence of the other (suppressed) events confuses 
me.  I supposed this method is used for both the removal of nodes and of values 
from a node's map.  Am I reading this correctly?

For reference, the JBossCache 1.1 tagged version of TreeCache's _remove method 
is below.  Line 2517 is the line containing old_value=n.remove(key).


  | public Object _remove(GlobalTransaction tx, Fqn fqn, Object key,
  |                       boolean create_undo_ops, boolean sendNodeEvent)
  | throws LockingException, TimeoutException {
  |       Node n=null;
  |       MethodCall undo_op=null;
  |       Object old_value=null;
  | 
  |       if(log.isDebugEnabled())
  |          log.debug("_remove(" + tx + ", \"" + fqn + "\", " + key + ")");
  | 
  |       try {
  |          // Find the node. This will lock it (if <tt>locking</tt> is true) 
and
  |          // add the temporarily created parent nodes to the TX's node list 
if tx != null)
  |          n=findNode(fqn, true, locking, tx, NODE_WRITE);
  |          if(n == null) {
  |             log.error("_remove(): node " + fqn + " not found");
  |             return null;
  |          }
  |          old_value=n.remove(key);
  | 
  |          // create a compensating method call (reverting the effect of
  |          // this modification) and put it into the TX's undo list.
  |          if(tx != null && create_undo_ops && old_value != null) {
  |             undo_op=new MethodCall(put_key_val_method,
  |                     new Object[]{tx, fqn, key, old_value,
  |                                  new Boolean(false)});
  |             // 1. put undo-op in TX' undo-operations list (needed to 
rollback TX)
  |             tx_table.addUndoOperation(tx, undo_op);
  |          }
  | 
  |          if(sendNodeEvent)
  |             notifyNodeRemoved(fqn);
  |          return old_value;
  |       }
  |       finally { // we always unlock when no TX is present 
(lock-update-unlock)
  |          if(tx == null && locking == true)
  |             releaseLocks(tx, fqn);
  |       }
  |    }
  | 

View the original post : 
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=3854386#3854386

Reply to the post : 
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=3854386


-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
JBoss-Development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to