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:

Previous
From: Tatsuo Ishii
Date:
Subject: Re: Assertion failure in pgbench
Next
From: Stepan Neretin
Date:
Subject: Re: Assertion failure in pgbench