> On Nov 28, 2023, at 4:29 PM, Yann Ylavic <ylavic....@gmail.com> wrote: > > On Fri, Nov 24, 2023 at 3:28 PM Ruediger Pluem <rpl...@apache.org > <mailto:rpl...@apache.org>> wrote: >> >> On 11/24/23 10:59 AM, Yann Ylavic wrote: >>> On Thu, Nov 23, 2023 at 5:47 PM Ruediger Pluem <rpl...@apache.org> wrote: >>>> >>>> On 11/23/23 5:05 PM, Yann Ylavic wrote: >>>>> On Thu, Nov 23, 2023 at 4:46 PM Yann Ylavic <ylavic....@gmail.com> wrote: >>>>>> >>>>>> On Thu, Nov 23, 2023 at 4:17 PM Ruediger Pluem <rpl...@apache.org> wrote: >>>>>>> >>>>>>> On 11/23/23 3:53 PM, Yann Ylavic wrote: >>>> >>>>>>> I am asking because I guess I am hit now by races in the byrequests LB >>>>>>> with the worker->s->lbstatus. >>>>>>> I probably want to look for a way to solve this in a more generic way >>>>>>> for various shared worker fields. >>>>>> >>>>>> lbstatus is an int so the 32bit apr_atomic API could do I think. >>>>> >>>>> I mean, if lbstatus becomes inconsistent because of the race then we >>>> >>>> My current theory is that this is the case. >>>> >>>>> can do something, but if it is e.g. that a worker switches from error >>>>> state to non-error become some threads can connect while some others >>>>> can't this is something we should address elsewhere (like a failure >>>>> threshold). >>>>> >>>>>> Maybe we need some ap_atomic_{int,long,size_t,..}_*() helpers for >>>>>> system dependent widths. It preferably would be implemented in APR but >>>>>> in the meantime we could have something in httpd already. >>>>>> What we should avoid IMO is needing 64bit atomics on 32bit systems >>>>>> (because we'd have to reimplement the mutexes etc), but apart from >>>>>> that I think we can wrap anything using the existing apr atomics. >>>>> >>>>> What we need for lbstatus is ap_atomic_int_or() and >>>>> ap_atomic_int_and_not() it seems, both could be implemented with a >>>>> cas32 loop. >>>> >>>> What functionality are ap_atomic_int_or() / ap_atomic_int_and_not() are >>>> supposed to deliver? >>>> I am having a hard time guessing it from the name :-). >>> >>> Actually I mixed ->lbstatus and ->status, so I thought we needed an >>> atomic "or" and an atomic "and not" to handle the ->status mask.. >>> >>> But ->lbstatus is much like the ->busy count and updated almost at the >>> same place, though it's an "int" and we can't reuse the same functions >>> for both :/ >>> It seems that we need to make sure that 0 <= lbstatus <= INT_MAX too, >> >> I think lbstatus is allowed to become negative. > > Tried something in https://github.com/apache/httpd/pull/396 > WDYT?
+1 for concept