Re: [PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-08 Thread Willy Tarreau
On Sun, May 08, 2022 at 12:39:13PM +0200, Vincent Bernat wrote:
>  ?  8 May 2022 10:57 +02, Willy Tarreau:
> 
> > After edition (still minimal and possibly inaccurate but the best I
> > could do):
> >
> > On Linux the interval before starting to send TCP keep-alive packets
> > is defined by TCP_KEEPIDLE. MacOS has an equivalent with TCP_KEEPIDLE,
> > which also uses seconds as a unit, so it's possible to simply remap the
> > definition of TCP_KEEPIDLE to TCP_KEEPALIVE there and get it to 
> > seamlessly
> > work. The other settings (interval and count) are not present,
> > though.
> 
> First instance of TCP_KEEPIDLE should be TCP_KEEPALIVE. ;-)

Oops, thanks, that's exactly why I hate having to document others' work
myself. It's so easy to get something wrong :-/

Willy



Re: [PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-08 Thread Vincent Bernat
 ❦  8 May 2022 10:57 +02, Willy Tarreau:

> After edition (still minimal and possibly inaccurate but the best I
> could do):
>
> On Linux the interval before starting to send TCP keep-alive packets
> is defined by TCP_KEEPIDLE. MacOS has an equivalent with TCP_KEEPIDLE,
> which also uses seconds as a unit, so it's possible to simply remap the
> definition of TCP_KEEPIDLE to TCP_KEEPALIVE there and get it to seamlessly
> work. The other settings (interval and count) are not present,
> though.

First instance of TCP_KEEPIDLE should be TCP_KEEPALIVE. ;-)
-- 
Treat end of file conditions in a uniform manner.
- The Elements of Programming Style (Kernighan & Plauger)



Re: [PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-08 Thread Willy Tarreau
On Sun, May 08, 2022 at 10:21:28AM +0100, David CARLIER wrote:
> On Sun, 8 May 2022 at 09:57, Willy Tarreau  wrote:
> >
> > On Sun, May 01, 2022 at 03:33:17PM +0100, David CARLIER wrote:
> > > Hi here a little patch to set idle time for SO_KEEPALIVE socket option.
> >
> > Now merged, thanks.
> >
> > David, one comment though, your commit messages keep missing a lot of
> > crucial information for reviewers and debuggers, and I had to spend time
> > documenting myself on keep-alive on MacOS to figure the differences and/or
> > what the impacts or limitations of the patch could be. I finally found and
> > put that information into the commit message, but it would be much easier
> > if you could put it yourself after your development since you actually
> > have access to the information I had to seek, and know the reasoning
> > behind your choice.
> >
> 
> Thanks, fair point :-) I ll take it in account

Thanks ;-)

> even tough I was certain for this one it would not break anything.

Quite frankly, experience tells us we really never know. If MacOS in
the future version would define the TCP_KEEPIDLE macro, that would be
sufficient to break the build for example.

> > The new choice was explained again. Finally, two weeks later I got a
> > report of breakage when using external code linked at run time, the
> > keyword registration didn't work anymore due to a mistake in this last
> > patch. Fortunately, the design decision was explained and I could
> > restart from this, figure my mistake and make sure that the 3rd attempt
> > at a fix this time addressed all 3 identified use cases:
> 
> Do you have a reasonable numbers of macOs users or is it a rare occurrence ?

I really don't know, here it was on the CI. Outside of the CI, breakage
is usually reported in this order:
  - Linux
  - FreeBSD
  - MacOS
  - others, in random order

Thus I guess it translates the number of occurrences in field. I suspect
that a number of admins have macs and are used to build it locally to test
their configs, and that it's probably a non-negligible part of the MacOS
reports. But as usual, I could be totally wrong ;-)

Willy




