Re: Assertion failure in pgbench - Mailing list pgsql-hackers
From | Tatsuo Ishii |
---|---|
Subject | Re: Assertion failure in pgbench |
Date | |
Msg-id | 20250731.110306.1627240226208638485.ishii@postgresql.org Whole thread Raw |
In response to | Re: Assertion failure in pgbench (Tatsuo Ishii <ishii@postgresql.org>) |
Responses |
Re: Assertion failure in pgbench
Re: Assertion failure in pgbench |
List | 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. 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
pgsql-hackers by date: