Re: BUG #15727: PANIC: cannot abort transaction 295144144, it was already committed

Amit Langote <langote_amit_f8@lab.ntt.co.jp>

From: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
To: Tom Lane <tgl@sss.pgh.pa.us>, r.zharkov@postgrespro.ru
Cc: Alvaro Herrera <alvherre@2ndquadrant.com>, Andres Freund <andres@anarazel.de>, pgsql-bugs@lists.postgresql.org
Date: 2019-04-08T07:21:47Z
Lists: pgsql-bugs

Attachments

On 2019/04/07 1:23, Tom Lane wrote:
> It seems that there may be some connection between this problem and
> EPQ.  I was working on committing Amit's fix for bug #15677, which
> demonstrated that EPQ doesn't work for partitioned-table target rels.
> It seemed like there really needed to be regression test coverage for
> that, so I tried to convert his crasher example into an isolation test.
> It does indeed crash without Amit's fix ... but with it, lookee what
> I get:
> 
> +error in steps c1 complexpartupdate: ERROR:  unexpected table_lock_tuple status: 1
> 
> That seems fully reproducible in this test.  I haven't looked into
> exactly what's causing that, but now that we have a reproducible
> example, somebody should.
> 
> I'm not quite sure if I should commit this as-is or wait till the
> other problem is fixed.  A crash is probably worse than a bogus
> error, but I don't like committing obviously-wrong "expected" output.
> Thoughts?

Thank you Tom for picking it up and adding the test which I should've done
to begin with.

Now that Andres has taken care of the other issues [1], maybe this one's
good to go?  The isolation test part needed to be rebased over Andres'
commit, which I've done in the attached updated patch.

Thanks,
Amit

[1] https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=41f5e04ae

Commits

  1. Fix GetNewTransactionId()'s interaction with xidVacLimit.

  2. Fix example in comment.

  3. Fix EvalPlanQualStart to handle partitioned result rels correctly.

  4. Fix a number of issues around modifying a previously updated row.

  5. Use FullTransactionId for the transaction stack.

  6. Add basic infrastructure for 64 bit transaction IDs.

  7. tableam: Add tuple_{insert, delete, update, lock} and use.

  8. Throw error if expiring tuple is again updated or deleted.