feat: implement locking mechanism for marketplace operations to prevent race conditions

This commit is contained in:
2025-09-05 05:09:14 +03:00
parent 45afc8fa31
commit d1e7f4e0f4
3 changed files with 71 additions and 3 deletions

View File

@@ -117,6 +117,13 @@ func (r *apiRepository) GetProducts(ctx context.Context, marketplaceID int, req
resultChan <- cachedMessage.Offers
return
}
locker := *redis.Locker
_, cancel, err := locker.TryWithContext(ctx, fmt.Sprintf("ym:products:marketplace:%d:lock", businessID))
if err != nil {
return
}
defer cancel()
r.setOfferMappingsRateLimit(businessID)
// all offers
var allOffers []*pb.GetProductsResponse_Offer
@@ -213,11 +220,17 @@ func (r *apiRepository) CalculateProductTariffs(ctx context.Context, marketplace
defer close(resultChan)
defer close(errChan)
_, client, _, err := r.setupMarketplaceClient(ctx, marketplaceID)
_, client, businessId, err := r.setupMarketplaceClient(ctx, marketplaceID)
if err != nil {
errChan <- err
return
}
locker := *redis.Locker
_, cancel, err := locker.WithContext(ctx, fmt.Sprintf("ym:tariffs:marketplace:%d:lock", businessId))
if err != nil {
return
}
defer cancel()
r.setTariffsRateLimit()