diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 716d795..3dc7dae 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -2113,7 +2113,6 @@ DropRelFileNodeAllBuffers(RelFileNodeBackend *rnodes, int nnodes) for (i = 0; i < NBuffers; i++) { - RelFileNodeBackend *rnode = NULL; volatile BufferDesc *bufHdr = &BufferDescriptors[i]; @@ -2125,8 +2124,9 @@ DropRelFileNodeAllBuffers(RelFileNodeBackend *rnodes, int nnodes) rnode = rnodes; - } else { - + } + else + { rnode = bsearch((const void *) &(bufHdr->tag.rnode), rnodes, nnodes, sizeof(RelFileNodeBackend), @@ -2135,7 +2135,6 @@ DropRelFileNodeAllBuffers(RelFileNodeBackend *rnodes, int nnodes) /* buffer does not belong to any of the relations */ if (rnode == NULL) continue; - } LockBufHdr(bufHdr); diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 40a9d0b..fb9f8ab 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -422,9 +422,11 @@ smgrdounlink(SMgrRelation reln, bool isRedo) void smgrdounlinkall(SMgrRelation * rels, int nrels, bool isRedo) { int i = 0; - RelFileNodeBackend rnodes[nrels]; + RelFileNodeBackend *rnodes; ForkNumber forknum; + /* initialize an array which contains all relations to be dropped */ + rnodes = palloc(sizeof(RelFileNodeBackend) * nrels); for (i = 0; i < nrels; i++) { RelFileNodeBackend rnode = rels[i]->smgr_rnode; @@ -458,7 +460,8 @@ void smgrdounlinkall(SMgrRelation * rels, int nrels, bool isRedo) * this backend, too, and thereby provide a backstop that we closed our * own smgr rel. */ - for (i = 0; i < nrels; i++) { + for (i = 0; i < nrels; i++) + { CacheInvalidateSmgr(rnodes[i]); } @@ -470,11 +473,14 @@ void smgrdounlinkall(SMgrRelation * rels, int nrels, bool isRedo) * xact. */ - for (i = 0; i < nrels; i++) { - int which = rels[i]->smgr_which; + for (i = 0; i < nrels; i++) + { + int which = rels[i]->smgr_which; for (forknum = 0; forknum <= MAX_FORKNUM; forknum++) (*(smgrsw[which].smgr_unlink)) (rnodes[i], forknum, isRedo); } + + pfree(rnodes); } /*