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 %ld of temporary file",
287 errmsg(
"could not seek to block %ld of temporary file",
309 if (datablocknum == -1L)
336 static inline unsigned long
342 static inline unsigned long
348 static inline unsigned long
377 unsigned long holepos;
403 unsigned long min_child;
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;
472 unsigned long holepos;
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 long 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 %ld is %ld, expected %ld",
1120 lt->
pos = seekpos - size;
1151 elog(
ERROR,
"invalid tape seek position");
void BufFileExportFileSet(BufFile *file)
void BufFileReadExact(BufFile *file, void *ptr, size_t size)
long BufFileAppend(BufFile *target, BufFile *source)
BufFile * BufFileOpenFileSet(FileSet *fileset, const char *name, int mode, bool missing_ok)
int BufFileSeekBlock(BufFile *file, long blknum)
BufFile * BufFileCreateTemp(bool interXact)
void BufFileWrite(BufFile *file, const void *ptr, size_t size)
int64 BufFileSize(BufFile *file)
BufFile * BufFileCreateFileSet(FileSet *fileset, const char *name)
void BufFileClose(BufFile *file)
#define MemSet(start, val, len)
elog(ERROR, "%s: %s", p2, msg)
int errcode_for_file_access(void)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(fmt[strlen(fmt) - 1] !='\n')
LogicalTape * LogicalTapeCreate(LogicalTapeSet *lts)
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)
size_t LogicalTapeRead(LogicalTape *lt, void *ptr, size_t size)
static long ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt)
void LogicalTapeClose(LogicalTape *lt)
#define TapeBlockPayloadSize
static void ltsWriteBlock(LogicalTapeSet *lts, long blocknum, const void *buffer)
static unsigned long parent_offset(unsigned long i)
struct TapeBlockTrailer TapeBlockTrailer
void LogicalTapeSetClose(LogicalTapeSet *lts)
static bool ltsReadFillBuffer(LogicalTape *lt)
static void ltsInitReadBuffer(LogicalTape *lt)
#define TAPE_WRITE_PREALLOC_MIN
static long ltsGetFreeBlock(LogicalTapeSet *lts)
static unsigned long right_offset(unsigned long i)
#define TapeBlockIsLast(buf)
#define TAPE_WRITE_PREALLOC_MAX
static long ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt)
void LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset)
void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size)
void LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset)
#define TapeBlockGetNBytes(buf)
static unsigned long left_offset(unsigned long i)
LogicalTapeSet * LogicalTapeSetCreate(bool preallocate, SharedFileSet *fileset, int worker)
static void ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer)
long LogicalTapeSetBlocks(LogicalTapeSet *lts)
#define TapeBlockSetNBytes(buf, nbytes)
static void ltsReleaseBlock(LogicalTapeSet *lts, long blocknum)
void LogicalTapeFreeze(LogicalTape *lt, TapeShare *share)
LogicalTape * LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared)
void pfree(void *pointer)
void * repalloc(void *pointer, Size size)
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
int pg_itoa(int16 i, char *a)