Re: [PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-08 Thread David CARLIER
On Sun, 8 May 2022 at 09:57, Willy Tarreau  wrote:
>
> On Sun, May 01, 2022 at 03:33:17PM +0100, David CARLIER wrote:
> > Hi here a little patch to set idle time for SO_KEEPALIVE socket option.
>
> Now merged, thanks.
>
> David, one comment though, your commit messages keep missing a lot of
> crucial information for reviewers and debuggers, and I had to spend time
> documenting myself on keep-alive on MacOS to figure the differences and/or
> what the impacts or limitations of the patch could be. I finally found and
> put that information into the commit message, but it would be much easier
> if you could put it yourself after your development since you actually
> have access to the information I had to seek, and know the reasoning
> behind your choice.
>

Thanks, fair point :-) I ll take it in account even tough I was
certain for this one it would not break anything.


...
> The new choice was explained again. Finally, two weeks later I got a
> report of breakage when using external code linked at run time, the
> keyword registration didn't work anymore due to a mistake in this last
> patch. Fortunately, the design decision was explained and I could
> restart from this, figure my mistake and make sure that the 3rd attempt
> at a fix this time addressed all 3 identified use cases:

Do you have a reasonable numbers of macOs users or is it a rare occurrence ?
>
>   commit 65d9f83794e00e136335348de531167f31d2f39b
>   Author: Willy Tarreau 
>   Date:   Tue Apr 26 19:35:38 2022 +0200
>
> BUILD: compiler: properly distinguish weak and global symbols
>
> While weak symbols were finally fixed with commit fb1b6f5bc ("BUILD:
> compiler: use a more portable set of asm(".weak") statements"), it
> was an error to think that initcall symbols were also weak. They must
> not be and they're only global. The reason is that any externally
> linked code loaded as a .so would drop its weak symbols when being
> loaded, hence its initcalls that may contain various function
> registration calls.
>
> The ambiguity came from the fact that we initially reused the initcall's
> HA_GLOBL macro for OSX then generalized it, then turned it to a choice
> between .globl and .weak based on the OS, while in fact we needed a
> macro to define weak symbols.
>
> Let's rename the macro to HA_WEAK() to make it clear it's only for weak
> symbols, and redefine HA_GLOBL() that initcall needs.
>
> This will need to be backported wherever the commit above is backported
> (at least 2.5 for now).
>
I did not notice really those mem stats until now, good to know !

> For sure it's not perfect, and anything can always be improved. But
> that's not the point, the point here is to put info about the intent and
> the approach so that these ones can be preserved or corrected later. And
> that's valid for any patch, even a one-liner.
>
> The impact of your patch is that tcp-keep-alive will start to work on
> MacOS and if someone starts to rely on it and someone else later reverts
> your patch because it causes a build issue on a specific platform and the
> person thinks "oh we don't need this one there, we already have something
> else", by just reverting it they could break the other user's deployment.
>
> That's why it's important to put enough explanation to ensure the patch
> remains firmly stuck to the code base and cannot vanish without an extremly
> good argument.
>
Alrighty :-)

> Hoping this helps!
>
> Cheers
> Willy



