Temporal SDK gRPC calls fail with DEADLINE_EXCEEDED after node restart (GraalVM / K8s)
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Cần làm rõ
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- grpc, java, kubernetes, spring-boot
- Lĩnh vực
- backend, cloud, distributed-systems, networking
Hướng nghiên cứu
Bắt đầu với bản demo temporal-graalvm-k8s được liên kết, quá trình cài đặt Helm của nó và lệnh gọi listNamespaces khi khởi động. Tái hiện lỗi bằng cách drain hoặc khởi động lại một node Kubernetes, sau đó so sánh hành vi của native-image với các lần chạy trên JVM và ngoài Kubernetes bằng các log DEADLINE_EXCEEDED đã được báo cáo. Được xem là hoàn tất khi ứng dụng kết nối lại và listNamespaces thành công nhanh chóng trong khi cụm Temporal vẫn ở trạng thái ổn định.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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
- Ngôn ngữ chính
- Java
- Star
- 434
- Fork
- 260
- Merge trung bình
- 2 ngày 18 giờ
- Pull request đã merge (30 ngày)
- 24
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của temporalio/sdk-java
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
temporalio/sdk-java#3134 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
temporalio/sdk-java#1825 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Proposal: handle SIGTERM by default to initiate graceful worker shutdownCó thể đã có người làm @eamsden đã nhận 3 ngày trước. Đang mở
temporalio/sdk-java#3135 · 1 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 55/100
temporalio/sdk-java#3132 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 54/100
temporalio/sdk-java#3125 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của temporalio/sdk-java
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
openhab/openhab-addons#21921 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
objectionary/eo-graphs#85 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
objectionary/lints#1544 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
objectionary/hone-maven-plugin#1309 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
chore s3
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 83/100
Maintainer thường phản hồi trong vòng 1 ngày