mutating func applyClusterEvent()

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)
    }