pg_wait_sampling icon indicating copy to clipboard operation
pg_wait_sampling copied to clipboard

Check collector has started in pg_wait_sampling_reset_profile.

Open valeriy-zainullin opened this issue 5 months ago • 1 comments

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.

valeriy-zainullin avatar Jun 19 '25 15:06 valeriy-zainullin

Воспроизведение. Можно запускать в любой директории, создается временный докер-контейнер.

#!/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

valeriy-zainullin avatar Jun 20 '25 07:06 valeriy-zainullin