103#define TapeBlockPayloadSize (BLCKSZ - sizeof(TapeBlockTrailer))
104#define TapeBlockGetTrailer(buf) \
105 ((TapeBlockTrailer *) ((char *) buf + TapeBlockPayloadSize))
107#define TapeBlockIsLast(buf) (TapeBlockGetTrailer(buf)->next < 0)
108#define TapeBlockGetNBytes(buf) \
109 (TapeBlockIsLast(buf) ? \
110 (- TapeBlockGetTrailer(buf)->next) : TapeBlockPayloadSize)
111#define TapeBlockSetNBytes(buf, nbytes) \
112 (TapeBlockGetTrailer(buf)->next = -(nbytes))
124#define TAPE_WRITE_PREALLOC_MIN 8
125#define TAPE_WRITE_PREALLOC_MAX 128
266 errmsg(
"could not seek to block %" PRId64
" of temporary file",
287 errmsg(
"could not seek to block %" PRId64
" of temporary file",
309 if (datablocknum == -1L)
405 if (left < heapsize && right < heapsize)
406 min_child = (heap[left] < heap[right]) ? left : right;
407 else if (left < heapsize)
409 else if (right < heapsize)
414 if (heap[min_child] >= holeval)
417 heap[holepos] = heap[min_child];
420 heap[holepos] = holeval;
507 if (heap[parent] < blocknum)
510 heap[holepos] = heap[parent];
513 heap[holepos] = blocknum;
585 if (fileset && worker == -1)
632 if (lts->
pfile == NULL)
643 tapeblocks = filesize / BLCKSZ;
690 elog(
ERROR,
"cannot create new tapes in leader process");
792 int64 nextBlockNumber;
797 elog(
ERROR,
"invalid logtape state: should be dirty");
818 if (nthistime > size)
822 memcpy(lt->
buffer + lt->
pos, ptr, nthistime);
825 lt->
pos += nthistime;
828 ptr = (
const char *) ptr + nthistime;
854 buffer_size = BLCKSZ;
858 if (buffer_size < BLCKSZ)
859 buffer_size = BLCKSZ;
866 buffer_size -= buffer_size % BLCKSZ;
948 if (nthistime > size)
952 memcpy(ptr, lt->
buffer + lt->
pos, nthistime);
954 lt->
pos += nthistime;
955 ptr = (
char *) ptr + nthistime;
1075 if (size <= (
size_t) lt->
pos)
1077 lt->
pos -= (int) size;
1086 seekpos = (size_t) lt->
pos;
1087 while (size > seekpos)
1103 elog(
ERROR,
"broken tape, next of block %" PRId64
" is %" PRId64
", expected %" PRId64,
1120 lt->
pos = seekpos - size;
1151 elog(
ERROR,
"invalid tape seek position");
BufFile * BufFileOpenFileSet(FileSet *fileset, const char *name, int mode, bool missing_ok)
int BufFileSeekBlock(BufFile *file, int64 blknum)
void BufFileExportFileSet(BufFile *file)
void BufFileReadExact(BufFile *file, void *ptr, size_t size)
BufFile * BufFileCreateTemp(bool interXact)
void BufFileWrite(BufFile *file, const void *ptr, size_t size)
BufFile * BufFileCreateFileSet(FileSet *fileset, const char *name)
int64 BufFileSize(BufFile *file)
void BufFileClose(BufFile *file)
int64 BufFileAppend(BufFile *target, BufFile *source)
#define MemSet(start, val, len)
int errcode_for_file_access(void)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
void LogicalTapeRewindForRead(LogicalTape *lt, size_t buffer_size)
#define TapeBlockGetTrailer(buf)
static LogicalTape * ltsCreateTape(LogicalTapeSet *lts)
void LogicalTapeSetForgetFreeSpace(LogicalTapeSet *lts)
size_t LogicalTapeBackspace(LogicalTape *lt, size_t size)
static int64 ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt)
size_t LogicalTapeRead(LogicalTape *lt, void *ptr, size_t size)
static uint64 parent_offset(uint64 i)
int64 LogicalTapeSetBlocks(LogicalTapeSet *lts)
void LogicalTapeClose(LogicalTape *lt)
#define TapeBlockPayloadSize
struct TapeBlockTrailer TapeBlockTrailer
void LogicalTapeSetClose(LogicalTapeSet *lts)
static bool ltsReadFillBuffer(LogicalTape *lt)
static void ltsInitReadBuffer(LogicalTape *lt)
#define TAPE_WRITE_PREALLOC_MIN
static uint64 left_offset(uint64 i)
static void ltsWriteBlock(LogicalTapeSet *lts, int64 blocknum, const void *buffer)
static int64 ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt)
#define TapeBlockIsLast(buf)
#define TAPE_WRITE_PREALLOC_MAX
void LogicalTapeSeek(LogicalTape *lt, int64 blocknum, int offset)
static void ltsReadBlock(LogicalTapeSet *lts, int64 blocknum, void *buffer)
LogicalTapeSet * LogicalTapeSetCreate(bool preallocate, SharedFileSet *fileset, int worker)
void LogicalTapeTell(LogicalTape *lt, int64 *blocknum, int *offset)
void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size)
#define TapeBlockGetNBytes(buf)
static void ltsReleaseBlock(LogicalTapeSet *lts, int64 blocknum)
#define TapeBlockSetNBytes(buf, nbytes)
static int64 ltsGetFreeBlock(LogicalTapeSet *lts)
static uint64 right_offset(uint64 i)
LogicalTape * LogicalTapeCreate(LogicalTapeSet *lts)
void LogicalTapeFreeze(LogicalTape *lt, TapeShare *share)
LogicalTape * LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
int pg_itoa(int16 i, char *a)