Fixed bugs on API key pool
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user