<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 7, 2013 at 12:43 PM, Bela Ban <span dir="ltr">&lt;<a href="mailto:bban@redhat.com" target="_blank">bban@redhat.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br>
On 2/7/13 11:09 AM, Dan Berindei wrote:<br>
&gt;<br>
&gt;<br>
&gt;     A few changes I have in mind (need to think about it more):<br>
&gt;<br>
&gt;     - I want to leave the existing RequestHandler interface in place, so<br>
&gt;     current implementation continue to work<br>
&gt;     - There will be a new AsyncRequestHandler interface (possibly<br>
&gt;     extending<br>
&gt;     RequestHandler, so an implementation can decide to implement<br>
&gt;     both). The<br>
&gt;     RequestCorrelator needs to have either request_handler or<br>
&gt;     async_request_handler set. If the former is set, the logic is<br>
&gt;     unchanged.<br>
&gt;     If the latter is set I&#39;ll invoke the async dispatching code<br>
&gt;<br>
&gt;     - AsyncRequestHandler will look similar to the following:<br>
&gt;     void handle(Message request, Handback hb, boolean requires_response)<br>
&gt;     throws Throwable;<br>
&gt;     - Handback is an interface, and its impl contains header information<br>
&gt;     (e.g. request ID)<br>
&gt;     - Handback has a sendReply(Object reply, boolean is_exception) method<br>
&gt;     which sends a response (or exception) back to the caller<br>
&gt;<br>
&gt;<br>
&gt; +1 for a new interface. TBH I hadn&#39;t read the RequestCorrelator code,<br>
&gt; so I had assumed it was already asynchronous, and only RpcDispatcher<br>
&gt; was synchronous.<br>
<br>
<br>
</div>Nope, unfortunately not.<br>
<div><br> <br></div></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<br>
&gt;<br>
&gt; I&#39;m not so sure about the Handback name, how about calling it Response<br>
&gt; instead?<br>
<br>
<br>
</div>It *is* actually called Response (can you read my mind?) :-)<br>
<div class="im"><br></div></blockquote><div><br></div><div>Nice :)<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
&gt;<br>
&gt;     - When requires_response is false, the AsyncRequestHandler doesn&#39;t<br>
&gt;     need to invoke sendReply()<br>
&gt;<br>
&gt;<br>
&gt; I think this should be the other way around: when requires_response is<br>
&gt; true, the AsyncRequestHandler *can* invoke sendReply(), but is not<br>
&gt; required to (the call will just time out on the caller node); when<br>
&gt; requires_response is false, invoking sendReply() should throw an<br>
&gt; exception.<br>
<br>
<br>
</div>The way I actually implemented it this morning is to omit the boolean<br>
parameter altogether:<br>
void handle(Message request, Response response) throws Exception;<br>
<br>
Response is null for async requests.<br>
<div class="im"><br></div></blockquote><div><br></div><div>Sounds good.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<br>
<br>
<br>
<br>
&gt;<br>
&gt;<br>
&gt;     - Message batching<br>
&gt;     - The above interfaces need to take message batching into account,<br>
&gt;     e.g.<br>
&gt;     the ability to handle multiple requests concurrently (if they<br>
&gt;     don&#39;t need<br>
&gt;     to be executed sequentially)<br>
&gt;<br>
&gt;<br>
&gt; You mean handle() is still going to be called once for each request,<br>
&gt; but second handle() call won&#39;t necessarily wait for the first<br>
&gt; message&#39;s sendReply() call?<br>
<br>
</div>Yes. I was thinking of adding a second method to the interface, which<br>
has a message batch as parameter. However, we&#39;d also have to pass in an<br>
array of Response objects and it looked a bit clumsy.<br>
<div class="im"><br></div></blockquote><div><br></div><div>Agree, it would look quite clumsy.<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">


&gt;<br>
&gt; Is this going to apply only to OOB messages, or to regular messages as<br>
&gt; well? I think I&#39;d prefer it if it only applied to OOB messages,<br>
&gt; otherwise we&#39;d have to implement our own ordering for regular/async<br>
&gt; commands.<br>
<br>
</div>No, I think it&#39;ll apply to all messages. A simple implementation could<br>
dispatch OOB messages to the thread pool, as they don&#39;t need to be<br>
ordered. Regular messages could be added to a queue where they are<br>
processed sequentially by a *single* thread. Pedro does implement<br>
ordering based on transactions (see his prev email), and I think there<br>
are some other good use cases for regular messages. I think one thing<br>
that could be done for regular messages is to implement something like<br>
SCOPE (remember ?) for async RPCs: updates to different web sessions<br>
could be processed concurrently, only updates to the *same* session<br>
would have to be ordered.<br>
<br></blockquote><div><br></div><div>Yeah, I agree implementing the regular message ordering ourselves would give us a little more room for optimizations. But it would make our part more complicated, too. Well, not for Total Ordering, because Pedro already implemented it, but for our regular async scenarios we&#39;d need to add a thread pool (we want to allow 2 threads from different sources to access different keys at the same time).<br>

<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This API is not in stone, we can always change it. Once I&#39;m done with<br>
this and have batching II implemented, plus some other JIRAs, I&#39;ll ping<br>
you guys and we should have a meeting discussing<br>
- Async invocation API<br>
- Message batching (also in conjunction with the above)<br>
- Message bundling and OOB / DONT_BUNDLE; bundling of OOB messages<br>
<div class="HOEnZb"><div class="h5"><br></div></div></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
--<br>
Bela Ban, JGroups lead (<a href="http://www.jgroups.org" target="_blank">http://www.jgroups.org</a>)<br>
<br>
_______________________________________________<br>
infinispan-dev mailing list<br>
<a href="mailto:infinispan-dev@lists.jboss.org">infinispan-dev@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/infinispan-dev" target="_blank">https://lists.jboss.org/mailman/listinfo/infinispan-dev</a><br>
</div></div></blockquote></div><br></div></div>