Skip to content

Commit 88f7f72

Browse files
committed
fix: truncate retry fail
1 parent 45203ea commit 88f7f72

File tree

4 files changed

+34
-17
lines changed

4 files changed

+34
-17
lines changed

src/main/java/com/alipay/oceanbase/rpc/ObTableClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public class ObTableClient extends AbstractObTableClient implements Lifecycle {
128128
/*
129129
* TableName -> Failures/Lock
130130
*/
131-
private ConcurrentHashMap<String, AtomicLong> tableContinuousFailures = new ConcurrentHashMap<String, AtomicLong>();
131+
public ConcurrentHashMap<String, AtomicLong> tableContinuousFailures = new ConcurrentHashMap<String, AtomicLong>();
132132

133133
private ConcurrentHashMap<String, Lock> refreshTableLocks = new ConcurrentHashMap<String, Lock>();
134134

src/main/java/com/alipay/oceanbase/rpc/bolt/transport/ObTableRemoting.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import com.alipay.oceanbase.rpc.bolt.protocol.ObTablePacketCode;
2222
import com.alipay.oceanbase.rpc.exception.*;
2323
import com.alipay.oceanbase.rpc.protocol.packet.ObCompressType;
24-
import com.alipay.oceanbase.rpc.protocol.payload.AbstractPayload;
25-
import com.alipay.oceanbase.rpc.protocol.payload.Credentialable;
26-
import com.alipay.oceanbase.rpc.protocol.payload.ObPayload;
27-
import com.alipay.oceanbase.rpc.protocol.payload.ObRpcResultCode;
24+
import com.alipay.oceanbase.rpc.protocol.payload.*;
2825
import com.alipay.oceanbase.rpc.protocol.payload.impl.login.ObTableLoginRequest;
2926
import com.alipay.oceanbase.rpc.util.ObPureCrc32C;
3027
import com.alipay.oceanbase.rpc.util.TableClientLoggerFactory;
@@ -108,14 +105,6 @@ public ObPayload invokeSync(final ObTableConnection conn, final ObPayload reques
108105
throw new FeatureNotSupportedException(errMessage);
109106
}
110107
ByteBuf buf = response.getPacketContentBuf();
111-
// If response indicates the request is routed to wrong server, we should refresh the routing meta.
112-
if (response.getHeader().isRoutingWrong()) {
113-
String errMessage = TraceUtil.formatTraceMessage(conn, request,
114-
"routed to the wrong server: " + response.getMessage());
115-
logger.warn(errMessage);
116-
throw new ObTableRoutingWrongException(errMessage);
117-
}
118-
119108
// verify checksum
120109
long expected_checksum = response.getHeader().getChecksum();
121110
byte[] content = new byte[buf.readableBytes()];
@@ -132,7 +121,17 @@ public ObPayload invokeSync(final ObTableConnection conn, final ObPayload reques
132121
// decode ResultCode for response packet
133122
ObRpcResultCode resultCode = new ObRpcResultCode();
134123
resultCode.decode(buf);
135-
124+
// If response indicates the request is routed to wrong server, we should refresh the routing meta.
125+
if (response.getHeader().isRoutingWrong()) {
126+
String errMessage = TraceUtil.formatTraceMessage(conn, request,
127+
"routed to the wrong server: " + response.getMessage());
128+
logger.warn(errMessage);
129+
if (needFetchAll(resultCode.getRcode())) {
130+
throw new ObTableRoutingWrongException(errMessage);
131+
} else {
132+
throw new ObTableMasterChangeException(errMessage);
133+
}
134+
}
136135
if (resultCode.getRcode() != 0) {
137136
ExceptionUtil.throwObTableException(conn.getObTable().getIp(), conn.getObTable()
138137
.getPort(), response.getHeader().getTraceId1(), response.getHeader()
@@ -173,4 +172,11 @@ protected InvokeFuture createInvokeFuture(Connection conn, RemotingCommand reque
173172
return new ObClientFuture(request.getId());
174173
}
175174

175+
private boolean needFetchAll(int errorCode) {
176+
return errorCode == ResultCodes.OB_PARTITION_NOT_EXIST.errorCode
177+
|| errorCode == ResultCodes.OB_INVALID_PARTITION.errorCode
178+
|| errorCode == ResultCodes.OB_UNKNOWN_PARTITION.errorCode
179+
|| errorCode == ResultCodes.OB_PARTITION_NOT_MATCH.errorCode
180+
|| errorCode == ResultCodes.OB_TABLET_NOT_EXIST.errorCode;
181+
}
176182
}

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/ResultCodes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ public enum ResultCodes {
358358
OB_CLUSTER_NO_MATCH(-4666), //
359359
OB_CHECK_ZONE_MERGE_ORDER(-4667), //
360360
OB_ERR_ZONE_NOT_EMPTY(-4668), //
361+
OB_TABLET_NOT_EXIST(-4725), //
361362
OB_ERR_PARSER_INIT(-5000), //
362363
OB_ERR_PARSE_SQL(-5001), //
363364
OB_ERR_RESOLVE_SQL(-5002), //

src/main/java/com/alipay/oceanbase/rpc/table/ObTableClientBatchOpsImpl.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,12 @@ public void partitionExecute(ObTableOperationResult[] results,
332332
if (failedServerList != null) {
333333
route.setBlackList(failedServerList);
334334
}
335-
subObTable = obTableClient
335+
ObTableParam newParam = obTableClient
336336
.getTable(tableName, originPartId, needRefreshTableEntry,
337-
obTableClient.isTableEntryRefreshIntervalWait(), route).getRight()
338-
.getObTable();
337+
obTableClient.isTableEntryRefreshIntervalWait(), route).getRight();
338+
339+
subObTable = newParam.getObTable();
340+
subRequest.setPartitionId(newParam.getPartitionId());
339341
}
340342
}
341343
subObTableBatchOperationResult = (ObTableBatchOperationResult) subObTable
@@ -380,6 +382,14 @@ public void partitionExecute(ObTableOperationResult[] results,
380382
"tablename:{} partition id:{} batch ops retry while meet ObTableMasterChangeException, errorCode: {} , retry times {}",
381383
tableName, partId, ((ObTableException) ex).getErrorCode(),
382384
tryTimes, ex);
385+
if (ex instanceof ObTableRoutingWrongException) {
386+
System.out.println("need fetchAll refresh");
387+
obTableClient.getOrRefreshTableEntry(tableName, true, obTableClient.isTableEntryRefreshIntervalWait(), true);
388+
obTableClient.tableContinuousFailures.computeIfPresent(tableName, (k, v) -> {
389+
v.set(0);
390+
return v;
391+
});
392+
}
383393
} else {
384394
obTableClient.calculateContinuousFailure(tableName, ex.getMessage());
385395
throw ex;

0 commit comments

Comments
 (0)