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)