On Thu, Jul 31, 2025 at 9:03 AM Tatsuo Ishii <is...@postgresql.org> wrote:
> >> Hi, > >> > >> I encountered the following assertion failure in pgbench on the current > master: > >> > >> Assertion failed: (res == ((void*)0)), function discardUntilSync, > >> file pgbench.c, line 3515. > >> Abort trap: 6 > >> > >> > >> This can be reliably reproduced with the following steps: > >> > >> ------------------------ > >> $ psql -c "ALTER SYSTEM SET default_transaction_isolation TO > 'serializable'" > >> > >> $ psql -c "SELECT pg_reload_conf()" > >> > >> $ pgbench -i > >> > >> $ cat test.sql > >> \set aid random(1, 100000 * :scale) > >> \set bid random(1, 1 * :scale) > >> \set tid random(1, 10 * :scale) > >> \set delta random(-5000, 5000) > >> \startpipeline > >> BEGIN; > >> UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = > :aid; > >> SELECT abalance FROM pgbench_accounts WHERE aid = :aid; > >> UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = > :tid; > >> UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = > :bid; > >> INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES > >> (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); > >> END; > >> \endpipeline > >> > >> $ pgbench -f test.sql -c 10 -j 10 -T 60 -M extended > >> ------------------------ > >> > >> Even without a custom script, shutting down the server with > >> immediate mode while running "pgbench -c 10 -j 10 -T 60" could > >> trigger the same assertion, though not always reliably. > >> > >> > >> /* receive PGRES_PIPELINE_SYNC and null following it */ > >> for (;;) > >> { > >> PGresult *res = PQgetResult(st->con); > >> > >> if (PQresultStatus(res) == PGRES_PIPELINE_SYNC) > >> { > >> PQclear(res); > >> res = PQgetResult(st->con); > >> Assert(res == NULL); > >> break; > >> } > >> PQclear(res); > >> } > >> > >> The failure occurs in this code. This code assumes that > PGRES_PIPELINE_SYNC > >> is always followed by a NULL. However, it seems that another > >> PGRES_PIPELINE_SYNC can appear consecutively, which violates that > assumption > >> and causes the assertion to fail. Thought? > > > > Yes. When an error occurs and an error response message returned from > > backend, pgbench will send one more sync message, then sends ROLLBACK > > if necessary. I think the code above should be changed to call > > PQgetResult repeatably until it returns NULL. > > Correction. That would not be a proper fix. Just removing inner > PQgetResult and the Assert is enough? > > Best regards, > -- > Tatsuo Ishii > SRA OSS K.K. > English: http://www.sraoss.co.jp/index_en/ > Japanese:http://www.sraoss.co.jp > > Hi, Tatsuo. Do you understand why there is an assertion error in the immediate shutdown case? Best Regards, Stepan Neretin