Skip to content

Commit cd42200

Browse files
authored
[fix] multi-cf retry table not exist (#229)
1 parent a13481f commit cd42200

File tree

4 files changed

+42
-24
lines changed

4 files changed

+42
-24
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3755,6 +3755,15 @@ public String getPhyTableNameFromTableGroup(ObTableQueryRequest request, String
37553755
return tableName;
37563756
}
37573757

3758+
public String getPhyTableNameFromTableGroup(ObTableEntityType type, String tableName) throws Exception {
3759+
if (odpMode) {
3760+
// do nothing
3761+
} else if (type == ObTableEntityType.HKV && isTableGroupName(tableName)) {
3762+
tableName = tryGetTableNameFromTableGroupCache(tableName, false);
3763+
}
3764+
return tableName;
3765+
}
3766+
37583767
/*
37593768
* Get the start keys of different tablets, byte[0] = [] = EMPTY_START_ROW = EMPTY_END_ROW
37603769
* Example:

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableLSOpRequest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,14 @@ public void addTabletOperation(ObTableTabletOp tabletOp) {
121121
public void setLsOperation(ObTableLSOperation lsOperation) {
122122
this.lsOperation = lsOperation;
123123
}
124-
124+
125+
/*
126+
* Get entity type.
127+
*/
128+
public ObTableEntityType getEntityType() {
129+
return entityType;
130+
}
131+
125132
/*
126133
* Set entity type.
127134
*/

src/main/java/com/alipay/oceanbase/rpc/stream/ObTableClientQueryAsyncStreamResult.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public void init() throws Exception {
8181
} catch (Exception e) {
8282
if (e instanceof ObTableNeedFetchAllException) {
8383
setExpectant(refreshPartition(this.asyncRequest.getObTableQueryRequest()
84-
.getTableQuery(), tableName));
84+
.getTableQuery(), client.getPhyTableNameFromTableGroup(entityType, tableName)));
8585
it = expectant.entrySet().iterator();
8686
retryTimes++;
8787
if (retryTimes > maxRetries) {
@@ -203,8 +203,8 @@ public boolean next() throws Exception {
203203
referToLastStreamResult(lastEntry.getValue());
204204
} catch (Exception e) {
205205
if (e instanceof ObTableNeedFetchAllException) {
206-
207-
TableEntry entry = client.getOrRefreshTableEntry(tableName, false, false,
206+
String realTableName = client.getPhyTableNameFromTableGroup(entityType, tableName);
207+
TableEntry entry = client.getOrRefreshTableEntry(realTableName, false, false,
208208
false);
209209
// Calculate the next partition only when the range partition is affected by a split, based on the keys already scanned.
210210
if (ObGlobal.obVsnMajor() >= 4
@@ -214,11 +214,11 @@ public boolean next() throws Exception {
214214
this.asyncRequest.getObTableQueryRequest().getTableQuery()
215215
.adjustStartKey(currentStartKey);
216216
setExpectant(refreshPartition(this.asyncRequest
217-
.getObTableQueryRequest().getTableQuery(), tableName));
217+
.getObTableQueryRequest().getTableQuery(), realTableName));
218218
setEnd(true);
219219
} else {
220220
setExpectant(refreshPartition(this.asyncRequest
221-
.getObTableQueryRequest().getTableQuery(), tableName));
221+
.getObTableQueryRequest().getTableQuery(), realTableName));
222222
}
223223
} else {
224224
throw e;
@@ -246,7 +246,8 @@ public boolean next() throws Exception {
246246
referToNewPartition(entry.getValue());
247247
} catch (Exception e) {
248248
if (e instanceof ObTableNeedFetchAllException) {
249-
TableEntry tableEntry = client.getOrRefreshTableEntry(tableName, false,
249+
String realTableName = client.getPhyTableNameFromTableGroup(entityType, tableName);
250+
TableEntry tableEntry = client.getOrRefreshTableEntry(realTableName, false,
250251
false, false);
251252
if (ObGlobal.obVsnMajor() >= 4
252253
&& tableEntry.isPartitionTable()
@@ -255,7 +256,7 @@ public boolean next() throws Exception {
255256
this.asyncRequest.getObTableQueryRequest().getTableQuery()
256257
.adjustStartKey(currentStartKey);
257258
setExpectant(refreshPartition(this.asyncRequest
258-
.getObTableQueryRequest().getTableQuery(), tableName));
259+
.getObTableQueryRequest().getTableQuery(), realTableName));
259260
}
260261
it = expectant.entrySet().iterator();
261262
retryTimes++;

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,8 @@ public void partitionExecute(ObTableSingleOpResult[] results,
448448
long startExecute = System.currentTimeMillis();
449449
Set<String> failedServerList = null;
450450
ObServerRoute route = null;
451-
451+
// maybe get real table name
452+
String realTableName = obTableClient.getPhyTableNameFromTableGroup(tableLsOpRequest.getEntityType(), tableName);
452453
while (true) {
453454
obTableClient.checkStatus();
454455
long currentExecute = System.currentTimeMillis();
@@ -457,7 +458,7 @@ public void partitionExecute(ObTableSingleOpResult[] results,
457458
logger.error("table name: {} ls id:{} it has tried " + tryTimes
458459
+ " times and it has waited " + costMillis + " ms"
459460
+ " which exceeds runtime max wait timeout "
460-
+ obTableClient.getRuntimeMaxWait() + " ms", tableName, lsId);
461+
+ obTableClient.getRuntimeMaxWait() + " ms", realTableName, lsId);
461462
throw new ObTableTimeoutExcetion("it has tried " + tryTimes
462463
+ " times and it has waited " + costMillis
463464
+ "ms which exceeds runtime max wait timeout "
@@ -475,20 +476,20 @@ public void partitionExecute(ObTableSingleOpResult[] results,
475476
if (failedServerList != null) {
476477
route.setBlackList(failedServerList);
477478
}
478-
TableEntry entry = obTableClient.getOrRefreshTableEntry(tableName, false,
479+
TableEntry entry = obTableClient.getOrRefreshTableEntry(realTableName, false,
479480
false, false);
480481
if (ObGlobal.obVsnMajor() >= 4) {
481-
obTableClient.refreshTableLocationByTabletId(entry, tableName, obTableClient.getTabletIdByPartId(entry, originPartId));
482+
obTableClient.refreshTableLocationByTabletId(entry, realTableName, obTableClient.getTabletIdByPartId(entry, originPartId));
482483
}
483-
subObTable = obTableClient.getTableWithPartId(tableName, originPartId, needRefreshTableEntry,
484+
subObTable = obTableClient.getTableWithPartId(realTableName, originPartId, needRefreshTableEntry,
484485
obTableClient.isTableEntryRefreshIntervalWait(), false, route).
485486
getRight().getObTable();
486487
}
487488
}
488489
ObPayload result = subObTable.execute(tableLsOpRequest);
489490
if (result != null && result.getPcode() == Pcodes.OB_TABLE_API_MOVE) {
490491
ObTableApiMove moveResponse = (ObTableApiMove) result;
491-
obTableClient.getRouteTableRefresher().addTableIfAbsent(tableName, true);
492+
obTableClient.getRouteTableRefresher().addTableIfAbsent(realTableName, true);
492493
obTableClient.getRouteTableRefresher().triggerRefreshTable();
493494
subObTable = obTableClient.getTable(moveResponse);
494495
result = subObTable.execute(tableLsOpRequest);
@@ -500,17 +501,17 @@ public void partitionExecute(ObTableSingleOpResult[] results,
500501
}
501502
}
502503
subLSOpResult = (ObTableLSOpResult) result;
503-
obTableClient.resetExecuteContinuousFailureCount(tableName);
504+
obTableClient.resetExecuteContinuousFailureCount(realTableName);
504505
break;
505506
} catch (Exception ex) {
506507
if (obTableClient.isOdpMode()) {
507508
logger.warn("meet exception when execute ls batch in odp mode." +
508-
"tablename: {}, errMsg: {}", tableName, ex.getMessage());
509+
"tablename: {}, errMsg: {}", realTableName, ex.getMessage());
509510
throw ex;
510511
} else if (ex instanceof ObTableReplicaNotReadableException) {
511512
if ((tryTimes - 1) < obTableClient.getRuntimeRetryTimes()) {
512513
logger.warn("tablename:{} ls id:{} retry when replica not readable: {}",
513-
tableName, lsId, ex.getMessage());
514+
realTableName, lsId, ex.getMessage());
514515
if (failedServerList == null) {
515516
failedServerList = new HashSet<String>();
516517
}
@@ -523,23 +524,23 @@ public void partitionExecute(ObTableSingleOpResult[] results,
523524
&& ((ObTableException) ex).isNeedRefreshTableEntry()) {
524525
needRefreshTableEntry = true;
525526
logger.warn("tablename:{} ls id:{} batch ops refresh table while meet ObTableMasterChangeException, errorCode: {}",
526-
tableName, lsId, ((ObTableException) ex).getErrorCode(), ex);
527+
realTableName, lsId, ((ObTableException) ex).getErrorCode(), ex);
527528
if (obTableClient.isRetryOnChangeMasterTimes()
528529
&& (tryTimes - 1) < obTableClient.getRuntimeRetryTimes()) {
529530
logger.warn("tablename:{} ls id:{} batch ops retry while meet ObTableMasterChangeException, errorCode: {} , retry times {}",
530-
tableName, lsId, ((ObTableException) ex).getErrorCode(),
531+
realTableName, lsId, ((ObTableException) ex).getErrorCode(),
531532
tryTimes, ex);
532533
if (ex instanceof ObTableNeedFetchAllException) {
533-
obTableClient.getOrRefreshTableEntry(tableName, needRefreshTableEntry,
534+
obTableClient.getOrRefreshTableEntry(realTableName, needRefreshTableEntry,
534535
obTableClient.isTableEntryRefreshIntervalWait(), true);
535536
throw ex;
536537
}
537538
} else {
538-
obTableClient.calculateContinuousFailure(tableName, ex.getMessage());
539+
obTableClient.calculateContinuousFailure(realTableName, ex.getMessage());
539540
throw ex;
540541
}
541542
} else {
542-
obTableClient.calculateContinuousFailure(tableName, ex.getMessage());
543+
obTableClient.calculateContinuousFailure(realTableName, ex.getMessage());
543544
throw ex;
544545
}
545546
}
@@ -550,7 +551,7 @@ public void partitionExecute(ObTableSingleOpResult[] results,
550551

551552
if (subLSOpResult == null) {
552553
RUNTIME.error("table name:{} ls id:{} check batch operation result error: client get unexpected NULL result",
553-
tableName, lsId);
554+
realTableName, lsId);
554555
throw new ObTableUnexpectedException("check batch operation result error: client get unexpected NULL result");
555556
}
556557

@@ -613,7 +614,7 @@ public void partitionExecute(ObTableSingleOpResult[] results,
613614

614615

615616
String endpoint = subObTable.getIp() + ":" + subObTable.getPort();
616-
MonitorUtil.info(tableLsOpRequest, subObTable.getDatabase(), tableName,
617+
MonitorUtil.info(tableLsOpRequest, subObTable.getDatabase(), realTableName,
617618
"LS_BATCH-Execute-", endpoint, tableLsOp,
618619
affectedRows, endExecute - startExecute,
619620
obTableClient.getslowQueryMonitorThreshold());

0 commit comments

Comments
 (0)