Release 1.65.10

Release date: May 8, 2026

Release Notes - Seatmap Platform

Version 1.65.10 - 2026-05-08

Release Focus: Prevent GA-seat oversell in booking-service by switching the counter update from absolute UPDATE to a compare-and-swap that fails the loser of any concurrent transaction.


What’s Fixed

GA oversell via concurrent counter updates

Two concurrent BookingService.changeState calls on the same GA group both read active_count / locked_count, computed new absolute values, and wrote them back. Whichever transaction committed second silently overwrote the first with the same precomputed values — so two “successful” locks left only one reflected in the counter. The result: an oversell.

The fix replaces the absolute UPDATE with compare-and-swap. BookingService captures previousActiveCount / previousLockedCount before mutating, and the booking repository’s UPDATE is constrained with WHERE active_count = :previous AND locked_count = :previous. When another transaction wins the race, 0 rows are affected, the repository throws ConcurrentStateChangeException, and the service returns false — which the caller treats as “no availability” and the client retries normally.

A new concurrency test (BookingServiceGaConcurrencyTest) spawns two parallel locks against the same GA and asserts conservation: locked_count_increase == (successful locks) * capacity. The test fails on the unfixed code and passes here.


Affected products

  • booking-serviceBookingService.changeState, BookingRepository UPDATE constraint, new concurrency test.

Upgrade

Drop-in patch release. No API contract changes. Behavior change: under high-concurrency GA lock traffic, the loser of a race now correctly retries instead of silently overwriting — slightly more retry traffic, no more oversells.


Operational note: Customer-reported ticket SEAT-986 (converter cropping for Funtam’s schema_2040.smp) is not fixed by this release despite the SEAT-986 reference in the commit footer — the commit reference is incorrect. The Funtam converter cropping bug remains open. See SEAT-986 comments for details.