Temporal SDK gRPC calls fail with DEADLINE_EXCEEDED after node restart (GraalVM / K8s)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 35/100
- Tipo de issue
- Bug
- Clareza
- Precisa de esclarecimento
- Status de atividade
- Pouca atividade
- Stack de tecnologia
- grpc, java, kubernetes, spring-boot
- Domínio
- backend, cloud, distributed-systems, networking
Direção de pesquisa
Comece pela demo temporal-graalvm-k8s vinculada, pela instalação do Helm e pela chamada de listNamespaces na inicialização. Reproduza a falha drenando ou reiniciando um nó do Kubernetes e, em seguida, compare o comportamento de native-image com as execuções em JVM e fora do Kubernetes usando os logs DEADLINE_EXCEEDED relatados. Está concluído quando a aplicação se reconecta e listNamespaces é bem-sucedido prontamente enquanto o cluster Temporal está saudável.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
When a Spring Boot application using the Temporal Java SDK is compiled as a GraalVM native image and deployed in Kubernetes, the application fails to communicate with Temporal after node restarts or pod rescheduling.
The same application works correctly:
- ✅ On JVM (non-native)
- ✅ In Docker outside Kubernetes
- ❌ Fails in Kubernetes when running as GraalVM native image
This suggests a compatibility issue between Temporal Java SDK and GraalVM native runtime, potentially related to:
- gRPC channel lifecycle
- DNS resolution / service discovery
- resource or reflection configuration
- connection reuse after pod rescheduling
Steps to Reproduce
- Install Temporal using official Helm chart - https://github.com/temporalio/helm-charts
- Deploy demo application - https://github.com/olegdibrov/temporal-graalvm-k8s
Install the app:
helm install control {path/to/chart}
Application logic (executed on startup):
List<DescribeNamespaceResponse> namespaces = workflowClient
.getWorkflowServiceStubs()
.blockingStub()
.listNamespaces(ListNamespacesRequest.newBuilder().build())
.getNamespacesList();
log.info("Found {} namespaces", namespaces.size());
- Restart Kubernetes node OR drain node:
kubectl drain <node> --ignore-daemonsets
Observe application startup behavior
Actual Behavior
Application fails to start for 10–30 minutes
Repeated errors:
io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: Deadline CallOptions was exceeded after 9.999s
Temporal cluster is healthy (all pods ready)
Eventually, the application may recover without restart
Expected Behavior
- Application should reconnect to Temporal immediately after pod restart
- listNamespaces should succeed consistently
- No prolonged unavailability if Temporal cluster is healthy
Important Observations
- Issue only occurs in GraalVM native image
- Does NOT reproduce on JVM
- Does NOT reproduce outside Kubernetes
- Temporal services are reachable and healthy during failure window
Delay (~10–30 minutes) suggests:
- stale DNS cache
- broken gRPC channel reuse
- or native-image-related networking issue
Environment
- Temporal SDK: 1.33.0
- GraalVM: 25
- Java: 25
- Spring Boot: 3.5.13
- Kubernetes: v1.30.5
Logs
Example error:
io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: Deadline CallOptions was exceeded after 9.999786125s
- Linguagem predominante
- Java
- Estrelas
- 441
- Forks
- 260
- Merge médio
- 4d 11h
- PRs com merge (30d)
- 22
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de temporalio/sdk-java
-
enhancement
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
temporalio/sdk-java#1825 ·
Mantenedores costumam responder em até 1 dia
-
Skipped mutableSideEffect leaks an empty RecordMarker command after a full replay, and the workflow task fails on every retryTalvez já em andamento @Quinn-With-Two-Ns assumiu há 5 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 52/100
temporalio/sdk-java#3163 · 3 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Add Spring Boot auto-configuration for standalone ActivityClientTalvez já em andamento @Quinn-With-Two-Ns assumiu há 5 dias. Aberta
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
temporalio/sdk-java#3146 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Proposal: handle SIGTERM by default to initiate graceful worker shutdownTalvez já em andamento @eamsden assumiu há 20 dias. Aberta
temporalio/sdk-java#3135 · 1 comentário · 1 responsável ·
Mantenedores costumam responder em até 1 dia
-
Skip result deserialization for local activities and SideEffect when not replaying (mutableSideEffect already does this)Talvez já em andamento @Quinn-With-Two-Ns assumiu há 15 dias. Abertaenhancement
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 54/100
temporalio/sdk-java#3125 · 2 comentários · 1 responsável ·
Mantenedores costumam responder em até 1 dia
Todas as issues de temporalio/sdk-java
Issues semelhantes
-
priority: medium Review effort [1-5]: 3 status: needs-triage type: bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
carlos-emr/carlos#5431 ·
Mantenedores costumam responder em até 1 dia
-
Integration tests: jetty:run fails with WELD-001408 for CountryJpaServiceTalvez já em andamento @viniciusmachak assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
primefaces/primefaces#15431 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 80/100
OpenAPITools/openapi-generator#25454 ·
Mantenedores costumam responder em até 1 dia
-
Component - Build
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100