grpc / grpc/grpc-java

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

Ouverte
#1,981 4 commentaires 0 réactions 1 personne assignée Réclamée par @zhangkun83 Voir sur GitHub
bug
Langage dominant
Java
Étoiles
12.1k
Forks
4k
Merge moyen
2 j 17 h
PR mergées (30 j)
37

Description

`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`.

Guide de contribution

Ouvrir le guide de contribution

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.