Skip to content

Commit 8a49a99

Browse files
authored
Fix issue where low traffic prevents timely detection and refresh of RS when the peer goes offline (#297)
1 parent 3d56037 commit 8a49a99

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,6 +1309,10 @@ public TableEntry getOrRefreshTableEntry(final String tableName, final boolean r
13091309
tableEntryRefreshContinuousFailureCeiling);
13101310
syncRefreshMetadata();
13111311
tableEntryRefreshContinuousFailureCount.set(0);
1312+
} else if (e.isConnectInactive()) {
1313+
// getMetaRefreshConnection failed, maybe the server is down, so we need to refresh metadata directly
1314+
syncRefreshMetadata();
1315+
tableEntryRefreshContinuousFailureCount.set(0);
13121316
}
13131317
} catch (Throwable t) {
13141318
RUNTIME.error("getOrRefreshTableEntry meet exception", t);
@@ -1414,6 +1418,10 @@ public TableEntry refreshTableLocationByTabletId(TableEntry tableEntry, String t
14141418
tableEntryRefreshContinuousFailureCeiling);
14151419
syncRefreshMetadata();
14161420
tableEntryRefreshContinuousFailureCount.set(0);
1421+
} else if (e.isConnectInactive()) {
1422+
// getMetaRefreshConnection failed, maybe the server is down, so we need to refresh metadata directly
1423+
syncRefreshMetadata();
1424+
tableEntryRefreshContinuousFailureCount.set(0);
14171425
}
14181426
} catch (Throwable t) {
14191427
RUNTIME.error("getOrRefreshTableEntry meet exception", t);
@@ -1504,9 +1512,15 @@ private TableEntry refreshTableEntry(TableEntry tableEntry, String tableName, bo
15041512
throw e;
15051513
} catch (Exception e) {
15061514
RUNTIME.error(LCD.convert("01-00020"), tableEntryKey, tableEntry, e);
1507-
throw new ObTableEntryRefreshException(String.format(
1508-
"failed to get table entry key=%s original tableEntry=%s ", tableEntryKey,
1509-
tableEntry), e);
1515+
if (e instanceof ObTableEntryRefreshException) {
1516+
throw new ObTableEntryRefreshException(String.format(
1517+
"failed to get table entry key=%s original tableEntry=%s ", tableEntryKey,
1518+
tableEntry), e, ((ObTableEntryRefreshException) e).isConnectInactive());
1519+
} else {
1520+
throw new ObTableEntryRefreshException(String.format(
1521+
"failed to get table entry key=%s original tableEntry=%s ", tableEntryKey,
1522+
tableEntry), e);
1523+
}
15101524
}
15111525
tableLocations.put(tableName, tableEntry);
15121526
if (fetchAll) {

src/main/java/com/alipay/oceanbase/rpc/exception/ObTableEntryRefreshException.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package com.alipay.oceanbase.rpc.exception;
1919

2020
public class ObTableEntryRefreshException extends ObTableException {
21+
22+
private boolean connectInactive = false;
2123

2224
/*
2325
* Ob table entry refresh exception.
@@ -52,7 +54,15 @@ public ObTableEntryRefreshException(String message) {
5254
public ObTableEntryRefreshException(String message, Throwable cause) {
5355
super(message, cause);
5456
}
57+
58+
public ObTableEntryRefreshException(String message, Throwable cause, boolean connectInactive) {
59+
super(message, cause);
60+
this.connectInactive = connectInactive;
61+
}
5562

63+
public boolean isConnectInactive() {
64+
return connectInactive;
65+
}
5666
/*
5767
* Ob table entry refresh exception.
5868
*/

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

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,10 @@ private static Connection getMetaRefreshConnection(String url, ObUserAuth sysUA)
304304
return DriverManager.getConnection(url, sysUA.getUserName(), sysUA.getPassword());
305305
} catch (Exception e) {
306306
RUNTIME.error(LCD.convert("01-00005"), e.getMessage(), e);
307-
throw new ObTableEntryRefreshException("fail to connect meta server", e);
307+
// Since the JDBC connection fails here, it is likely that the server has crashed or scaling down.
308+
// Therefore, we need to set the Inactive flag of the ObTableEntryRefreshException to true.
309+
// This allows the upper-layer retry mechanism to catch this exception and immediately refresh the metadata.
310+
throw new ObTableEntryRefreshException("fail to connect meta server", e, true /* connect inactive */);
308311
}
309312
}
310313

@@ -403,9 +406,15 @@ private static TableEntry callTableEntryRefresh(ObServerAddr obServerAddr, Table
403406
} else {
404407
RUNTIME.error(LCD.convert("01-00007"), url, key, e);
405408
}
406-
throw new ObTableEntryRefreshException(format(
407-
"fail to refresh table entry from remote url=%s, key=%s, message=%s", url, key,
408-
e.getMessage()), e);
409+
if (e instanceof ObTableEntryRefreshException) {
410+
throw new ObTableEntryRefreshException(format(
411+
"fail to refresh table entry from remote url=%s, key=%s, message=%s", url, key,
412+
e.getMessage()), e, ((ObTableEntryRefreshException) e).isConnectInactive());
413+
} else {
414+
throw new ObTableEntryRefreshException(format(
415+
"fail to refresh table entry from remote url=%s, key=%s, message=%s", url, key,
416+
e.getMessage()), e.getCause());
417+
}
409418
} finally {
410419
try {
411420
if (null != connection) {
@@ -543,6 +552,10 @@ public static String loadTableNameWithGroupName(final ServerRoster serverRoster,
543552
RUNTIME.error("callTableEntryNameWithPriority meet exception", e);
544553
serverRoster.downgradePriority(addr);
545554
throw e;
555+
} catch (ObTableEntryRefreshException e) {
556+
RUNTIME.error("callTableEntryNameWithPriority meet exception", e);
557+
throw new ObTableEntryRefreshException(format(
558+
"fail to get table name from remote url=%s, key=%s", url, key), e, e.isConnectInactive());
546559
} catch (Exception e) {
547560
throw new ObTableNotExistException(format(
548561
"fail to get table name from remote url=%s, key=%s", url, key), e);
@@ -979,8 +992,13 @@ public static Long getTableIdFromRemote(ObServerAddr obServerAddr, ObUserAuth sy
979992
+ " table_id from remote");
980993
}
981994
} catch (Exception e) {
982-
throw new ObTableEntryRefreshException("fail to get " + tableName
983-
+ " table_id from remote", e);
995+
if (e instanceof ObTableEntryRefreshException) {
996+
throw new ObTableEntryRefreshException(format(
997+
"fail to get " + tableName + " table_id from remote", e), e, ((ObTableEntryRefreshException) e).isConnectInactive());
998+
} else {
999+
throw new ObTableEntryRefreshException(format(
1000+
"fail to get " + tableName + " table_id from remote", e), e);
1001+
}
9841002
} finally {
9851003
try {
9861004
if (null != rs) {
@@ -1019,8 +1037,13 @@ public static ObIndexInfo getIndexInfoFromRemote(ObServerAddr obServerAddr, ObUs
10191037
throw new ObTableEntryRefreshException("index is not exist");
10201038
}
10211039
} catch (Exception e) {
1022-
throw new ObTableEntryRefreshException(format(
1023-
"fail to get index info from remote, indexTableName: %s, error message: %s", indexTableName, e.getMessage()), e);
1040+
if (e instanceof ObTableEntryRefreshException) {
1041+
throw new ObTableEntryRefreshException(format(
1042+
"fail to get index info from remote, indexTableName: %s, error message: %s", indexTableName, e.getMessage()), e, ((ObTableEntryRefreshException) e).isConnectInactive());
1043+
} else {
1044+
throw new ObTableEntryRefreshException(format(
1045+
"fail to get index info from remote, indexTableName: %s, error message: %s", indexTableName, e.getMessage()), e);
1046+
}
10241047
} finally {
10251048
try {
10261049
if (null != rs) {

0 commit comments

Comments
 (0)