-
Notifications
You must be signed in to change notification settings - Fork 299
/
ExceptionsTranslatorImpl.java
87 lines (79 loc) · 3.98 KB
/
ExceptionsTranslatorImpl.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package me.prettyprint.cassandra.service;
import java.net.SocketTimeoutException;
import java.util.NoSuchElementException;
import me.prettyprint.hector.api.exceptions.HCassandraInternalException;
import me.prettyprint.hector.api.exceptions.HInactivePoolException;
import me.prettyprint.hector.api.exceptions.HInvalidRequestException;
import me.prettyprint.hector.api.exceptions.HNotFoundException;
import me.prettyprint.hector.api.exceptions.HPoolExhaustedException;
import me.prettyprint.hector.api.exceptions.HPoolRecoverableException;
import me.prettyprint.hector.api.exceptions.HTimedOutException;
import me.prettyprint.hector.api.exceptions.HUnavailableException;
import me.prettyprint.hector.api.exceptions.HectorException;
import me.prettyprint.hector.api.exceptions.HectorTransportException;
import me.prettyprint.hector.api.exceptions.PoolIllegalStateException;
import org.apache.thrift.TApplicationException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.transport.TTransportException;
public final class ExceptionsTranslatorImpl implements ExceptionsTranslator {
@Override
public HectorException translate(Throwable original) {
return translate(original, null);
}
@Override
public HectorException translate(Throwable original, CassandraHost host) {
HectorException he;
if (original instanceof HectorException) {
he = (HectorException) original;
} else if (original instanceof TApplicationException) {
he = new HCassandraInternalException(((TApplicationException)original).getType(), original.getMessage());
} else if (original instanceof TTransportException) {
// if the underlying cause is a scoket timeout, reflect that directly
// TODO this may be an issue on the Cassandra side which warrants investigation.
// I seem to remember these coming back as TimedOutException previously
if (((TTransportException) original).getCause() instanceof SocketTimeoutException) {
he = new HTimedOutException(original);
} else {
he = new HectorTransportException(original);
}
} else if (original instanceof org.apache.cassandra.thrift.TimedOutException) {
he = new HTimedOutException(original);
} else if (original instanceof org.apache.cassandra.thrift.InvalidRequestException) {
// See bug https://issues.apache.org/jira/browse/CASSANDRA-1862
// If a bootstrapping node is accessed it responds with IRE. It makes more sense to throw
// UnavailableException.
// Hector wraps this caveat and fixes this.
String why = ((org.apache.cassandra.thrift.InvalidRequestException) original).getWhy();
if (why != null && why.contains("bootstrap")) {
he = new HUnavailableException(original);
} else {
HInvalidRequestException e = new HInvalidRequestException(original);
e.setWhy(why);
he = e;
}
} else if (original instanceof HPoolExhaustedException ) {
he = (HPoolExhaustedException) original;
} else if (original instanceof HPoolRecoverableException ) {
he = (HPoolRecoverableException) original;
} else if (original instanceof HInactivePoolException ) {
he = (HInactivePoolException) original;
} else if (original instanceof TProtocolException) {
he = new HInvalidRequestException(original);
} else if (original instanceof org.apache.cassandra.thrift.NotFoundException) {
he = new HNotFoundException(original);
} else if (original instanceof org.apache.cassandra.thrift.UnavailableException) {
he = new HUnavailableException(original);
} else if (original instanceof TException) {
he = new HectorTransportException(original);
} else if (original instanceof NoSuchElementException) {
he = new HPoolExhaustedException(original);
} else if (original instanceof IllegalStateException) {
he = new PoolIllegalStateException(original);
} else {
he = new HectorException(original);
}
he.setHost(host);
return he;
}
}