[jbosscache-commits] JBoss Cache SVN: r5780 - in core/trunk/src/main/java/org/jboss/cache: marshall and 1 other directory.

jbosscache-commits at lists.jboss.org jbosscache-commits at lists.jboss.org
Wed Apr 30 13:04:26 EDT 2008


Author: manik.surtani at jboss.com
Date: 2008-04-30 13:04:26 -0400 (Wed, 30 Apr 2008)
New Revision: 5780

Modified:
   core/trunk/src/main/java/org/jboss/cache/RPCManagerImpl.java
   core/trunk/src/main/java/org/jboss/cache/marshall/CommandAwareRpcDispatcher.java
Log:
Further optimisations around unnecessary construction of response lists

Modified: core/trunk/src/main/java/org/jboss/cache/RPCManagerImpl.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/RPCManagerImpl.java	2008-04-30 16:44:48 UTC (rev 5779)
+++ core/trunk/src/main/java/org/jboss/cache/RPCManagerImpl.java	2008-04-30 17:04:26 UTC (rev 5780)
@@ -42,7 +42,6 @@
 import org.jgroups.util.RspList;
 
 import javax.transaction.TransactionManager;
-import java.io.NotSerializableException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -406,17 +405,14 @@
 
       RspList rsps = disp.invokeRemoteCommands(recipients, command, modeToUse, timeout, isUsingBuddyReplication, useOutOfBandMessage, responseFilter);
 
-      // a null response is 99% likely to be due to a marshalling problem - we throw a NSE, this needs to be changed when
-      // JGroups supports http://jira.jboss.com/jira/browse/JGRP-193
-      if (rsps == null)
-      {
-         throw new NotSerializableException("RpcDispatcher returned a null.  This is most often caused by args for " + command.getClass().getSimpleName() + " not being serializable.");
-      }
       if (mode == GroupRequest.GET_NONE) return Collections.emptyList();// async case
 
       if (trace)
          log.trace("(" + getLocalAddress() + "): responses for method " + command.getClass().getSimpleName() + ":\n" + rsps);
 
+      // short-circuit no-return-value calls.
+      if (rsps == null) return Collections.emptyList();
+
       List<Object> retval = new ArrayList<Object>(rsps.size());
 
       for (Rsp rsp : rsps.values())

Modified: core/trunk/src/main/java/org/jboss/cache/marshall/CommandAwareRpcDispatcher.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/marshall/CommandAwareRpcDispatcher.java	2008-04-30 16:44:48 UTC (rev 5779)
+++ core/trunk/src/main/java/org/jboss/cache/marshall/CommandAwareRpcDispatcher.java	2008-04-30 17:04:26 UTC (rev 5780)
@@ -16,8 +16,10 @@
 import org.jgroups.MessageListener;
 import org.jgroups.blocks.RpcDispatcher;
 import org.jgroups.blocks.RspFilter;
+import org.jgroups.util.Rsp;
 import org.jgroups.util.RspList;
 
+import java.io.NotSerializableException;
 import java.util.Vector;
 
 /**
@@ -66,7 +68,7 @@
     * is aware of {@link org.jboss.cache.commands.ReplicableCommand} objects.
     */
    public RspList invokeRemoteCommands(Vector<Address> dests, ReplicableCommand command, int mode, long timeout,
-                                       boolean use_anycasting, boolean oob, RspFilter filter)
+                                       boolean use_anycasting, boolean oob, RspFilter filter) throws NotSerializableException
    {
       if (dests != null && dests.isEmpty())
       {
@@ -94,9 +96,30 @@
          msg.setFlag(Message.OOB);
       RspList retval = super.castMessage(dests, msg, mode, timeout, use_anycasting, filter);
       if (log.isTraceEnabled()) log.trace("responses: " + retval);
-      return retval;
+
+      // a null response is 99% likely to be due to a marshalling problem - we throw a NSE, this needs to be changed when
+      // JGroups supports http://jira.jboss.com/jira/browse/JGRP-193
+      // the serialization problem could be on the remote end and this is why we cannot catch this above, when marshalling.
+      if (retval == null)
+      {
+         throw new NotSerializableException("RpcDispatcher returned a null.  This is most often caused by args for " + command.getClass().getSimpleName() + " not being serializable.");
+      }
+
+      if (retval.isEmpty() || containsOnlyNulls(retval))
+         return null;
+      else
+         return retval;
    }
 
+   private boolean containsOnlyNulls(RspList l)
+   {
+      for (Rsp r : l.values())
+      {
+         if (r.getValue() != null) return false;
+      }
+      return true;
+   }
+
    /**
     * Message contains a Command. Execute it against *this* object and return result.
     */




More information about the jbosscache-commits mailing list