196 #define MAX_SYSCACHE_CALLBACKS 64 197 #define MAX_RELCACHE_CALLBACKS 10 243 #define FIRSTCHUNKSIZE 32 250 chunk->
next = *listHdr;
256 int chunksize = 2 * chunk->
maxitems;
264 chunk->
next = *listHdr;
285 while (chunk->
next != NULL)
288 chunk->
next = *destHdr;
301 #define ProcessMessageList(listHdr, codeFragment) \ 303 InvalidationChunk *_chunk; \ 304 for (_chunk = (listHdr); _chunk != NULL; _chunk = _chunk->next) \ 307 for (_cindex = 0; _cindex < _chunk->nitems; _cindex++) \ 309 SharedInvalidationMessage *msg = &_chunk->msgs[_cindex]; \ 321 #define ProcessMessageListMulti(listHdr, codeFragment) \ 323 InvalidationChunk *_chunk; \ 324 for (_chunk = (listHdr); _chunk != NULL; _chunk = _chunk->next) \ 326 SharedInvalidationMessage *msgs = _chunk->msgs; \ 327 int n = _chunk->nitems; \ 497 cacheId, hashValue, dbId);
634 elog(
FATAL,
"unrecognized SI message ID: %d", msg->
id);
716 #ifdef CLOBBER_CACHE_ENABLED 739 if (transInvalInfo != NULL &&
753 Assert(transInvalInfo == NULL ||
756 transInvalInfo = myInfo;
786 if (SharedInvalidMessagesArray == NULL)
804 SharedInvalidMessagesArray =
repalloc(SharedInvalidMessagesArray,
832 bool *RelcacheInitFileInval)
837 if (transInvalInfo == NULL)
839 *RelcacheInitFileInval =
false;
871 SharedInvalidMessagesArray == NULL));
888 int nmsgs,
bool RelcacheInitFileInval,
895 (RelcacheInitFileInval ?
" and relcache file invalidation" :
""));
897 if (RelcacheInitFileInval)
923 if (RelcacheInitFileInval)
955 if (transInvalInfo == NULL)
987 transInvalInfo = NULL;
988 SharedInvalidMessagesArray = NULL;
1054 transInvalInfo = myInfo->
parent;
1065 transInvalInfo = myInfo->
parent;
1095 if (transInvalInfo == NULL)
1175 if (tupleRelId == RelationRelationId)
1179 relationId = classtup->oid;
1180 if (classtup->relisshared)
1185 else if (tupleRelId == AttributeRelationId)
1189 relationId = atttup->attrelid;
1203 else if (tupleRelId == IndexRelationId)
1213 relationId = indextup->indexrelid;
1216 else if (tupleRelId == ConstraintRelationId)
1224 if (constrtup->contype == CONSTRAINT_FOREIGN &&
1227 relationId = constrtup->conrelid;
1286 if (relation->
rd_rel->relisshared)
1322 relationId = classtup->oid;
1323 if (classtup->relisshared)
1345 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1412 msg.
rm.
dbId = databaseId;
1439 elog(
FATAL,
"invalid cache ID: %d", cacheid);
1441 elog(
FATAL,
"out of syscache_callback_list slots");
1480 elog(
FATAL,
"out of relcache_callback_list slots");
1500 elog(
ERROR,
"invalid cache ID: %d", cacheid);
1508 ccitem->
function(ccitem->
arg, cacheid, hashvalue);
1509 i = ccitem->
link - 1;
1528 if (transInvalInfo == NULL)
1535 SharedInvalidMessagesArray == NULL));
1539 SharedInvalidMessagesArray = NULL;
1546 xlrec.
nmsgs = nmsgs;
1555 pfree(invalMessages);
void CacheInvalidateSmgr(RelFileNodeBackend rnode)
#define ProcessMessageListMulti(listHdr, codeFragment)
static void AppendInvalidationMessages(InvalidationListHeader *dest, InvalidationListHeader *src)
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER]
static SharedInvalidationMessage * SharedInvalidMessagesArray
bool IsToastRelation(Relation relation)
bool IsCatalogRelation(Relation relation)
SharedInvalSnapshotMsg sn
void(* RelcacheCallbackFunction)(Datum arg, Oid relid)
static void AddInvalidationMessage(InvalidationChunk **listHdr, SharedInvalidationMessage *msg)
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
void CacheInvalidateHeapTuple(Relation relation, HeapTuple tuple, HeapTuple newtuple)
void AtEOXact_Inval(bool isCommit)
MemoryContext TopTransactionContext
void AcceptInvalidationMessages(void)
InvalidationListHeader PriorCmdInvalidMsgs
struct InvalidationChunk InvalidationChunk
SharedInvalRelcacheMsg rc
void CommandEndInvalidationMessages(void)
static struct RELCACHECALLBACK relcache_callback_list[MAX_RELCACHE_CALLBACKS]
#define MAX_RELCACHE_CALLBACKS
static int relcache_callback_count
#define XLOG_XACT_INVALIDATIONS
RelcacheCallbackFunction function
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
bool RelationIdIsInInitFile(Oid relationId)
MemoryContext CurTransactionContext
#define FLEXIBLE_ARRAY_MEMBER
void PrepareToInvalidateCacheTuple(Relation relation, HeapTuple tuple, HeapTuple newtuple, void(*function)(int, uint32, Oid))
struct TransInvalidationInfo * parent
static int recursion_depth
void CacheInvalidateRelmap(Oid databaseId)
static TransInvalidationInfo * transInvalInfo
void RelationMapInvalidate(bool shared)
#define OidIsValid(objectId)
void InvalidateSystemCaches(void)
int trace_recovery(int trace_level)
#define ProcessMessageList(listHdr, codeFragment)
void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func, Datum arg)
InvalidationListHeader CurrentCmdInvalidMsgs
void pfree(void *pointer)
int debug_invalidate_system_caches_always
#define ObjectIdGetDatum(X)
struct InvalidationChunk * next
#define XLogLogicalInfoActive()
static void MakeSharedInvalidMessagesArray(const SharedInvalidationMessage *msgs, int n)
void ReceiveSharedInvalidMessages(void(*invalFunction)(SharedInvalidationMessage *msg), void(*resetFunction)(void))
#define SHAREDINVALRELCACHE_ID
struct InvalidationListHeader InvalidationListHeader
#define SHAREDINVALRELMAP_ID
void(* SyscacheCallbackFunction)(Datum arg, int cacheid, uint32 hashvalue)
#define MAX_SYSCACHE_CALLBACKS
struct TransInvalidationInfo TransInvalidationInfo
void CacheInvalidateRelcacheByRelid(Oid relid)
FormData_pg_attribute * Form_pg_attribute
void PostPrepare_Inval(void)
static int numSharedInvalidMessagesArray
SharedInvalCatcacheMsg cc
#define MinSizeOfXactInvals
void smgrclosenode(RelFileNodeBackend rnode)
SharedInvalCatalogMsg cat
void InvalidateCatalogSnapshot(void)
char * GetDatabasePath(Oid dbNode, Oid spcNode)
static void ProcessInvalidationMessagesMulti(InvalidationListHeader *hdr, void(*func)(const SharedInvalidationMessage *msgs, int n))
static void PrepareInvalidationState(void)
static struct SYSCACHECALLBACK syscache_callback_list[MAX_SYSCACHE_CALLBACKS]
void LogLogicalInvalidations()
FormData_pg_index * Form_pg_index
HeapTuple SearchSysCache1(int cacheId, Datum key1)
void XLogRegisterData(char *data, int len)
bool RelcacheInitFileInval
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
static void ProcessInvalidationMessages(InvalidationListHeader *hdr, void(*func)(SharedInvalidationMessage *msg))
void CacheInvalidateRelcacheAll(void)
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
void ReleaseSysCache(HeapTuple tuple)
static void AddSnapshotInvalidationMessage(InvalidationListHeader *hdr, Oid dbId, Oid relId)
void CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
static void RegisterCatalogInvalidation(Oid dbId, Oid catId)
void RelationCacheInitFilePostInvalidate(void)
bool IsSharedRelation(Oid relationId)
static void AddCatalogInvalidationMessage(InvalidationListHeader *hdr, Oid dbId, Oid catId)
static int syscache_callback_count
void * MemoryContextAllocZero(MemoryContext context, Size size)
static void RegisterRelcacheInvalidation(Oid dbId, Oid relId)
#define SHAREDINVALSNAPSHOT_ID
void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, int nmsgs, bool RelcacheInitFileInval, Oid dbid, Oid tsid)
int GetCurrentTransactionNestLevel(void)
FormData_pg_constraint * Form_pg_constraint
void CacheInvalidateCatalog(Oid catalogId)
#define HeapTupleIsValid(tuple)
void RelationCacheInitFilePreInvalidate(void)
static void RegisterCatcacheInvalidation(int cacheId, uint32 hashValue, Oid dbId)
#define Assert(condition)
bool RelationInvalidatesSnapshotsOnly(Oid relid)
void SysCacheInvalidate(int cacheId, uint32 hashValue)
void CatalogCacheFlushCatalog(Oid catId)
static void AddRelcacheInvalidationMessage(InvalidationListHeader *hdr, Oid dbId, Oid relId)
void RelationCacheInvalidateEntry(Oid relationId)
void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs, int n)
void ResetCatalogCaches(void)
void * repalloc(void *pointer, Size size)
static int16 syscache_callback_links[SysCacheSize]
void CacheInvalidateRelcache(Relation relation)
#define IsBootstrapProcessingMode()
FormData_pg_class * Form_pg_class
void LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg)
#define SHAREDINVALCATALOG_ID
static int maxSharedInvalidMessagesArray
void AtEOSubXact_Inval(bool isCommit)
int xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs, bool *RelcacheInitFileInval)
void * MemoryContextAlloc(MemoryContext context, Size size)
void RelationCacheInvalidate(void)
#define SHAREDINVALSMGR_ID
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
CommandId GetCurrentCommandId(bool used)
void XLogBeginInsert(void)
#define RelationGetRelid(relation)
#define offsetof(type, field)
static void AddCatcacheInvalidationMessage(InvalidationListHeader *hdr, int id, uint32 hashValue, Oid dbId)
static void RegisterSnapshotInvalidation(Oid dbId, Oid relId)
SyscacheCallbackFunction function
static void AppendInvalidationMessageList(InvalidationChunk **destHdr, InvalidationChunk **srcHdr)