*** a/src/backend/access/transam/xact.c --- b/src/backend/access/transam/xact.c *************** *** 5641,5646 **** xact_redo_commit(xl_xact_parsed_commit *parsed, --- 5641,5648 ---- /* 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 *************** *** 5658,5663 **** xact_redo_commit(xl_xact_parsed_commit *parsed, --- 5660,5666 ---- */ XLogFlush(lsn); + srels = palloc(sizeof(SMgrRelation) * parsed->nrels); for (i = 0; i < parsed->nrels; i++) { SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId); *************** *** 5665,5673 **** 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); } } /* --- 5668,5681 ---- 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); } /* *************** *** 5708,5713 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) --- 5716,5722 ---- { int i; TransactionId max_xid; + SMgrRelation *srels = NULL; Assert(TransactionIdIsValid(xid)); *************** *** 5771,5776 **** xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid) --- 5780,5786 ---- } /* 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); *************** *** 5778,5786 **** 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 --- 5788,5801 ---- 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