| From: | "Drouvot, Bertrand" <bdrouvot(at)amazon(dot)com> | 
|---|---|
| To: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> | 
| Subject: | [BUG] failed assertion in EnsurePortalSnapshotExists() | 
| Date: | 2021-09-27 15:52:25 | 
| Message-ID: | ff82b8c5-77f4-3fe7-6028-fcf3303e82dd@amazon.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-hackers | 
Hi hackers,
I recently observed a failed assertion in EnsurePortalSnapshotExists().
The steps to reproduce the issue on the master branch are:
create table bdt (a int primary key);
insert into bdt values (1),(2);
create table bdt2 (a int);
insert into bdt2 values (1);
Then launching:
DO $$
BEGIN
   FOR i IN 1..2 LOOP
     BEGIN
       INSERT INTO bdt (a) VALUES (i);
        exception when unique_violation then update bdt2 set a = i;
      COMMIT;
     END;
   END LOOP;
END;
$$;
Would produce:
server closed the connection unexpectedly
         This probably means the server terminated abnormally
         before or while processing the request.
The connection to the server was lost
Due to:
#2  0x0000000000b2ffcb in ExceptionalCondition (conditionName=0xd0d598 
"portal->portalSnapshot == NULL", errorType=0xd0d0b3 "FailedAssertion", 
fileName=0xd0d174 "pquery.c", lineNumber=1785) at assert.c:69
#3  0x000000000099e666 in EnsurePortalSnapshotExists () at pquery.c:1785
 From what i have seen, we end up having ActiveSnapshot set to NULL in 
AtSubAbort_Snapshot() (while we still have ActivePortal->portalSnapshot 
not being NULL and not set to NULL later on).
That leads to ActiveSnapshotSet() not being true in the next call to 
EnsurePortalSnapshotExists() and leads to the failed assertion (checking 
that ActivePortal->portalSnapshot is NULL) later on in the code.
Based on this, i have created the attached patch (which fixes the issue 
mentioned in the repro) but I have the feeling that I may have missed 
something more important here (that would not be addressed with the 
attached patch), thoughts?
Thanks
Bertrand
| Attachment | Content-Type | Size | 
|---|---|---|
| v1-0001-EnsurePortalSnapshotExists-failed-assertion.patch | text/plain | 580 bytes | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Robert Haas | 2021-09-27 16:17:14 | Re: when the startup process doesn't (logging startup delays) | 
| Previous Message | Robert Haas | 2021-09-27 15:49:59 | Re: when the startup process doesn't (logging startup delays) |