Lin807188583 opened a new pull request, #3418:
URL: https://github.com/apache/brpc/pull/3418

   ## Problem
   ready_to_run* unconditionally calls signal_task() on every task-ready event, 
even when all workers are busy and nobody is parked in wait(). This results in 
unnecessary futex_wake syscalls that wake no thread, wasting CPU under load.
   
   ## Solution
   Add per-tag waiter counting via _tagged_waiter_num: ParkingLot::wait() 
tracks waiters entering/leaving (via parking_lot_waiter_add/sub out-of-line 
forwarders) BEFORE the state check. ready_to_run* checks 
has_waiting_workers(tag) before calling signal_task — if no worker of the given 
tag is parked, the wakeup is skipped (BAIDU_UNLIKELY marks the true branch as 
cold since under load all workers are busy).
   
   ## Race-free design
   The waiter_add() is called BEFORE the get_state() check in wait(). This 
ensures that any concurrent ready_to_run() that calls has_waiting_workers() 
will see the waiter even if it races between the state check and futex_wait(). 
If the state already changed (signal was sent), wait() undoes the tracking and 
returns immediately without sleeping. This eliminates the lost-wakeup window 
entirely.
   
   ## Why it's safe
   - Tasks are already enqueued (push_rq) before the signal check, so they will 
be picked up by the next steal regardless of signaling.
   - _tagged_waiter_num uses relaxed atomics (it's a hint, not a 
synchronization primitive); the actual wake ordering is handled by 
parking_lot's existing futex mechanism.
   
   ## Multi-tag benefit
   Per-tag accounting avoids tag-A's ready_to_run() issuing a signal_task() 
just because tag-B has parked workers.
   
   Tested: bthread_unittest 20/20 on Linux x86 (Ubuntu 24.04/GCC 13) and macOS 
arm64 (M4).
   
   ### What problem does this PR solve?
   
   Issue Number: resolve 
   
   Problem Summary:
   
   ### What is changed and the side effects?
   
   Changed:
   
   Side effects:
   - Performance effects:
   
   - Breaking backward compatibility: 
   
   ---
   ### Check List:
   - Please make sure your changes are compilable.
   - When providing us with a new feature, it is best to add related tests.
   - Please follow [Contributor Covenant Code of 
Conduct](https://github.com/apache/brpc/blob/master/CODE_OF_CONDUCT.md).
   


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


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to