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);
642 elog(
ERROR,
"cannot start a subtransaction when there are unprocessed inval messages");
778 elog(
FATAL,
"unrecognized SI message ID: %d", msg->
id);
837 #ifdef DISCARD_CACHES_ENABLED
884 bool *RelcacheInitFileInval)
893 *RelcacheInitFileInval =
false;
926 (memcpy(msgarray + nmsgs,
932 (memcpy(msgarray + nmsgs,
938 (memcpy(msgarray + nmsgs,
944 (memcpy(msgarray + nmsgs,
963 int nmsgs,
bool RelcacheInitFileInval,
970 (RelcacheInitFileInval ?
" and relcache file invalidation" :
""));
972 if (RelcacheInitFileInval)
998 if (RelcacheInitFileInval)
1259 if (tupleRelId == RelationRelationId)
1263 relationId = classtup->oid;
1264 if (classtup->relisshared)
1269 else if (tupleRelId == AttributeRelationId)
1273 relationId = atttup->attrelid;
1287 else if (tupleRelId == IndexRelationId)
1297 relationId = indextup->indexrelid;
1300 else if (tupleRelId == ConstraintRelationId)
1308 if (constrtup->contype == CONSTRAINT_FOREIGN &&
1311 relationId = constrtup->conrelid;
1370 if (relation->
rd_rel->relisshared)
1406 relationId = classtup->oid;
1407 if (classtup->relisshared)
1429 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1496 msg.
rm.
dbId = databaseId;
1523 elog(
FATAL,
"invalid cache ID: %d", cacheid);
1525 elog(
FATAL,
"out of syscache_callback_list slots");
1564 elog(
FATAL,
"out of relcache_callback_list slots");
1584 elog(
ERROR,
"invalid cache ID: %d", cacheid);
1592 ccitem->
function(ccitem->
arg, cacheid, hashvalue);
1593 i = ccitem->
link - 1;
1623 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)