[infinispan-dev] Threadpools in a large cluster
Bela Ban
bban at redhat.com
Thu Feb 7 10:11:12 EST 2013
On 2/7/13 2:55 PM, Pedro Ruivo wrote:
>
>> The default would be to invoke the old handle(Message) method. The
>> dispatching mechanism could be changed to use the async method by
>> setting an attribute in MessageDispatcher (which in turn sets it in
>> RequestCorrelator).
>>
>> How would you do this ? Remember, we cannot change or remove
>> handle(Message) as subclasses of RpcDispatcher or MessageDispatcher, or
>> impls of RequestHandler are out there and any change to handle(Message)
>> would break them.
>>
>> Would you simply provide a separate AsyncRequestHandler interface, not
>> extending RequestHandler ? This would require RequestCorrelator and
>> MessageDispatcher to have 2 refs instead of 1. With the current approach
>> I can do an instanceof on the RequestHandler.
>>
>> I eventually like to merge RequestHandler and AsyncRequestHandler into 1
>> class, but this can be done in 4.0 at the earliest time.
>>
> My opinion, I would use a separate a interface and 2 references (while
> RequestHandler is still active).
That's not good because that would be an API change and would break code
in MuxRpcDispatcher/MuxRequestCorrelator.
I've pushed my branch JGRP-1587 to the repo, so you can look at the
code. This isn't final yet of course.
> However, I will change the
> AsyncRequestHandler interface to:
>
> Object handle(Message message, Response response) throws Exception
OK, that's what it is currently
>
> and the Response interface would be as follow:
>
> void sendResponse(Object reply, boolean isException) //or sendReply(...);
Yes
>
> void setAsyncResponse(boolean value); //or setAsyncReply(...);
>
> boolean isAsyncResponse(); //or isAsyncReply();
I don't like this. Intuitively, we create a response or not, depending
on information in the request. Also, 2 more method to implement.
>
> And with this, it can supports both behaviors, with a minor addition:
>
> 1) To work in async mode:
> the application invokes setAsyncResponse(true) and eventually it
> will invoke the sendResponse(...)
>
> 2) To work in sync mode:
> the application invokes setAsyncResponse(false). I think this
> should be the default value
>
> in the RequestCorrelator, it checks if isAsyncReponse() value. If true,
> it does not send the response (it only sends it if it is an exception
> caught). If the value is false, it sends the return value as a response
> (the current behavior). In pseudo code:
>
> try {
> ret = asyncRequestHandler.handle(message, response);
> if (response expected and !response.isAsynResponse())
> reponse.sendResponse(ret, false);
> catch Throwable t
> reponse.sendResponse(t, true)
>
> With this suggestion, when you remove the RequestHandler interface (in
> 4.0 or 5.0), the user only needs to add the Response parameter and
> everything will work as usual.
>
> For Infinispan 5.3, it can be adopted as soon as it is implemented in
> JGroups without using the async method.
>
> To avoid the problem of sending twice a response, I would put an
> AtomicBoolean or a similar synchronization mechanism in the Response
> implementation.
>
> opinions?
>
> //more below
>>>> - AsyncRequestHandler will look similar to the following:
>>>> void handle(Message request, Handback hb, boolean requires_response)
>>>> throws Throwable;
>>>> - Handback is an interface, and its impl contains header information
>>>> (e.g. request ID)
>>>> - Handback has a sendReply(Object reply, boolean is_exception) method
>>>> which sends a response (or exception) back to the caller
>>>> - When requires_response is false, the AsyncRequestHandler doesn't need
>>>> to invoke sendReply()
>>> My 2 cents, I think that the boolean requires_response should be in
>>> Handback implementation to avoid passing an extra argument
>> I actually removed the requires_response parameter. If no response is
>> required, rsp in handle(Message req, Response rsp) will simply be null.
> I would avoid put the rsp in null and I would do an empty implementation
> of the Response interface, in which the methods do nothing.
Can't do that as I want to do stuff like:
void handle(Message req, response rsp) {
try {
// invoke the request
}
catch(Throwable t) {
if(rsp != null)
rsp.send(t, true); // send the exception back to the caller
else
logError();
}
}
--
Bela Ban, JGroups lead (http://www.jgroups.org)
More information about the infinispan-dev
mailing list