mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
hash: Add write-ahead logging support.
The warning about hash indexes not being write-ahead logged and their use being discouraged has been removed. "snapshot too old" is now supported for tables with hash indexes. Most importantly, barring bugs, hash indexes will now be crash-safe and usable on standbys. This commit doesn't yet add WAL consistency checking for hash indexes, as we now have for other index types; a separate patch has been submitted to cure that lack. Amit Kapila, reviewed and slightly modified by me. The larger patch series of which this is a part has been reviewed and tested by Álvaro Herrera, Ashutosh Sharma, Mark Kirkwood, Jeff Janes, and Jesper Pedersen. Discussion: http://postgr.es/m/CAA4eK1JOBX=YU33631Qh-XivYXtPSALh514+jR8XeD7v+K3r_Q@mail.gmail.com
This commit is contained in:
@@ -19,10 +19,142 @@
|
||||
void
|
||||
hash_desc(StringInfo buf, XLogReaderState *record)
|
||||
{
|
||||
char *rec = XLogRecGetData(record);
|
||||
uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
|
||||
|
||||
switch (info)
|
||||
{
|
||||
case XLOG_HASH_INIT_META_PAGE:
|
||||
{
|
||||
xl_hash_init_meta_page *xlrec = (xl_hash_init_meta_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "num_tuples %g, fillfactor %d",
|
||||
xlrec->num_tuples, xlrec->ffactor);
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_INIT_BITMAP_PAGE:
|
||||
{
|
||||
xl_hash_init_bitmap_page *xlrec = (xl_hash_init_bitmap_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "bmsize %d", xlrec->bmsize);
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_INSERT:
|
||||
{
|
||||
xl_hash_insert *xlrec = (xl_hash_insert *) rec;
|
||||
|
||||
appendStringInfo(buf, "off %u", xlrec->offnum);
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_ADD_OVFL_PAGE:
|
||||
{
|
||||
xl_hash_add_ovfl_page *xlrec = (xl_hash_add_ovfl_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "bmsize %d, bmpage_found %c",
|
||||
xlrec->bmsize, (xlrec->bmpage_found) ? 'T' : 'F');
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_SPLIT_ALLOCATE_PAGE:
|
||||
{
|
||||
xl_hash_split_allocate_page *xlrec = (xl_hash_split_allocate_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "new_bucket %u, meta_page_masks_updated %c, issplitpoint_changed %c",
|
||||
xlrec->new_bucket,
|
||||
(xlrec->flags & XLH_SPLIT_META_UPDATE_MASKS) ? 'T' : 'F',
|
||||
(xlrec->flags & XLH_SPLIT_META_UPDATE_SPLITPOINT) ? 'T' : 'F');
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_SPLIT_COMPLETE:
|
||||
{
|
||||
xl_hash_split_complete *xlrec = (xl_hash_split_complete *) rec;
|
||||
|
||||
appendStringInfo(buf, "old_bucket_flag %u, new_bucket_flag %u",
|
||||
xlrec->old_bucket_flag, xlrec->new_bucket_flag);
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_MOVE_PAGE_CONTENTS:
|
||||
{
|
||||
xl_hash_move_page_contents *xlrec = (xl_hash_move_page_contents *) rec;
|
||||
|
||||
appendStringInfo(buf, "ntups %d, is_primary %c",
|
||||
xlrec->ntups,
|
||||
xlrec->is_prim_bucket_same_wrt ? 'T' : 'F');
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_SQUEEZE_PAGE:
|
||||
{
|
||||
xl_hash_squeeze_page *xlrec = (xl_hash_squeeze_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "prevblkno %u, nextblkno %u, ntups %d, is_primary %c",
|
||||
xlrec->prevblkno,
|
||||
xlrec->nextblkno,
|
||||
xlrec->ntups,
|
||||
xlrec->is_prim_bucket_same_wrt ? 'T' : 'F');
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_DELETE:
|
||||
{
|
||||
xl_hash_delete *xlrec = (xl_hash_delete *) rec;
|
||||
|
||||
appendStringInfo(buf, "is_primary %c",
|
||||
xlrec->is_primary_bucket_page ? 'T' : 'F');
|
||||
break;
|
||||
}
|
||||
case XLOG_HASH_UPDATE_META_PAGE:
|
||||
{
|
||||
xl_hash_update_meta_page *xlrec = (xl_hash_update_meta_page *) rec;
|
||||
|
||||
appendStringInfo(buf, "ntuples %g",
|
||||
xlrec->ntuples);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
hash_identify(uint8 info)
|
||||
{
|
||||
return NULL;
|
||||
const char *id = NULL;
|
||||
|
||||
switch (info & ~XLR_INFO_MASK)
|
||||
{
|
||||
case XLOG_HASH_INIT_META_PAGE:
|
||||
id = "INIT_META_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_INIT_BITMAP_PAGE:
|
||||
id = "INIT_BITMAP_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_INSERT:
|
||||
id = "INSERT";
|
||||
break;
|
||||
case XLOG_HASH_ADD_OVFL_PAGE:
|
||||
id = "ADD_OVFL_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_SPLIT_ALLOCATE_PAGE:
|
||||
id = "SPLIT_ALLOCATE_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_SPLIT_PAGE:
|
||||
id = "SPLIT_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_SPLIT_COMPLETE:
|
||||
id = "SPLIT_COMPLETE";
|
||||
break;
|
||||
case XLOG_HASH_MOVE_PAGE_CONTENTS:
|
||||
id = "MOVE_PAGE_CONTENTS";
|
||||
break;
|
||||
case XLOG_HASH_SQUEEZE_PAGE:
|
||||
id = "SQUEEZE_PAGE";
|
||||
break;
|
||||
case XLOG_HASH_DELETE:
|
||||
id = "DELETE";
|
||||
break;
|
||||
case XLOG_HASH_SPLIT_CLEANUP:
|
||||
id = "SPLIT_CLEANUP";
|
||||
break;
|
||||
case XLOG_HASH_UPDATE_META_PAGE:
|
||||
id = "UPDATE_META_PAGE";
|
||||
break;
|
||||
}
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user