diff --git a/Libraries/Core/Generators/RagfairOfferGenerator.cs b/Libraries/Core/Generators/RagfairOfferGenerator.cs index 2e6c14dd..338867da 100644 --- a/Libraries/Core/Generators/RagfairOfferGenerator.cs +++ b/Libraries/Core/Generators/RagfairOfferGenerator.cs @@ -362,7 +362,7 @@ public class RagfairOfferGenerator( stopwatch.Stop(); if (logger.IsLogEnabled(LogLevel.Debug)) { - logger.Debug($"Took {stopwatch.ElapsedMilliseconds}ms to GetRagfairAssorts"); + logger.Debug($"Took {stopwatch.ElapsedMilliseconds}ms to GetRagfairAssorts - {assortItemsToProcess.Count} items"); } stopwatch.Restart(); diff --git a/Libraries/Core/Servers/RagfairServer.cs b/Libraries/Core/Servers/RagfairServer.cs index c15f1904..43120f8b 100644 --- a/Libraries/Core/Servers/RagfairServer.cs +++ b/Libraries/Core/Servers/RagfairServer.cs @@ -60,6 +60,7 @@ public class RagfairServer( _ragfairOfferGenerator.GenerateDynamicOffers(expiredAssortsWithChildren); _ragfairOfferService.RemoveExpiredOffers(); + GC.Collect(GC.MaxGeneration, GCCollectionMode.Optimized, true, true); } _ragfairRequiredItemsService.BuildRequiredItemTable(); diff --git a/Libraries/Core/Services/RagfairRequiredItemsService.cs b/Libraries/Core/Services/RagfairRequiredItemsService.cs index ea0e814f..18123dc1 100644 --- a/Libraries/Core/Services/RagfairRequiredItemsService.cs +++ b/Libraries/Core/Services/RagfairRequiredItemsService.cs @@ -10,17 +10,18 @@ public class RagfairRequiredItemsService( RagfairOfferService _ragfairOfferService, PaymentHelper _paymentHelper) { - protected ConcurrentDictionary> _requiredItemsCache; + protected ConcurrentDictionary> _requiredItemsCache = new(); public List? GetRequiredItemsById(string searchId) { _requiredItemsCache.TryGetValue(searchId, out var list); + return list; } public void BuildRequiredItemTable() { - _requiredItemsCache = new ConcurrentDictionary>(); + _requiredItemsCache.Clear(); foreach (var offer in _ragfairOfferService.GetOffers()) foreach (var requirement in offer.Requirements) { diff --git a/Libraries/Core/Utils/RagfairOfferHolder.cs b/Libraries/Core/Utils/RagfairOfferHolder.cs index 9f2bbd46..bb0c210f 100644 --- a/Libraries/Core/Utils/RagfairOfferHolder.cs +++ b/Libraries/Core/Utils/RagfairOfferHolder.cs @@ -1,4 +1,3 @@ -using System.Collections.Concurrent; using Core.Helpers; using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Ragfair; @@ -27,8 +26,8 @@ public class RagfairOfferHolder( protected Dictionary> _offersByTrader = new(); // key = traderId, value = list of offerIds protected object _offersByTraderLock = new(); - // Use dict for the fast key lookup, value is not used - protected ConcurrentDictionary _expiredOfferIds = []; + protected HashSet _expiredOfferIds = []; + protected object _expiredOfferIdsLock = new(); public RagfairOffer? GetOfferById(string id) { @@ -125,7 +124,7 @@ public class RagfairOfferHolder( AddOfferByTrader(sellerId, offer); } - AddOfferByTemplates(sellerId, offer); + AddOfferByTemplates(itemTpl, offer); } } @@ -167,9 +166,9 @@ public class RagfairOfferHolder( lock (_offersByTemplateLock) { var firstItem = offer.Items.FirstOrDefault(); - if (_offersByTemplate.ContainsKey(firstItem.Template)) + if (_offersByTemplate.TryGetValue(firstItem.Template, out var offers)) { - _offersByTemplate[firstItem.Template].Remove(offer.Id); + offers.Remove(offer.Id); } } } @@ -238,7 +237,10 @@ public class RagfairOfferHolder( /// Id of offer to add to stale collection public void FlagOfferAsExpired(string staleOfferId) { - _expiredOfferIds.TryAdd(staleOfferId, null); + lock (_expiredOfferIdsLock) + { + _expiredOfferIds.Add(staleOfferId); + } } /// @@ -247,7 +249,10 @@ public class RagfairOfferHolder( /// Number of expired offers public int GetExpiredOfferCount() { - return _expiredOfferIds.Count; + lock (_expiredOfferIdsLock) + { + return _expiredOfferIds.Count; + } } /// @@ -256,28 +261,30 @@ public class RagfairOfferHolder( /// Expired offer assorts public List> GetExpiredOfferItems() { - // list of lists of item+children - var expiredItems = new List>(); - - foreach (var (expiredOfferId, _) in _expiredOfferIds) + lock (_expiredOfferIdsLock) { - var offer = GetOfferById(expiredOfferId); - if (offer is null) + // list of lists of item+children + var expiredItems = new List>(); + foreach (var expiredOfferId in _expiredOfferIds) { - logger.Warning($"offerId: {expiredOfferId} was not found !!"); - continue; - } - if (offer?.Items?.Count == 0) - { - logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items"); + var offer = GetOfferById(expiredOfferId); + if (offer is null) + { + logger.Warning($"offerId: {expiredOfferId} was not found !!"); + continue; + } + if (offer?.Items?.Count == 0) + { + logger.Error($"Unable to process expired offer: {expiredOfferId}, it has no items"); - continue; + continue; + } + + expiredItems.Add(offer.Items); } - expiredItems.Add(offer.Items); + return expiredItems; } - - return expiredItems; } /** @@ -285,7 +292,10 @@ public class RagfairOfferHolder( */ public void ResetExpiredOfferIds() { - _expiredOfferIds.Clear(); + lock (_expiredOfferIdsLock) + { + _expiredOfferIds.Clear(); + } } /// @@ -294,9 +304,11 @@ public class RagfairOfferHolder( /// public void FlagExpiredOffersAfterDate(long timestamp) { + lock (_expiredOfferIdsLock) + { foreach (var offer in GetOffers()) { - if (_expiredOfferIds.ContainsKey(offer.Id) || ragfairServerHelper.IsTrader(offer.User.Id)) + if (_expiredOfferIds.Contains(offer.Id) || ragfairServerHelper.IsTrader(offer.User.Id)) { // Already flagged or trader offer (handled separately), skip continue; @@ -304,17 +316,20 @@ public class RagfairOfferHolder( if (IsStale(offer, timestamp)) { - _expiredOfferIds.TryAdd(offer.Id, null); + _expiredOfferIds.Add(offer.Id); } } + } } public void RemoveExpiredOffers() { - logger.Warning($"removing {_expiredOfferIds.Count} expired offers"); - foreach (var (expiredOfferId, _) in _expiredOfferIds) + lock (_expiredOfferIdsLock) { - RemoveOffer(expiredOfferId, false); + foreach (var expiredOfferId in _expiredOfferIds) + { + RemoveOffer(expiredOfferId, false); + } } } }