Skip to content

Commit c803c3f

Browse files
GroundWumaochongxin
andcommitted
fix global index route wrong when need partial route refresh (#232)
* fix global index route wrong when need partial route refresh * Ensure PartitionInfo is Exposed Only After Leader is Found During Single Shard Refresh --------- Co-authored-by: maochongxin <[email protected]>
1 parent 6920d74 commit c803c3f

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
import static com.alipay.oceanbase.rpc.protocol.payload.ResultCodes.OB_ERR_KV_ROUTE_ENTRY_EXPIRE;
6666
import static com.alipay.oceanbase.rpc.protocol.payload.impl.execute.ObTableOperationType.*;
6767
import static com.alipay.oceanbase.rpc.util.TableClientLoggerFactory.*;
68+
import static java.lang.String.format;
6869

6970
public class ObTableClient extends AbstractObTableClient implements Lifecycle {
7071
private static final Logger logger = getLogger(ObTableClient.class);
@@ -1942,10 +1943,22 @@ public ObPair<Long, ObTableParam> getTableInternal(String tableName, TableEntry
19421943
long partitionId = partId;
19431944
ObPartitionLocationInfo obPartitionLocationInfo = null;
19441945
if (ObGlobal.obVsnMajor() >= 4) {
1945-
19461946
obPartitionLocationInfo = getOrRefreshPartitionInfo(tableEntry, tableName, tabletId);
1947-
19481947
replica = getPartitionLocation(obPartitionLocationInfo, route);
1948+
/**
1949+
* Normally, getOrRefreshPartitionInfo makes sure that a thread only continues if it finds the leader
1950+
* during a route refresh. But sometimes, there might not be a leader yet. In this case, the thread
1951+
* is released, and since it can't get the replica, it throws an no master exception.
1952+
*/
1953+
if (replica == null && obPartitionLocationInfo.getPartitionLocation().getLeader() == null) {
1954+
RUNTIME.error(LCD.convert("01-00028"), partitionId, tableEntry.getPartitionEntry(), tableEntry);
1955+
RUNTIME.error(format(
1956+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1957+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1958+
throw new ObTablePartitionNoMasterException(format(
1959+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1960+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1961+
}
19491962
} else {
19501963
if (tableEntry.isPartitionTable()
19511964
&& null != tableEntry.getPartitionInfo().getSubPartDesc()) {

src/main/java/com/alipay/oceanbase/rpc/location/LocationUtil.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,8 +1257,17 @@ private static ObPartitionEntry getPartitionLocationFromResultSetByTablet(TableE
12571257
}
12581258
location.addReplicaLocation(replica);
12591259

1260-
if (partitionLocationInfo.initialized.compareAndSet(false, true)) {
1260+
if (location.getLeader() != null && partitionLocationInfo.initialized.compareAndSet(false, true)) {
12611261
partitionLocationInfo.initializationLatch.countDown();
1262+
} else if (rs.isLast() && location.getLeader() == null) {
1263+
partitionLocationInfo.initializationLatch.countDown();
1264+
RUNTIME.error(LCD.convert("01-00028"), partitionId, partitionEntry, tableEntry);
1265+
RUNTIME.error(format(
1266+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1267+
partitionId, partitionEntry, tableEntry));
1268+
throw new ObTablePartitionNoMasterException(format(
1269+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1270+
partitionId, partitionEntry, tableEntry));
12621271
}
12631272
}
12641273

@@ -1311,8 +1320,17 @@ private static ObPartitionEntry getPartitionLocationFromResultSet(TableEntry tab
13111320
}
13121321
location.addReplicaLocation(replica);
13131322

1314-
if (partitionLocationInfo.initialized.compareAndSet(false, true)) {
1323+
if (location.getLeader() != null && partitionLocationInfo.initialized.compareAndSet(false, true)) {
1324+
partitionLocationInfo.initializationLatch.countDown();
1325+
} else if (rs.isLast() && location.getLeader() == null) {
13151326
partitionLocationInfo.initializationLatch.countDown();
1327+
RUNTIME.error(LCD.convert("01-00028"), partitionId, partitionEntry, tableEntry);
1328+
RUNTIME.error(format(
1329+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1330+
partitionId, partitionEntry, tableEntry));
1331+
throw new ObTablePartitionNoMasterException(format(
1332+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1333+
partitionId, partitionEntry, tableEntry));
13161334
}
13171335
} else {
13181336
partitionId = rs.getLong("partition_id");

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ protected ObPayload commonExecute(ObTableClient client, Logger logger,
148148
if (failedServerList != null) {
149149
route.setBlackList(failedServerList);
150150
}
151+
if (ObGlobal.obVsnMajor() >= 4) {
152+
TableEntry tableEntry = client.getOrRefreshTableEntry(indexTableName, false, false, false);
153+
client.refreshTableLocationByTabletId(tableEntry, indexTableName, client.getTabletIdByPartId(tableEntry, partIdWithIndex.getLeft()));
154+
}
155+
151156
subObTable = client
152157
.getTableWithPartId(indexTableName, partIdWithIndex.getLeft(),
153158
needRefreshTableEntry, client.isTableEntryRefreshIntervalWait(),

0 commit comments

Comments
 (0)