-
Notifications
You must be signed in to change notification settings - Fork 13.1k
[ISSUE #12792] Fix Netty direct memory OOM caused by distro verify task burst #13419
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -53,6 +53,10 @@ public class GlobalExecutor { | |||||||||||||||
EnvUtil.getAvailableProcessors(RemoteUtils.getRemoteExecutorTimesOfProcessors()), 60L, TimeUnit.SECONDS, | ||||||||||||||||
new LinkedBlockingQueue<>(RemoteUtils.getRemoteExecutorQueueSize()), | ||||||||||||||||
new ThreadFactoryBuilder().daemon(true).nameFormat("nacos-cluster-grpc-executor-%d").build()); | ||||||||||||||||
|
||||||||||||||||
public static final ScheduledExecutorService DISTRO_VERIFY_EXECUTOR = ExecutorFactory.Managed | ||||||||||||||||
.newScheduledExecutorService(ClassUtils.getCanonicalName(GlobalExecutor.class), 4, | ||||||||||||||||
new NameThreadFactory("com.alibaba.nacos.core.distro.verify")); | ||||||||||||||||
Comment on lines
+57
to
+59
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 新增的DISTRO_VERIFY_EXECUTOR线程池未配置核心线程保活策略
📋 问题详情新创建的DISTRO_VERIFY_EXECUTOR线程池未设置核心线程保活时间,可能导致线程频繁创建/销毁。根据性能优化规范,应为ScheduledExecutorService配置合理的keepAliveTime参数以提升线程复用效率。 💡 解决方案添加keepAliveTime参数配置: - .newScheduledExecutorService(ClassUtils.getCanonicalName(GlobalExecutor.class), 4,
+ .newScheduledExecutorService(ClassUtils.getCanonicalName(GlobalExecutor.class), 4, 60L, TimeUnit.SECONDS, 🔧 建议代码
Suggested change
|
||||||||||||||||
|
||||||||||||||||
public static void runWithoutThread(Runnable runnable) { | ||||||||||||||||
runnable.run(); | ||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package com.alibaba.nacos.core.distributed.distro.task.verify; | ||
|
||
import com.alibaba.nacos.core.distributed.distro.DistroConfig; | ||
import com.alibaba.nacos.core.distributed.distro.component.DistroTransportAgent; | ||
import com.alibaba.nacos.core.distributed.distro.entity.DistroData; | ||
import com.alibaba.nacos.core.distributed.distro.entity.DistroKey; | ||
import com.alibaba.nacos.sys.env.EnvUtil; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
import org.mockito.InjectMocks; | ||
import org.mockito.Mock; | ||
import org.mockito.MockedStatic; | ||
import org.mockito.MockitoAnnotations; | ||
import org.springframework.mock.env.MockEnvironment; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
import static org.mockito.ArgumentMatchers.any; | ||
import static org.mockito.Mockito.verify; | ||
import static org.mockito.Mockito.when; | ||
import static org.mockito.Mockito.mockStatic; | ||
import static org.mockito.Mockito.times; | ||
|
||
class DistroVerifyExecuteTaskTest { | ||
|
||
@InjectMocks | ||
private DistroVerifyExecuteTask distroVerifyExecuteTask; | ||
|
||
@Mock | ||
private DistroTransportAgent transportAgent; | ||
|
||
@Mock | ||
private DistroConfig distroConfig; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
MockitoAnnotations.openMocks(this); | ||
EnvUtil.setEnvironment(new MockEnvironment()); | ||
// 初始化测试数据 | ||
List<DistroData> verifyData = new ArrayList<>(); | ||
for (int i = 0; i < 10; i++) { | ||
DistroKey key = new DistroKey("testKey" + i, "testResource"); | ||
DistroData data = new DistroData(key, ("data" + i).getBytes()); | ||
verifyData.add(data); | ||
} | ||
|
||
// 创建被测任务实例 | ||
distroVerifyExecuteTask = new DistroVerifyExecuteTask( | ||
transportAgent, verifyData, "targetServer", "testResource" | ||
); | ||
} | ||
|
||
@Test | ||
void testRunWithSmallBatchSize() throws InterruptedException { | ||
// 准备测试数据 | ||
when(distroConfig.getVerifyBatchSize()).thenReturn(2); | ||
when(distroConfig.getVerifyIntervalMillis()).thenReturn(50L); | ||
try (MockedStatic<DistroConfig> mockedStatic = mockStatic(DistroConfig.class)) { | ||
mockedStatic.when(DistroConfig::getInstance).thenReturn(distroConfig); | ||
|
||
// 执行测试 | ||
distroVerifyExecuteTask.run(); | ||
|
||
// 验证全部被调用 | ||
Thread.sleep(100L); | ||
verify(transportAgent, times(10)).syncVerifyData(any(), any()); | ||
} | ||
} | ||
Comment on lines
+70
to
+85
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 单元测试未验证配置边界条件
📋 问题详情测试用例未覆盖verifyBatchSize=0的异常配置场景。根据单元测试规范,应添加验证配置有效性(如最小值检查)的测试用例,确保系统在非法配置下能正确处理。 💡 解决方案添加边界值测试用例: + @Test(expected = IllegalArgumentException.class)
+ void testInvalidBatchSize() {
+ when(distroConfig.getVerifyBatchSize()).thenReturn(0);
+ mockedStatic.when(DistroConfig::getInstance).thenReturn(distroConfig);
+ distroVerifyExecuteTask.run();
+ }
|
||
|
||
@Test | ||
void testRunWithLargeBatchSize() throws InterruptedException { | ||
// 准备测试数据 | ||
when(distroConfig.getVerifyBatchSize()).thenReturn(20); | ||
when(distroConfig.getVerifyIntervalMillis()).thenReturn(50L); | ||
try (MockedStatic<DistroConfig> mockedStatic = mockStatic(DistroConfig.class)) { | ||
mockedStatic.when(DistroConfig::getInstance).thenReturn(distroConfig); | ||
|
||
// 执行测试 | ||
distroVerifyExecuteTask.run(); | ||
// 验证全部被调用 | ||
Thread.sleep(100L); | ||
verify(transportAgent, times(10)).syncVerifyData(any(), any()); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
新增的verifyBatchSize字段缺少配置说明注释
📋 问题详情
在DistroConfig类中新增的verifyBatchSize字段未添加配置说明注释,导致其他开发者无法明确该配置项的用途和合理取值范围。根据代码标准化规范,所有配置项应包含清晰的注释说明其业务含义和默认值。
💡 解决方案
在字段前添加配置说明注释:
🔧 建议代码
有用意见👍 | 无用意见👎 | 错误意见❌