From a7e18bff1aa45e1e6602581cca4d5a0efe8e5d07 Mon Sep 17 00:00:00 2001 From: Jacob Champion Date: Fri, 8 Nov 2024 14:19:26 -0800 Subject: [PATCH v10 2/2] squash! Report external auth calls as wait events Add a wait event around all calls to ldap_unbind(). (For the record, I do not want to implement this in this way.) --- src/backend/libpq/auth.c | 18 ++++++++++++++++++ .../utils/activity/wait_event_names.txt | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index bd8a2a098b39..34cc145dc5e8 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -2373,7 +2373,9 @@ InitializeLDAPConnection(Port *port, LDAP **ldap) (errmsg("could not set LDAP protocol version: %s", ldap_err2string(r)), errdetail_for_ldap(*ldap))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_SET_OPTION); ldap_unbind(*ldap); + pgstat_report_wait_end(); return STATUS_ERROR; } @@ -2393,7 +2395,9 @@ InitializeLDAPConnection(Port *port, LDAP **ldap) (errmsg("could not start LDAP TLS session: %s", ldap_err2string(r)), errdetail_for_ldap(*ldap))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_START_TLS); ldap_unbind(*ldap); + pgstat_report_wait_end(); return STATUS_ERROR; } } @@ -2537,7 +2541,9 @@ CheckLDAPAuth(Port *port) { ereport(LOG, (errmsg("invalid character in user name for LDAP authentication"))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_NAME_CHECK); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); return STATUS_ERROR; } @@ -2561,7 +2567,9 @@ CheckLDAPAuth(Port *port) server_name, ldap_err2string(r)), errdetail_for_ldap(ldap))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_BIND_FOR_SEARCH); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); return STATUS_ERROR; } @@ -2594,7 +2602,9 @@ CheckLDAPAuth(Port *port) errdetail_for_ldap(ldap))); if (search_message != NULL) ldap_msgfree(search_message); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_SEARCH); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); pfree(filter); return STATUS_ERROR; @@ -2616,7 +2626,9 @@ CheckLDAPAuth(Port *port) count, filter, server_name, count))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_COUNT_ENTRIES); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); pfree(filter); ldap_msgfree(search_message); @@ -2635,7 +2647,9 @@ CheckLDAPAuth(Port *port) filter, server_name, ldap_err2string(error)), errdetail_for_ldap(ldap))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_GET_DN); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); pfree(filter); ldap_msgfree(search_message); @@ -2663,7 +2677,9 @@ CheckLDAPAuth(Port *port) (errmsg("LDAP login failed for user \"%s\" on server \"%s\": %s", fulluser, server_name, ldap_err2string(r)), errdetail_for_ldap(ldap))); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_AFTER_BIND); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); pfree(fulluser); return STATUS_ERROR; @@ -2672,7 +2688,9 @@ CheckLDAPAuth(Port *port) /* Save the original bind DN as the authenticated identity. */ set_authn_id(port, fulluser); + pgstat_report_wait_start(WAIT_EVENT_LDAP_UNBIND_SUCCESS); ldap_unbind(ldap); + pgstat_report_wait_end(); pfree(passwd); pfree(fulluser); diff --git a/src/backend/utils/activity/wait_event_names.txt b/src/backend/utils/activity/wait_event_names.txt index a28522256140..f082756c294e 100644 --- a/src/backend/utils/activity/wait_event_names.txt +++ b/src/backend/utils/activity/wait_event_names.txt @@ -177,6 +177,15 @@ LDAP_BIND_FOR_SEARCH "Waiting for an LDAP bind operation to search the directory LDAP_HOST_LOOKUP "Waiting for DNS lookup of LDAP servers." LDAP_SEARCH "Waiting for an LDAP search operation to complete." LDAP_START_TLS "Waiting for an LDAP StartTLS exchange." +LDAP_UNBIND_AFTER_BIND "Waiting for an LDAP connection to be unbound after a simple bind failed." +LDAP_UNBIND_AFTER_BIND_FOR_SEARCH "Waiting for an LDAP connection to be unbound after a bind for search failed." +LDAP_UNBIND_AFTER_COUNT_ENTRIES "Waiting for an LDAP connection to be unbound after an entry count failed." +LDAP_UNBIND_AFTER_GET_DN "Waiting for an LDAP connection to be unbound after ldap_get_dn failed." +LDAP_UNBIND_AFTER_NAME_CHECK "Waiting for an LDAP connection to be unbound after a name check failed." +LDAP_UNBIND_AFTER_SEARCH "Waiting for an LDAP connection to be unbound after a bind+search failed." +LDAP_UNBIND_AFTER_SET_OPTION "Waiting for an LDAP connection to be unbound after ldap_set_option failed." +LDAP_UNBIND_AFTER_START_TLS "Waiting for an LDAP connection to be unbound after ldap_start_tls_s failed." +LDAP_UNBIND_SUCCESS "Waiting for a successful LDAP connection to be unbound." PAM_ACCT_MGMT "Waiting for the PAM service to validate the user account." PAM_AUTHENTICATE "Waiting for the PAM service to authenticate the user." RADIUS_RECVFROM "Waiting for a recvfrom call during a RADIUS transaction." -- 2.47.2