From 973a210cce990134f63da12f8ca2d4d0718a103e Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 7 Jan 2003 01:19:12 +0000 Subject: [PATCH] Tweak mdnblocks() to avoid doing lseek() on segments that it has previously determined not to be the last segment of a relation. This reduces the expected cost to one seek, rather than one seek per segment. We can get away with this because truncation of a relation will cause a relcache flush and so the md.c file descriptor will be closed; when it is re-opened we will re-determine the last segment. --- src/backend/storage/smgr/md.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index f8f82048f3..d67be96349 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.93 2002/11/12 15:26:30 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.94 2003/01/07 01:19:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -569,6 +569,21 @@ mdnblocks(Relation reln) #ifndef LET_OS_MANAGE_FILESIZE segno = 0; + + /* + * Skip through any segments that aren't the last one, to avoid redundant + * seeks on them. We have previously verified that these segments are + * exactly RELSEG_SIZE long, and it's useless to recheck that each time. + * (NOTE: this assumption could only be wrong if another backend has + * truncated the relation. We rely on higher code levels to handle that + * scenario by closing and re-opening the md fd.) + */ + while (v->mdfd_chain != (MdfdVec *) NULL) + { + segno++; + v = v->mdfd_chain; + } + for (;;) { nblocks = _mdnblocks(v->mdfd_vfd, BLCKSZ);