]> granicus.if.org Git - postgresql/commitdiff
Use 64 bit type for BufFileSize().
authorThomas Munro <tmunro@postgresql.org>
Wed, 14 Nov 2018 23:34:04 +0000 (12:34 +1300)
committerThomas Munro <tmunro@postgresql.org>
Thu, 15 Nov 2018 00:40:06 +0000 (13:40 +1300)
BufFileSize() can't use off_t, because it's only 32 bits wide on
some systems.  BufFile objects can have many 1GB segments so the
total size can exceed 2^31.  The only known client of the function
is parallel CREATE INDEX, which was reported to fail when building
large indexes on Windows.

Though this is technically an ABI break on platforms with a 32 bit
off_t and we might normally avoid back-patching it, the function is
brand new and thus unlikely to have been discovered by extension
authors yet, and it's fairly thoroughly broken on those platforms
anyway, so just fix it.

Defect in 9da0cc35.  Bug #15460.  Back-patch to 11, where this
function landed.

Author: Thomas Munro
Reported-by: Paul van der Linden, Pavel Oskin
Reviewed-by: Peter Geoghegan
Discussion: https://postgr.es/m/15460-b6db80de822fa0ad%40postgresql.org
Discussion: https://postgr.es/m/CAHDGBJP_GsESbTt4P3FZA8kMUKuYxjg57XHF7NRBoKnR%3DCAR-g%40mail.gmail.com

src/backend/storage/file/buffile.c
src/backend/utils/sort/logtape.c
src/include/storage/buffile.h

index e93813d97371f32aa0f6cbe839fdbd34b7dfacbc..8c7d8bcb91dfb93c2730b1cc71cc39f234a09c4c 100644 (file)
@@ -798,10 +798,10 @@ BufFileTellBlock(BufFile *file)
  * Counts any holes left behind by BufFileAppend as part of the size.
  * Returns -1 on error.
  */
-off_t
+int64
 BufFileSize(BufFile *file)
 {
-       off_t           lastFileSize;
+       int64           lastFileSize;
 
        /* Get the size of the last physical file by seeking to end. */
        lastFileSize = FileSeek(file->files[file->numFiles - 1], 0, SEEK_END);
@@ -809,7 +809,7 @@ BufFileSize(BufFile *file)
                return -1;
        file->offsets[file->numFiles - 1] = lastFileSize;
 
-       return ((file->numFiles - 1) * (off_t) MAX_PHYSICAL_FILESIZE) +
+       return ((file->numFiles - 1) * (int64) MAX_PHYSICAL_FILESIZE) +
                lastFileSize;
 }
 
index 50a150b7136b59030f4b879570f869e9b875bb0f..269523d5f6afda961efdcef5192b578fd8c212eb 100644 (file)
@@ -426,7 +426,7 @@ ltsConcatWorkerTapes(LogicalTapeSet *lts, TapeShare *shared,
        {
                char            filename[MAXPGPATH];
                BufFile    *file;
-               off_t           filesize;
+               int64           filesize;
 
                lt = &lts->tapes[i];
 
index a6cdeb451c1f7b0d89dce77a8531f1425fd89fc5..a4043bd69d1c1c5e7007df4f66c5a12cf6b50f71 100644 (file)
@@ -43,7 +43,7 @@ extern size_t BufFileWrite(BufFile *file, void *ptr, size_t size);
 extern int     BufFileSeek(BufFile *file, int fileno, off_t offset, int whence);
 extern void BufFileTell(BufFile *file, int *fileno, off_t *offset);
 extern int     BufFileSeekBlock(BufFile *file, long blknum);
-extern off_t BufFileSize(BufFile *file);
+extern int64 BufFileSize(BufFile *file);
 extern long BufFileAppend(BufFile *target, BufFile *source);
 
 extern BufFile *BufFileCreateShared(SharedFileSet *fileset, const char *name);