Fix B6: Market concurrency lock, watchlist exclusion from cleanup, optimized trade ID deduplication query, and TradeHistoryWorker sync logic

This commit is contained in:
Richard
2026-07-03 11:10:53 +02:00
parent 434c631290
commit 5fe7ab63ac
7 changed files with 45 additions and 20 deletions
@@ -15,6 +15,7 @@ namespace Predictalytics.Worker.Services;
public class MarketSyncWorker : BackgroundService
{
private static DateTime _lastDbError = DateTime.MinValue;
private static DateTime _lastClosedMarketSync = DateTime.MinValue;
private readonly IServiceProvider _services;
private readonly IPlatformStatisticsService _statsService;
private readonly ILogger<MarketSyncWorker> _logger;
@@ -42,7 +43,13 @@ public class MarketSyncWorker : BackgroundService
using var platformCtx = PlatformLogContext.Push(p.PlatformName);
int cycleTotalSynced = 0;
foreach (var includeClosed in new[] { false, true })
var includeClosedOptions = new List<bool> { false };
if (DateTime.UtcNow - _lastClosedMarketSync >= TimeSpan.FromDays(1))
{
includeClosedOptions.Add(true);
}
foreach (var includeClosed in includeClosedOptions)
{
_logger.LogWarning("[{Platform}] Syncing markets (includeClosed={Closed})...", p.PlatformName, includeClosed);
@@ -73,6 +80,11 @@ public class MarketSyncWorker : BackgroundService
if (passSynced % 500 == 0)
_logger.LogWarning("[{Platform}] Synced {Total} markets so far (includeClosed={Closed})...", p.PlatformName, passSynced, includeClosed);
}
if (includeClosed)
{
_lastClosedMarketSync = DateTime.UtcNow;
}
}
// Need a temporary scope for stats
@@ -77,7 +77,8 @@ public class PollingWorker : BackgroundService
// ── Deduplicate: check each trade against DB ──
var newTrades = new List<Domain.Entities.Trade>();
var knownTradeIds = await tradeRepo.GetKnownPlatformTradeIdsAsync(trader.Platform, trader.Id, stoppingToken);
var fetchedTradeIds = validTrades.Select(tr => tr.PlatformTradeId).ToList();
var knownTradeIds = await tradeRepo.GetKnownPlatformTradeIdsAsync(trader.Platform, trader.Id, fetchedTradeIds, stoppingToken);
foreach (var trade in validTrades)
{
@@ -85,7 +85,8 @@ public class TradeHistoryWorker : BackgroundService
var fetchedTrades = await provider.GetTraderTradesAsync(trader.PlatformUserId, TradesPerFetch, ct);
var validTrades = fetchedTrades.Where(tr => !string.IsNullOrWhiteSpace(tr.PlatformTradeId)).ToList();
var knownTradeIds = await tradeRepo.GetKnownPlatformTradeIdsAsync(trader.Platform, trader.Id, ct);
var fetchedTradeIds = validTrades.Select(tr => tr.PlatformTradeId).ToList();
var knownTradeIds = await tradeRepo.GetKnownPlatformTradeIdsAsync(trader.Platform, trader.Id, fetchedTradeIds, ct);
// Collect all unique AssetIds we might need to resolve
var assetIdsToResolve = validTrades
@@ -111,7 +112,6 @@ public class TradeHistoryWorker : BackgroundService
{
if (knownTradeIds.Contains(trade.PlatformTradeId))
{
if (!isInitial) break;
continue;
}