diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 9540279..c354ef4 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -1418,6 +1418,26 @@ FileSeek(File file, off_t offset, int whence) return VfdCache[file].seekPos; } +off_t +FileSize(File file) +{ + int returnCode; + struct stat sb; + + Assert(FileIsValid(file)); + + DO_DB(elog(LOG, "FileSize: %d (%s)", file, VfdCache[file].fileName)); + + returnCode = FileAccess(file); + if (returnCode < 0) + return returnCode; + returnCode = fstat(VfdCache[file].fd, &sb); + if (returnCode < 0) + return returnCode; + + return sb.st_size; +} + /* * XXX not actually used but here for completeness */ diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 7f44606..3676ee9 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -1661,11 +1661,11 @@ _mdnblocks(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg) { off_t len; - len = FileSeek(seg->mdfd_vfd, 0L, SEEK_END); + len = FileSize(seg->mdfd_vfd); if (len < 0) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not seek to end of file \"%s\": %m", + errmsg("could not determine size of file \"%s\": %m", FilePathName(seg->mdfd_vfd)))); /* note that this calculation will ignore any partial block at EOF */ return (BlockNumber) (len / BLCKSZ); diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 8a4d07c..2fb8424 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -68,6 +68,7 @@ extern int FileRead(File file, char *buffer, int amount); extern int FileWrite(File file, char *buffer, int amount); extern int FileSync(File file); extern off_t FileSeek(File file, off_t offset, int whence); +extern off_t FileSize(File file); extern int FileTruncate(File file, off_t offset); extern char *FilePathName(File file);