Re: Log connection establishment timings - Mailing list pgsql-hackers
From | Bertrand Drouvot |
---|---|
Subject | Re: Log connection establishment timings |
Date | |
Msg-id | Z8XVX0cJ9toN0JRa@ip-10-97-1-34.eu-west-3.compute.internal Whole thread Raw |
In response to | Re: Log connection establishment timings (Melanie Plageman <melanieplageman@gmail.com>) |
Responses |
Re: Log connection establishment timings
Re: Log connection establishment timings |
List | pgsql-hackers |
Hi, On Fri, Feb 28, 2025 at 05:52:35PM -0500, Melanie Plageman wrote: > On Fri, Feb 28, 2025 at 12:54 AM Bertrand Drouvot > <bertranddrouvot.pg@gmail.com> wrote: > > > > On Thu, Feb 27, 2025 at 05:55:19PM -0500, Melanie Plageman wrote: > > > It still needs polishing (e.g. I need to figure out where to put the new guc hook > > > functions and enums and such) > > > > yeah, I wonder if it would make sense to create new dedicated "connection_logging" > > file(s). > > I think for now there isn't enough for a new file. I think these are > probably okay in postmaster.c since this has to do with postmaster > starting new connections. Agree. > > > I'm worried the list of possible connection log messages could get > > > unwieldy if we add many more. > > > > Thinking out loud, I'm not sure we'd add "many more" but maybe what we could do > > is to introduce some predefined groups like: > > > > 'basic' (that would be equivalent to 'received, + timings introduced in 0002') > > 'security' (equivalent to 'authenticated,authorized') > > > > Not saying we need to create this kind of predefined groups now, just an idea > > in case we'd add many more: that could "help" the user experience, or are you > > more concerned about the code maintenance? > > I was more worried about the user having to provide very long lists. > But groupings could be a sensible solution in the future. Okay, yeah most probably. > > Just did a quick test, (did not look closely at the code), and it looks like > > that: > > > > 'all': does not report the "received" (but does report authenticated and authorized) > > 'received': does not work? > > 'authenticated': works > > 'authorized': works > > Thanks for testing! Ouch, there were many bugs in that prototype. My > enums were broken and a few other things. > > I found some bugs in 0002 as well. Attached v8 fixes the issues I found so far. Thanks for the updated version! > We have to be really careful about when log_connections is actually > set before we use it -- I fixed some issues with that. Good catch! Yeah for the EXEC_BACKEND case we need to wait that read_nondefault_variables() in SubPostmasterMain() is executed. Looking at 0001, a few random comments: === 1 #include "utils/varlena.h" +#include "utils/guc_hooks.h" wrong ordering? === 2 +/* + * Validate the input for the log_connections GUC. + */ +bool +check_log_connections(char **newval, void **extra, GucSource source) +{ This function is pretty close to check_debug_io_direct() for example and its overall content, memory management, looks good to me. I just have a few following comments about it. I was just wondering why: " + else if (pg_strcasecmp(item, "all") == 0) + { + GUC_check_errdetail("Must specify \"all\" alone with no additional options, whitespace, or characters."); + goto log_connections_error; + } " but yeah that probably makes more sense that way. === 3 + if (pg_strcasecmp(*newval, "all") == 0) + effval = "received, authenticated, authorized, disconnected"; Not sure this one is needed, see comment "=== 5". === 4 +void +assign_log_connections(const char *newval, void *extra) +{ + log_connections = *((int *) extra); +} Not written in the exact same way as assign_debug_io_direct() but that's fine. === 5 +typedef enum ConnectionLogOption +{ + LOG_CONNECTION_RECEIVED = (1 << 0), + LOG_CONNECTION_AUTHENTICATED = (1 << 1), + LOG_CONNECTION_AUTHORIZED = (1 << 2), + LOG_CONNECTION_DISCONNECTED = (1 << 3), +} ConnectionLogOption; I wonder if it would make sense to add LOG_CONNECTION_ALL here (LOG_CONNECTION_RECEIVED | LOG_CONNECTION_AUTHENTICATED ..) That sounds a better place (than defining "all" in check_log_connections()) to me. It's also how it is done in MonotonicFunction. That way we could avoid the special case in check_log_connections() and it looks less likely that we miss to add new flags in LOG_CONNECTION_ALL should we add more options, thoughts? We'd need to change all the checks that you added (around log_connections) to also add a check on LOG_CONNECTION_ALL though. === 6 Also not sure if it's worth adding a "MAX" (like it's done for relopt_kind) because we'd probably not go over it anyay. " /* some compilers treat enums as signed ints, so we can't use 1 << 31 */ RELOPT_KIND_MAX = (1 << 30) " Just mentioning in passing as I just realized there is this check in relopt_kind. === 7 s/ConnectionLogOption/LogConnectionOption/? (as it is linked to "log_connections") === 8 All the TAP tests have been modified that way: -$node->append_conf('postgresql.conf', "log_connections = on"); +$node->append_conf('postgresql.conf', "log_connections = 'all'"); Is it worh to add some checks for the other values? I did a few manual checks and that seems to work as expected. I'll look at 0002 later. Regards, -- Bertrand Drouvot PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
pgsql-hackers by date: