*** a/src/backend/access/transam/twophase.c --- b/src/backend/access/transam/twophase.c *************** *** 1445,1450 **** FinishPreparedTransaction(const char *gid, bool isCommit) --- 1445,1451 ---- int ndelrels; SharedInvalidationMessage *invalmsgs; int i; + SMgrRelation *srels = NULL; /* * Validate the GID, and lock the GXACT to ensure that two backends do not *************** *** 1534,1546 **** FinishPreparedTransaction(const char *gid, bool isCommit) delrels = abortrels; ndelrels = hdr->nabortrels; } for (i = 0; i < ndelrels; i++) ! { ! SMgrRelation srel = smgropen(delrels[i], InvalidBackendId); ! smgrdounlink(srel, false); ! smgrclose(srel); ! } /* * Handle cache invalidation messages. --- 1535,1550 ---- delrels = abortrels; ndelrels = hdr->nabortrels; } + + srels = palloc(sizeof(SMgrRelation) * ndelrels); for (i = 0; i < ndelrels; i++) ! srels[i] = smgropen(delrels[i], InvalidBackendId); ! smgrdounlinkall(srels, ndelrels, false); ! ! for (i = 0; i < ndelrels; i++) ! smgrclose(srels[i]); ! pfree(srels); /* * Handle cache invalidation messages. *** a/src/backend/access/transam/xact.c --- b/src/backend/access/transam/xact.c *************** *** 5640,5645 **** xact_redo_commit(xl_xact_parsed_commit *parsed, --- 5640,5647 ---- /* Make sure files supposed to be dropped are dropped */ if (parsed->nrels > 0) { + SMgrRelation *srels = NULL; + /* * First update minimum recovery point to cover this WAL record. Once * a relation is deleted, there's no going back. The buffer manager *************** *** 5657,5662 **** xact_redo_commit(xl_xact_parsed_commit *parsed, --- 5659,5665 ---- */ XLogFlush(lsn); + srels = palloc(sizeof(SMgrRelation) * parsed->nrels); for (i = 0; i < parsed->nrels; i++) { SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId); *************** *** 5664,5672 **** xact_redo_commit(xl_xact_parsed_commit *parsed, for (fork = 0; fork <= MAX_FORKNUM; fork++) XLogDropRelation(parsed->xnodes[i], fork); ! smgrdounlink(srel, true); ! smgrclose(srel); } } /* --- 5667,5680 ---- for (fork = 0; fork <= MAX_FORKNUM; fork++) XLogDropRelation(parsed->xnodes[i], fork); ! srels[i] = srel; } + + smgrdounlinkall(srels, parsed->nrels, true); + + for (i = 0; i < parsed->nrels; i++) + smgrclose(srels[i]); + pfree(srels); } /* *************** *** 5707,5712 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) --- 5715,5721 ---- { int i; TransactionId max_xid; + SMgrRelation *srels = NULL; Assert(TransactionIdIsValid(xid)); *************** *** 5770,5775 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) --- 5779,5785 ---- } /* Make sure files supposed to be dropped are dropped */ + srels = palloc(sizeof(SMgrRelation) * parsed->nrels); for (i = 0; i < parsed->nrels; i++) { SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId); *************** *** 5777,5785 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) for (fork = 0; fork <= MAX_FORKNUM; fork++) XLogDropRelation(parsed->xnodes[i], fork); ! smgrdounlink(srel, true); ! smgrclose(srel); } } void --- 5787,5800 ---- for (fork = 0; fork <= MAX_FORKNUM; fork++) XLogDropRelation(parsed->xnodes[i], fork); ! srels[i] = srel; } + + smgrdounlinkall(srels, parsed->nrels, true); + + for (i = 0; i < parsed->nrels; i++) + smgrclose(srels[i]); + pfree(srels); } void