in Sources/DistributedActors/Cluster/ClusterShellState.swift [421:467]
mutating func applyClusterEvent(_ event: Cluster.Event) -> AppliedClusterEventDirective {
var changeWasApplied: Bool
switch event {
case .leadershipChange(let change):
do {
if let appliedChange = try self.membership.applyLeadershipChange(to: change.newLeader) {
self.log.debug("Leader change: \(appliedChange)", metadata: self.metadata)
changeWasApplied = true
} else {
changeWasApplied = false
}
} catch {
self.log.warning("Unable to apply leadership change: \(change), error: \(error)", metadata: self.metadata)
changeWasApplied = false
}
case .membershipChange(let change):
if let appliedChange = self.membership.applyMembershipChange(change) {
self.log.trace("Applied change via cluster event: \(appliedChange)", metadata: self.metadata)
changeWasApplied = true
} else {
changeWasApplied = false
}
case .reachabilityChange(let change):
if self.membership.applyReachabilityChange(change) != nil {
self.log.trace("Applied reachability change: \(change)", metadata: self.metadata)
changeWasApplied = true
} else {
changeWasApplied = false
}
case .snapshot(let snapshot):
/// Realistically we are a SOURCE of snapshots, not a destination of them, however for completeness let's implement it:
changeWasApplied = false
for change in Cluster.Membership._diff(from: .empty, to: snapshot).changes {
let directive = self.applyClusterEvent(.membershipChange(change))
changeWasApplied = changeWasApplied || directive.applied
// actions we'll calculate below, once
}
}
guard changeWasApplied else {
return .init(applied: changeWasApplied)
}
self.log.trace("Membership updated on [\(self.selfNode)] by \(event): \(pretty: self.membership)")
return .init(applied: changeWasApplied)
}