From 6b61b654af0de0ef153c387b7425bfdf4a26a4f9 Mon Sep 17 00:00:00 2001 From: ZhangYan <13218057180@163.com> Date: Wed, 7 Dec 2022 14:58:03 +0800 Subject: [PATCH 1/2] fix thread blocked problem of etcd watcher in the previous version of EtcdDataSource, when the flowRules defined in the etcd change and trigger etcd watcher, there will be a following error: 2022-12-07 14:36:03.592 [vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker [?:?] - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 2336 ms, time limit is 2000 ms 2022-12-07 14:36:04.592 [vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker [?:?] - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 3337 ms, time limit is 2000 ms 2022-12-07 14:36:05.592 [vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker [?:?] - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 4337 ms, time limit is 2000 ms 2022-12-07 14:36:06.595 [vertx-blocked-thread-checker] WARN io.vertx.core.impl.BlockedThreadChecker [?:?] - Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 5337 ms, time limit is 2000 ms io.vertx.core.VertxException: Thread blocked at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.CompletableFuture$Signaller.block(CompletableFuture.java:1707) at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3334) at java.util.concurrent.CompletableFuture.waitingGet(CompletableFuture.java:1742) at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1908) at com.htsc.fst.saas.infrastructure.component.EtcdDataSource.readSource(EtcdDataSource.java:92) at com.htsc.fst.saas.infrastructure.component.EtcdDataSource.readSource(EtcdDataSource.java:23) at com.alibaba.csp.sentinel.datasource.AbstractDataSource.loadConfig(AbstractDataSource.java:44) at com.htsc.fst.saas.infrastructure.component.EtcdDataSource.lambda$initWatcher$0(EtcdDataSource.java:74) at com.htsc.fst.saas.infrastructure.component.EtcdDataSource$$Lambda$480/1375681611.accept(Unknown Source) at io.etcd.jetcd.Watch$1.onNext(Watch.java:183) at io.etcd.jetcd.impl.WatchImpl$WatcherImpl.onNext(WatchImpl.java:310) at io.etcd.jetcd.impl.WatchImpl$WatcherImpl$$Lambda$488/2088661957.handle(Unknown Source I guess the reason is : when the watcher hold etcd Client, you can't use etcd Client in the Watch's consumer function. Besides the problem above, use getKeyValue() in the watchEvent can reduce once invoke with etcd server to getting the latest flowRules :) --- .../alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java index bc72e8233f..82e1235abe 100644 --- a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java +++ b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java @@ -88,7 +88,8 @@ private void initWatcher() { WatchEvent.EventType eventType = watchEvent.getEventType(); if (eventType == WatchEvent.EventType.PUT) { try { - T newValue = loadConfig(); + String newValueJson = watchEvent.getKeyValue().getValue().toString(); + T newValue = parser.convert(newValueJson); getProperty().updateValue(newValue); } catch (Exception e) { RecordLog.warn("[EtcdDataSource] Failed to update config", e); From 9aeb7a92dceb4dc11257505b41adae3a1b4a5dd8 Mon Sep 17 00:00:00 2001 From: ZhangYan <13218057180@163.com> Date: Fri, 23 Dec 2022 15:35:25 +0800 Subject: [PATCH 2/2] Update EtcdDataSource.java Add charset adaptation -- accept the suggestion from @LProDreamAll --- .../alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java index 82e1235abe..33684eb82b 100644 --- a/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java +++ b/sentinel-extension/sentinel-datasource-etcd/src/main/java/com/alibaba/csp/sentinel/datasource/etcd/EtcdDataSource.java @@ -88,7 +88,7 @@ private void initWatcher() { WatchEvent.EventType eventType = watchEvent.getEventType(); if (eventType == WatchEvent.EventType.PUT) { try { - String newValueJson = watchEvent.getKeyValue().getValue().toString(); + String newValueJson = watchEvent.getKeyValue().getValue().toString(charset); T newValue = parser.convert(newValueJson); getProperty().updateValue(newValue); } catch (Exception e) {