Re: Assertion failure in pgbench
Tatsuo Ishii <ishii@postgresql.org>
From: Tatsuo Ishii <ishii@postgresql.org>
To: masao.fujii@gmail.com
Cc: pgsql-hackers@lists.postgresql.org
Date: 2025-07-31T01:43:23Z
Lists: pgsql-hackers
> 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.
Best regards,
--
Tatsuo Ishii
SRA OSS K.K.
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix assertion failure in pgbench when handling multiple pipeline sync messages.
- 6914a330f019 15.14 landed
- 1d3ded521a0b 16.10 landed
- 398e07162eca 17.6 landed
- fee46ab4f244 18.0 landed
- 12efa48978c6 19 (unreleased) landed