|
1 | 1 | import concurrent.futures |
2 | 2 | import os |
| 3 | +import signal |
3 | 4 | import sys |
4 | 5 | import time |
5 | 6 |
|
|
24 | 25 | import tucana.generated.velorum.info_pb2_grpc as info_pb2_grpc |
25 | 26 | import tucana.generated.velorum.info_pb2 as info_pb2 |
26 | 27 | from grpc_reflection.v1alpha import reflection |
| 28 | +from grpc_health.v1 import health, health_pb2, health_pb2_grpc |
27 | 29 |
|
28 | 30 | from src.endpoint.info.info_endpoint import InfoService |
29 | 31 | from src.endpoint.generation.generate_endpoint import GenerateService |
|
37 | 39 | generate_pb2_grpc.add_GenerateServiceServicer_to_server(GenerateService(), server) |
38 | 40 | info_pb2_grpc.add_InfoServiceServicer_to_server(InfoService(), server) |
39 | 41 |
|
| 42 | + |
| 43 | + health_servicer = health.HealthServicer() |
| 44 | + health_servicer.set('liveness', health_pb2.HealthCheckResponse.SERVING) |
| 45 | + health_servicer.set('readiness', health_pb2.HealthCheckResponse.SERVING) |
| 46 | + health_pb2_grpc.add_HealthServicer_to_server(health_servicer, server) |
| 47 | + |
40 | 48 | port = os.getenv("HOST", "0.0.0.0") + ":" + os.getenv("PORT", "50051") |
41 | 49 | server.add_insecure_port(port) |
42 | 50 | log.success(f"Velorum listening on {port}") # type: ignore[attr-defined] |
|
50 | 58 |
|
51 | 59 | server.start() |
52 | 60 |
|
53 | | - try: |
54 | | - while True: |
55 | | - time.sleep(86400) |
56 | | - except KeyboardInterrupt: |
| 61 | + |
| 62 | + def shutdown(signum, frame): |
57 | 63 | log.info("Shutting down gracefully...") |
58 | | - server.stop(0) |
| 64 | + health_servicer.enter_graceful_shutdown() |
| 65 | + server.stop(5).wait() |
| 66 | + |
| 67 | + signal.signal(signal.SIGTERM, shutdown) |
| 68 | + signal.signal(signal.SIGINT, shutdown) |
| 69 | + |
| 70 | + server.wait_for_termination() |
0 commit comments