Temporal SDK gRPC calls fail with DEADLINE_EXCEEDED after node restart (GraalVM / K8s)
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Muss geklärt werden
- Aktivitätsstatus
- Ruhig
- Tech-Stack
- grpc, java, kubernetes, spring-boot
- Bereich
- backend, cloud, distributed-systems, networking
Rechercherichtung
Beginne mit der verlinkten temporal-graalvm-k8s-Demo, ihrer Helm-Installation und dem listNamespaces-Aufruf beim Start. Reproduziere den Fehler, indem du einen Kubernetes-Knoten drainst oder neu startest, und vergleiche anschließend das Verhalten von native-image mit JVM- und Nicht-Kubernetes-Ausführungen anhand der gemeldeten DEADLINE_EXCEEDED-Logs. Als erledigt gilt die Aufgabe, wenn sich die Anwendung wieder verbindet und listNamespaces umgehend erfolgreich ist, während der Temporal-Cluster fehlerfrei läuft.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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
- Vorherrschende Sprache
- Java
- Sterne
- 437
- Forks
- 261
- Ø Merge
- 4 T. 10 Std.
- Gemergte PRs (30 T.)
- 21
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus temporalio/sdk-java
-
enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
temporalio/sdk-java#1825 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Skipped mutableSideEffect leaks an empty RecordMarker command after a full replay, and the workflow task fails on every retryEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
temporalio/sdk-java#3163 · 3 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Add Spring Boot auto-configuration for standalone ActivityClientEvtl. vergeben @Quinn-With-Two-Ns hat das vor 2 Tagen übernommen. Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
temporalio/sdk-java#3146 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Proposal: handle SIGTERM by default to initiate graceful worker shutdownEvtl. vergeben @eamsden hat das vor 14 Tagen übernommen. Offen
temporalio/sdk-java#3135 · 1 Kommentar · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
-
Skip result deserialization for local activities and SideEffect when not replaying (mutableSideEffect already does this)Evtl. vergeben @Quinn-With-Two-Ns hat das vor 9 Tagen übernommen. Offenenhancement
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 54/100
temporalio/sdk-java#3125 · 2 Kommentare · 1 zugewiesene Person ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in temporalio/sdk-java
Ähnliche Issues
-
[Bug] DefaultSerializationExceptionWrapper does not implement Cleanable, so cleanup() is never invoked by codecsEvtl. vergeben @binbin0325 hat das heute übernommen. Offencomponent/need-triage type/need-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
2026 Error Report
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
triplea-game/triplea#15096 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug][API] Switching workflow versions leaves schedules onlineEvtl. vergeben @zhuangchong hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
apache/dolphinscheduler#18731 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Implement JDBC Domain Enums (`SqlCategory`, `SqlExecutionStatus`, `SqlExecutionType`) in Core ModuleOffencore-module enhancement good first issue
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 87/100
sdlc-pro/spring-lens#531 ·
Maintainer antworten meist innerhalb von 1 Tag