Skip to content

Commit 93078e6

Browse files
committed
Maintain valid md.c state when FileClose() fails.
FileClose() failure ordinarily causes a PANIC. Suppose the user disables that PANIC via data_sync_retry=on. After mdclose() issued a FileClose() that failed, calls into md.c raised SIGSEGV. This fix adds repalloc() calls during mdclose(); update a comment about ignoring repalloc() cost. The rate of relation segment count change is a minor factor; more relevant to overall performance is the rate of mdclose() and subsequent re-opening of segments. Back-patch to v10, where commit 45e191e introduced the bug. Reviewed by Kyotaro Horiguchi. Discussion: https://postgr.es/m/20191222091930.GA1280238@rfd.leadboat.com
1 parent 2e89a12 commit 93078e6

File tree

1 file changed

+6
-14
lines changed
  • src/backend/storage/smgr

1 file changed

+6
-14
lines changed

src/backend/storage/smgr/md.c

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -491,18 +491,10 @@ mdclose(SMgrRelation reln, ForkNumber forknum)
491491
{
492492
MdfdVec *v = &reln->md_seg_fds[forknum][nopensegs - 1];
493493

494-
/* if not closed already */
495-
if (v->mdfd_vfd >= 0)
496-
{
497-
FileClose(v->mdfd_vfd);
498-
v->mdfd_vfd = -1;
499-
}
500-
494+
FileClose(v->mdfd_vfd);
495+
_fdvec_resize(reln, forknum, nopensegs - 1);
501496
nopensegs--;
502497
}
503-
504-
/* resize just once, avoids pointless reallocations */
505-
_fdvec_resize(reln, forknum, 0);
506498
}
507499

508500
/*
@@ -1025,10 +1017,10 @@ _fdvec_resize(SMgrRelation reln,
10251017
else
10261018
{
10271019
/*
1028-
* It doesn't seem worthwhile complicating the code by having a more
1029-
* aggressive growth strategy here; the number of segments doesn't
1030-
* grow that fast, and the memory context internally will sometimes
1031-
* avoid doing an actual reallocation.
1020+
* It doesn't seem worthwhile complicating the code to amortize
1021+
* repalloc() calls. Those are far faster than PathNameOpenFile() or
1022+
* FileClose(), and the memory context internally will sometimes avoid
1023+
* doing an actual reallocation.
10321024
*/
10331025
reln->md_seg_fds[forknum] =
10341026
repalloc(reln->md_seg_fds[forknum],

0 commit comments

Comments
 (0)