Skip to content

Commit 646a37d

Browse files
committed
use odp interfaces and seperate from ocp mode to refresh meta
1 parent d7ee23b commit 646a37d

File tree

3 files changed

+91
-49
lines changed

3 files changed

+91
-49
lines changed

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

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ private <T> T execute(String tableName, TableExecuteCallback<T> callback, ObServ
457457
int tryTimes = 0;
458458
boolean needRefreshPartitionLocation = false;
459459
long startExecute = System.currentTimeMillis();
460-
Row rowKey = transformToRow(tableName, callback.getRowKey());
460+
Row rowKey = odpMode ? null : transformToRow(tableName, callback.getRowKey());
461461
while (true) {
462462
checkStatus();
463463
long currentExecute = System.currentTimeMillis();
@@ -966,11 +966,17 @@ public TableEntry getOrRefreshTableEntry(final String tableName, boolean forceRe
966966
* @param tableName table name
967967
* */
968968
private TableEntry refreshMeta(String tableName) throws Exception {
969-
if (odpMode) {
970-
return tableRoute.refreshODPMeta(tableName, true);
971-
} else {
972-
return tableRoute.refreshMeta(tableName);
973-
}
969+
return tableRoute.refreshMeta(tableName);
970+
}
971+
972+
/**
973+
* refresh table meta information except location
974+
* work for both OcpMode and OdpMode
975+
* only support by ODP version after 4.3.2
976+
* @param tableName table name
977+
* */
978+
public TableEntry refreshOdpMeta(String tableName) throws Exception {
979+
return tableRoute.refreshODPMeta(tableName, true);
974980
}
975981

976982
/**
@@ -1076,6 +1082,20 @@ public ObTableParam getTableParamWithPartId(String tableName, long partId, ObSer
10761082
return tableRoute.getTableWithPartId(tableName, partId, route);
10771083
}
10781084

1085+
/**
1086+
* get addr by pardId in ODP mode
1087+
* only support by ODP version after 4.3.2
1088+
* @param tableName table want to get
1089+
* @param partId logic of table
1090+
* @param route ObServer route
1091+
* @return ObPair of partId and table
1092+
* @throws Exception exception
1093+
*/
1094+
public ObTableParam getOdpTableParamWithPartId(String tableName, long partId, ObServerRoute route)
1095+
throws Exception {
1096+
return tableRoute.getOdpTableWithPartId(tableName, partId, route);
1097+
}
1098+
10791099
/**
10801100
*
10811101
* @param moveResponse reRoute response
@@ -1910,14 +1930,17 @@ private Partition getSinglePartitionInternal(String tableName, Row rowKey, boole
19101930
addRowKeyElement(tableName, rowKey.getColumns());
19111931
}
19121932
ObTableParam tableParam = null;
1913-
if (refresh) {
1914-
if (odpMode) {
1933+
if (odpMode) {
1934+
if (refresh) {
19151935
tableRoute.refreshODPMeta(tableName, true);
1916-
} else {
1936+
}
1937+
tableParam = tableRoute.getOdpTableParam(tableName, rowKey);
1938+
} else {
1939+
if (refresh) {
19171940
tableRoute.refreshMeta(tableName);
19181941
}
1942+
tableParam = tableRoute.getTableParam(tableName, rowKey);
19191943
}
1920-
tableParam = tableRoute.getTableParam(tableName, rowKey);
19211944
return new Partition(tableParam.getPartitionId(), tableParam.getPartId(),
19221945
tableParam.getTableId(), tableParam.getObTable().getIp(), tableParam.getObTable()
19231946
.getPort(), tableParam.getLsId());
@@ -1941,15 +1964,20 @@ public List<Partition> getPartition(String tableName, boolean refresh) throws Ex
19411964
*/
19421965
private List<Partition> getAllPartitionInternal(String tableName, boolean refresh) throws Exception {
19431966
List<Partition> partitions = new ArrayList<>();
1944-
if (refresh) {
1945-
if (odpMode) {
1967+
List<ObTableParam> allTables;
1968+
if (odpMode) {
1969+
if (refresh) {
19461970
tableRoute.refreshODPMeta(tableName, true);
1947-
} else {
1971+
}
1972+
allTables = tableRoute.getOdpTableParams(tableName, new ObTableQuery(), new Object[]{ ObObj.getMin() }, true,
1973+
new Object[]{ ObObj.getMax() }, true);
1974+
} else {
1975+
if (refresh) {
19481976
tableRoute.refreshMeta(tableName);
19491977
}
1978+
allTables = tableRoute.getTableParams(tableName, new ObTableQuery(), new Object[]{ ObObj.getMin() }, true,
1979+
new Object[]{ ObObj.getMax() }, true);
19501980
}
1951-
List<ObTableParam> allTables = tableRoute.getTableParams(tableName, new ObTableQuery(), new Object[]{ ObObj.getMin() }, true,
1952-
new Object[]{ ObObj.getMax() }, true);
19531981
for (ObTableParam tableParam : allTables) {
19541982
Partition partition = new Partition(tableParam.getPartitionId(), tableParam.getPartId(), tableParam.getTableId(),
19551983
tableParam.getObTable().getIp(), tableParam.getObTable().getPort(), tableParam.getLsId());

src/main/java/com/alipay/oceanbase/rpc/location/model/TableRoute.java

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -94,16 +94,23 @@ public void setConfigServerInfo(ConfigServerInfo configServerInfo) {
9494
* */
9595
public TableEntry getTableEntry(String tableName) throws Exception {
9696
TableEntry tableEntry;
97-
if (tableClient.isOdpMode()) {
98-
tableEntry = odpTableLocations.getTableEntry(tableName);
99-
if (tableEntry == null) {
100-
tableEntry = refreshODPMeta(tableName, false);
101-
}
102-
} else {
103-
tableEntry = tableLocations.getTableEntry(tableName);
104-
if (tableEntry == null) {
105-
tableEntry = refreshMeta(tableName);
106-
}
97+
tableEntry = tableLocations.getTableEntry(tableName);
98+
if (tableEntry == null) {
99+
tableEntry = refreshMeta(tableName);
100+
}
101+
return tableEntry;
102+
}
103+
104+
/**
105+
* get ODP tableEntry by tableName,
106+
* this methods will guarantee the tableEntry is not null
107+
* only support by ODP version after 4.3.2
108+
* */
109+
public TableEntry getOdpTableEntry(String tableName) throws Exception {
110+
TableEntry tableEntry;
111+
tableEntry = odpTableLocations.getTableEntry(tableName);
112+
if (tableEntry == null) {
113+
tableEntry = refreshODPMeta(tableName, false);
107114
}
108115
return tableEntry;
109116
}
@@ -631,6 +638,16 @@ public ObTableParam getTableParam(String tableName, Row rowkey) throws Exception
631638
return getTableParamWithRoute(tableName, rowkey, route);
632639
}
633640

641+
public ObTableParam getOdpTableParam(String tableName, Row rowkey) throws Exception {
642+
TableEntry odpTableEntry = getOdpTableEntry(tableName);
643+
if (odpTableEntry == null) {
644+
logger.error("tableEntry is null, tableName: {}", tableName);
645+
throw new ObTableEntryRefreshException("tableEntry is null, tableName: " + tableName);
646+
}
647+
long partId = getPartId(odpTableEntry, rowkey);
648+
return getODPTableInternal(odpTableEntry, partId);
649+
}
650+
634651
public ObTableParam getTableParamWithRoute(String tableName, Row rowkey, ObServerRoute route)
635652
throws Exception {
636653
TableEntry tableEntry = getTableEntry(tableName);
@@ -639,11 +656,7 @@ public ObTableParam getTableParamWithRoute(String tableName, Row rowkey, ObServe
639656
throw new ObTableEntryRefreshException("tableEntry is null, tableName: " + tableName);
640657
}
641658
long partId = getPartId(tableEntry, rowkey);
642-
if (tableClient.isOdpMode()) {
643-
return getODPTableInternal(tableEntry, partId);
644-
} else {
645-
return getTableInternal(tableName, tableEntry, partId, route);
646-
}
659+
return getTableInternal(tableName, tableEntry, partId, route);
647660
}
648661

649662
/**
@@ -665,11 +678,7 @@ public List<ObTableParam> getTableParams(String tableName, List<Row> rowkeys) th
665678
for (Row rowkey : rowkeys) {
666679
long partId = getPartId(tableEntry, rowkey);
667680
ObTableParam param = null;
668-
if (tableClient.isOdpMode()) {
669-
param = getODPTableInternal(tableEntry, partId);
670-
} else {
671-
param = getTableInternal(tableName, tableEntry, partId, route);
672-
}
681+
param = getTableInternal(tableName, tableEntry, partId, route);
673682
params.add(param);
674683
}
675684
return params;
@@ -728,11 +737,13 @@ private ObPartitionLocationInfo getOrRefreshPartitionInfo(TableEntry tableEntry,
728737
public ObTableParam getTableWithPartId(String tableName, long partId, ObServerRoute route)
729738
throws Exception {
730739
TableEntry tableEntry = getTableEntry(tableName);
731-
if (tableClient.isOdpMode()) {
732-
return getODPTableInternal(tableEntry, partId);
733-
} else {
734-
return getTableInternal(tableName, tableEntry, partId, route);
735-
}
740+
return getTableInternal(tableName, tableEntry, partId, route);
741+
}
742+
743+
public ObTableParam getOdpTableWithPartId(String tableName, long partId, ObServerRoute route)
744+
throws Exception {
745+
TableEntry tableEntry = getOdpTableEntry(tableName);
746+
return getODPTableInternal(tableEntry, partId);
736747
}
737748

738749
/**
@@ -977,15 +988,18 @@ public ObTableParam getTableParam(String tableName, List<String> scanRangeColumn
977988
public List<ObTableParam> getTableParams(String tableName, ObTableQuery query, Object[] start,
978989
boolean startInclusive, Object[] end,
979990
boolean endInclusive) throws Exception {
980-
981-
if (tableClient.isOdpMode()) {
982-
return getODPTablesInternal(tableName, query.getScanRangeColumns(), start,
983-
startInclusive, end, endInclusive);
984-
}
985991
return getTablesInternal(tableName, query.getScanRangeColumns(), start, startInclusive,
986992
end, endInclusive, tableClient.getRoute(false));
987993
}
988994

995+
public List<ObTableParam> getOdpTableParams(String tableName, ObTableQuery query, Object[] start,
996+
boolean startInclusive, Object[] end,
997+
boolean endInclusive) throws Exception {
998+
999+
return getODPTablesInternal(tableName, query.getScanRangeColumns(), start,
1000+
startInclusive, end, endInclusive);
1001+
}
1002+
9891003
private List<ObTableParam> getTablesInternal(String tableName, List<String> scanRangeColumns,
9901004
Object[] start, boolean startInclusive,
9911005
Object[] end, boolean endInclusive,
@@ -1083,7 +1097,7 @@ public List<ObTableParam> getODPTablesInternal(String tableName, List<String> sc
10831097
throw new IllegalArgumentException("length of start key and end key is not equal");
10841098
}
10851099
List<ObTableParam> obTableParams = new ArrayList<ObTableParam>();
1086-
TableEntry odpTableEntry = getTableEntry(tableName);
1100+
TableEntry odpTableEntry = getOdpTableEntry(tableName);
10871101

10881102
if (scanRangeColumns == null || scanRangeColumns.isEmpty()) {
10891103
Map<String, Integer> tableEntryRowKeyElement = tableClient.getRowKeyElement(tableName);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private AbstractQueryStreamResult commonExecute(InitQueryResultCallback<Abstract
193193
getPartId() != null && tableQuery.getIndexName() == null) {
194194
ObServerRoute route = obTableClient.getRoute(false);
195195
try {
196-
ObTableParam odpTable = obTableClient.getTableParamWithPartId(
196+
ObTableParam odpTable = obTableClient.getOdpTableParamWithPartId(
197197
tableName, getPartId(), route);
198198
partitionObTables.put(odpTable.getPartId(), new ObPair<>(odpTable.getPartId(), odpTable));
199199
} catch (Exception e) {
@@ -204,8 +204,8 @@ private AbstractQueryStreamResult commonExecute(InitQueryResultCallback<Abstract
204204
"current ODP version does not support query with part id", e);
205205
} else if (((ObTableException) e).getErrorCode() == ResultCodes.OB_ERR_KV_ROUTE_ENTRY_EXPIRE.errorCode) {
206206
// retry table meta one time
207-
obTableClient.getOrRefreshTableEntry(tableName, true);
208-
ObTableParam odpTable = obTableClient.getTableParamWithPartId(
207+
obTableClient.refreshOdpMeta(tableName);
208+
ObTableParam odpTable = obTableClient.getOdpTableParamWithPartId(
209209
tableName, getPartId(), route);
210210
partitionObTables.put(odpTable.getPartId(), new ObPair<>(odpTable.getPartId(), odpTable));
211211
} else {

0 commit comments

Comments
 (0)