*** 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
