Skip to content

Commit 2b487ed

Browse files
authored
set dirty and add ip to suspect list (#379)
1 parent 21c346c commit 2b487ed

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

src/main/java/com/alipay/oceanbase/rpc/location/model/RouteTableRefresher.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import java.sql.SQLException;
2222
import java.sql.Statement;
2323
import java.util.*;
24-
import java.util.concurrent.ConcurrentHashMap;
25-
import java.util.concurrent.Executors;
26-
import java.util.concurrent.ScheduledExecutorService;
27-
import java.util.concurrent.TimeUnit;
24+
import java.util.concurrent.*;
2825
import java.util.concurrent.locks.Lock;
2926
import java.util.concurrent.locks.ReentrantLock;
3027

@@ -33,6 +30,7 @@
3330
import com.alipay.oceanbase.rpc.exception.ObTableTryLockTimeoutException;
3431
import com.alipay.oceanbase.rpc.exception.ObTableUnexpectedException;
3532
import com.alipay.oceanbase.rpc.location.LocationUtil;
33+
import com.alipay.oceanbase.rpc.table.ObTable;
3634
import org.slf4j.Logger;
3735

3836
import static com.alipay.oceanbase.rpc.util.TableClientLoggerFactory.getLogger;
@@ -41,6 +39,8 @@ public class RouteTableRefresher {
4139

4240
private static final Logger logger = getLogger(RouteTableRefresher.class);
4341

42+
private static final int failureLimit = 3;
43+
4444
private static final String sql = "select 'detect server alive' from dual";
4545

4646
private final ObTableClient tableClient;
@@ -136,7 +136,7 @@ private void doCheckAliveTask() {
136136
checkAlive(entry.getKey());
137137
} catch (Exception e) {
138138
// silence resolving
139-
logger.warn("RouteTableRefresher::doCheckAliveTask fail, failed server: {}", entry.getKey().toString());
139+
logger.warn("RouteTableRefresher::doCheckAliveTask fail, failed server: {}", entry.getKey().toString(), e);
140140
}
141141
}
142142
}
@@ -198,7 +198,7 @@ private void checkAlive(ObServerAddr addr) {
198198
}
199199
}
200200

201-
public static void addIntoSuspectIPs(SuspectObServer server) throws Exception {
201+
public static void addIntoSuspectIPs(SuspectObServer server) throws InterruptedException {
202202
ObServerAddr addr = server.getAddr();
203203
if (suspectServers.get(addr) != null) {
204204
// already in the list, directly return
@@ -264,7 +264,16 @@ private void removeFromSuspectIPs(ObServerAddr addr) {
264264
throw new ObTableTryLockTimeoutException("try to get suspect server lock timeout, timeout: 1s");
265265
}
266266
// no need to remove lock
267-
suspectServers.remove(addr);
267+
SuspectObServer server = suspectServers.remove(addr);
268+
if (server != null) {
269+
int failure = server.getFailure();
270+
if (failure < failureLimit) {
271+
ObTable obTable = tableClient.getTableRoute().getTableRoster().getTable(addr);
272+
if (obTable != null && !obTable.isValid()) {
273+
obTable.setValid();
274+
}
275+
}
276+
}
268277
logger.debug("removed server from suspect list: {}", addr);
269278
break;
270279
} catch (ObTableTryLockTimeoutException e) {
@@ -286,7 +295,6 @@ private void removeFromSuspectIPs(ObServerAddr addr) {
286295
}
287296

288297
private void calcFailureOrClearCache(ObServerAddr addr) {
289-
int failureLimit = 3;
290298
TableRoute tableRoute = tableClient.getTableRoute();
291299
SuspectObServer server = suspectServers.get(addr);
292300
server.incrementFailure();

src/main/java/com/alipay/oceanbase/rpc/table/ObTable.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.alipay.oceanbase.rpc.exception.*;
2727
import com.alipay.oceanbase.rpc.filter.ObTableFilter;
2828
import com.alipay.oceanbase.rpc.location.model.ObServerAddr;
29+
import com.alipay.oceanbase.rpc.location.model.RouteTableRefresher;
2930
import com.alipay.oceanbase.rpc.mutation.*;
3031
import com.alipay.oceanbase.rpc.protocol.payload.ObPayload;
3132
import com.alipay.oceanbase.rpc.protocol.payload.impl.execute.*;
@@ -429,13 +430,13 @@ public ObPayload execute(final ObPayload request) throws RemotingException,
429430
// cannot connect to ob server, need refresh table location
430431
// do not set odp ip and port as dirty
431432
if (!isOdpMode) {
432-
setDirty();
433+
dealWithReconnectFailForObTableConnection();
433434
}
434435
throw new ObTableServerConnectException(ex);
435436
} catch (ObTableServerConnectException ex) {
436437
// do not set odp ip and port as dirty
437438
if (!isOdpMode) {
438-
setDirty();
439+
dealWithReconnectFailForObTableConnection();
439440
}
440441
throw ex;
441442
} catch (Exception ex) {
@@ -505,13 +506,13 @@ public ObPayload executeWithConnection(final ObPayload request,
505506
// Cannot connect to ob server, need refresh table location
506507
// do not set odp ip and port as dirty
507508
if (!isOdpMode) {
508-
setDirty();
509+
dealWithReconnectFailForObTableConnection();
509510
}
510511
throw new ObTableServerConnectException(ex);
511512
} catch (ObTableServerConnectException ex) {
512513
// do not set odp ip and port as dirty
513514
if (!isOdpMode) {
514-
setDirty();
515+
dealWithReconnectFailForObTableConnection();
515516
}
516517
throw ex;
517518
} catch (Exception ex) {
@@ -520,6 +521,12 @@ public ObPayload executeWithConnection(final ObPayload request,
520521
return executeWithReconnect(connection, request);
521522
}
522523

524+
private void dealWithReconnectFailForObTableConnection() throws InterruptedException {
525+
setDirty();
526+
RouteTableRefresher.SuspectObServer suspectAddr = new RouteTableRefresher.SuspectObServer(addr);
527+
RouteTableRefresher.addIntoSuspectIPs(suspectAddr);
528+
}
529+
523530
private void checkObTableOperationResult(String ip, int port, Object result) {
524531
if (result == null) {
525532
throw new ObTableException("client get unexpected NULL result");

0 commit comments

Comments
 (0)