From 9c7aa3b92daaa89722a9183eed3578cb311bf373 Mon Sep 17 00:00:00 2001 From: Erving Date: Thu, 12 Nov 2020 22:21:24 +0800 Subject: [PATCH] Add extension component fail insulator config, default to no (#763) --- .../runtime/SofaRuntimePropertiesTest.java | 14 +++++++++++-- .../sofa/runtime/SofaRuntimeProperties.java | 21 ++++++++++++++----- .../SofaRuntimeConfigurationProperties.java | 9 ++++++++ .../ext/component/ExtensionComponent.java | 4 ++++ .../runtime/test/SofaEventHandlerTest.java | 3 +++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/sofa-boot-project/sofa-boot-autoconfigure/src/test/java/com/alipay/sofa/autoconfigure/test/runtime/SofaRuntimePropertiesTest.java b/sofa-boot-project/sofa-boot-autoconfigure/src/test/java/com/alipay/sofa/autoconfigure/test/runtime/SofaRuntimePropertiesTest.java index a9c918587..cb455f763 100644 --- a/sofa-boot-project/sofa-boot-autoconfigure/src/test/java/com/alipay/sofa/autoconfigure/test/runtime/SofaRuntimePropertiesTest.java +++ b/sofa-boot-project/sofa-boot-autoconfigure/src/test/java/com/alipay/sofa/autoconfigure/test/runtime/SofaRuntimePropertiesTest.java @@ -39,7 +39,8 @@ @TestPropertySource(properties = { "com.alipay.sofa.boot.disableJvmFirst=true", "com.alipay.sofa.boot.skipJvmReferenceHealthCheck=true", "com.alipay.sofa.boot.skipJvmSerialize=true", - "com.alipay.sofa.boot.skipExtensionHealthCheck=true" }) + "com.alipay.sofa.boot.skipExtensionHealthCheck=true", + "com.alipay.sofa.boot.extensionFailureInsulating=true" }) public class SofaRuntimePropertiesTest { @Autowired @@ -82,9 +83,18 @@ public void testSkipExtensionHealthCheckProperty() { Assert.assertTrue(configurationProperties.isSkipExtensionHealthCheck()); } + @Test + public void testExtensionFailureInsulating() { + SofaRuntimeConfigurationProperties configurationProperties = ctx + .getBean(SofaRuntimeConfigurationProperties.class); + + Assert.assertTrue(SofaRuntimeProperties.isSkipExtensionHealthCheck(ctx.getClassLoader())); + Assert.assertTrue(configurationProperties.isExtensionFailureInsulating()); + } + @Configuration @EnableAutoConfiguration static class SofaRuntimePropertiesTestConfiguration { } -} \ No newline at end of file +} diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/SofaRuntimeProperties.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/SofaRuntimeProperties.java index 316c295c6..5a633e71a 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/SofaRuntimeProperties.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/SofaRuntimeProperties.java @@ -26,12 +26,13 @@ */ public class SofaRuntimeProperties { - private static ConcurrentHashMap skipJvmReferenceHealthCheckMap = new ConcurrentHashMap<>(); - private static ConcurrentHashMap skipExtensionHealthCheckMap = new ConcurrentHashMap<>(); - private static ConcurrentHashMap disableJvmFirstMap = new ConcurrentHashMap<>(); - private static ConcurrentHashMap skipJvmSerializeMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap skipJvmReferenceHealthCheckMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap skipExtensionHealthCheckMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap disableJvmFirstMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap skipJvmSerializeMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap extensionFailureInsulatingMap = new ConcurrentHashMap<>(); - private static boolean jvmFilterEnable = false; + private static boolean jvmFilterEnable = false; public static boolean isJvmFilterEnable() { return jvmFilterEnable; @@ -55,6 +56,16 @@ public static void setSkipJvmReferenceHealthCheck(ClassLoader classLoader, skipJvmReferenceHealthCheckMap.putIfAbsent(classLoader, skipJvmReferenceHealthCheck); } + public static boolean isExtensionFailureInsulating(ClassLoader classLoader) { + return extensionFailureInsulatingMap.get(classLoader) != null + && extensionFailureInsulatingMap.get(classLoader); + } + + public static void setExtensionFailureInsulating(ClassLoader classLoader, + boolean extensionFailureInsulating) { + extensionFailureInsulatingMap.putIfAbsent(classLoader, extensionFailureInsulating); + } + public static boolean isSkipExtensionHealthCheck(SofaRuntimeContext sofaRuntimeContext) { return isSkipExtensionHealthCheck(sofaRuntimeContext.getAppClassLoader()); } diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/configure/SofaRuntimeConfigurationProperties.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/configure/SofaRuntimeConfigurationProperties.java index 78538d3c6..886f1bfaa 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/configure/SofaRuntimeConfigurationProperties.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/configure/SofaRuntimeConfigurationProperties.java @@ -49,6 +49,15 @@ public boolean isSkipJvmReferenceHealthCheck() { .isSkipJvmReferenceHealthCheck(this.getClass().getClassLoader()); } + public void setExtensionFailureInsulating(boolean extensionFailureInsulating) { + SofaRuntimeProperties.setExtensionFailureInsulating(this.getClass().getClassLoader(), + extensionFailureInsulating); + } + + public boolean isExtensionFailureInsulating() { + return SofaRuntimeProperties.isExtensionFailureInsulating(this.getClass().getClassLoader()); + } + public boolean isDisableJvmFirst() { return SofaRuntimeProperties.isDisableJvmFirst(this.getClass().getClassLoader()); } diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/ext/component/ExtensionComponent.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/ext/component/ExtensionComponent.java index f70fd97a5..29ace4538 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/ext/component/ExtensionComponent.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/ext/component/ExtensionComponent.java @@ -145,6 +145,10 @@ private void loadContributions(ExtensionPoint extensionPoint, Extension extensio .loadContributions((ExtensionInternal) extension); ((ExtensionInternal) extension).setContributions(contribs); } catch (Exception e) { + if (SofaRuntimeProperties.isExtensionFailureInsulating(sofaRuntimeContext + .getAppClassLoader())) { + this.e = e; + } SofaLogger.error("Failed to create contribution objects", e); } } diff --git a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/test/java/com/alipay/sofa/runtime/test/SofaEventHandlerTest.java b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/test/java/com/alipay/sofa/runtime/test/SofaEventHandlerTest.java index d92dd5a7a..511f80330 100644 --- a/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/test/java/com/alipay/sofa/runtime/test/SofaEventHandlerTest.java +++ b/sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/test/java/com/alipay/sofa/runtime/test/SofaEventHandlerTest.java @@ -77,6 +77,7 @@ public void before() { properties.setProperty("com.alipay.sofa.boot.skipJvmReferenceHealthCheck", "true"); properties.setProperty("com.alipay.sofa.boot.skipExtensionHealthCheck", "true"); properties.setProperty("com.alipay.sofa.boot.skipJvmSerialize", "true"); + properties.setProperty("com.alipay.sofa.boot.extensionFailureInsulating", "true"); properties.setProperty("spring.application.name", "tSofaEventHandlerTest"); SofaFramework.getRuntimeSet().forEach(value -> SofaFramework.unRegisterSofaRuntimeManager(value)); SpringApplication springApplication = new SpringApplication( @@ -104,6 +105,8 @@ public void testUninstallEvent() { Assert .assertFalse(SofaRuntimeProperties.isSkipJvmReferenceHealthCheck(ctx.getClassLoader())); Assert.assertFalse(SofaRuntimeProperties.isSkipExtensionHealthCheck(ctx.getClassLoader())); + Assert + .assertFalse(SofaRuntimeProperties.isExtensionFailureInsulating(ctx.getClassLoader())); Assert.assertFalse(SofaRuntimeProperties.isSkipJvmSerialize(ctx.getClassLoader())); Assert.assertTrue(SofaFramework.getRuntimeSet().isEmpty()); Assert.assertFalse(ctx.isActive());