From 62c336fbc50a2d8d84b2094130765ecbb20e6f48 Mon Sep 17 00:00:00 2001 From: mplorentz Date: Wed, 17 Jul 2024 11:39:14 -0400 Subject: [PATCH 1/2] Lower concurrent queue limit in RelaySubscription and improve error logging --- Nos/Service/Analytics.swift | 10 ++++++++-- Nos/Service/Relay/RelayService.swift | 11 +++++++++-- .../Relay/RelaySubscriptionManager.swift | 18 +++++++++++++----- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Nos/Service/Analytics.swift b/Nos/Service/Analytics.swift index 3c37d0f49..6fe964ec1 100644 --- a/Nos/Service/Analytics.swift +++ b/Nos/Service/Analytics.swift @@ -172,8 +172,14 @@ class Analytics { // MARK: - Relays - func rateLimited(by socket: WebSocket) { - track("Rate Limited", properties: ["relay": socket.request.url?.absoluteString ?? "null"]) + func rateLimited(by socket: WebSocket, requestCount: Int) { + track( + "Rate Limited", + properties: [ + "relay": socket.request.url?.absoluteString ?? "null", + "count": requestCount, + ] + ) } func badRequest(from socket: WebSocket, message: String) { diff --git a/Nos/Service/Relay/RelayService.swift b/Nos/Service/Relay/RelayService.swift index cd3ae05d8..b6cd5d882 100644 --- a/Nos/Service/Relay/RelayService.swift +++ b/Nos/Service/Relay/RelayService.swift @@ -455,8 +455,15 @@ extension RelayService { let response = responseArray.description Log.debug("Notice from \(socket.host): \(response)") if let notice = responseArray[safe: 1] as? String { - if notice == "rate limited" { - analytics.rateLimited(by: socket) + if notice == "rate limited" || notice == "ERROR: too many concurrent REQs" { + Task { + let numberOfRequests = await subscriptionManager.active() + .filter { subscription in + subscription.relayAddress == socket.url + } + .count + analytics.rateLimited(by: socket, requestCount: numberOfRequests) + } } else if notice.contains("bad req:") { analytics.badRequest(from: socket, message: response) } diff --git a/Nos/Service/Relay/RelaySubscriptionManager.swift b/Nos/Service/Relay/RelaySubscriptionManager.swift index e0b4fc222..2c153a155 100644 --- a/Nos/Service/Relay/RelaySubscriptionManager.swift +++ b/Nos/Service/Relay/RelaySubscriptionManager.swift @@ -41,7 +41,7 @@ actor RelaySubscriptionManagerActor: RelaySubscriptionManager { } /// Limit of the number of active subscriptions in a single relay - private let queueLimit = 25 + private let queueLimit = 10 // MARK: - Protocol conformance @@ -201,10 +201,18 @@ actor RelaySubscriptionManagerActor: RelaySubscriptionManager { } #if DEBUG - let allCount = all.count - let activeCount = active.count - if allCount > activeCount { - Log.debug("\(allCount - activeCount) subscriptions waiting in queue.") + // Print number of waiting subscriptions for each relay + if all.count > active.count { + var waitingSubscriptionsByRelay = [URL: Int]() + for subscription in all { + if subscription.subscriptionStartDate == nil { + let count = waitingSubscriptionsByRelay[subscription.relayAddress] ?? 0 + waitingSubscriptionsByRelay[subscription.relayAddress] = count + 1 + } + } + for (relayAddress, count) in waitingSubscriptionsByRelay { + Log.debug("\(relayAddress) has \(count) subscriptions waiting in queue.") + } } #endif } From a89fc4b00e867e9e644a3ccb49705747a2514185 Mon Sep 17 00:00:00 2001 From: mplorentz Date: Wed, 17 Jul 2024 17:02:31 -0400 Subject: [PATCH 2/2] Fix swiftlint warning --- Nos/Service/Relay/RelaySubscriptionManager.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Nos/Service/Relay/RelaySubscriptionManager.swift b/Nos/Service/Relay/RelaySubscriptionManager.swift index 2c153a155..c70dd0de7 100644 --- a/Nos/Service/Relay/RelaySubscriptionManager.swift +++ b/Nos/Service/Relay/RelaySubscriptionManager.swift @@ -204,11 +204,9 @@ actor RelaySubscriptionManagerActor: RelaySubscriptionManager { // Print number of waiting subscriptions for each relay if all.count > active.count { var waitingSubscriptionsByRelay = [URL: Int]() - for subscription in all { - if subscription.subscriptionStartDate == nil { - let count = waitingSubscriptionsByRelay[subscription.relayAddress] ?? 0 - waitingSubscriptionsByRelay[subscription.relayAddress] = count + 1 - } + for subscription in all where subscription.subscriptionStartDate == nil { + let count = waitingSubscriptionsByRelay[subscription.relayAddress] ?? 0 + waitingSubscriptionsByRelay[subscription.relayAddress] = count + 1 } for (relayAddress, count) in waitingSubscriptionsByRelay { Log.debug("\(relayAddress) has \(count) subscriptions waiting in queue.")