162 #define CatCacheMsgs 0
163 #define RelCacheMsgs 1
182 #define SetSubGroupToFollow(targetgroup, priorgroup, subgroup) \
184 (targetgroup)->firstmsg[subgroup] = \
185 (targetgroup)->nextmsg[subgroup] = \
186 (priorgroup)->nextmsg[subgroup]; \
189 #define SetGroupToFollow(targetgroup, priorgroup) \
191 SetSubGroupToFollow(targetgroup, priorgroup, CatCacheMsgs); \
192 SetSubGroupToFollow(targetgroup, priorgroup, RelCacheMsgs); \
195 #define NumMessagesInSubGroup(group, subgroup) \
196 ((group)->nextmsg[subgroup] - (group)->firstmsg[subgroup])
198 #define NumMessagesInGroup(group) \
199 (NumMessagesInSubGroup(group, CatCacheMsgs) + \
200 NumMessagesInSubGroup(group, RelCacheMsgs))
253 #define MAX_SYSCACHE_CALLBACKS 64
254 #define MAX_RELCACHE_CALLBACKS 10
295 int nextindex = group->
nextmsg[subgroup];
299 if (ima->
msgs == NULL)
313 int reqsize = 2 * ima->
maxmsgs;
322 ima->
msgs[nextindex] = *msg;
355 #define ProcessMessageSubGroup(group, subgroup, codeFragment) \
357 int _msgindex = (group)->firstmsg[subgroup]; \
358 int _endmsg = (group)->nextmsg[subgroup]; \
359 for (; _msgindex < _endmsg; _msgindex++) \
361 SharedInvalidationMessage *msg = \
362 &InvalMessageArrays[subgroup].msgs[_msgindex]; \
373 #define ProcessMessageSubGroupMulti(group, subgroup, codeFragment) \
375 int n = NumMessagesInSubGroup(group, subgroup); \
377 SharedInvalidationMessage *msgs = \
378 &InvalMessageArrays[subgroup].msgs[(group)->firstmsg[subgroup]]; \
550 cacheId, hashValue, dbId);
687 elog(
FATAL,
"unrecognized SI message ID: %d", msg->
id);
776 #ifdef DISCARD_CACHES_ENABLED
825 elog(
ERROR,
"cannot start a subtransaction when there are unprocessed inval messages");
885 bool *RelcacheInitFileInval)
894 *RelcacheInitFileInval =
false;
927 (memcpy(msgarray + nmsgs,
933 (memcpy(msgarray + nmsgs,
939 (memcpy(msgarray + nmsgs,
945 (memcpy(msgarray + nmsgs,
964 int nmsgs,
bool RelcacheInitFileInval,
971 (RelcacheInitFileInval ?
" and relcache file invalidation" :
""));
973 if (RelcacheInitFileInval)
999 if (RelcacheInitFileInval)
1260 if (tupleRelId == RelationRelationId)
1264 relationId = classtup->oid;
1265 if (classtup->relisshared)
1270 else if (tupleRelId == AttributeRelationId)
1274 relationId = atttup->attrelid;
1288 else if (tupleRelId == IndexRelationId)
1298 relationId = indextup->indexrelid;
1301 else if (tupleRelId == ConstraintRelationId)
1309 if (constrtup->contype == CONSTRAINT_FOREIGN &&
1312 relationId = constrtup->conrelid;
1371 if (relation->
rd_rel->relisshared)
1407 relationId = classtup->oid;
1408 if (classtup->relisshared)
1430 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1497 msg.
rm.
dbId = databaseId;
1524 elog(
FATAL,
"invalid cache ID: %d", cacheid);
1526 elog(
FATAL,
"out of syscache_callback_list slots");
1565 elog(
FATAL,
"out of relcache_callback_list slots");
1585 elog(
ERROR,
"invalid cache ID: %d", cacheid);
1593 ccitem->
function(ccitem->
arg, cacheid, hashvalue);
1594 i = ccitem->
link - 1;
1624 xlrec.
nmsgs = nmsgs;
#define OidIsValid(objectId)
bool IsToastRelation(Relation relation)
bool IsCatalogRelation(Relation relation)
bool IsSharedRelation(Oid relationId)
void ResetCatalogCaches(void)
void PrepareToInvalidateCacheTuple(Relation relation, HeapTuple tuple, HeapTuple newtuple, void(*function)(int, uint32, Oid))
void CatalogCacheFlushCatalog(Oid catId)
elog(ERROR, "%s: %s", p2, msg)
static int recursion_depth
int trace_recovery(int trace_level)
#define HeapTupleIsValid(tuple)
void PostPrepare_Inval(void)
void InvalidateSystemCachesExtended(bool debug_discard)
static void AddCatcacheInvalidationMessage(InvalidationMsgsGroup *group, int id, uint32 hashValue, Oid dbId)
static void PrepareInvalidationState(void)
static void AddCatalogInvalidationMessage(InvalidationMsgsGroup *group, Oid dbId, Oid catId)
static int relcache_callback_count
#define NumMessagesInGroup(group)
static void AddRelcacheInvalidationMessage(InvalidationMsgsGroup *group, Oid dbId, Oid relId)
void LogLogicalInvalidations(void)
static void RegisterSnapshotInvalidation(Oid dbId, Oid relId)
void AcceptInvalidationMessages(void)
static void ProcessInvalidationMessages(InvalidationMsgsGroup *group, void(*func)(SharedInvalidationMessage *msg))
void CacheInvalidateRelmap(Oid databaseId)
void LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg)
struct TransInvalidationInfo TransInvalidationInfo
void CacheInvalidateCatalog(Oid catalogId)
#define ProcessMessageSubGroupMulti(group, subgroup, codeFragment)
static void AppendInvalidationMessageSubGroup(InvalidationMsgsGroup *dest, InvalidationMsgsGroup *src, int subgroup)
static struct SYSCACHECALLBACK syscache_callback_list[MAX_SYSCACHE_CALLBACKS]
static struct RELCACHECALLBACK relcache_callback_list[MAX_RELCACHE_CALLBACKS]
static TransInvalidationInfo * transInvalInfo
void CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
static void RegisterCatcacheInvalidation(int cacheId, uint32 hashValue, Oid dbId)
static void RegisterRelcacheInvalidation(Oid dbId, Oid relId)
int xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs, bool *RelcacheInitFileInval)
#define ProcessMessageSubGroup(group, subgroup, codeFragment)
void CacheInvalidateRelcache(Relation relation)
static void AppendInvalidationMessages(InvalidationMsgsGroup *dest, InvalidationMsgsGroup *src)
static void ProcessInvalidationMessagesMulti(InvalidationMsgsGroup *group, void(*func)(const SharedInvalidationMessage *msgs, int n))
void CacheInvalidateRelcacheByRelid(Oid relid)
void InvalidateSystemCaches(void)
void AtEOXact_Inval(bool isCommit)
#define MAX_SYSCACHE_CALLBACKS
void CacheInvalidateSmgr(RelFileLocatorBackend rlocator)
#define SetGroupToFollow(targetgroup, priorgroup)
void AtEOSubXact_Inval(bool isCommit)
static void AddSnapshotInvalidationMessage(InvalidationMsgsGroup *group, Oid dbId, Oid relId)
static int16 syscache_callback_links[SysCacheSize]
static void RegisterCatalogInvalidation(Oid dbId, Oid catId)
static void AddInvalidationMessage(InvalidationMsgsGroup *group, int subgroup, const SharedInvalidationMessage *msg)
struct InvalMessageArray InvalMessageArray
void CommandEndInvalidationMessages(void)
#define MAX_RELCACHE_CALLBACKS
void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
#define SetSubGroupToFollow(targetgroup, priorgroup, subgroup)
struct InvalidationMsgsGroup InvalidationMsgsGroup
void CacheInvalidateHeapTuple(Relation relation, HeapTuple tuple, HeapTuple newtuple)
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
static InvalMessageArray InvalMessageArrays[2]
static int syscache_callback_count
void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, int nmsgs, bool RelcacheInitFileInval, Oid dbid, Oid tsid)
void CacheInvalidateRelcacheAll(void)
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
void(* SyscacheCallbackFunction)(Datum arg, int cacheid, uint32 hashvalue)
void(* RelcacheCallbackFunction)(Datum arg, Oid relid)
Assert(fmt[strlen(fmt) - 1] !='\n')
MemoryContext TopTransactionContext
void pfree(void *pointer)
void * MemoryContextAllocZero(MemoryContext context, Size size)
MemoryContext CurTransactionContext
void * repalloc(void *pointer, Size size)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
#define IsBootstrapProcessingMode()
FormData_pg_attribute * Form_pg_attribute
FormData_pg_class * Form_pg_class
FormData_pg_constraint * Form_pg_constraint
FormData_pg_index * Form_pg_index
static Datum ObjectIdGetDatum(Oid X)
#define RelationGetRelid(relation)
void RelationCacheInvalidate(bool debug_discard)
void RelationCacheInitFilePostInvalidate(void)
void RelationCacheInitFilePreInvalidate(void)
bool RelationIdIsInInitFile(Oid relationId)
void RelationCacheInvalidateEntry(Oid relationId)
void RelationMapInvalidate(bool shared)
char * GetDatabasePath(Oid dbOid, Oid spcOid)
void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs, int n)
void ReceiveSharedInvalidMessages(void(*invalFunction)(SharedInvalidationMessage *msg), void(*resetFunction)(void))
#define SHAREDINVALCATALOG_ID
#define SHAREDINVALSMGR_ID
#define SHAREDINVALSNAPSHOT_ID
#define SHAREDINVALRELCACHE_ID
#define SHAREDINVALRELMAP_ID
void smgrcloserellocator(RelFileLocatorBackend rlocator)
void InvalidateCatalogSnapshot(void)
SharedInvalidationMessage * msgs
RelcacheCallbackFunction function
SyscacheCallbackFunction function
struct TransInvalidationInfo * parent
InvalidationMsgsGroup CurrentCmdInvalidMsgs
InvalidationMsgsGroup PriorCmdInvalidMsgs
bool RelcacheInitFileInval
void SysCacheInvalidate(int cacheId, uint32 hashValue)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
bool RelationInvalidatesSnapshotsOnly(Oid relid)
SharedInvalCatcacheMsg cc
SharedInvalRelcacheMsg rc
SharedInvalCatalogMsg cat
SharedInvalSnapshotMsg sn
int GetCurrentTransactionNestLevel(void)
CommandId GetCurrentCommandId(bool used)
#define MinSizeOfXactInvals
#define XLOG_XACT_INVALIDATIONS
#define XLogLogicalInfoActive()
void XLogRegisterData(char *data, uint32 len)
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogBeginInsert(void)