Skip to content

Commit 6c564c5

Browse files
author
Andrea Scuderi
committed
Fix Graceful shutdown
1 parent c212869 commit 6c564c5

File tree

3 files changed

+29
-17
lines changed

3 files changed

+29
-17
lines changed

Sources/BreezeLambdaAPI/BreezeLambdaAPI.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,6 @@ public actor BreezeLambdaAPI<T: BreezeCodable>: Service {
5757
public func run() async throws {
5858
logger.info("Starting BreezeLambdaAPI...")
5959
try await serviceGroup.run()
60+
logger.info("BreezeLambdaAPI is stopped successfully")
6061
}
6162
}

Sources/BreezeLambdaAPI/BreezeLambdaService.swift

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,25 +46,40 @@ actor BreezeLambdaService<T: BreezeCodable>: Service {
4646

4747
func run() async throws {
4848
let dbManager = await dynamoDBService.dbManager()
49-
try await withGracefulShutdownHandler {
49+
let breezeApi = BreezeLambdaHandler<T>(dbManager: dbManager, operation: self.operation)
50+
self.breezeApi = breezeApi
51+
logger.info("Starting BreezeLambdaService...")
52+
let runtime = LambdaRuntime(body: handler)
53+
try await runTaskWithCancellationOnGracefulShutdown {
5054
do {
51-
let breezeApi = BreezeLambdaHandler<T>(dbManager: dbManager, operation: operation)
52-
self.breezeApi = breezeApi
53-
logger.info("Starting BreezeLambdaService...")
54-
logger.info("Starting BreezeLambdaService...")
55-
let runtime = LambdaRuntime(body: handler)
5655
try await runtime.run()
5756
} catch {
58-
logger.error("\(error.localizedDescription)")
57+
self.logger.error("\(error.localizedDescription)")
5958
throw error
6059
}
6160
} onGracefulShutdown: {
62-
Task {
63-
self.logger.info("Gracefully stoping BreezeLambdaService ...")
64-
try await self.dynamoDBService.gracefulShutdown()
65-
self.logger.info("BreezeLambdaService stopped.")
66-
exit(EXIT_SUCCESS)
61+
self.logger.info("Gracefully stoping BreezeLambdaService ...")
62+
try await self.dynamoDBService.gracefulShutdown()
63+
self.logger.info("BreezeLambdaService is stopped.")
64+
}
65+
}
66+
67+
private func runTaskWithCancellationOnGracefulShutdown(
68+
operation: @escaping @Sendable () async throws -> Void,
69+
onGracefulShutdown: () async throws -> Void
70+
) async throws {
71+
let (cancelOrGracefulShutdown, cancelOrGracefulShutdownContinuation) = AsyncStream<Void>.makeStream()
72+
let task = Task {
73+
try await withTaskCancellationOrGracefulShutdownHandler {
74+
try await operation()
75+
} onCancelOrGracefulShutdown: {
76+
cancelOrGracefulShutdownContinuation.yield()
77+
cancelOrGracefulShutdownContinuation.finish()
6778
}
6879
}
80+
for await _ in cancelOrGracefulShutdown {
81+
try await onGracefulShutdown()
82+
task.cancel()
83+
}
6984
}
7085
}

Tests/BreezeLambdaAPITests/BreezeLambdaAPIServiceTests.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ struct BreezeLambdaAPIServiceTests {
3535

3636
let logger = Logger(label: "BreezeHTTPClientServiceTests")
3737

38-
/*
39-
This test is commented out because it requires to manage the process exit(EXIT_SUCCESS).
40-
4138
@Test
4239
func test_breezeLambdaAPIService_whenValidEnvironment() async throws {
4340
try await testGracefulShutdown { gracefulShutdownTestTrigger in
@@ -62,12 +59,11 @@ struct BreezeLambdaAPIServiceTests {
6259
}
6360
for await _ in gracefulStream {
6461
logger.info("Graceful shutdown stream received")
65-
await group.cancelAll()
62+
group.cancelAll()
6663
}
6764
}
6865
}
6966
}
70-
*/
7167

7268
@Test
7369
func test_breezeLambdaAPIService_whenInvalidEnvironment() async throws {

0 commit comments

Comments
 (0)