Hello again,

I can finally come up with a patch (attached) that solves the issue for
me. Anyone mind to point out potential concerns regarding the patch?

Explanation:
After some debugging-mess with printing the memory addresses, I noticed
that the workers grab a slot even if they did that before in the
iteration for the first virtual host - reassigning and thus wasting the
old value of worker->s.
I thus wanted to check whether worker->s is the unshared initial memory
subject to be replaced or a SHM already. As I did not find any suitable
flag, I managed it using storage->dptr() and the index (which is 0 for
the initial, private memory).

It is now the first time that I can use httpd > 2.3.16 with balancers
and more than one virtual host.

Kind regards,
Florian Schröder

Am Donnerstag, den 23.02.2012, 19:23 +0100 schrieb f_los_ch: 
> Hi together,
> 
> I'm trying to get my reverse-proxy running with the new httpd 2.4.1,
> that aborts now with "worker slotmem_grab failed".
> 
> When looking at mod_proxy_balancer:
> 
> It looks like each balancer creates the SHM for its number of workers (1
> in my case) using its unique ->sname. After that, each worker grabs a
> slot from this.
> 
> I have several virtual hosts pointing to the same balancer (by rewrite
> [P]). So, the second time, the balancer calls shm's slotmem_create again
> with its name, that already exists -> kind-of noop.
> 
> Now, the SHM under the balancer's name has still only 1 slot (that is
> already occupied).
> 
> When the worker now wants to (re-)grab its slot, I get:
> 
> [slotmem_shm:debug] mod_slotmem_shm.c(575): AH02293: slotmem(...) grab
> failed. Num 1/num_free 0 [proxy_balancer:emerg] (22)Invalid argument:
> AH01186: worker slotmem_grab failed 
> Please note that my explanation should only be considered as an educated
> guess for the reason of the error - there might be other obvious causes
> that I have overseen.
> 
> Has anyone similar issues? Any suggestions?
> 
> Thanks in advance,
> Florian
> 
> 
> $ httpd -V Server version: Apache/2.4.1 (Unix) Server built:   Feb 23
> 2012 18:21:48 Server's Module Magic Number: 20120211:0 Server loaded:
> APR 1.4.5, APR-UTIL 1.4.1 Compiled using: APR 1.4.5, APR-UTIL 1.4.1
> Architecture:   32-bit Server MPM:     event   threaded:     yes (fixed
> thread count)     forked:     yes (variable process count) 
> 

--- modules/proxy/mod_proxy_balancer.c  2012-03-31 17:40:36.000000000 +0200
+++ ../httpd-2.4.2_new/modules/proxy/mod_proxy_balancer.c       2012-04-07 20:53:56.896961481 +0200
@@ -825,6 +828,16 @@ static int balancer_post_config(apr_pool
                 proxy_worker_shared *shm;

                 worker = *workers;
+
+                /* Ckeck if we grabbed already */
+                if (storage->dptr(balancer->wslot, worker->s->index, (void *)&shm) == APR_SUCCESS) {
+                    if (shm == worker->s) {
+                        /* worker->s pointed to some shm before */
+                        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(05561) "won't grab worker-SHM %lu with index %d twice", (unsigned long int)(worker->s), worker->s->index);
+                        continue;
+                    }
+                }
+
                 if ((rv = storage->grab(balancer->wslot, &index)) != APR_SUCCESS) {
                     ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, APLOGNO(01186) "worker slotmem_grab failed");
                     return !OK;

Reply via email to