Fixed bugs on API key pool

This commit is contained in:
jim
2026-05-03 13:59:51 -05:00
parent 6cec7afb53
commit 34e5745e99
2 changed files with 45 additions and 10 deletions
+22
View File
@@ -1773,6 +1773,28 @@ namespace URLNotesGrabberCORE
cmd.ExecuteNonQuery(); 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() private static void SaveState()
{ {
using var conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + _dbPath); using var conn = new System.Data.SQLite.SQLiteConnection("Data Source=" + _dbPath);
+23 -10
View File
@@ -705,14 +705,18 @@ namespace URLNotesGrabberCORE
int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60; int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60;
ApiKeyPool.MarkRateLimited(key, retry); ApiKeyPool.MarkRateLimited(key, retry);
int remaining = retry; if (ApiKeyPool.IsAllRateLimited(out int minRetry))
DateTime retryUntil = DateTime.Now.AddSeconds(retry);
while (remaining > 0)
{ {
Console.WriteLine("Sleeping for {0} more seconds, until {1}", remaining, retryUntil.ToShortTimeString()); Console.WriteLine($"[Pool] All keys rate-limited, waiting {minRetry}s before retry");
int sleepSeconds = Math.Min(60, remaining); int remaining = minRetry;
Thread.Sleep(sleepSeconds * 1000); DateTime retryAt = DateTime.Now.AddSeconds(minRetry);
remaining -= sleepSeconds; 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; continue;
} }
@@ -933,10 +937,19 @@ namespace URLNotesGrabberCORE
{ {
int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60; int retry = response.retryInSeconds > 0 ? response.retryInSeconds : 60;
ApiKeyPool.MarkRateLimited(key, retry); 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()); Console.WriteLine($"[Pool] All keys rate-limited, waiting {minRetry}s before returning");
Thread.Sleep(60000); 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; return response.statusCode;
} }