(new thread) On Tue, Jan 02, 2024 at 10:34:11AM -0500, Robert Haas wrote: > On Wed, Dec 27, 2023 at 10:36 AM Nathan Bossart > <nathandboss...@gmail.com> wrote: >> Thanks! I also noticed that WALSummarizerLock probably needs a mention in >> wait_event_names.txt. > > Fixed.
I think we're supposed to omit the "Lock" suffix in wait_event_names.txt. > It seems like it would be good if there were an automated cross-check > between lwlocknames.txt and wait_event_names.txt. +1. Here's a hastily-thrown-together patch for that. I basically copied 003_check_guc.pl and adjusted it for this purpose. This test only checks that everything in lwlocknames.txt has a matching entry in wait_event_names.txt. It doesn't check that everything in the predefined LWLock section of wait_event_names.txt has an entry in lwlocknames.txt. AFAICT that would be a little more difficult because you can't distinguish between the two in pg_wait_events. Even with this test, I worry that we could easily forget to add entries in wait_event_names.txt for the non-predefined locks, but I don't presently have a proposal for how to prevent that. -- Nathan Bossart Amazon Web Services: https://aws.amazon.com
>From 5031b55d8e1095ca919fe9a088ec0539b28984fc Mon Sep 17 00:00:00 2001 From: Nathan Bossart <nat...@postgresql.org> Date: Tue, 2 Jan 2024 11:19:20 -0600 Subject: [PATCH v1 1/1] verify wait events for all lwlocks --- .../utils/activity/wait_event_names.txt | 2 +- src/test/modules/test_misc/meson.build | 1 + .../modules/test_misc/t/005_check_lwlock.pl | 51 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/modules/test_misc/t/005_check_lwlock.pl diff --git a/src/backend/utils/activity/wait_event_names.txt b/src/backend/utils/activity/wait_event_names.txt index d876f8a667..f61ec3e59d 100644 --- a/src/backend/utils/activity/wait_event_names.txt +++ b/src/backend/utils/activity/wait_event_names.txt @@ -324,7 +324,7 @@ XactTruncation "Waiting to execute <function>pg_xact_status</function> or update WrapLimitsVacuum "Waiting to update limits on transaction id and multixact consumption." NotifyQueueTail "Waiting to update limit on <command>NOTIFY</command> message storage." WaitEventExtension "Waiting to read or update custom wait events information for extensions." -WALSummarizerLock "Waiting to read or update WAL summarization state." +WALSummarizer "Waiting to read or update WAL summarization state." XactBuffer "Waiting for I/O on a transaction status SLRU buffer." CommitTsBuffer "Waiting for I/O on a commit timestamp SLRU buffer." diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build index 911084ac0f..13bc6cb423 100644 --- a/src/test/modules/test_misc/meson.build +++ b/src/test/modules/test_misc/meson.build @@ -10,6 +10,7 @@ tests += { 't/002_tablespace.pl', 't/003_check_guc.pl', 't/004_io_direct.pl', + 't/005_check_lwlock.pl', ], }, } diff --git a/src/test/modules/test_misc/t/005_check_lwlock.pl b/src/test/modules/test_misc/t/005_check_lwlock.pl new file mode 100644 index 0000000000..aff83e879e --- /dev/null +++ b/src/test/modules/test_misc/t/005_check_lwlock.pl @@ -0,0 +1,51 @@ +# Tests to cross-check the consistency of pg_wait_events with lwlocknames.h. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->start; + +# Grab the names of all the LWLocks from pg_wait_events. +my $all_lwlocks = $node->safe_psql( + 'postgres', + "SELECT name FROM pg_wait_events WHERE type = 'LWLock'"); +my @all_lwlocks_array = split("\n", $all_lwlocks); + +# Find the location of lwlocknames.h. +my $include_dir = $node->config_data('--includedir'); +my $lwlocknames_file = "$include_dir/server/storage/lwlocknames.h"; + +# Read the list of locks from lwlocknames.h. +my $num_tests = 0; +my @lwlocks_found; +open(my $contents, '<', $lwlocknames_file) + || die "Could not open $lwlocknames_file: $!"; +while (my $line = <$contents>) +{ + if ($line =~ m/^#define ([a-zA-Z]+)Lock .*/) + { + push @lwlocks_found, $1; + } +} +close $contents; + +# Cross-check that all the locks found in lwlocknames.h have matching entries +# in pg_wait_events. +my %all_lwlocks_hash = map { $_ => 1 } @all_lwlocks_array; +my @missing_from_wait_events = grep(!$all_lwlocks_hash{$_}, @lwlocks_found); +is(scalar(@missing_from_wait_events), + 0, "no LWLocks missing from pg_wait_events"); + +foreach my $lwlock (@missing_from_wait_events) +{ + print( + "found $lwlock in lwlocknames.h, missing from wait_event_names.txt\n" + ); +} + +done_testing(); -- 2.25.1