!6609 修复hash索引部分问题

Merge pull request !6609 from 陈栋/bugfix
This commit is contained in:
opengauss_bot
2024-11-04 02:54:18 +00:00
committed by Gitee
3 changed files with 26 additions and 24 deletions

View File

@ -1136,6 +1136,7 @@ static void HashXlogMovePageContentsBlock(XLogBlockHead *blockhead, XLogBlockDat
if (block_id == HASH_MOVE_BUK_BLOCK_NUM) {
PageSetLSN(bufferinfo->pageinfo.page, bufferinfo->lsn);
MakeRedoBufferDirty(bufferinfo);
}
if (block_id == HASH_MOVE_ADD_BLOCK_NUM) {
@ -1169,6 +1170,7 @@ static void HashXlogSqueezePageBlock(XLogBlockHead *blockhead, XLogBlockDataPars
if (block_id == HASH_SQUEEZE_BUK_BLOCK_NUM) {
PageSetLSN(bufferinfo->pageinfo.page, bufferinfo->lsn);
MakeRedoBufferDirty(bufferinfo);
}
if (block_id == HASH_SQUEEZE_ADD_BLOCK_NUM) {

View File

@ -1737,22 +1737,22 @@ void ExtremeRtoFlushBuffer(RedoBufferInfo *bufferinfo, bool updateFsm)
/* backends may mark buffer dirty already */
if (!(bufDesc->state & BM_DIRTY)) {
MarkBufferDirty(bufferinfo->buf);
}
if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) {
int mode = WARNING;
if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) {
int mode = WARNING;
#ifdef USE_ASSERT_CHECKING
mode = PANIC;
mode = PANIC;
#endif
const uint32 shiftSz = 32;
ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, "
"lsn_page %X/%X, page %u/%u/%u %u",
(uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn),
(uint32)(bufDesc->extra->lsn_on_disk >> shiftSz),
(uint32)(bufDesc->extra->lsn_on_disk),
(uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz),
(uint32)(PageGetLSN(bufferinfo->pageinfo.page)),
bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode,
bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno)));
const uint32 shiftSz = 32;
ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, "
"lsn_page %X/%X, page %u/%u/%u %u",
(uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn),
(uint32)(bufDesc->extra->lsn_on_disk >> shiftSz),
(uint32)(bufDesc->extra->lsn_on_disk),
(uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz),
(uint32)(PageGetLSN(bufferinfo->pageinfo.page)),
bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode,
bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno)));
}
}
#ifdef USE_ASSERT_CHECKING
bufDesc->lsn_dirty = PageGetLSN(bufferinfo->pageinfo.page);

View File

@ -26,20 +26,20 @@ function hash_index_test()
gsql -d $db_name -p $dn1_primary_port -c "create table hash_table_2(id int, name varchar, sex varchar default 'male');"
gsql -d $db_name -p $dn1_primary_port -c "insert into hash_table_2 select random()*100, 'XXX', 'XXX' from generate_series(1,50000);"
gsql -d $db_name -p $dn1_primary_port -c "create or replace procedure hash_proc_9(sid in integer)
gsql -d $db_name -p $dn1_primary_port -c "create or replace procedure hash_proc_2(sid in integer)
is
begin
set enable_indexscan = on;
set enable_bitmapscan = off;
delete from hash_table_9 where id = sid;
perform * from hash_table_9 where id = sid;
insert into hash_table_9 select sid, random() * 10, 'xxx' from generate_series(1,5000);
delete from hash_table_2 where id = sid;
perform * from hash_table_2 where id = sid;
insert into hash_table_2 select sid, random() * 10, 'xxx' from generate_series(1,5000);
end;
/"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_9(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_9(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_9(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_9(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_2(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_2(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_2(1);"
gsql -d $db_name -p $dn1_primary_port -c "call hash_proc_2(1);"
sleep 3;
@ -56,8 +56,8 @@ function test_1()
kill_cluster
echo "begin to set parallel recovery param"
gs_guc set -Z datanode -D $primary_data_dir -c "recovery_max_workers = 2"
gs_guc set -Z datanode -D $primary_data_dir -c "recovery_parse_workers = 0"
gs_guc set -Z datanode -D $primary_data_dir -c "recovery_redo_workers = 0"
gs_guc set -Z datanode -D $primary_data_dir -c "recovery_parse_workers = 1"
gs_guc set -Z datanode -D $primary_data_dir -c "recovery_redo_workers = 1"
gs_guc set -Z datanode -D $primary_data_dir -c "hot_standby = on"
start_cluster
echo "start cluter success!"