Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/backend/access/transam/subtrans.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
#define TransactionIdToEntry(xid) ((xid) % (uint32) SUBTRANS_XACTS_PER_PAGE)


subtransaction_id_hook_type subtransaction_id_hook = NULL;

/*
* Link to shared-memory data structures for SUBTRANS control
*/
Expand Down
7 changes: 7 additions & 0 deletions src/backend/commands/cluster.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "access/tableam.h"
#include "access/toast_internals.h"
#include "access/transam.h"
#include "access/subtrans.h"
#include "access/xact.h"
#include "access/xlog.h"
#include "catalog/catalog.h"
Expand Down Expand Up @@ -1255,6 +1256,12 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
rel2->rd_newRelfilenodeSubid = rel1->rd_newRelfilenodeSubid;
rel2->rd_firstRelfilenodeSubid = rel1->rd_firstRelfilenodeSubid;
RelationAssumeNewRelfilenode(rel1);

if (subtransaction_id_hook)
{
subtransaction_id_hook(rel2);
}

relation_close(rel1, NoLock);
relation_close(rel2, NoLock);
}
Expand Down
7 changes: 7 additions & 0 deletions src/backend/commands/tablecmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "access/nbtree.h"
#include "access/reloptions.h"
#include "access/relscan.h"
#include "access/subtrans.h"
#include "access/sysattr.h"
#include "access/tableam.h"
#include "access/toast_compression.h"
Expand Down Expand Up @@ -10099,6 +10100,12 @@ ATExecAddIndex(AlteredTableInfo *tab, Relation rel,

irel->rd_createSubid = stmt->oldCreateSubid;
irel->rd_firstRelfilenodeSubid = stmt->oldFirstRelfilenodeSubid;

if (subtransaction_id_hook)
{
subtransaction_id_hook(irel);
}

RelationPreserveStorage(irel->rd_node, true);
index_close(irel, NoLock);
}
Expand Down
21 changes: 21 additions & 0 deletions src/backend/utils/cache/relcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "access/nbtree.h"
#include "access/parallel.h"
#include "access/reloptions.h"
#include "access/subtrans.h"
#include "access/sysattr.h"
#include "access/table.h"
#include "access/tableam.h"
Expand Down Expand Up @@ -1425,6 +1426,11 @@ RelationInitPhysicalAddr(Relation relation)
relation->rd_firstRelfilenodeSubid = TopSubTransactionId;
else
relation->rd_firstRelfilenodeSubid = InvalidSubTransactionId;

if (subtransaction_id_hook)
{
subtransaction_id_hook(relation);
}
}
}

Expand Down Expand Up @@ -2924,6 +2930,11 @@ RelationForgetRelation(Oid rid)
* transaction, we could opt to destroy the entry.)
*/
relation->rd_droppedSubid = GetCurrentSubTransactionId();

if (subtransaction_id_hook)
{
subtransaction_id_hook(relation);
}
}

RelationClearRelation(relation, false);
Expand Down Expand Up @@ -3642,6 +3653,11 @@ RelationBuildLocalRelation(const char *relname,
rel->rd_firstRelfilenodeSubid = InvalidSubTransactionId;
rel->rd_droppedSubid = InvalidSubTransactionId;

if (subtransaction_id_hook)
{
subtransaction_id_hook(rel);
}

/*
* create a new tuple descriptor from the one passed in. We do this
* partly to copy it into the cache context, and partly because the new
Expand Down Expand Up @@ -4007,6 +4023,11 @@ RelationAssumeNewRelfilenode(Relation relation)
if (relation->rd_firstRelfilenodeSubid == InvalidSubTransactionId)
relation->rd_firstRelfilenodeSubid = relation->rd_newRelfilenodeSubid;

if (subtransaction_id_hook)
{
subtransaction_id_hook(relation);
}

/* Flag relation as needing eoxact cleanup (to clear these fields) */
EOXactListAdd(relation);
}
Expand Down
6 changes: 6 additions & 0 deletions src/include/access/subtrans.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#ifndef SUBTRANS_H
#define SUBTRANS_H

#include "utils/rel.h"

/* Number of SLRU buffers to use for subtrans */
#define NUM_SUBTRANS_BUFFERS 32

Expand All @@ -23,6 +25,10 @@ typedef struct SubTransData
struct SlruCtlData;
typedef struct SlruCtlData *SlruCtl;

/* Hook for subtransaction id */
typedef void (*subtransaction_id_hook_type) (Relation rel);
extern PGDLLIMPORT subtransaction_id_hook_type subtransaction_id_hook;

extern void SubTransSetParent(TransactionId xid, TransactionId parent);
extern TransactionId SubTransGetParent(TransactionId xid);
extern TransactionId SubTransGetTopmostTransaction(TransactionId xid);
Expand Down