feat: implement locking mechanism for marketplace operations to prevent race conditions
This commit is contained in:
		@@ -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()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user