apache / apache/servicecomb-java-chassis

addLocalContext(parentContext.getLocalContext());多线程问题Concurrentmodificationexception Bug

未关闭
#3,323 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Java
星标
1.9k
派生
814
平均合并
8 天 23 小时
30 天内合并 PR
1

描述

这个类有构造这个代码:
org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation
public SwaggerInvocation() {
parentContext = ContextUtils.getInvocationContext();
if (parentContext != null) {
addContext(parentContext.getContext());
addLocalContext(parentContext.getLocalContext());
}
}

其中addLocalContext(parentContext.getLocalContext()); 里面调用了localContext.putAll(otherContext);
这个在多线程环境,业务代码自己开多线程调用下游服务传递上下文会有多线程问题,报Concurrentmodificationexception异常
建议使用public void setLocalContext(Map localContext)直接设置上下文

或者将
protected Map context = new HashMap<>();

protected Map localContext = new HashMap<>();

都换成ConcurrentMap

贡献指南

这个仓库没有索引到贡献指南

调研方向

从 org.apache.servicecomb.swagger.invocation.SwaggerInvocation#SwaggerInvocation 开始,检查 addLocalContext,尤其是 issue 中描述的 localContext.putAll 调用。比较提出的上下文处理替代方案,并验证在传播本地上下文时,并发的下游调用不会引发 ConcurrentModificationException。

由索引模型根据 Issue 内容生成。

评估

技术栈
java
领域
backend
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
40/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。