40
40
#include "storage/ipc.h"
41
41
#include "tcop/backend_startup.h"
42
42
#include "utils/memutils.h"
43
+ #include "utils/wait_event.h"
43
44
44
45
/*----------------------------------------------------------------
45
46
* Global authentication functions
@@ -993,6 +994,7 @@ pg_GSS_recvauth(Port *port)
993
994
elog (DEBUG4 , "processing received GSS token of length %u" ,
994
995
(unsigned int ) gbuf .length );
995
996
997
+ pgstat_report_wait_start (WAIT_EVENT_GSSAPI_ACCEPT_SEC_CONTEXT );
996
998
maj_stat = gss_accept_sec_context (& min_stat ,
997
999
& port -> gss -> ctx ,
998
1000
port -> gss -> cred ,
@@ -1004,6 +1006,7 @@ pg_GSS_recvauth(Port *port)
1004
1006
& gflags ,
1005
1007
NULL ,
1006
1008
pg_gss_accept_delegation ? & delegated_creds : NULL );
1009
+ pgstat_report_wait_end ();
1007
1010
1008
1011
/* gbuf no longer used */
1009
1012
pfree (buf .data );
@@ -1215,6 +1218,7 @@ pg_SSPI_recvauth(Port *port)
1215
1218
/*
1216
1219
* Acquire a handle to the server credentials.
1217
1220
*/
1221
+ pgstat_report_wait_start (WAIT_EVENT_SSPI_ACQUIRE_CREDENTIALS_HANDLE );
1218
1222
r = AcquireCredentialsHandle (NULL ,
1219
1223
"negotiate" ,
1220
1224
SECPKG_CRED_INBOUND ,
@@ -1224,6 +1228,8 @@ pg_SSPI_recvauth(Port *port)
1224
1228
NULL ,
1225
1229
& sspicred ,
1226
1230
& expiry );
1231
+ pgstat_report_wait_end ();
1232
+
1227
1233
if (r != SEC_E_OK )
1228
1234
pg_SSPI_error (ERROR , _ ("could not acquire SSPI credentials" ), r );
1229
1235
@@ -1289,6 +1295,7 @@ pg_SSPI_recvauth(Port *port)
1289
1295
elog (DEBUG4 , "processing received SSPI token of length %u" ,
1290
1296
(unsigned int ) buf .len );
1291
1297
1298
+ pgstat_report_wait_start (WAIT_EVENT_SSPI_ACCEPT_SECURITY_CONTEXT );
1292
1299
r = AcceptSecurityContext (& sspicred ,
1293
1300
sspictx ,
1294
1301
& inbuf ,
@@ -1298,6 +1305,7 @@ pg_SSPI_recvauth(Port *port)
1298
1305
& outbuf ,
1299
1306
& contextattr ,
1300
1307
NULL );
1308
+ pgstat_report_wait_end ();
1301
1309
1302
1310
/* input buffer no longer used */
1303
1311
pfree (buf .data );
@@ -1395,11 +1403,13 @@ pg_SSPI_recvauth(Port *port)
1395
1403
1396
1404
CloseHandle (token );
1397
1405
1406
+ pgstat_report_wait_start (WAIT_EVENT_SSPI_LOOKUP_ACCOUNT_SID );
1398
1407
if (!LookupAccountSid (NULL , tokenuser -> User .Sid , accountname , & accountnamesize ,
1399
1408
domainname , & domainnamesize , & accountnameuse ))
1400
1409
ereport (ERROR ,
1401
1410
(errmsg_internal ("could not look up account SID: error code %lu" ,
1402
1411
GetLastError ())));
1412
+ pgstat_report_wait_end ();
1403
1413
1404
1414
free (tokenuser );
1405
1415
@@ -1496,8 +1506,11 @@ pg_SSPI_make_upn(char *accountname,
1496
1506
*/
1497
1507
1498
1508
samname = psprintf ("%s\\%s" , domainname , accountname );
1509
+
1510
+ pgstat_report_wait_start (WAIT_EVENT_SSPI_TRANSLATE_NAME );
1499
1511
res = TranslateName (samname , NameSamCompatible , NameUserPrincipal ,
1500
1512
NULL , & upnamesize );
1513
+ pgstat_report_wait_end ();
1501
1514
1502
1515
if ((!res && GetLastError () != ERROR_INSUFFICIENT_BUFFER )
1503
1516
|| upnamesize == 0 )
@@ -1512,8 +1525,10 @@ pg_SSPI_make_upn(char *accountname,
1512
1525
/* upnamesize includes the terminating NUL. */
1513
1526
upname = palloc (upnamesize );
1514
1527
1528
+ pgstat_report_wait_start (WAIT_EVENT_SSPI_TRANSLATE_NAME );
1515
1529
res = TranslateName (samname , NameSamCompatible , NameUserPrincipal ,
1516
1530
upname , & upnamesize );
1531
+ pgstat_report_wait_end ();
1517
1532
1518
1533
pfree (samname );
1519
1534
if (res )
@@ -2112,7 +2127,9 @@ CheckPAMAuth(Port *port, const char *user, const char *password)
2112
2127
return STATUS_ERROR ;
2113
2128
}
2114
2129
2130
+ pgstat_report_wait_start (WAIT_EVENT_PAM_AUTHENTICATE );
2115
2131
retval = pam_authenticate (pamh , 0 );
2132
+ pgstat_report_wait_end ();
2116
2133
2117
2134
if (retval != PAM_SUCCESS )
2118
2135
{
@@ -2125,7 +2142,9 @@ CheckPAMAuth(Port *port, const char *user, const char *password)
2125
2142
return pam_no_password ? STATUS_EOF : STATUS_ERROR ;
2126
2143
}
2127
2144
2145
+ pgstat_report_wait_start (WAIT_EVENT_PAM_ACCT_MGMT );
2128
2146
retval = pam_acct_mgmt (pamh , 0 );
2147
+ pgstat_report_wait_end ();
2129
2148
2130
2149
if (retval != PAM_SUCCESS )
2131
2150
{
@@ -2265,7 +2284,11 @@ InitializeLDAPConnection(Port *port, LDAP **ldap)
2265
2284
}
2266
2285
2267
2286
/* Look up a list of LDAP server hosts and port numbers */
2268
- if (ldap_domain2hostlist (domain , & hostlist ))
2287
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_HOST_LOOKUP );
2288
+ r = ldap_domain2hostlist (domain , & hostlist );
2289
+ pgstat_report_wait_end ();
2290
+
2291
+ if (r )
2269
2292
{
2270
2293
ereport (LOG ,
2271
2294
(errmsg ("LDAP authentication could not find DNS SRV records for \"%s\"" ,
@@ -2353,23 +2376,31 @@ InitializeLDAPConnection(Port *port, LDAP **ldap)
2353
2376
(errmsg ("could not set LDAP protocol version: %s" ,
2354
2377
ldap_err2string (r )),
2355
2378
errdetail_for_ldap (* ldap )));
2379
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_SET_OPTION );
2356
2380
ldap_unbind (* ldap );
2381
+ pgstat_report_wait_end ();
2357
2382
return STATUS_ERROR ;
2358
2383
}
2359
2384
2360
2385
if (port -> hba -> ldaptls )
2361
2386
{
2387
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_START_TLS );
2362
2388
#ifndef WIN32
2363
- if (( r = ldap_start_tls_s (* ldap , NULL , NULL )) != LDAP_SUCCESS )
2389
+ r = ldap_start_tls_s (* ldap , NULL , NULL );
2364
2390
#else
2365
- if (( r = ldap_start_tls_s (* ldap , NULL , NULL , NULL , NULL )) != LDAP_SUCCESS )
2391
+ r = ldap_start_tls_s (* ldap , NULL , NULL , NULL , NULL );
2366
2392
#endif
2393
+ pgstat_report_wait_end ();
2394
+
2395
+ if (r != LDAP_SUCCESS )
2367
2396
{
2368
2397
ereport (LOG ,
2369
2398
(errmsg ("could not start LDAP TLS session: %s" ,
2370
2399
ldap_err2string (r )),
2371
2400
errdetail_for_ldap (* ldap )));
2401
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_START_TLS );
2372
2402
ldap_unbind (* ldap );
2403
+ pgstat_report_wait_end ();
2373
2404
return STATUS_ERROR ;
2374
2405
}
2375
2406
}
@@ -2513,7 +2544,9 @@ CheckLDAPAuth(Port *port)
2513
2544
{
2514
2545
ereport (LOG ,
2515
2546
(errmsg ("invalid character in user name for LDAP authentication" )));
2547
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_NAME_CHECK );
2516
2548
ldap_unbind (ldap );
2549
+ pgstat_report_wait_end ();
2517
2550
pfree (passwd );
2518
2551
return STATUS_ERROR ;
2519
2552
}
@@ -2523,9 +2556,12 @@ CheckLDAPAuth(Port *port)
2523
2556
* Bind with a pre-defined username/password (if available) for
2524
2557
* searching. If none is specified, this turns into an anonymous bind.
2525
2558
*/
2559
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_BIND_FOR_SEARCH );
2526
2560
r = ldap_simple_bind_s (ldap ,
2527
2561
port -> hba -> ldapbinddn ? port -> hba -> ldapbinddn : "" ,
2528
2562
port -> hba -> ldapbindpasswd ? ldap_password_hook (port -> hba -> ldapbindpasswd ) : "" );
2563
+ pgstat_report_wait_end ();
2564
+
2529
2565
if (r != LDAP_SUCCESS )
2530
2566
{
2531
2567
ereport (LOG ,
@@ -2534,7 +2570,9 @@ CheckLDAPAuth(Port *port)
2534
2570
server_name ,
2535
2571
ldap_err2string (r )),
2536
2572
errdetail_for_ldap (ldap )));
2573
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_BIND_FOR_SEARCH );
2537
2574
ldap_unbind (ldap );
2575
+ pgstat_report_wait_end ();
2538
2576
pfree (passwd );
2539
2577
return STATUS_ERROR ;
2540
2578
}
@@ -2548,13 +2586,16 @@ CheckLDAPAuth(Port *port)
2548
2586
filter = psprintf ("(uid=%s)" , port -> user_name );
2549
2587
2550
2588
search_message = NULL ;
2589
+
2590
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_SEARCH );
2551
2591
r = ldap_search_s (ldap ,
2552
2592
port -> hba -> ldapbasedn ,
2553
2593
port -> hba -> ldapscope ,
2554
2594
filter ,
2555
2595
attributes ,
2556
2596
0 ,
2557
2597
& search_message );
2598
+ pgstat_report_wait_end ();
2558
2599
2559
2600
if (r != LDAP_SUCCESS )
2560
2601
{
@@ -2564,7 +2605,9 @@ CheckLDAPAuth(Port *port)
2564
2605
errdetail_for_ldap (ldap )));
2565
2606
if (search_message != NULL )
2566
2607
ldap_msgfree (search_message );
2608
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_SEARCH );
2567
2609
ldap_unbind (ldap );
2610
+ pgstat_report_wait_end ();
2568
2611
pfree (passwd );
2569
2612
pfree (filter );
2570
2613
return STATUS_ERROR ;
@@ -2586,7 +2629,9 @@ CheckLDAPAuth(Port *port)
2586
2629
count ,
2587
2630
filter , server_name , count )));
2588
2631
2632
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_COUNT_ENTRIES );
2589
2633
ldap_unbind (ldap );
2634
+ pgstat_report_wait_end ();
2590
2635
pfree (passwd );
2591
2636
pfree (filter );
2592
2637
ldap_msgfree (search_message );
@@ -2605,7 +2650,9 @@ CheckLDAPAuth(Port *port)
2605
2650
filter , server_name ,
2606
2651
ldap_err2string (error )),
2607
2652
errdetail_for_ldap (ldap )));
2653
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_GET_DN );
2608
2654
ldap_unbind (ldap );
2655
+ pgstat_report_wait_end ();
2609
2656
pfree (passwd );
2610
2657
pfree (filter );
2611
2658
ldap_msgfree (search_message );
@@ -2623,15 +2670,19 @@ CheckLDAPAuth(Port *port)
2623
2670
port -> user_name ,
2624
2671
port -> hba -> ldapsuffix ? port -> hba -> ldapsuffix : "" );
2625
2672
2673
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_BIND );
2626
2674
r = ldap_simple_bind_s (ldap , fulluser , passwd );
2675
+ pgstat_report_wait_end ();
2627
2676
2628
2677
if (r != LDAP_SUCCESS )
2629
2678
{
2630
2679
ereport (LOG ,
2631
2680
(errmsg ("LDAP login failed for user \"%s\" on server \"%s\": %s" ,
2632
2681
fulluser , server_name , ldap_err2string (r )),
2633
2682
errdetail_for_ldap (ldap )));
2683
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_AFTER_BIND );
2634
2684
ldap_unbind (ldap );
2685
+ pgstat_report_wait_end ();
2635
2686
pfree (passwd );
2636
2687
pfree (fulluser );
2637
2688
return STATUS_ERROR ;
@@ -2640,7 +2691,9 @@ CheckLDAPAuth(Port *port)
2640
2691
/* Save the original bind DN as the authenticated identity. */
2641
2692
set_authn_id (port , fulluser );
2642
2693
2694
+ pgstat_report_wait_start (WAIT_EVENT_LDAP_UNBIND_SUCCESS );
2643
2695
ldap_unbind (ldap );
2696
+ pgstat_report_wait_end ();
2644
2697
pfree (passwd );
2645
2698
pfree (fulluser );
2646
2699
@@ -3072,8 +3125,12 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
3072
3125
return STATUS_ERROR ;
3073
3126
}
3074
3127
3075
- if (sendto (sock , radius_buffer , packetlength , 0 ,
3076
- serveraddrs [0 ].ai_addr , serveraddrs [0 ].ai_addrlen ) < 0 )
3128
+ pgstat_report_wait_start (WAIT_EVENT_RADIUS_SENDTO );
3129
+ r = sendto (sock , radius_buffer , packetlength , 0 ,
3130
+ serveraddrs [0 ].ai_addr , serveraddrs [0 ].ai_addrlen );
3131
+ pgstat_report_wait_end ();
3132
+
3133
+ if (r < 0 )
3077
3134
{
3078
3135
ereport (LOG ,
3079
3136
(errmsg ("could not send RADIUS packet: %m" )));
@@ -3121,7 +3178,10 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
3121
3178
FD_ZERO (& fdset );
3122
3179
FD_SET (sock , & fdset );
3123
3180
3181
+ pgstat_report_wait_start (WAIT_EVENT_RADIUS_WAIT );
3124
3182
r = select (sock + 1 , & fdset , NULL , NULL , & timeout );
3183
+ pgstat_report_wait_end ();
3184
+
3125
3185
if (r < 0 )
3126
3186
{
3127
3187
if (errno == EINTR )
@@ -3154,8 +3214,12 @@ PerformRadiusTransaction(const char *server, const char *secret, const char *por
3154
3214
*/
3155
3215
3156
3216
addrsize = sizeof (remoteaddr );
3217
+
3218
+ pgstat_report_wait_start (WAIT_EVENT_RADIUS_RECVFROM );
3157
3219
packetlength = recvfrom (sock , receive_buffer , RADIUS_BUFFER_SIZE , 0 ,
3158
3220
(struct sockaddr * ) & remoteaddr , & addrsize );
3221
+ pgstat_report_wait_end ();
3222
+
3159
3223
if (packetlength < 0 )
3160
3224
{
3161
3225
ereport (LOG ,
0 commit comments