[ 
https://issues.apache.org/jira/browse/THRIFT-3858?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James E. King, III updated THRIFT-3858:
---------------------------------------
    Priority: Minor  (was: Major)

> Tthreadpoolserver should throw exception when it gets 
> RejectedExecutionException
> --------------------------------------------------------------------------------
>
>                 Key: THRIFT-3858
>                 URL: https://issues.apache.org/jira/browse/THRIFT-3858
>             Project: Thrift
>          Issue Type: Improvement
>          Components: Java - Library
>    Affects Versions: 0.9.3
>            Reporter: Vihang Karajgaonkar
>            Priority: Minor
>
> In the TThreadpoolServer class when for any reason the executor server 
> receives a RejectedExecutionException, it just logs it and closes the client 
> connection. Client has no way to find out why its connection request was 
> rejected. If TThreadpoolServer could return some error information back to 
> client, it would be able to handle the exception gracefully.
> Eg: In Hive project the clients use Thrift library (0.9.3) for connections 
> from client to hiveserver2. If for some reason the maximum threads (in this 
> case concurrent client sessions) are reached, the next new session is unable 
> to connect and the client code has no way to figure why the connection 
> request failed. If client receives back an error saying that max threads have 
> been reached, client could display useful error messages to the user so that 
> corrective action can be taken.
> {code}
> try {
>             executorService_.execute(wp);
>             break;
>           } catch(Throwable t) {
>             if (t instanceof RejectedExecutionException) {
>               retryCount++;
>               try {
>                 if (remainTimeInMillis > 0) {
>                   //do a truncated 20 binary exponential backoff sleep
>                   long sleepTimeInMillis = ((long) (random.nextDouble() *
>                       (1L << Math.min(retryCount, 20)))) * 
> beBackoffSlotInMillis;
>                   sleepTimeInMillis = Math.min(sleepTimeInMillis, 
> remainTimeInMillis);
>                   TimeUnit.MILLISECONDS.sleep(sleepTimeInMillis);
>                   remainTimeInMillis = remainTimeInMillis - sleepTimeInMillis;
>                 } else {
>                   client.close();
>                   wp = null;
>                   LOGGER.warn("Task has been rejected by ExecutorService " + 
> retryCount
>                       + " times till timedout, reason: " + t);
>                   break;
>                 }
>               }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to