|
3 | 3 | import io.dingodb.sdk.common.DingoClientException.ExhaustedRetryException; |
4 | 4 | import io.dingodb.sdk.common.DingoClientException.InvalidRouteTableException; |
5 | 5 | import io.dingodb.sdk.common.DingoClientException.RequestErrorException; |
| 6 | +import io.dingodb.sdk.common.utils.ErrorCodeUtils; |
6 | 7 | import io.dingodb.sdk.service.JsonMessageUtils; |
7 | 8 | import io.dingodb.sdk.service.Caller; |
8 | 9 | import io.dingodb.sdk.service.ChannelProvider; |
|
12 | 13 | import io.dingodb.sdk.service.entity.Message.Response; |
13 | 14 | import io.dingodb.sdk.service.entity.error.Errno; |
14 | 15 | import io.dingodb.sdk.service.entity.error.Error; |
| 16 | +import io.dingodb.sdk.service.entity.store.TxnPrewriteRequest; |
15 | 17 | import io.grpc.CallOptions; |
16 | 18 | import io.grpc.Channel; |
17 | 19 | import io.grpc.MethodDescriptor; |
|
25 | 27 | import java.util.function.Function; |
26 | 28 |
|
27 | 29 | import static io.dingodb.sdk.common.utils.ErrorCodeUtils.errorToStrategy; |
| 30 | +import static io.dingodb.sdk.common.utils.ErrorCodeUtils.isPreWriteRequestFailed; |
28 | 31 |
|
29 | 32 | @Slf4j |
30 | 33 | public class ServiceCaller<S extends Service<S>> implements Caller<S> { |
@@ -96,8 +99,10 @@ public <REQ extends Request, RES extends Response> RES call( |
96 | 99 | errMsgs.compute( |
97 | 100 | channel.authority() + ">>" + error.getErrmsg(), (k, v) -> v == null ? 1 : v + 1 |
98 | 101 | ); |
| 102 | + boolean isPreWriteFailed = isPreWriteFailed(request); |
99 | 103 | switch (handler.onErrStrategy( |
100 | | - errorToStrategy(errCode), |
| 104 | + isPreWriteRequestFailed(errCode, isPreWriteFailed) ? |
| 105 | + ErrorCodeUtils.Strategy.FAILED : errorToStrategy(errCode), |
101 | 106 | this.retry, retry, request, response, options, channel.authority(), requestId |
102 | 107 | )) { |
103 | 108 | case RETRY: |
@@ -141,6 +146,13 @@ public <REQ extends Request, RES extends Response> RES call( |
141 | 146 | throw generateException(methodName, requestId, lastRequest, connected, errMsgs, handler); |
142 | 147 | } |
143 | 148 |
|
| 149 | + private static <REQ extends Request> boolean isPreWriteFailed(REQ request) { |
| 150 | + if (request instanceof TxnPrewriteRequest) { |
| 151 | + return (((TxnPrewriteRequest) request).isTryOnePc() || ((TxnPrewriteRequest) request).isUseAsyncCommit()); |
| 152 | + } |
| 153 | + return false; |
| 154 | + } |
| 155 | + |
144 | 156 | private void waitRetry() { |
145 | 157 | LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1)); |
146 | 158 | } |
|
0 commit comments