Assertion failure in pgbench - Mailing list pgsql-hackers

From Fujii Masao
Subject Assertion failure in pgbench
Date
Msg-id CAHGQGwFAX56Tfx+1ppo431OSWiLLuW72HaGzZ39NkLkop6bMzQ@mail.gmail.com
Whole thread Raw
Responses 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?

Regards.


-- 
Fujii Masao



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Making type Datum be 8 bytes everywhere
Next
From: Nathan Bossart
Date:
Subject: Re: teach pg_upgrade to handle in-place tablespaces