apache / apache/servicecomb-java-chassis
addLocalContext(parentContext.getLocalContext());多线程问题Concurrentmodificationexception Bug
- 主要言語
- Java
- スター
- 1.9k
- フォーク
- 814
- 平均マージ
- 8日 23時間
- マージ済み PR(30日)
- 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