From 54d5c36aaed7b7f109f5e7efde8cbeb6eba45852 Mon Sep 17 00:00:00 2001 From: trytocatch Date: Fri, 22 Nov 2024 17:17:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3abortProcess=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E9=87=8D=E5=A4=8D=E6=89=A7=E8=A1=8C=E7=9A=84=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E9=97=AE=E9=A2=98=EF=BC=8C=E5=88=A9=E7=94=A8AtomicInt?= =?UTF-8?q?eger=E6=9C=AC=E8=BA=AB=E7=9A=84=E5=8E=9F=E5=AD=90=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=8F=AA=E6=9C=89=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E8=83=BD=E9=80=9A=E8=BF=87isLimitExceeded?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=EF=BC=8C=E8=BF=9B=E8=80=8C=E6=89=A7=E8=A1=8C?= =?UTF-8?q?abortProcess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taobao/arthas/core/advisor/AdviceListenerAdapter.java | 4 +++- .../core/command/monitor200/AbstractTraceAdviceListener.java | 5 ++--- .../arthas/core/command/monitor200/StackAdviceListener.java | 4 ++-- .../core/command/monitor200/TimeTunnelAdviceListener.java | 4 ++-- .../arthas/core/command/monitor200/WatchAdviceListener.java | 4 ++-- .../grpcweb/grpc/service/advisor/WatchRpcAdviceListener.java | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java index 724414d4373..d8b893f2328 100644 --- a/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java +++ b/core/src/main/java/com/taobao/arthas/core/advisor/AdviceListenerAdapter.java @@ -131,7 +131,9 @@ protected Object getExpressionResult(String express, Advice advice, double cost) * @return true 如果超过或者达到了上限 */ protected boolean isLimitExceeded(int limit, int currentTimes) { - return currentTimes >= limit; + //正常来讲,只需要判断currentTimes == limit即可,currentTimes如果是准确的(不能使用process.times().get()), + //那么不会出现自增时跳过limit的问题,为了应对未知的极端情况,仍旧加上currentTimes - limit > 100,以防万一 + return limit <= 0 || currentTimes == limit || currentTimes - limit > 100; } /** diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java index e9eaee2f2bb..e6aac616a2f 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/AbstractTraceAdviceListener.java @@ -93,13 +93,12 @@ private void finishing(ClassLoader loader, Advice advice) { } if (conditionResult) { // 满足输出条件 - process.times().incrementAndGet(); // TODO: concurrency issues for process.write process.appendResult(traceEntity.getModel()); + int times = process.times().incrementAndGet(); // 是否到达数量限制 - if (isLimitExceeded(command.getNumberOfLimit(), process.times().get())) { - // TODO: concurrency issue to abort process + if (isLimitExceeded(command.getNumberOfLimit(), times)) { abortProcess(process, command.getNumberOfLimit()); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java index 5e58bdb277a..7f91a1d51e5 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/StackAdviceListener.java @@ -63,8 +63,8 @@ private void finishing(Advice advice) { StackModel stackModel = ThreadUtil.getThreadStackModel(advice.getLoader(), Thread.currentThread()); stackModel.setTs(LocalDateTime.now()); process.appendResult(stackModel); - process.times().incrementAndGet(); - if (isLimitExceeded(command.getNumberOfLimit(), process.times().get())) { + int times = process.times().incrementAndGet(); + if (isLimitExceeded(command.getNumberOfLimit(), times)) { abortProcess(process, command.getNumberOfLimit()); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java index 6c9faf7084f..e518ce5ca4d 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/TimeTunnelAdviceListener.java @@ -98,8 +98,8 @@ private void afterFinishing(Advice advice) { isFirst = false; } - process.times().incrementAndGet(); - if (isLimitExceeded(command.getNumberOfLimit(), process.times().get())) { + int times = process.times().incrementAndGet(); + if (isLimitExceeded(command.getNumberOfLimit(), times)) { abortProcess(process, command.getNumberOfLimit()); } } diff --git a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java index 6d186d34de9..13cac929348 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java +++ b/core/src/main/java/com/taobao/arthas/core/command/monitor200/WatchAdviceListener.java @@ -102,8 +102,8 @@ private void watching(Advice advice) { } process.appendResult(model); - process.times().incrementAndGet(); - if (isLimitExceeded(command.getNumberOfLimit(), process.times().get())) { + int times = process.times().incrementAndGet(); + if (isLimitExceeded(command.getNumberOfLimit(), times)) { abortProcess(process, command.getNumberOfLimit()); } } diff --git a/labs/arthas-grpc-web-proxy/src/main/java/com/taobao/arthas/grpcweb/grpc/service/advisor/WatchRpcAdviceListener.java b/labs/arthas-grpc-web-proxy/src/main/java/com/taobao/arthas/grpcweb/grpc/service/advisor/WatchRpcAdviceListener.java index 17330fe6ade..206b9da3788 100644 --- a/labs/arthas-grpc-web-proxy/src/main/java/com/taobao/arthas/grpcweb/grpc/service/advisor/WatchRpcAdviceListener.java +++ b/labs/arthas-grpc-web-proxy/src/main/java/com/taobao/arthas/grpcweb/grpc/service/advisor/WatchRpcAdviceListener.java @@ -119,8 +119,8 @@ private void watching(Advice advice) { model.setAccessPoint(AccessPoint.ACCESS_AFTER_THROWING.getKey()); } arthasStreamObserver.appendResult(model); - arthasStreamObserver.times().incrementAndGet(); - if (isLimitExceeded(watchRequestModel.getNumberOfLimit(), arthasStreamObserver.times().get())) { + int times = arthasStreamObserver.times().incrementAndGet(); + if (isLimitExceeded(watchRequestModel.getNumberOfLimit(), times)) { String msg = "Command execution times exceed limit: " + watchRequestModel.getNumberOfLimit() + ", so command will exit.\n"; arthasStreamObserver.end();