#endif
/*
- * Return the current file size. Counts any holes left behind by
- * BufFileViewAppend as part of the size.
+ * Return the current file size.
+ *
+ * Counts any holes left behind by BufFileAppend as part of the size.
+ * Returns -1 on error.
*/
off_t
BufFileSize(BufFile *file)
{
+ off_t lastFileSize;
+
+ /* Get the size of the last physical file by seeking to end. */
+ lastFileSize = FileSeek(file->files[file->numFiles - 1], 0, SEEK_END);
+ if (lastFileSize < 0)
+ return -1;
+ file->offsets[file->numFiles - 1] = lastFileSize;
+
return ((file->numFiles - 1) * (off_t) MAX_PHYSICAL_FILESIZE) +
- FileGetSize(file->files[file->numFiles - 1]);
+ lastFileSize;
}
/*
for (i = target->numFiles; i < newNumFiles; i++)
{
target->files[i] = source->files[i - target->numFiles];
- target->offsets[i] = 0L;
+ target->offsets[i] = source->offsets[i - target->numFiles];
}
target->numFiles = newNumFiles;
return VfdCache[file].fileMode;
}
-/*
- * FileGetSize - returns the size of file
- */
-off_t
-FileGetSize(File file)
-{
- Assert(FileIsValid(file));
- return VfdCache[file].fileSize;
-}
-
/*
* Make room for another allocatedDescs[] array entry if needed and possible.
* Returns true if an array element is available.
{
char filename[MAXPGPATH];
BufFile *file;
+ off_t filesize;
lt = <s->tapes[i];
pg_itoa(i, filename);
file = BufFileOpenShared(fileset, filename);
+ filesize = BufFileSize(file);
+ if (filesize < 0)
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not determine size of temporary file \"%s\"", filename)));
/*
* Stash first BufFile, and concatenate subsequent BufFiles to that.
lt->offsetBlockNumber = BufFileAppend(lts->pfile, file);
}
/* Don't allocate more for read buffer than could possibly help */
- lt->max_size = Min(MaxAllocSize, shared[i].buffilesize);
- tapeblocks = shared[i].buffilesize / BLCKSZ;
+ lt->max_size = Min(MaxAllocSize, filesize);
+ tapeblocks = filesize / BLCKSZ;
nphysicalblocks += tapeblocks;
}
{
BufFileExportShared(lts->pfile);
share->firstblocknumber = lt->firstBlockNumber;
- share->buffilesize = BufFileSize(lts->pfile);
}
}
for (i = 0; i < nWorkers; i++)
{
shared->tapes[i].firstblocknumber = 0L;
- shared->tapes[i].buffilesize = 0;
}
}
extern int FileGetRawDesc(File file);
extern int FileGetRawFlags(File file);
extern mode_t FileGetRawMode(File file);
-extern off_t FileGetSize(File file);
/* Operations used for sharing named temporary files */
extern File PathNameCreateTemporaryFile(const char *name, bool error_on_failure);
typedef struct TapeShare
{
/*
- * firstblocknumber is first block that should be read from materialized
- * tape.
- *
- * buffilesize is the size of associated BufFile following freezing.
+ * Currently, all the leader process needs is the location of the
+ * materialized tape's first block.
*/
long firstblocknumber;
- off_t buffilesize;
} TapeShare;
/*