add fatal log

This commit is contained in:
anlicheng 2026-05-28 16:11:31 +08:00
parent c7f216e810
commit 6714d22137
4 changed files with 32 additions and 0 deletions

View File

@ -145,9 +145,11 @@ actor SDLContextActor {
try await self.runRootBody() try await self.runRootBody()
await self.cleanupRoot() await self.cleanupRoot()
} catch is CancellationError { } catch is CancellationError {
SDLLogger.fatal("[SDLContext] root task cancelled")
await self.cleanupRoot() await self.cleanupRoot()
throw CancellationError() throw CancellationError()
} catch { } catch {
SDLLogger.fatal("[SDLContext] root task failed: \(error)")
await self.readySignal.fail(error) await self.readySignal.fail(error)
await self.cleanupRoot() await self.cleanupRoot()
throw error throw error
@ -158,6 +160,7 @@ actor SDLContextActor {
do { do {
try await self.readySignal.wait(timeout: .seconds(30)) try await self.readySignal.wait(timeout: .seconds(30))
} catch { } catch {
SDLLogger.fatal("[SDLContext] start failed while waiting ready signal: \(error)")
rootTask.cancel() rootTask.cancel()
_ = try? await rootTask.value _ = try? await rootTask.value
self.rootTask = nil self.rootTask = nil
@ -167,6 +170,7 @@ actor SDLContextActor {
// context // context
public func stop() async { public func stop() async {
SDLLogger.fatal("[SDLContext] stop requested")
let rootTask = self.rootTask let rootTask = self.rootTask
self.rootTask = nil self.rootTask = nil
@ -434,6 +438,7 @@ extension SDLContextActor {
case .requestExposedService: case .requestExposedService:
await self.requestExposedService() await self.requestExposedService()
case .shutdown(let message): case .shutdown(let message):
SDLLogger.fatal("[SDLContext] Super shutdown received: \(message)")
self.publishTunnelEvent(message: message) self.publishTunnelEvent(message: message)
let error = NSError(domain: "com.jihe.punchnet.tun", code: -2) let error = NSError(domain: "com.jihe.punchnet.tun", code: -2)
self.provider.cancelTunnelWithError(error) self.provider.cancelTunnelWithError(error)
@ -456,12 +461,14 @@ extension SDLContextActor {
SDLLogger.log("[SDLContext] setNetworkSettings successed") SDLLogger.log("[SDLContext] setNetworkSettings successed")
await self.readySignal.succeed(()) await self.readySignal.succeed(())
} catch { } catch {
SDLLogger.fatal("[SDLContext] apply tunnel network settings failed: \(error)")
SDLLogger.log("[SDLContext] setTunnelNetworkSettings get error: \(error)") SDLLogger.log("[SDLContext] setTunnelNetworkSettings get error: \(error)")
await self.failTunnel(error) await self.failTunnel(error)
} }
} }
private func failTunnel(_ error: Error) async { private func failTunnel(_ error: Error) async {
SDLLogger.fatal("[SDLContext] failTunnel: \(error)")
await self.readySignal.fail(error) await self.readySignal.fail(error)
self.provider.cancelTunnelWithError(error) self.provider.cancelTunnelWithError(error)
} }

View File

@ -107,6 +107,7 @@ actor SDLSuperControlPlane {
private func handleRegisterSuperAck(_ registerSuperAck: SDLRegisterSuperAck) async { private func handleRegisterSuperAck(_ registerSuperAck: SDLRegisterSuperAck) async {
guard let key = try? self.rsaCipher.decode(data: Data(registerSuperAck.key)) else { guard let key = try? self.rsaCipher.decode(data: Data(registerSuperAck.key)) else {
SDLLogger.fatal("[SDLSuperControlPlane] registerSuperAck invalid key, will fail tunnel")
SDLLogger.log("[SDLContext] registerSuperAck invalid key") SDLLogger.log("[SDLContext] registerSuperAck invalid key")
await self.onDecision(.failTunnel(SDLError.invalidKey)) await self.onDecision(.failTunnel(SDLError.invalidKey))
return return
@ -123,6 +124,7 @@ actor SDLSuperControlPlane {
case "chacha20": case "chacha20":
cipher = CCChaCha20Cipher(regionId: regionId, keyData: key) cipher = CCChaCha20Cipher(regionId: regionId, keyData: key)
default: default:
SDLLogger.fatal("[SDLSuperControlPlane] unsupported cipher algorithm \(algorithm), will fail tunnel")
SDLLogger.log("[SDLContext] registerSuperAck invalid algorithm \(algorithm)") SDLLogger.log("[SDLContext] registerSuperAck invalid algorithm \(algorithm)")
await self.onDecision(.failTunnel(SDLError.unsupportedAlgorithm(algorithm: algorithm))) await self.onDecision(.failTunnel(SDLError.unsupportedAlgorithm(algorithm: algorithm)))
return return
@ -140,6 +142,7 @@ actor SDLSuperControlPlane {
switch errorCode { switch errorCode {
case .invalidToken, .nodeDisabled: case .invalidToken, .nodeDisabled:
SDLLogger.fatal("[SDLSuperControlPlane] SuperNak \(errorCode) will fail tunnel: \(errorMessage)")
await self.onDecision(.publishTunnelEvent(code: Int(errorCode.rawValue), message: errorMessage)) await self.onDecision(.publishTunnelEvent(code: Int(errorCode.rawValue), message: errorMessage))
await self.onDecision(.failTunnel(NSError(domain: "com.jihe.punchnet.tun", code: -1))) await self.onDecision(.failTunnel(NSError(domain: "com.jihe.punchnet.tun", code: -1)))
case .noIpAddress, .networkFault, .internalFault: case .noIpAddress, .networkFault, .internalFault:
@ -161,6 +164,7 @@ actor SDLSuperControlPlane {
SDLLogger.log("[SDLContext] exposedServiceChanged event") SDLLogger.log("[SDLContext] exposedServiceChanged event")
await self.onDecision(.requestExposedService) await self.onDecision(.requestExposedService)
case .shutdown(let shutdownEvent): case .shutdown(let shutdownEvent):
SDLLogger.fatal("[SDLSuperControlPlane] shutdown event received: \(shutdownEvent.message)")
await self.onDecision(.shutdown(message: shutdownEvent.message)) await self.onDecision(.shutdown(message: shutdownEvent.message))
case .none: case .none:
() ()

View File

@ -36,6 +36,10 @@ public class SDLLogger: @unchecked Sendable {
public func _log(_ message: String) { public func _log(_ message: String) {
self.log.info("\(message, privacy: .public)") self.log.info("\(message, privacy: .public)")
} }
public func _fatal(_ message: String) {
self.log.fault("\(message, privacy: .public)")
}
public static func log(_ message: @autoclosure () -> String, for system: Subsystem = .debug) { public static func log(_ message: @autoclosure () -> String, for system: Subsystem = .debug) {
guard self.isEnabled(system), let logger = loggers[system] else { guard self.isEnabled(system), let logger = loggers[system] else {
@ -45,6 +49,14 @@ public class SDLLogger: @unchecked Sendable {
logger._log(message()) logger._log(message())
} }
public static func fatal(_ message: @autoclosure () -> String, for system: Subsystem = .debug) {
guard let logger = loggers[system] else {
return
}
logger._fatal(message())
}
private static func isEnabled(_ system: Subsystem) -> Bool { private static func isEnabled(_ system: Subsystem) -> Bool {
switch system { switch system {
case .debug: case .debug:

View File

@ -30,6 +30,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
guard let options, let config = SDLConfiguration.parse(options: options) else { guard let options, let config = SDLConfiguration.parse(options: options) else {
SDLLogger.fatal("[PacketTunnelProvider] startTunnel failed: invalid configuration")
completionHandler(TunnelError.invalidConfiguration) completionHandler(TunnelError.invalidConfiguration)
return return
} }
@ -39,6 +40,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
SDLLogger.fatal("[PacketTunnelProvider] stopTunnel requested, reason: \(reason.rawValue)")
self.stopContext(clearRuntimeConfiguration: true, completionHandler: completionHandler) self.stopContext(clearRuntimeConfiguration: true, completionHandler: completionHandler)
} }
@ -61,6 +63,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
override func sleep(completionHandler: @escaping () -> Void) { override func sleep(completionHandler: @escaping () -> Void) {
SDLLogger.fatal("[PacketTunnelProvider] sleep requested, will stop current context")
self.stopContext(clearRuntimeConfiguration: false) { self.stopContext(clearRuntimeConfiguration: false) {
SDLLogger.log("[PacketTunnelProvider] sleep") SDLLogger.log("[PacketTunnelProvider] sleep")
completionHandler() completionHandler()
@ -71,6 +74,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
SDLLogger.log("[PacketTunnelProvider] wake up!!!!!!!") SDLLogger.log("[PacketTunnelProvider] wake up!!!!!!!")
self.startCachedContext { err in self.startCachedContext { err in
if let err { if let err {
SDLLogger.fatal("[PacketTunnelProvider] wakeup start failed: \(err)")
SDLLogger.log("[PacketTunnelProvider] wakeup start failed: \(err.localizedDescription)") SDLLogger.log("[PacketTunnelProvider] wakeup start failed: \(err.localizedDescription)")
} else { } else {
SDLLogger.log("[PacketTunnelProvider] wakeup and try start") SDLLogger.log("[PacketTunnelProvider] wakeup and try start")
@ -119,6 +123,7 @@ private extension PacketTunnelProvider {
self.runtimeLock.unlock() self.runtimeLock.unlock()
guard let config, let rsaCipher else { guard let config, let rsaCipher else {
SDLLogger.fatal("[PacketTunnelProvider] startCachedContext failed: missing cached runtime configuration")
completionHandler(TunnelError.invalidConfiguration) completionHandler(TunnelError.invalidConfiguration)
return return
} }
@ -150,11 +155,13 @@ private extension PacketTunnelProvider {
try await contextActor.start() try await contextActor.start()
self.finishContextStart(contextActor, error: nil) self.finishContextStart(contextActor, error: nil)
} catch { } catch {
SDLLogger.fatal("[PacketTunnelProvider] context start failed: \(error)")
self.finishContextStart(contextActor, error: error) self.finishContextStart(contextActor, error: error)
} }
} }
case .starting, .running, .stopping: case .starting, .running, .stopping:
SDLLogger.fatal("[PacketTunnelProvider] startContext rejected: invalid runtime state \(self.runtimeState)")
self.runtimeLock.unlock() self.runtimeLock.unlock()
completionHandler(TunnelError.invalidContext) completionHandler(TunnelError.invalidContext)
} }
@ -166,6 +173,7 @@ private extension PacketTunnelProvider {
let startCompletionHandler = self.startCompletionHandler let startCompletionHandler = self.startCompletionHandler
guard contextActor != nil else { guard contextActor != nil else {
SDLLogger.fatal("[PacketTunnelProvider] stopContext requested while context is nil, clearRuntimeConfiguration: \(clearRuntimeConfiguration)")
self.runtimeState = .idle self.runtimeState = .idle
self.startCompletionHandler = nil self.startCompletionHandler = nil
if clearRuntimeConfiguration { if clearRuntimeConfiguration {
@ -187,6 +195,7 @@ private extension PacketTunnelProvider {
} }
self.runtimeLock.unlock() self.runtimeLock.unlock()
SDLLogger.fatal("[PacketTunnelProvider] stopContext will stop current context, clearRuntimeConfiguration: \(clearRuntimeConfiguration)")
startCompletionHandler?(TunnelError.invalidContext) startCompletionHandler?(TunnelError.invalidContext)
Task { Task {