grpc / grpc/grpc-java

Executor usage in `ClientCallImpl` races with channel shutdown and termination.

オープン
#1,981 コメント 4 件 リアクション 0 件 担当者 1 名 @zhangkun83 が担当を希望しています GitHub で見る
bug
主要言語
Java
スター
12.1k
フォーク
4k
平均マージ
2日 17時間
マージ済み PR(30日)
37

説明

`ManagedChannelImpl` clear `scheduledExecutor` in `shutdown()`, and releases (which potentially closes) `executor` in `maybeTerminateChannel()`.

Neither `newCall()` nor `ClientCallImpl` checks the shutdown state of the channel. `ClientCallImpl` relies on `FailingClientTransport` for the expected behavior. However, `ClientCallImpl` uses the passed in executors anyway, for scheduling the deadline timer and invoking the call listener.

If `ClientCallImpl` tries to schedule a deadline timer after the channel is shut down, it will get a NPE. If it runs the call listener after the shared executor has been closed, which is 1 second (`SharedResourceHolder.DESTROY_DELAY_SECONDS`) after all references are gone, e.g., the application calls `Call.start()` that late, it will get a `RejectedExecutionException`. Our current tests are not testing for the two cases.

This doesn't seem to be a serious issue. It only affect people who try to use `Call`s after the channel has been shutdown. I am yet to figure out a solution.

Anyway, it seems `executor` should be cleared after being returned to the shared pool, like `scheduledExecutor`.

コントリビューションガイド

コントリビューションガイドを開く

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。