161 #define CatCacheMsgs 0
162 #define RelCacheMsgs 1
181 #define SetSubGroupToFollow(targetgroup, priorgroup, subgroup) \
183 (targetgroup)->firstmsg[subgroup] = \
184 (targetgroup)->nextmsg[subgroup] = \
185 (priorgroup)->nextmsg[subgroup]; \
188 #define SetGroupToFollow(targetgroup, priorgroup) \
190 SetSubGroupToFollow(targetgroup, priorgroup, CatCacheMsgs); \
191 SetSubGroupToFollow(targetgroup, priorgroup, RelCacheMsgs); \
194 #define NumMessagesInSubGroup(group, subgroup) \
195 ((group)->nextmsg[subgroup] - (group)->firstmsg[subgroup])
197 #define NumMessagesInGroup(group) \
198 (NumMessagesInSubGroup(group, CatCacheMsgs) + \
199 NumMessagesInSubGroup(group, RelCacheMsgs))
252 #define MAX_SYSCACHE_CALLBACKS 64
253 #define MAX_RELCACHE_CALLBACKS 10
294 int nextindex = group->
nextmsg[subgroup];
298 if (ima->
msgs == NULL)
312 int reqsize = 2 * ima->
maxmsgs;
321 ima->
msgs[nextindex] = *msg;
354 #define ProcessMessageSubGroup(group, subgroup, codeFragment) \
356 int _msgindex = (group)->firstmsg[subgroup]; \
357 int _endmsg = (group)->nextmsg[subgroup]; \
358 for (; _msgindex < _endmsg; _msgindex++) \
360 SharedInvalidationMessage *msg = \
361 &InvalMessageArrays[subgroup].msgs[_msgindex]; \
372 #define ProcessMessageSubGroupMulti(group, subgroup, codeFragment) \
374 int n = NumMessagesInSubGroup(group, subgroup); \
376 SharedInvalidationMessage *msgs = \
377 &InvalMessageArrays[subgroup].msgs[(group)->firstmsg[subgroup]]; \
549 cacheId, hashValue, dbId);
641 elog(
ERROR,
"cannot start a subtransaction when there are unprocessed inval messages");
777 elog(
FATAL,
"unrecognized SI message ID: %d", msg->
id);
836 #ifdef DISCARD_CACHES_ENABLED
883 bool *RelcacheInitFileInval)
892 *RelcacheInitFileInval =
false;
925 (memcpy(msgarray + nmsgs,
931 (memcpy(msgarray + nmsgs,
937 (memcpy(msgarray + nmsgs,
943 (memcpy(msgarray + nmsgs,
962 int nmsgs,
bool RelcacheInitFileInval,
968 elog(
DEBUG4,
"replaying commit with %d messages%s", nmsgs,
969 (RelcacheInitFileInval ?
" and relcache file invalidation" :
""));
971 if (RelcacheInitFileInval)
973 elog(
DEBUG4,
"removing relcache init files for database %u", dbid);
996 if (RelcacheInitFileInval)
1257 if (tupleRelId == RelationRelationId)
1261 relationId = classtup->oid;
1262 if (classtup->relisshared)
1267 else if (tupleRelId == AttributeRelationId)
1271 relationId = atttup->attrelid;
1285 else if (tupleRelId == IndexRelationId)
1295 relationId = indextup->indexrelid;
1298 else if (tupleRelId == ConstraintRelationId)
1306 if (constrtup->contype == CONSTRAINT_FOREIGN &&
1309 relationId = constrtup->conrelid;
1368 if (relation->
rd_rel->relisshared)
1404 relationId = classtup->oid;
1405 if (classtup->relisshared)
1427 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1494 msg.
rm.
dbId = databaseId;
1520 if (cacheid < 0 || cacheid >= SysCacheSize)
1521 elog(
FATAL,
"invalid cache ID: %d", cacheid);
1523 elog(
FATAL,
"out of syscache_callback_list slots");
1562 elog(
FATAL,
"out of relcache_callback_list slots");
1581 if (cacheid < 0 || cacheid >= SysCacheSize)
1582 elog(
ERROR,
"invalid cache ID: %d", cacheid);
1590 ccitem->
function(ccitem->
arg, cacheid, hashvalue);
1591 i = ccitem->
link - 1;
1621 xlrec.
nmsgs = nmsgs;
#define Assert(condition)
#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)
static int recursion_depth
#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)
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 smgrreleaserellocator(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)