grpc / grpc/grpc-java

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

Abierto
#1,981 4 comentarios 0 reacciones 1 asignado Reclamado por @zhangkun83 Ver en GitHub
bug
Lenguaje dominante
Java
Estrellas
12.1k
Forks
4k
Merge medio
2 d 17 h
PR fusionados (30 d)
37

Descripción

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

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.