diff --git a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs index b74396718..ff1ef81ca 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/RagfairOfferHolder.cs @@ -21,7 +21,7 @@ ItemHelper itemHelper /// /// Expired offer Ids /// - private readonly HashSet _expiredOfferIds = []; + private readonly ConcurrentDictionary _expiredOfferIds = []; /// /// Ragfair offer cache, keyed by offer Id @@ -43,7 +43,7 @@ ItemHelper itemHelper /// private readonly ConcurrentDictionary> _fakePlayerOffers = new(); - private readonly Lock _expiredOfferIdsLock = new(); + private readonly Lock _processExpiredOffersLock = new(); private readonly Lock _ragfairOperationLock = new(); /// @@ -60,11 +60,11 @@ ItemHelper itemHelper /// Get a ragfair offer by its id /// /// RagfairOffer - public HashSet GetStaleOfferIds() + public List GetStaleOfferIds() { - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { - return _expiredOfferIds; + return _expiredOfferIds.Keys.ToList(); } } @@ -107,12 +107,7 @@ public IEnumerable GetOffersByTrader(MongoId traderId) /// RagfairOffer list public List GetOffers() { - if (!_offersById.IsEmpty) - { - return _offersById.Values.ToList(); - } - - return []; + return _offersById.IsEmpty ? [] : _offersById.Values.ToList(); } /// @@ -324,9 +319,9 @@ protected bool AddFakePlayerOffer(MongoId itemTpl, MongoId offerId) /// Id of offer to add to stale collection public void FlagOfferAsExpired(MongoId staleOfferId) { - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { - if (!_expiredOfferIds.Add(staleOfferId)) + if (!_expiredOfferIds.TryAdd(staleOfferId, 0)) { logger.Warning($"Unable to add offer: {staleOfferId} to expired offers"); } @@ -339,7 +334,7 @@ public void FlagOfferAsExpired(MongoId staleOfferId) /// Number of expired offers public int GetExpiredOfferCount() { - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { return _expiredOfferIds.Count; } @@ -352,9 +347,9 @@ public int GetExpiredOfferCount() public IEnumerable> GetExpiredOfferItems() { List expiredOfferIdsCopy; - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { - expiredOfferIdsCopy = _expiredOfferIds.ToList(); + expiredOfferIdsCopy = _expiredOfferIds.Keys.ToList(); } // list of lists of item+children @@ -385,7 +380,7 @@ public IEnumerable> GetExpiredOfferItems() /// public void ResetExpiredOfferIds() { - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { _expiredOfferIds.Clear(); } @@ -397,24 +392,30 @@ public void ResetExpiredOfferIds() /// Timestamp at point offer is 'expired' public void FlagExpiredOffersAfterDate(long timestamp) { - lock (_expiredOfferIdsLock) + lock (_processExpiredOffersLock) { - foreach (var offer in GetOffers()) - { - if (_expiredOfferIds.Contains(offer.Id) || offer.IsTraderOffer()) + var offers = GetOffers(); + Parallel.ForEach( + offers, + offer => { - // Already flagged or trader offer (handled separately), skip - continue; - } + if (_expiredOfferIds.ContainsKey(offer.Id) || offer.IsTraderOffer()) + { + // Already flagged or trader offer (handled separately), skip + return; + } - if (offer.IsStale(timestamp)) - { - if (!_expiredOfferIds.Add(offer.Id)) + if (!offer.IsStale(timestamp)) + { + return; + } + + if (!_expiredOfferIds.TryAdd(offer.Id, 0)) { logger.Warning($"Unable to add offer: {offer.Id} to expired offers as it already exists"); } } - } + ); } } }