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

   When every parent in a consistent_hash pool is down, selectParent walked the 
whole hash ring taking the global host_status_rwlock on every hop. The ring 
holds 1024 replica nodes per parent (num_parents * 1024 nodes) and the 
chash_lookup() gate withholds wrap_around until the ring is traversed twice, so 
one all-down selection cost ~2 * num_parents * 1024 HostStatus::getHostStatus() 
calls (~49k for 24 parents) -- inline ET_NET CPU that starved the loopback 
health probe and drove the VIP flap in inc-p1s2-260703.
   
   Track the distinct parents examined on each ring: skip the locked 
getHostStatus read for a parent already seen, and force wrap_around once every 
distinct parent has been rejected. The expensive locked read is now paid at 
most once per parent (O(num_parents)); the ring still advances ~O(N*logN) 
cheap, lock-free hops to reach every distinct parent. Selection order and the 
retry-window logic are unchanged.
   
   The seen-parent tracking is sized to num_parents (std::vector<bool>), not 
MAX_PARENTS: the parent.config parser does not cap num_parents at MAX_PARENTS, 
so a fixed [MAX_PARENTS] array would overflow the stack for pools larger than 
64.
   
   Add consistent_hash_ring_walk.test.py: an all-down 100-parent pool (marked 
down via HostStatus, >MAX_PARENTS on purpose) must report "getHostStatus calls: 
100", proving the walk reads each parent once instead of walking the full ring.


-- 
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