Skip to content

Commit 31994e0

Browse files
maochongxinGroundWu
authored andcommitted
Ensure PartitionInfo is Exposed Only After Leader is Found During Single Shard Refresh
1 parent 38cc5ff commit 31994e0

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-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");

0 commit comments

Comments
 (0)