perf: throttle gateway environment checks

This commit is contained in:
Peter Steinberger
2025-12-19 18:21:55 +01:00
parent aec1869d32
commit fc7a63a4de

View File

@@ -53,6 +53,8 @@ final class GatewayProcessManager {
private var desiredActive = false private var desiredActive = false
private var stopping = false private var stopping = false
private var recentCrashes: [Date] = [] private var recentCrashes: [Date] = []
private var environmentRefreshTask: Task<Void, Never>?
private var lastEnvironmentRefresh: Date?
private final class GatewayLockHandle { private final class GatewayLockHandle {
private let fd: FileDescriptor private let fd: FileDescriptor
@@ -73,6 +75,7 @@ final class GatewayProcessManager {
private let logLimit = 20000 // characters to keep in-memory private let logLimit = 20000 // characters to keep in-memory
private let maxCrashes = 3 private let maxCrashes = 3
private let crashWindow: TimeInterval = 120 // seconds private let crashWindow: TimeInterval = 120 // seconds
private let environmentRefreshMinInterval: TimeInterval = 30
func setActive(_ active: Bool) { func setActive(_ active: Bool) {
// Remote mode should never spawn a local gateway; treat as stopped. // Remote mode should never spawn a local gateway; treat as stopped.
@@ -141,12 +144,26 @@ final class GatewayProcessManager {
self.execution = nil self.execution = nil
} }
func refreshEnvironmentStatus() { func refreshEnvironmentStatus(force: Bool = false) {
Task { let now = Date()
if !force {
if self.environmentRefreshTask != nil { return }
if let last = self.lastEnvironmentRefresh,
now.timeIntervalSince(last) < self.environmentRefreshMinInterval
{
return
}
}
self.lastEnvironmentRefresh = now
self.environmentRefreshTask = Task { [weak self] in
let status = await Task.detached(priority: .utility) { let status = await Task.detached(priority: .utility) {
GatewayEnvironment.check() GatewayEnvironment.check()
}.value }.value
self.environmentStatus = status await MainActor.run {
guard let self else { return }
self.environmentStatus = status
self.environmentRefreshTask = nil
}
} }
} }