filesize.patch
application/octet-stream
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);