Re: gai_strerror() is not thread-safe on Windows - Mailing list pgsql-hackers
From | Thomas Munro |
---|---|
Subject | Re: gai_strerror() is not thread-safe on Windows |
Date | |
Msg-id | CA+hUKGLAe-vdnwnUY+yKn3Ns+W-O9bcagH4pfkmZcQvwtLiCPg@mail.gmail.com Whole thread Raw |
In response to | Re: gai_strerror() is not thread-safe on Windows (Kyotaro Horiguchi <horikyota.ntt@gmail.com>) |
Responses |
Re: gai_strerror() is not thread-safe on Windows
|
List | pgsql-hackers |
On Tue, Dec 5, 2023 at 3:43 PM Kyotaro Horiguchi <horikyota.ntt@gmail.com> wrote: > At Tue, 5 Dec 2023 08:26:54 +1300, Thomas Munro <thomas.munro@gmail.com> wrote in > > On second thoughts, I guess it would make more sense to use the exact > > messages Windows' own implementation would return instead of whatever > > we had in the past (probably cribbed from some other OS or just made > > up?). I asked CI to spit those out[1]. Updated patch attached. Will > > add to CF. > > > > [1] https://cirrus-ci.com/task/5816802207334400?logs=main#L15 > > Windows' gai_strerror outputs messages that correspond to the language > environment. Similarly, I think that the messages that the messages > returned by our version should be translatable. Hmm, that is a good point. Wow, POSIX has given us a terrible interface here, in terms of resource management. Let's see what glibc does: https://github.com/lattera/glibc/blob/master/sysdeps/posix/gai_strerror.c https://github.com/lattera/glibc/blob/master/sysdeps/posix/gai_strerror-strs.h It doesn't look like it knows about locales at all. And a test program seems to confirm: #include <locale.h> #include <netdb.h> #include <stdio.h> int main() { setlocale(LC_MESSAGES, "ja_JP.UTF-8"); printf("%s\n", gai_strerror(EAI_MEMORY)); } That prints: Memory allocation failure FreeBSD tries harder, and prints: メモリ割り当て失敗 We can see that it has a thread-local variable that holds a copy of that localised string until the next call to gai_strerror() in the same thread: https://github.com/freebsd/freebsd-src/blob/main/lib/libc/net/gai_strerror.c https://github.com/freebsd/freebsd-src/blob/main/lib/libc/nls/ja_JP.UTF-8.msg FreeBSD's message catalogues would provide a read-made source of translations, bu... hmm, if glibc doesn't bother and the POSIX interface is unhelpful and Windows' own implementation is so willfully unusable, I don't really feel inclined to build a whole thread-local cache thing on our side just to support this mess. So I think we should just hard-code the error messages in English and move on. However, English is my language so perhaps I should abstain and leave it to others to decide how important that is. > These messages may add extra line-end periods to the parent (or > cotaining) messages when appended. This looks as follows. > > (auth.c:517 : errdetail_log() : sub (detail) message) > > Could not translate client host name "hoge" to IP address: An address incompatible with the requested protocol was used.. > > (hba.c:1562 : errmsg() : main message) > > invalid IP address "192.0.2.1": This is usually a temporary error during hostname resolution and means that the localserver did not receive a response from an authoritative server. > > When I first saw the first version, I thought it would be better to > use Windows' own messages, just like you did. However, considering the > content of the message above, wouldn't it be better to adhere to > Linux-style messages overall? Yeah, I agree that either the glibc or the FreeBSD messages would be better than those now that I've seen them. They are short and sweet. > A slightly subtler point is that the second example seems to have a > misalignment between the descriptions before and after the colon, but > do you think it's not something to be concerned about to this extent? I didn't understand what you meant here.
pgsql-hackers by date: