Skip to content

Commit fc09ac9

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 fff65c9 commit fc09ac9

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);
@@ -1844,10 +1845,22 @@ public ObPair<Long, ObTableParam> getTableInternal(String tableName, TableEntry
18441845
long partitionId = partId;
18451846
ObPartitionLocationInfo obPartitionLocationInfo = null;
18461847
if (ObGlobal.obVsnMajor() >= 4) {
1847-
18481848
obPartitionLocationInfo = getOrRefreshPartitionInfo(tableEntry, tableName, tabletId);
1849-
18501849
replica = getPartitionLocation(obPartitionLocationInfo, route);
1850+
/**
1851+
* Normally, getOrRefreshPartitionInfo makes sure that a thread only continues if it finds the leader
1852+
* during a route refresh. But sometimes, there might not be a leader yet. In this case, the thread
1853+
* is released, and since it can't get the replica, it throws an no master exception.
1854+
*/
1855+
if (replica == null && obPartitionLocationInfo.getPartitionLocation().getLeader() == null) {
1856+
RUNTIME.error(LCD.convert("01-00028"), partitionId, tableEntry.getPartitionEntry(), tableEntry);
1857+
RUNTIME.error(format(
1858+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1859+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1860+
throw new ObTablePartitionNoMasterException(format(
1861+
"partition=%d has no leader partitionEntry=%s original tableEntry=%s",
1862+
partitionId, tableEntry.getPartitionEntry(), tableEntry));
1863+
}
18511864
} else {
18521865
if (tableEntry.isPartitionTable()
18531866
&& 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)