diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java index 44f51c4f64..1b50fb46a1 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java @@ -100,7 +100,7 @@ public boolean isCut() { return cut; } - public void setCut(boolean cut) { + private void setCut(boolean cut) { this.cut = cut; } @@ -108,10 +108,6 @@ public AtomicLong getPassCount() { return passCount; } - public void setPassCount(AtomicLong passCount) { - this.passCount = passCount; - } - public int getTimeWindow() { return timeWindow; } @@ -143,12 +139,6 @@ public boolean equals(Object o) { if (grade != that.grade) { return false; } - // if (cut != that.cut) { return false; } - //// AtomicLong dose not Override equals() - // if ((passCount == null && that.passCount != null) - // || (passCount.get() != that.passCount.get())) { - // return false; - // } return true; } @@ -158,9 +148,6 @@ public int hashCode() { result = 31 * result + new Double(count).hashCode(); result = 31 * result + timeWindow; result = 31 * result + grade; - // result = 31 * result + (cut ? 1 : 0); - // result = 31 * result + (passCount != null ? (int)passCount.get() : - // 0); return result; } @@ -179,6 +166,7 @@ public boolean passCheck(Context context, DefaultNode node, int acquireCount, Ob if (grade == RuleConstant.DEGRADE_GRADE_RT) { double rt = clusterNode.avgRt(); if (rt < this.count) { + passCount.set(0); return true; } @@ -189,11 +177,17 @@ public boolean passCheck(Context context, DefaultNode node, int acquireCount, Ob } else { double exception = clusterNode.exceptionQps(); double success = clusterNode.successQps(); - if (success == 0) { + long total = clusterNode.totalQps(); + // if total qps less than RT_MAX_EXCEED_N, pass. + if (total < RT_MAX_EXCEED_N) { return true; } - if (exception / success < count) { + if (success == 0) { + return exception < RT_MAX_EXCEED_N; + } + + if (exception / (success + exception) < count) { return true; } } diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeTest.java index 968cb5c4f2..27400f1bd8 100755 --- a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeTest.java +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeTest.java @@ -70,6 +70,8 @@ public void testExceptionRatioModeDegrade() throws Throwable { String key = "test_degrade_exception_ratio"; ClusterNode cn = mock(ClusterNode.class); when(cn.exceptionQps()).thenReturn(2L); + // Indicates that there are QPS more than min threshold. + when(cn.totalQps()).thenReturn(12L); ClusterBuilderSlot.getClusterNodeMap().put(new StringResourceWrapper(key, EntryType.IN), cn); Context context = mock(Context.class); @@ -77,12 +79,12 @@ public void testExceptionRatioModeDegrade() throws Throwable { when(node.getClusterNode()).thenReturn(cn); DegradeRule rule = new DegradeRule(); - rule.setCount(0.5); + rule.setCount(0.15); rule.setResource(key); rule.setTimeWindow(5); rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION); - when(cn.successQps()).thenReturn(4L); + when(cn.successQps()).thenReturn(8L); // Will fail. assertFalse(rule.passCheck(context, node, 1)); @@ -90,7 +92,7 @@ public void testExceptionRatioModeDegrade() throws Throwable { // Restore from the degrade timeout. TimeUnit.SECONDS.sleep(6); - when(cn.successQps()).thenReturn(7L); + when(cn.successQps()).thenReturn(20L); // Will pass. assertTrue(rule.passCheck(context, node, 1)); } diff --git a/sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/config/TransportConfig.java b/sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/config/TransportConfig.java index 791db903f3..5f934a9808 100755 --- a/sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/config/TransportConfig.java +++ b/sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/config/TransportConfig.java @@ -42,6 +42,10 @@ public static String getConsoleServer() { return SentinelConfig.getConfig(CONSOLE_SERVER); } + public static int getRuntimePort() { + return runtimePort; + } + /** * Get Server port of this HTTP server. * diff --git a/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/command/SimpleHttpCommandCenter.java b/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/command/SimpleHttpCommandCenter.java index 66c4bb854e..f073ccaf75 100755 --- a/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/command/SimpleHttpCommandCenter.java +++ b/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/command/SimpleHttpCommandCenter.java @@ -124,9 +124,7 @@ public void run() { } } - if (success) { - tmpPort = port; - } else { + if (!success) { tmpPort = PORT_UNINITIALIZED; } TransportConfig.setRuntimePort(tmpPort); diff --git a/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/SimpleHttpHeartbeatSender.java b/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/SimpleHttpHeartbeatSender.java index 4eff03c93b..1fce561233 100755 --- a/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/SimpleHttpHeartbeatSender.java +++ b/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/SimpleHttpHeartbeatSender.java @@ -52,7 +52,7 @@ public class SimpleHttpHeartbeatSender implements HeartbeatSender { public SimpleHttpHeartbeatSender() { // Retrieve the list of default addresses. List newAddrs = getDefaultConsoleIps(); - RecordLog.info("Default console address list retrieved: " + newAddrs); + RecordLog.info("[SimpleHttpHeartbeatSender] Default console address list retrieved: " + newAddrs); this.addressList = newAddrs; // Set interval config. String interval = System.getProperty(TransportConfig.HEARTBEAT_INTERVAL_MS, String.valueOf(DEFAULT_INTERVAL)); @@ -61,6 +61,10 @@ public SimpleHttpHeartbeatSender() { @Override public boolean sendHeartbeat() throws Exception { + if (TransportConfig.getRuntimePort() <= 0) { + RecordLog.info("[SimpleHttpHeartbeatSender] Runtime port not initialized, won't send heartbeat"); + return false; + } InetSocketAddress addr = getAvailableAddress(); if (addr == null) { return false;