diff --git a/src/common/backend/catalog/storage_gtt.cpp b/src/common/backend/catalog/storage_gtt.cpp index 237a94b90..5ced8a8d5 100644 --- a/src/common/backend/catalog/storage_gtt.cpp +++ b/src/common/backend/catalog/storage_gtt.cpp @@ -462,8 +462,8 @@ void forget_gtt_storage_info(Oid relid, const RelFileNode rnode, bool isCommit) Assert(gttnode2->relfilenode == rnode.relNode); Assert(list_length(entry->relfilenode_list) == 1); /* rollback switch relfilenode */ - gtt_switch_rel_relfilenode( - entry2->relid, gttnode2->relfilenode, entry->relid, gtt_fetch_current_relfilenode(entry->relid), false); + gtt_switch_rel_relfilenode(entry2->relid, gttnode2->relfilenode, entry->relid, + gtt_fetch_current_relfilenode(entry->relid), false, InvalidTransactionId); /* clean up footprint */ entry2->oldrelid = InvalidOid; dRnode = gtt_search_relfilenode(entry, rnode.relNode, false); @@ -1367,7 +1367,8 @@ Oid gtt_fetch_current_relfilenode(Oid relid) return gttRnode->relfilenode; } -void gtt_switch_rel_relfilenode(Oid rel1, Oid relfilenode1, Oid rel2, Oid relfilenode2, bool footprint) +void gtt_switch_rel_relfilenode(Oid rel1, Oid relfilenode1, Oid rel2, Oid relfilenode2, bool footprint, + TransactionId frozenXid) { gtt_local_hash_entry* entry1; gtt_local_hash_entry* entry2; @@ -1395,6 +1396,15 @@ void gtt_switch_rel_relfilenode(Oid rel1, Oid relfilenode1, Oid rel2, Oid relfil entry2->relfilenode_list = list_delete_ptr(entry2->relfilenode_list, gttRnode2); entry1->relfilenode_list = lappend(entry1->relfilenode_list, gttRnode2); + + if (entry1->relkind == RELKIND_RELATION && TransactionIdIsValid(frozenXid)) { + /* update relfrozenxid for the new gtt relfilenode */ + remove_gtt_relfrozenxid_from_ordered_list((Oid)gttRnode2->relfrozenxid); + gttRnode2->relfrozenxid = frozenXid; + insert_gtt_relfrozenxid_to_ordered_list((Oid)frozenXid); + set_gtt_session_relfrozenxid(); + } + (void)MemoryContextSwitchTo(oldcontext); if (footprint) { diff --git a/src/gausskernel/optimizer/commands/cluster.cpp b/src/gausskernel/optimizer/commands/cluster.cpp index b5c000288..d6c9a6f21 100755 --- a/src/gausskernel/optimizer/commands/cluster.cpp +++ b/src/gausskernel/optimizer/commands/cluster.cpp @@ -170,7 +170,7 @@ static void VacFullCompaction(Relation oldHeap, Oid partOid); } #endif void swapRelationIndicesRelfileNode(Relation rel1, Relation rel2, uint8 needSwitch); -static void GttSwapRelationFiles(Oid r1, Oid r2); +static void GttSwapRelationFiles(Oid r1, Oid r2, TransactionId frozenXid); static void HbktModifyPartIndexRelnode(Relation indexRel, Partition indexPart, DataTransferType transferType, Oid bucketOid); @@ -3369,7 +3369,7 @@ void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, bool is_system_catalog, bo */ if (get_rel_persistence(OIDOldHeap) == RELPERSISTENCE_GLOBAL_TEMP) { Assert(!is_system_catalog); - GttSwapRelationFiles(OIDOldHeap, OIDNewHeap); + GttSwapRelationFiles(OIDOldHeap, OIDNewHeap, frozenXid); } swap_relation_files(OIDOldHeap, OIDNewHeap, (OIDOldHeap == RelationRelationId), @@ -3575,7 +3575,7 @@ static List* get_tables_to_cluster(MemoryContext cluster_context) return rvs; } -static void GttSwapRelationFiles(Oid r1, Oid r2) +static void GttSwapRelationFiles(Oid r1, Oid r2, TransactionId frozenXid) { Oid relfilenode1; Oid relfilenode2; @@ -3589,7 +3589,7 @@ static void GttSwapRelationFiles(Oid r1, Oid r2) relfilenode2 = gtt_fetch_current_relfilenode(r2); Assert(OidIsValid(relfilenode1) && OidIsValid(relfilenode2)); - gtt_switch_rel_relfilenode(r1, relfilenode1, r2, relfilenode2, true); + gtt_switch_rel_relfilenode(r1, relfilenode1, r2, relfilenode2, true, frozenXid); CacheInvalidateRelcache(rel1); CacheInvalidateRelcache(rel2); diff --git a/src/include/catalog/storage_gtt.h b/src/include/catalog/storage_gtt.h index d7445757d..d3ad19c59 100644 --- a/src/include/catalog/storage_gtt.h +++ b/src/include/catalog/storage_gtt.h @@ -40,7 +40,8 @@ extern bool get_gtt_relstats( Oid relid, BlockNumber* relpages, double* reltuples, BlockNumber* relallvisible, TransactionId* relfrozenxid); extern void init_gtt_storage(CmdType operation, ResultRelInfo *resultRelInfo); extern Oid gtt_fetch_current_relfilenode(Oid relid); -extern void gtt_switch_rel_relfilenode(Oid rel1, Oid relfilenode1, Oid rel2, Oid relfilenode2, bool footprint); +extern void gtt_switch_rel_relfilenode(Oid rel1, Oid relfilenode1, Oid rel2, Oid relfilenode2, bool footprint, + TransactionId frozenXid); extern void gtt_create_storage_files(Oid relid); extern void remove_gtt_att_statistic(Oid reloid, int attnum); extern void CheckGttTableInUse(Relation rel);