Re: [PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-08 Thread Willy Tarreau
On Sun, May 01, 2022 at 03:33:17PM +0100, David CARLIER wrote:
> Hi here a little patch to set idle time for SO_KEEPALIVE socket option.

Now merged, thanks.

David, one comment though, your commit messages keep missing a lot of
crucial information for reviewers and debuggers, and I had to spend time
documenting myself on keep-alive on MacOS to figure the differences and/or
what the impacts or limitations of the patch could be. I finally found and
put that information into the commit message, but it would be much easier
if you could put it yourself after your development since you actually
have access to the information I had to seek, and know the reasoning
behind your choice.

Just an indication, your patch mentioned this:

   TCP_KEEPALIVE has the same semantic.

After edition (still minimal and possibly inaccurate but the best I
could do):
   
On Linux the interval before starting to send TCP keep-alive packets
is defined by TCP_KEEPIDLE. MacOS has an equivalent with TCP_KEEPIDLE,
which also uses seconds as a unit, so it's possible to simply remap the
definition of TCP_KEEPIDLE to TCP_KEEPALIVE there and get it to seamlessly
work. The other settings (interval and count) are not present, though.

A good rule of thumb to write a useful commit message is to think about
these 3 steps:
  - first, convince a project maintainer that your work is worth being
merged and is very unlikely to cause trouble elsewhere ;

  - second, provide helpful information about why it's done like this and
what it provides, to someone who would see a bisect session finish on
this patch, so that this person doesn't simply think "what's this mess,
let's revert it" without figuring what use case a revert could break ;

  - third, by explaining the design decisions, choices and tradeoffs (and
sometimes even alternate solutions that were ditched), you'll help the
person that discovers breakage find a different solution that will
still preserve the original intent while addressing the problem.

For example recently I broke MacOS build while trying to fix a clang
warning. The two patches that caused the breakage were these ones:

  commit b12966af1006be8d4438ee1ca39c2541a1f2a4f9
  Author: Willy Tarreau 
  Date:   Wed Apr 13 17:09:45 2022 +0200

BUILD: debug: mark the __start_mem_stats/__stop_mem_stats symbols as weak

Building with clang and DEBUG_MEM_STATS shows the following warnings:

  warning: __start_mem_stats changed binding to STB_WEAK [-Wsource-mgr]
  warning: __stop_mem_stats changed binding to STB_WEAK [-Wsource-mgr]

The reason is that the symbols are declared using ".globl" while they
are also referenced as __attribute__((weak)) elsewhere. It turns out
that a weak symbol is implicitly a global one and that the two classes
are exclusive, thus it may confuse the linker. Better fix this.

This may be backported where the patch applies.

  commit 2a06e248f5c8b7c86c7dd48eed7f6d5e87288457
  Author: Willy Tarreau 
  Date:   Wed Apr 13 17:12:20 2022 +0200

BUILD: initcall: mark the __start_i_* symbols as weak, not global

Just like for previous fix, these symbols are marked ".globl" during
their declaration, but their later mention uses __attribute__((weak)),
so it's better to only use ".weak" during the declaration so that the
symbol's class does not change.

No need to backport this unless someone reports build issues.

There's an explanation of the problem, when it's encountered, and the
reasoning behind the proposed solution. The follwing day the CI broke
on MacOS, I could restart from the elements above to try to design
another solution that still follows the same spirit (and in the worst
case it could possibly have been accepted to just revert and keep that
warning when debugging):

  commit fb1b6f5bc0e8eac116e2cafe8716a7f16d95b58e
  Author: Willy Tarreau 
  Date:   Thu Apr 14 16:57:12 2022 +0200

BUILD: compiler: use a more portable set of asm(".weak") statements

The two recent patches b12966af1 ("BUILD: debug: mark the
__start_mem_stats/__stop_mem_stats symbols as weak") and 2a06e248f
("BUILD: initcall: mark the __start_i_* symbols as weak, not global")
aimed at fixing a build warning and resulted in a build breakage on
MacOS which doesn't have a ".weak" asm statement.

We've already had MacOS-specific asm() statements for section names, so
this patch continues on this trend by moving HA_GLOBL() to compiler.h
and using ".globl" on MacOS since apparently nobody complains there.

It is debatable whether to expose this only when !USE_OBSOLETE_LINKER
or all the time, but since these are just macroes it's no big deal to
let them be available when needed and let the caller decide on the
build conditions.

If any of the patches above is backported, this one will need to as
well.

The new choice was explained again. Finally, t

[PATCH 1/1: BUILD/MINOR: TCP_KEEPIDLE macos equivalence

2022-05-01 Thread David CARLIER
Hi here a little patch to set idle time for SO_KEEPALIVE socket option.

Kind regards.


0001-BUILD-MINOR-socket-translate-TCP_KEEPIDLE-for-macOs-.patch
Description: Binary data