pg_wait_sampling
pg_wait_sampling copied to clipboard
Check collector has started in pg_wait_sampling_reset_profile.
The worker might have not started yet or it may never start, because its registration was cancelled due to worker limit.
This commit adds a check for NULL value of pgws_collector_hdr->latch. The previous usage in pg_wait_sampling.c has such a check, we should do the same here.
Воспроизведение. Можно запускать в любой директории, создается временный докер-контейнер.
#!/bin/bash
sudo docker run --rm -i ubuntu:24.04 bash <<"EOF"
set -xe
apt-get update
apt-get install -y \
git build-essential pkg-config libicu-dev libipc-run-perl \
flex bison libreadline-dev libz-dev gettext libperl-dev
git clone -b REL_17_5 --depth 1 https://github.com/postgres/postgres
cd postgres
git clone https://github.com/postgrespro/pg_wait_sampling contrib/pg_wait_sampling
mkdir contrib/pgws_reproduce
cat - > contrib/pgws_reproduce/Makefile <<"_EOF"
MODULE_big = pgws_reproduce
OBJS = main.o
EXTENSION = pgws_reproduce
REGRESS =
subdir = contrib/pgws_reproduce
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
_EOF
cat - > contrib/pgws_reproduce/pgws_reproduce.control <<"_EOF"
pg_wait_sampling extension
comment = 'reproduce bug'
default_version = '1'
module_pathname = '$libdir/pgws_reproduce'
relocatable = true
_EOF
cat - > contrib/pgws_reproduce/main.c <<"_EOF"
#include "postgres.h"
#include "postmaster/bgworker.h"
#include "fmgr.h"
#include <sched.h> /* Only works on linux. */
PG_MODULE_MAGIC;
void pgws_reproduce_worker_main(Datum main_arg);
void _PG_init(void);
void pgws_reproduce_worker_main(Datum main_arg) {
while (true) {
sched_yield();
}
}
void _PG_init(void) {
/* Default limit of workers is 8. */
for (int i = 0; i < 32; ++i) {
BackgroundWorker worker;
memset(&worker, 0, sizeof(worker));
worker.bgw_restart_time = 1;
worker.bgw_flags = BGWORKER_SHMEM_ACCESS;
snprintf(worker.bgw_library_name, BGW_MAXLEN, "pgws_reproduce");
snprintf(worker.bgw_function_name, BGW_MAXLEN, CppAsString(pgws_reproduce_worker_main));
worker.bgw_main_arg = (Datum) 0;
RegisterBackgroundWorker(&worker);
}
}
_EOF
grep -v '$(recurse' contrib/Makefile > output.txt
mv output.txt contrib/Makefile
echo 'SUBDIRS += pg_wait_sampling pgws_reproduce' >> contrib/Makefile
echo -e '$(recurse)\n$(recurse_always)' >> contrib/Makefile
CFLAGS='-ggdb -O0 -g' ./configure -q \
--enable-cassert --enable-tap-tests --enable-nls \
--with-icu --with-perl --prefix=$(pwd)/install
make -s -j$(nproc) world-bin
make -s -j$(nproc) install-world-bin
useradd postgres
chown -R postgres .
cd install
su postgres -c 'bin/initdb -D data'
su postgres -c "echo \"shared_preload_libraries = 'pgws_reproduce, pg_wait_sampling'\" > data/postgresql.conf"
su postgres -c 'bin/pg_ctl -D data -l logfile start' || (cat logfile; exit 1)
cd ..
su postgres -c 'make -C contrib/pg_wait_sampling installcheck' || (grep '(PID ' install/logfile; exit 2)
cat install/logfile
EOF