Subversion Repositories SmartDukaan

Rev

Hide changed files | Details | Compare with Previous | Blame | RSS feed

Filtering Options

Rev Age Author Path Log message Diff Changes
37706 9 d 3 h amit /trunk/ cart: take the cart row before any line, to break a lock-ordering deadlock

InnoDB was rolling back cart edits with "Deadlock found when trying to get lock"
(GlitchTip #53, 27 deadlocks) and losing others to OptimisticLockException
"actual row count: 0; expected: 1" (11 issues, 42 events). Both are the same cause.

Two request paths took the same two rows in OPPOSITE orders. Adding a line INSERTs
into user.line, and line_cart_id_fk shared-locks the parent cart FIRST, line second.
Validation/hydration mutated the line rows FIRST and wrote cart.total_price second.
Run those concurrently on one cart and it is a cycle. Caught in the act on prod:

T1: INSERT user.line (cart_id=175180781) -> holds S on cart, waits S on line
T2: UPDATE user.cart SET total_price=269340.0, version=175 WHERE version=174
-> holds X on line, waits X on cart
*** WE ROLL BACK TRANSACTION (1)

Fix is to give every mutating path one order: cart, then lines. CartRepository gains
selectByIdForUpdate, and it is called as the first statement of each path that writes
a cart line. Re-taking it inside one request is a no-op.

A lock-ordering fix is all-or-nothing -- one path in the wrong order is enough to
re-form the cycle -- so this covers ALL TEN cart-line writers, not just the two that
happened to show up in the stack traces: createCartItem, clearCart, getCartValidation,
addItemsToCart (x2), addShoppingBag, validateForOpen (x2) and V2BillingController's
bind/unbindInsurance. The audit is worth re-running before adding another writer.

Note validateForOpen and getCartValidation WRITE despite their names (they correct
cart_line quantity/price and roll up cart.total_price), which is why a "validate" call
was ever holding write locks. The lock is placed accordingly; making those genuinely
read-only is a separate, larger change.

This also serialises concurrent edits to the SAME cart, which is what the @Version
column on Cart was already trying and failing to express. Different carts are
different rows, so there is no cost across partners.
 
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/v2/CartValidationServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepositoryImpl.java
/trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2BillingController.java
37640 11 d 14 h amit /trunk/profitmandi-dao/src/ Hot Deal brand: brand-driven membership, model_hot_deal reduced to attributes + oem_brand + oem_catalog_id, migration SQL  
/trunk/profitmandi-dao/src/main/resources/sql/hot_deal_brand_migration.sql
/trunk/profitmandi-dao/src/main/resources/sql/hot_deal_brand_schema.sql
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/catalog/ModelHotDeal.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/catalog/TagListing.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/CatalogRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/CatalogRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/ModelHotDealRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/ModelHotDealRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/service/solr/FofoSolr.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/ModelHotDealService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/ModelHotDealServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/pricing/PricingServiceImpl.java
/trunk/profitmandi-dao/src/test/java/com/spice/profitmandi/service/catalog/ModelHotDealServiceImplTest.java
37305 44 d 14 h ranu /trunk/ carry bag for silver at 1  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/v2/controller/V2CartController.java
37283 47 d 15 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ hot deals: cart/pricing availability reads date-windowed model_hot_deal instead of tag_listing.hot_deals  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/pricing/PricingServiceImpl.java
37143 64 d 14 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Brand eligibility: unified blocked + LOI-ineligible enforcement — new BlockedBrandService; BrandsService restrictedBrands/applyRestrictedSolrExclusion/validateOrderableBrands; hard-validate at add-to-cart (fofoId-aware addItemsToCart) and bulk order; cart validation uses restricted union  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/BlockedBrandService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/BlockedBrandServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/BrandsService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/BrandsServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/order/BulkOrderService.java
35947 204 d 18 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/ Revert r35945: undo cart pessimistic locking (will re-apply after testing)  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepositoryImpl.java
35945 204 d 20 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/ Add pessimistic locking to cart operations to prevent deadlocks; add updateCartItem, removeCartItem, getCartItems methods  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/user/CartRepositoryImpl.java
35690 230 d 0 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ Optimize order creation performance: add overloaded focusedModelShortageValidation with pre-fetched data, add overloaded payThroughWallet and processTransaction to avoid duplicate fetches, fix N+1 queries in BulkOrderService by batch-fetching items and tagListings  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/order/BulkOrderService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/wallet/CommonPaymentService.java
35574 251 d 5 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ Fix price mismatch false positives in cart validation

- Handle cart price = 0/unset: silently update to current price (client bug)
- Use tolerance comparison (0.01) instead of exact Float.compare
- Prevents false PRICE_CHANGED errors from float precision issues
 
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
35573 251 d 6 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ Feature: Add price mismatch detection in cart

- Detect when cart item price differs from current TagListing price
- Notify user with PRICE_CHANGED message showing old vs new price
- Auto-update cart line with current price
- Add logging for price mismatch events
 
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
35493 276 d 8 h amit /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/ N+1 query optimization for B2B order creation flow

- OrderServiceImpl: Batch fetch PendingOrderItems before validation loop (line 402)
- OrderServiceImpl: Batch update opening stock using minusOpeningStockBatch
- OrderServiceImpl: Pre-fetch tagListings and GST rates before createAndGetFofoOrderItem loop
- OrderServiceImpl: Batch fetch PendingOrderItems for status update (line 719)
- CartServiceImpl: Pre-fetch items before getCartValidation loop
- SchemeServiceImpl: Batch fetch SchemeInOut records in processSchemeOut
- SmartCartService: Added minusOpeningStockBatch method for batch updates
- TagListingRepository: Added selectByItemIds batch method
- FofoOpeningStockRepository: Added findByFofoIdAndCatalogIds batch method
- PendingOrderItemRepository: Added selectByIds batch method

Performance improvement: ~70-100 DB queries reduced per order (10 items avg)
 
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/SmartCartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/SmartCartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/TagListingRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/TagListingRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOpeningStockRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/FofoOpeningStockRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/PendingOrderItemRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/PendingOrderItemRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/order/OrderServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/scheme/SchemeServiceImpl.java
35214 345 d 13 h vikas /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ App build Version & Notification Template  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
35211 346 d 12 h vikas /trunk/ App build Version & Notification Template  
/trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/StoreController.java
/trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/TicketChatActivityController.java
35170 351 d 12 h vikas /trunk/ Carry bag 1 rupee to NEW, GOLD, PLATINUM, DIAMOND  
/trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/ProfitMandiConstants.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-web/src/main/java/com/spice/profitmandi/web/controller/UserController.java
35140 354 d 16 h ranu /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ in transit add in instock  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
33244 889 d 18 h ranu /trunk/ add signature added profitmandi exception  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/CategoryRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/catalog/CategoryRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/CsService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/CsServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CurrentInventorySnapshotRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CurrentInventorySnapshotRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CustomerAddressRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CustomerAddressRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CustomerRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/fofo/CustomerRepositoryImpl.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/CsController.java
33172 910 d 15 h tejus.lohani /trunk/ add bulk order service in admin dashboard  
/trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/model/BulkOrderModel.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/order/BulkOrderService.java
/trunk/profitmandi-fofo/src/main/webapp/WEB-INF/views/ftl/bulk_order.vm
/trunk/profitmandi-common/src/main/java/com/spice/profitmandi/common/util/ExcelUtils.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/catalog/ItemLoaderService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/wallet/WalletServiceImpl.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/config/AppConfig.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/OrderController.java
/trunk/profitmandi-fofo/src/main/webapp/resources/js/placement-plan.js
32588 1061 d 13 h amit.gupta /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ Fixed cart  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
32585 1061 d 17 h amit.gupta /trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/ Changed quantity to 400  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
32493 1093 d 18 h amit.gupta /trunk/ Added changes related to auto order creation when internal po is created  
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/PartnerPositionRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/PartnerPositionRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/PartnersPositionRepository.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/PartnersPositionRepositoryImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/cart/CartServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/Supplier.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/entity/warehouse/WarehouseLineItem.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/dao/repository/cs/CsServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionService.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/transaction/TransactionServiceImpl.java
/trunk/profitmandi-dao/src/main/java/com/spice/profitmandi/service/warehouse/PurchaseOrderServiceImpl.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/AuthUserController.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/CsController.java
/trunk/profitmandi-fofo/src/main/java/com/spice/profitmandi/web/controller/warehouse/PurchaseOrderController.java

Show All