78#define BLOCKS_PER_CHUNK (1 << 16)
79#define BLOCKS_PER_ENTRY (BITS_PER_BYTE * sizeof(uint16))
80#define MAX_ENTRIES_PER_CHUNK (BLOCKS_PER_CHUNK / BLOCKS_PER_ENTRY)
81#define INITIAL_ENTRIES_PER_CHUNK 16
122#define SH_PREFIX blockreftable
123#define SH_ELEMENT_TYPE BlockRefTableEntry
124#define SH_KEY_TYPE BlockRefTableKey
126#define SH_HASH_KEY(tb, key) \
127 hash_bytes((const unsigned char *) &key, sizeof(BlockRefTableKey))
128#define SH_EQUAL(tb, a, b) (memcmp(&a, &b, sizeof(BlockRefTableKey)) == 0)
129#define SH_SCOPE static inline
131#define SH_RAW_ALLOCATOR pg_malloc0
272 key.forknum = forknum;
282 brtentry->limit_block = limit_block;
310 key.forknum = forknum;
349 key.forknum = forknum;
449 for (
i = 0;
i < chunk_usage; ++
i)
492 if (brtab->
hash->members > 0)
512 while (
sentry->nchunks > 0 &&
521 for (
i = 0;
i < brtab->
hash->members; ++
i)
533 key.forknum =
sentry->forknum;
579 char *error_filename,
581 void *error_callback_arg)
598 error_callback(error_callback_arg,
599 "file \"%s\" has wrong magic number: expected %u, found %u",
654 "file \"%s\" has wrong checksum: expected %08X, found %08X",
673 *forknum =
sentry.forknum;
674 *limit_block =
sentry.limit_block;
1156 if (
sa->rlocator.spcOid >
sb->rlocator.spcOid)
1158 if (
sa->rlocator.spcOid <
sb->rlocator.spcOid)
1161 if (
sa->rlocator.dbOid >
sb->rlocator.dbOid)
1163 if (
sa->rlocator.dbOid <
sb->rlocator.dbOid)
1166 if (
sa->rlocator.relNumber >
sb->rlocator.relNumber)
1168 if (
sa->rlocator.relNumber <
sb->rlocator.relNumber)
1171 if (
sa->forknum >
sb->forknum)
1173 if (
sa->forknum <
sb->forknum)
1234 "file \"%s\" ends unexpectedly",
1247 if (buffer->
used == 0)
1249 "file \"%s\" ends unexpectedly",
1282 buffer->
used += length;
void BlockRefTableFreeEntry(BlockRefTableEntry *entry)
BlockRefTableEntry * BlockRefTableGetEntry(BlockRefTable *brtab, const RelFileLocator *rlocator, ForkNumber forknum, BlockNumber *limit_block)
bool BlockRefTableReaderNextRelation(BlockRefTableReader *reader, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *limit_block)
int BlockRefTableEntryGetBlocks(BlockRefTableEntry *entry, BlockNumber start_blkno, BlockNumber stop_blkno, BlockNumber *blocks, int nblocks)
void BlockRefTableMarkBlockModified(BlockRefTable *brtab, const RelFileLocator *rlocator, ForkNumber forknum, BlockNumber blknum)
BlockRefTableWriter * CreateBlockRefTableWriter(io_callback_fn write_callback, void *write_callback_arg)
void BlockRefTableWriteEntry(BlockRefTableWriter *writer, BlockRefTableEntry *entry)
static void BlockRefTableRead(BlockRefTableReader *reader, void *data, int length)
void BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry, ForkNumber forknum, BlockNumber blknum)
BlockRefTableReader * CreateBlockRefTableReader(io_callback_fn read_callback, void *read_callback_arg, char *error_filename, report_error_fn error_callback, void *error_callback_arg)
unsigned BlockRefTableReaderGetBlocks(BlockRefTableReader *reader, BlockNumber *blocks, int nblocks)
void BlockRefTableSetLimitBlock(BlockRefTable *brtab, const RelFileLocator *rlocator, ForkNumber forknum, BlockNumber limit_block)
void BlockRefTableEntrySetLimitBlock(BlockRefTableEntry *entry, BlockNumber limit_block)
BlockRefTable * CreateEmptyBlockRefTable(void)
BlockRefTableEntry * CreateBlockRefTableEntry(RelFileLocator rlocator, ForkNumber forknum)
void WriteBlockRefTable(BlockRefTable *brtab, io_callback_fn write_callback, void *write_callback_arg)
static void BlockRefTableFileTerminate(BlockRefTableBuffer *buffer)
void DestroyBlockRefTableReader(BlockRefTableReader *reader)
#define MAX_ENTRIES_PER_CHUNK
void DestroyBlockRefTableWriter(BlockRefTableWriter *writer)
#define INITIAL_ENTRIES_PER_CHUNK
uint16 * BlockRefTableChunk
static void BlockRefTableWrite(BlockRefTableBuffer *buffer, void *data, int length)
static void BlockRefTableFlush(BlockRefTableBuffer *buffer)
static int BlockRefTableComparator(const void *a, const void *b)
void(* report_error_fn)(void *callback_arg, char *msg,...) pg_attribute_printf(2
int(* io_callback_fn)(void *callback_arg, void *data, int length)
#define BLOCKREFTABLE_MAGIC
#define InvalidBlockNumber
#define Assert(condition)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_array(type, count)
#define palloc0_object(type)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define COMP_CRC32C(crc, data, len)
#define EQ_CRC32C(c1, c2)
#define qsort(a, b, c, d)
io_callback_fn io_callback
BlockRefTableChunk * chunk_data
BlockRefTableBuffer buffer
uint16 chunk_data[MAX_ENTRIES_PER_CHUNK]
void * error_callback_arg
report_error_fn error_callback
BlockRefTableBuffer buffer
blockreftable_hash * hash