Skip to content

Commit a6bc6c6

Browse files
committed
Updated a bit example
1 parent b420bc9 commit a6bc6c6

File tree

3 files changed

+88
-82
lines changed

3 files changed

+88
-82
lines changed

Samples/Package.swift

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
1-
// swift-tools-version:5.0
1+
// swift-tools-version:6.0
22
// The swift-tools-version declares the minimum version of Swift required to build this package.
33

44
import PackageDescription
5+
6+
let globalSwiftSettings: [SwiftSetting] = [
7+
.swiftLanguageMode(.v6)
8+
]
59

610
var targets: [PackageDescription.Target] = [
7-
.target(
11+
.executableTarget(
812
name: "SWIMNIOSampleCluster",
913
dependencies: [
10-
"SWIM",
11-
"SWIMNIOExample",
12-
"SwiftPrometheus",
13-
"Lifecycle",
14-
"ArgumentParser",
15-
],
16-
path: "Sources/SWIMNIOSampleCluster"
14+
.product(name: "SWIM", package: "swift-cluster-membership"),
15+
.product(name: "SWIMNIOExample", package: "swift-cluster-membership"),
16+
.product(name: "ServiceLifecycle", package: "swift-service-lifecycle"),
17+
.product(name: "ArgumentParser", package: "swift-argument-parser"),
18+
]
1719
),
1820

1921
/* --- tests --- */
@@ -22,9 +24,8 @@ var targets: [PackageDescription.Target] = [
2224
.testTarget(
2325
name: "NoopTests",
2426
dependencies: [
25-
"SWIM",
26-
],
27-
path: "Tests/NoopTests"
27+
.product(name: "SWIM", package: "swift-cluster-membership"),
28+
]
2829
),
2930
]
3031

@@ -34,15 +35,14 @@ var dependencies: [Package.Dependency] = [
3435

3536
// ~~~~~~~ only for samples ~~~~~~~
3637

37-
.package(url: "https://github.com/swift-server/swift-service-lifecycle.git", from: "1.0.0-alpha"),
38-
.package(url: "https://github.com/MrLotU/SwiftPrometheus.git", from: "1.0.0-alpha"),
39-
.package(url: "https://github.com/apple/swift-argument-parser", from: "0.2.0"),
38+
.package(url: "https://github.com/swift-server/swift-service-lifecycle.git", from: "2.6.1"),
39+
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.5.0"),
4040
]
4141

