减少actor的使用

This commit is contained in:
anlicheng 2026-03-10 17:57:44 +08:00
parent d930dbafad
commit 182f6ffd17
2 changed files with 28 additions and 15 deletions

View File

@ -46,7 +46,7 @@ actor SDLContextActor {
private var dnsWorker: Task<Void, Never>?
private var quicClient: SDLQUICClient?
private var quicWorkers: [Task<Void, Never>]?
private var quicWorker: Task<Void, Never>?
nonisolated private let puncherActor: SDLPuncherActor
//
@ -136,7 +136,7 @@ actor SDLContextActor {
}
private func startQUICClient() async throws -> SDLQUICClient {
self.quicWorkers?.forEach {$0.cancel()}
self.quicWorker?.cancel()
self.quicClient?.stop()
// monitor
@ -149,7 +149,7 @@ actor SDLContextActor {
try await Task.sleep(for: .seconds(0.2))
SDLLogger.shared.log("[SDLContext] start quic client ready")
let messageTask = Task.detached {
self.quicWorker = Task.detached {
for await message in quicClient.messageStream {
switch message {
case .welcome(let welcome):
@ -174,9 +174,7 @@ actor SDLContextActor {
}
}
}
self.quicClient = quicClient
self.quicWorkers = [messageTask]
return quicClient
}
@ -310,8 +308,8 @@ actor SDLContextActor {
self.udpHoleWorkers?.forEach { $0.cancel() }
self.udpHoleWorkers = nil
self.quicWorkers?.forEach { $0.cancel() }
self.quicWorkers = nil
self.quicWorker?.cancel()
self.quicWorker = nil
self.dnsWorker?.cancel()
self.dnsWorker = nil
@ -433,7 +431,7 @@ actor SDLContextActor {
case .natChanged(let natChangedEvent):
let dstMac = natChangedEvent.mac
SDLLogger.shared.log("[SDLContext] natChangedEvent, dstMac: \(dstMac)", level: .info)
await sessionManager.removeSession(dstMac: dstMac)
sessionManager.removeSession(dstMac: dstMac)
case .sendRegister(let sendRegisterEvent):
SDLLogger.shared.log("[SDLContext] sendRegisterEvent, ip: \(sendRegisterEvent)", level: .debug)
let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp)
@ -473,7 +471,7 @@ actor SDLContextActor {
}
}
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) async throws {
private func handleRegister(remoteAddress: SocketAddress, register: SDLRegister) throws {
let networkAddr = config.networkAddress
SDLLogger.shared.log("register packet: \(register), network_address: \(networkAddr)", level: .debug)
@ -488,18 +486,18 @@ actor SDLContextActor {
self.udpHole?.send(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress)
// , super-nodenatudpnat
let session = Session(dstMac: register.srcMac, natAddress: remoteAddress)
await self.sessionManager.addSession(session: session)
self.sessionManager.addSession(session: session)
} else {
SDLLogger.shared.log("SDLContext didReadRegister get a invalid packet, because dst_ip not matched: \(register.dstMac)", level: .warning)
}
}
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) {
// tun,
let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {
let session = Session(dstMac: registerAck.srcMac, natAddress: remoteAddress)
await self.sessionManager.addSession(session: session)
self.sessionManager.addSession(session: session)
} else {
SDLLogger.shared.log("SDLContext didReadRegisterAck get a invalid packet, because dst_mac not matched: \(registerAck.dstMac)", level: .warning)
}
@ -553,7 +551,7 @@ actor SDLContextActor {
let identitySnapshot = self.snapshotPublisher.current()
let ruleMap = identitySnapshot.lookup(data.identityID)
if self.authIPPacket(ipPacket: ipPacket, ruleMap: ruleMap) {
if self.checkPolicy(ipPacket: ipPacket, ruleMap: ruleMap) {
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([packet])
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), allow", level: .debug)
@ -568,7 +566,7 @@ actor SDLContextActor {
}
}
private func authIPPacket(ipPacket: IPPacket, ruleMap: IdentityRuleMap?) -> Bool {
private func checkPolicy(ipPacket: IPPacket, ruleMap: IdentityRuleMap?) -> Bool {
//
if let reverseFlowSession = ipPacket.flowSession()?.reverse(),
self.flowSessionManager.hasSession(reverseFlowSession) {

View File

@ -28,7 +28,8 @@ struct Session {
}
}
actor SessionManager {
class SessionManager {
private let locker = NSLock()
private var sessions: [Data:Session] = [:]
// session
@ -36,6 +37,11 @@ actor SessionManager {
func getSession(toAddress: Data) -> Session? {
let timestamp = Int32(Date().timeIntervalSince1970)
locker.lock()
defer {
locker.unlock()
}
if var session = self.sessions[toAddress] {
if session.lastTimestamp >= timestamp + ttl {
session.updateLastTimestamp(timestamp)
@ -50,10 +56,19 @@ actor SessionManager {
}
func addSession(session: Session) {
locker.lock()
defer {
locker.unlock()
}
self.sessions[session.dstMac] = session
}
func removeSession(dstMac: Data) {
locker.lock()
defer {
locker.unlock()
}
self.sessions.removeValue(forKey: dstMac)
}