bneradt opened a new pull request, #13515:
URL: https://github.com/apache/trafficserver/pull/13515

   A transaction that revalidates a stale cached object and cannot take the
   cache write lock is sent back through a second cache lookup while it
   still holds the cache read connection its first lookup opened. The read
   that completes for that second lookup replaces the connection the
   transaction is using: debug builds abort on the read connection
   assertion in HttpCacheSM::state_cache_open_read(), and release builds
   close that connection out from under the stale object saved as the retry
   fallback, leaving the fallback pointing into freed memory. The re-lookup
   runs for every cache_open_write_fail_action rather than only for the two
   that configure a read retry, so fail action 2, which is documented to
   serve the stale object instead of retrying anything, aborts a debug
   build several times a day under production traffic.
   
   This patch limits the re-lookup to the fail actions that configure a
   read retry. A transaction that loses the write lock with a cached object
   and no retry configured now hands that object straight to the freshness
   handling that serves stale content, with no second lookup. The retry
   actions do want that lookup, so this also makes replacing the read
   connection explicit and drops the saved stale object along with the
   connection that owns it, since neither can outlive the other. This adds
   an autest covering both configurations that does not depend on
   contention between transactions: denying the write lock through
   max_open_write_retries makes the failure synchronous, and each
   configuration aborts an unpatched debug build on the production
   assertion.
   
   The re-lookup arrived with the fail action 6 work in #12852, which
   applied it to every non-default fail action; that commit's own test
   notes the stale path is timing sensitive and does not exercise it. The
   resulting aborts resemble the ones #13487 fixed, because both land in
   HttpCacheSM while a cache write retry dispatches events, but they are a
   distinct failure. #13487 stopped HttpSM from canceling its own captive
   action, which aborts on the cancellation assertion in
   HttpCacheSM.cc:138; this is the read connection assertion ten lines
   later, reached with that action perfectly valid. Both fixes are needed,
   and neither subsumes the other.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to