修复并发对临时表insert/update/delete/vacuum/analyze/vacuum full时出现的报错

This commit is contained in:
luozihao
2022-10-31 16:41:01 +08:00
parent 6179070ae2
commit 47e990faa2
3 changed files with 19 additions and 8 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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);