Re: (OS 10048)Only one usage of each socket address (protocol/network address/port) is normally permitted

Yann Ylavic <[email protected]>
Newsgroups gmane.comp.apache.devel
Message-ID <CAKQ1sVNswcwXgy8kGPZhcYka5EofkYcA+i=Mrtf9ytRhR7SgAw@mail.gmail.com>
On Wed, Feb 12, 2025 at 12:38 PM Yann Ylavic <[email protected]> wrote:
>
> However it seems that [4] will cause worker->s->is_address_reusable =
> 0 in [3] (i.e. disable DNS reuse altogether) which is not really
> expected, and would explain why the pool is cleared in
> connection_cleanup().
>
> [3] https://github.com/apache/httpd/blob/2.4.63/modules/proxy/proxy_util.c#L1989-L2034
> [4] https://github.com/apache/httpd/blob/2.4.63/modules/proxy/proxy_util.c#L2140-L2159

I think we need something like the attached patch to not let the
->disablereuse=1 in [4] (because of a $-substitution including outside
hostname[:port]) force ->is_address_reusable=0 in [3] implicitly.

The rationale is that before 2.4.59 ->is_address_reusable and
->disablereuse were kind of the same thing (the former, not
configurable, was set from the latter), but since 2.4.59
->is_address_reusable is about the reusability of backend's DNS
address (and lifetime, both deduced from the address_ttl= parameter)
while ->disablereuse is about the reusability of the
connections/sockets only.
Except we probably still want to disable address reuse when
disablereuse=on explicitly (for compatibility), but not for the
implicit case [4], which is what this patch does.
Thoughts?

Jean-Frederic, I don't think it addresses your issue because you
probably have enablereuse=on already if your ProxyPassMatch used to
reuse connections before 2.4.59? Connection reuse for ProxyPassMatch
is possible since 2.4.47, but has always depended on enablereuse=on.
If you don't use ProxyPassMatch with a $-substitution I don't see why
something changed in 2.4.59 though..
is_address_reusable-vs-disablereuse.diff (text/x-patch, 1.6 KB)
Index: modules/proxy/proxy_util.c
===================================================================
--- modules/proxy/proxy_util.c	(revision 1923126)
+++ modules/proxy/proxy_util.c	(working copy)
@@ -2262,12 +2262,18 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_wo
         if (!worker->s->retry_set) {
             worker->s->retry = apr_time_from_sec(PROXY_WORKER_DEFAULT_RETRY);
         }
-        /* Consistently set address and connection reusabilty: when reuse
-         * is disabled by configuration, or when the address is known already
-         * to not be reusable for this worker (in any case, thus ignore/force
-         * DisableReuse).
+        /* worker->s->disablereuse is about disabling backend connection/socket
+         * reuse for successive requests, while worker->s->is_address_reusable
+         * is about DNS address reuse (an worker->s->address_ttl of zero also
+         * means not reusable). When the DNS address is not reusable neither
+         * are the connections, so make this consistent here.
+         * However setting disablereuse=on (or enablereuse=off) has always
+         * disabled DNS address reuse too, both were kind of the same thing
+         * before 2.4.59, so we keep this behaviour unless an address_ttl= is
+         * configured explicitely.
          */
         if (!worker->s->address_ttl || (!worker->s->address_ttl_set
+                                        && worker->s->disablereuse_set
                                         && worker->s->disablereuse)) {
             worker->s->is_address_reusable = 0;
         }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.