4242
let package = Package(
4343
name: "swift-cluster-membership-samples",
4444
platforms: [
45-
.macOS(.v10_12)
45+
.macOS(.v15),
4646
],
4747
products: [
4848
.executable(
@@ -54,7 +54,14 @@ let package = Package(
5454

5555
dependencies: dependencies,
5656

57-
targets: targets,
57+
targets: targets.map { target in
58+
var swiftSettings = target.swiftSettings ?? []
59+
swiftSettings.append(contentsOf: globalSwiftSettings)
60+
if !swiftSettings.isEmpty {
61+
target.swiftSettings = swiftSettings
62+
}
63+
return target
64+
},
5865

5966
cxxLanguageStandard: .cxx11
6067
)

Samples/Sources/SWIMNIOSampleCluster/main.swift renamed to Samples/Sources/SWIMNIOSampleCluster/SWIMNIOSampleCluster.swift

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,33 +15,35 @@
1515
import ClusterMembership
1616
import SWIM
1717
import Metrics
18-
import Prometheus
1918
import SWIMNIOExample
2019
import NIO
2120
import Logging
22-
import Lifecycle
21+
import ServiceLifecycle
2322
import ArgumentParser
2423

25-
struct SWIMNIOSampleCluster: ParsableCommand {
24+
@main
25+
struct SWIMNIOSampleCluster: AsyncParsableCommand {
26+
2627
@Option(name: .shortAndLong, help: "The number of nodes to start, defaults to: 1")
27-
var count: Int?
28+
var count: Int = 1
2829

29-
@Argument(help: "Hostname that node(s) should bind to")
30-
var host: String?
30+
// @Argument(help: "Hostname that node(s) should bind to")
31+
// var host: String?
3132

3233
@Option(help: "Determines which this node should bind to; Only effective when running a single node")
33-
var port: Int?
34+
var port: Int = 7001
3435

3536
@Option(help: "Configures which nodes should be passed in as initial contact points, format: host:port,")
3637
var initialContactPoints: String = ""
3738

3839
@Option(help: "Configures log level")
3940
var logLevel: String = "info"
4041

41-
mutating func run() throws {
42+
func run() async throws {
4243
LoggingSystem.bootstrap(_SWIMPrettyMetadataLogHandler.init)
4344
let group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
4445

46+
// FIXME: Update Prometheus client
4547
// Uncomment this if you'd like to see metrics displayed in the command line periodically;
4648
// This bootstraps and uses the Prometheus metrics backend to report metrics periodically by printing them to the stdout (console).
4749
//
@@ -58,51 +60,44 @@ struct SWIMNIOSampleCluster: ParsableCommand {
5860
// }
5961
// }
6062

61-
let lifecycle = ServiceLifecycle()
62-
lifecycle.registerShutdown(
63-
label: "eventLoopGroup",
64-
.sync(group.syncShutdownGracefully)
65-
)
66-
63+
var services: [any Service] = []
6764
var settings = SWIMNIO.Settings()
68-
if count == nil || count == 1 {
69-
let nodePort = self.port ?? 7001
65+
if self.count == 1 {
66+
let nodePort = self.port
7067
settings.logger = Logger(label: "swim-\(nodePort)")
7168
settings.logger.logLevel = self.parseLogLevel()
7269
settings.swim.logger.logLevel = self.parseLogLevel()
7370

7471
settings.swim.initialContactPoints = self.parseContactPoints()
75-
76-
let node = SampleSWIMNIONode(port: nodePort, settings: settings, group: group)
77-
lifecycle.register(
78-
label: "swim-\(nodePort)",
79-
start: .sync { node.start() },
80-
shutdown: .sync {}
72+
services.append(
73+
SampleSWIMNIONode(
74+
port: nodePort,
75+
settings: settings,
76+
group: group
77+
)
8178
)
82-
8379
} else {
84-
let basePort = port ?? 7001
85-
for i in 1...(count ?? 1) {
80+
let basePort = port
81+
for i in 1...count {
8682
let nodePort = basePort + i
8783

8884
settings.logger = Logger(label: "swim-\(nodePort)")
8985
settings.swim.initialContactPoints = self.parseContactPoints()
9086

91-
let node = SampleSWIMNIONode(
92-
port: nodePort,
93-
settings: settings,
94-
group: group
95-
)
96-
97-
lifecycle.register(
98-
label: "swim\(nodePort)",
99-
start: .sync { node.start() },
100-
shutdown: .sync {}
87+
services.append(
88+
SampleSWIMNIONode(
89+
port: nodePort,
90+
settings: settings,
91+
group: group
92+
)
10193
)
10294
}
10395
}
104-
105-
try lifecycle.startAndWait()
96+
let serviceGroup = ServiceGroup(
97+
services: services,
98+
logger: .init(label: "swim")
99+
)
100+
try await serviceGroup.run()
106101
}
107102

108103
private func parseLogLevel() -> Logger.Level {
@@ -127,5 +122,3 @@ struct SWIMNIOSampleCluster: ParsableCommand {
127122
return Set(contactPoints)
128123
}
129124
}
130-
131-
SWIMNIOSampleCluster.main()

Samples/Sources/SWIMNIOSampleCluster/SWIMNIOSampleNode.swift

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,51 +17,57 @@ import SWIM
1717
import SWIMNIOExample
1818
import NIO
1919
import Logging
20+
import ServiceLifecycle
2021

21-
struct SampleSWIMNIONode {
22+
struct SampleSWIMNIONode: Service {
23+
2224
let port: Int
2325
var settings: SWIMNIO.Settings
24-
26+
2527
let group: EventLoopGroup
26-
28+
2729
init(port: Int, settings: SWIMNIO.Settings, group: EventLoopGroup) {
2830
self.port = port
2931
self.settings = settings
3032
self.group = group
3133
}
32-
33-
func start() {
34-
let bootstrap = DatagramBootstrap(group: group)
35-
.channelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
36-
.channelInitializer { channel in
37-
return channel.pipeline
38-
.addHandler(SWIMNIOHandler(settings: self.settings)).flatMap {
39-
channel.pipeline.addHandler(SWIMNIOSampleHandler())
40-
}
41-
}
42-
43-
bootstrap.bind(host: "127.0.0.1", port: port).whenComplete { result in
44-
switch result {
45-
case .success(let res):
46-
self.settings.logger.info("Bound to: \(res)")
47-
()
48-
case .failure(let error):
34+
35+
func run() async throws {
36+
try await withGracefulShutdownHandler {
37+
let bootstrap = DatagramBootstrap(group: group)
38+
.channelOption(ChannelOptions.socketOption(.so_reuseaddr), value: 1)
39+
.channelInitializer { channel in
40+
return channel.pipeline
41+
.addHandler(SWIMNIOHandler(settings: self.settings)).flatMap {
42+
channel.pipeline.addHandler(SWIMNIOSampleHandler())
43+
}
44+
}
45+
46+
do {
47+
let result = try await bootstrap.bind(host: "127.0.0.1", port: port).get()
48+
self.settings.logger.info("Bound to: \(result)")
49+
} catch {
4950
self.settings.logger.error("Error: \(error)")
50-
()
51+
throw error
5152
}
53+
// FIXME: Should wait the app
54+
try await Task.sleep(for: .seconds(100))
55+
} onGracefulShutdown: {
56+
try? self.group.syncShutdownGracefully()
5257
}
5358
}
54-
59+
5560
}
5661

5762
final class SWIMNIOSampleHandler: ChannelInboundHandler {
58-
public typealias InboundIn = SWIM.MemberStatusChangedEvent
59-
63+
64+
typealias InboundIn = SWIM.MemberStatusChangedEvent<SWIM.NIOPeer>
65+
6066
let log = Logger(label: "SWIMNIOSample")
61-
67+
6268
public func channelRead(context: ChannelHandlerContext, data: NIOAny) {
6369
let change: SWIM.MemberStatusChangedEvent = self.unwrapInboundIn(data)
64-
70+
6571
// we log each event (in a pretty way)
6672
self.log.info("Membership status changed: [\(change.member.node)] is now [\(change.status)]", metadata: [
6773
"swim/member": "\(change.member.node)",

0 commit comments

Comments
 (0)