Skip to content

Commit 14677e5

Browse files
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 cd42200 commit 14677e5

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
@@ -64,6 +64,7 @@
6464
import static com.alipay.oceanbase.rpc.property.Property.*;
6565
import static com.alipay.oceanbase.rpc.protocol.payload.impl.execute.ObTableOperationType.*;
6666
import static com.alipay.oceanbase.rpc.util.TableClientLoggerFactory.*;
67+
import static java.lang.String.format;
6768

6869
public class ObTableClient extends AbstractObTableClient implements Lifecycle {
6970
private static final Logger logger = getLogger(ObTableClient.class);
@@ -1834,10 +1835,22 @@ public ObPair<Long, ObTableParam> getTableInternal(String tableName, TableEntry
18341835
long partitionId = partId;
18351836
ObPartitionLocationInfo obPartitionLocationInfo = null;
18361837
if (ObGlobal.obVsnMajor() >= 4) {
1837-
18381838
obPartitionLocationInfo = getOrRefreshPartitionInfo(tableEntry, tableName, tabletId);
1839-
18401839
replica = getPartitionLocation(obPartitionLocationInfo, route);
1840+
/**
1841+
* Normally, getOrRefreshPartitionInfo makes sure that a thread only continues if it finds the leader
1842+
* during a route refresh. But sometimes, there might not be a leader yet. In this case, the thread
1843+
* is released, and since it can't get the replica, it throws an no master exception.
1844+
*/
1845+
if (replica == null && obPartitionLocationInfo.getPartitionLocation().getLeader() == null) {
1846+
RUNTIME.error(LCD.convert("01-00028"), partitionId, tableEntry.getPartitionEntry(), tableEntry);
1847+
RUNTIME.error(format(
1848+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1849+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1850+
throw new ObTablePartitionNoMasterException(format(
1851+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1852+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1853+
}
18411854
} else {
18421855
if (tableEntry.isPartitionTable()
18431856
&& 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
@@ -1258,8 +1258,17 @@ private static ObPartitionEntry getPartitionLocationFromResultSetByTablet(TableE
12581258
}
12591259
location.addReplicaLocation(replica);
12601260

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

@@ -1312,8 +1321,17 @@ private static ObPartitionEntry getPartitionLocationFromResultSet(TableEntry tab
13121321
}
13131322
location.addReplicaLocation(replica);
13141323

1315-
if (partitionLocationInfo.initialized.compareAndSet(false, true)) {
1324+
if (location.getLeader() != null && partitionLocationInfo.initialized.compareAndSet(false, true)) {
1325+
partitionLocationInfo.initializationLatch.countDown();
1326+
} else if (rs.isLast() && location.getLeader() == null) {
13161327
partitionLocationInfo.initializationLatch.countDown();
1328+
RUNTIME.error(LCD.convert("01-00028"), partitionId, partitionEntry, tableEntry);
1329+
RUNTIME.error(format(
1330+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1331+
partitionId, partitionEntry, tableEntry));
1332+
throw new ObTablePartitionNoMasterException(format(
1333+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1334+
partitionId, partitionEntry, tableEntry));
13171335
}
13181336
} else {
13191337
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
@@ -145,6 +145,11 @@ protected ObPayload commonExecute(ObTableClient client, Logger logger,
145145
if (failedServerList != null) {
146146
route.setBlackList(failedServerList);
147147
}
148+
if (ObGlobal.obVsnMajor() >= 4) {
149+
TableEntry tableEntry = client.getOrRefreshTableEntry(indexTableName, false, false, false);
150+
client.refreshTableLocationByTabletId(tableEntry, indexTableName, client.getTabletIdByPartId(tableEntry, partIdWithIndex.getLeft()));
151+
}
152+
148153
subObTable = client
149154
.getTableWithPartId(indexTableName, partIdWithIndex.getLeft(),
150155
needRefreshTableEntry, client.isTableEntryRefreshIntervalWait(),

0 commit comments

Comments
 (0)