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");
}
}
- }
+ );
}
}
}