修复并发对临时表insert/update/delete/vacuum/analyze/vacuum full时出现的报错
This commit is contained in:
@ -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) {
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user