From 34e5745e993b7a24aaee3f1cfda24a1cca18d1e1 Mon Sep 17 00:00:00 2001 From: jim Date: Sun, 3 May 2026 13:59:51 -0500 Subject: [PATCH] Fixed bugs on API key pool --- URLNotesGrabberCORE/DataAccess.cs | 22 +++++++++++++++++++++ URLNotesGrabberCORE/Program.cs | 33 +++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/URLNotesGrabberCORE/DataAccess.cs b/URLNotesGrabberCORE/DataAccess.cs index aa6b136..c62baec 100644 --- a/URLNotesGrabberCORE/DataAccess.cs +++ b/URLNotesGrabberCORE/DataAccess.cs @@ -1773,6 +1773,28 @@ namespace URLNotesGrabberCORE cmd.ExecuteNonQuery(); } + public static bool IsAllRateLimited(out int minRetrySeconds) + { + minRetrySeconds = 0; + if (!_usePool || _overrideKey != null) return false; + if (_keys.Count <= 1) return true; + + var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + bool all = true; + int min = int.MaxValue; + + foreach (var key in _keys) + { + var retryUntil = GetRetryUntil(key); + if (retryUntil <= now) { all = false; break; } + int remaining = (int)(retryUntil - now); + if (remaining < min) min = remaining; + } + + minRetrySeconds = all ? min : 0; + return all; + } + private static void SaveState() { using var conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + _dbPath); diff --git a/URLNotesGrabberCORE/Program.cs b/URLNotesGrabberCORE/Program.cs index f5e7bfb..0babc2b 100644 --- a/URLNotesGrabberCORE/Program.cs +++ b/URLNotesGrabberCORE/Program.cs @@ -705,14 +705,18 @@ namespace URLNotesGrabberCORE int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60; ApiKeyPool.MarkRateLimited(key, retry); - int remaining = retry; - DateTime retryUntil = DateTime.Now.AddSeconds(retry); - while (remaining > 0) + if (ApiKeyPool.IsAllRateLimited(out int minRetry)) { - Console.WriteLine("Sleeping for {0} more seconds, until {1}", remaining, retryUntil.ToShortTimeString()); - int sleepSeconds = Math.Min(60, remaining); - Thread.Sleep(sleepSeconds * 1000); - remaining -= sleepSeconds; + Console.WriteLine($"[Pool] All keys rate-limited, waiting {minRetry}s before retry"); + int remaining = minRetry; + DateTime retryAt = DateTime.Now.AddSeconds(minRetry); + while (remaining > 0) + { + Console.WriteLine("Sleeping for {0} more seconds, until {1}", remaining, retryAt.ToShortTimeString()); + int sleepSeconds = Math.Min(60, remaining); + Thread.Sleep(sleepSeconds * 1000); + remaining -= sleepSeconds; + } } continue; } @@ -933,10 +937,19 @@ namespace URLNotesGrabberCORE { int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60; ApiKeyPool.MarkRateLimited(key, retry); - for (int s = 0; s <= response.retryInSeconds; s += 60) + + if (ApiKeyPool.IsAllRateLimited(out int minRetry)) { - Console.WriteLine("Sleeping for {0} more seconds, until {1}", response.retryInSeconds - s, DateTime.Now.AddSeconds(response.retryInSeconds - s).ToShortTimeString()); - Thread.Sleep(60000); + Console.WriteLine($"[Pool] All keys rate-limited, waiting {minRetry}s before returning"); + int remaining = minRetry; + DateTime retryAt = DateTime.Now.AddSeconds(minRetry); + while (remaining > 0) + { + Console.WriteLine("Sleeping for {0} more seconds, until {1}", remaining, retryAt.ToShortTimeString()); + int sleepSeconds = Math.Min(60, remaining); + Thread.Sleep(sleepSeconds * 1000); + remaining -= sleepSeconds; + } } return response.statusCode; }