Vihang Karajgaonkar created THRIFT-3858:
-------------------------------------------

             Summary: 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
    Affects Versions: 0.9.3
            Reporter: Vihang Karajgaonkar


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