PostgreSQL Source Code git master
inval.h File Reference
#include "access/htup.h"
#include "storage/relfilelocator.h"
#include "utils/relcache.h"
Include dependency graph for inval.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef void(* SyscacheCallbackFunction) (Datum arg, int cacheid, uint32 hashvalue)
 
typedef void(* RelcacheCallbackFunction) (Datum arg, Oid relid)
 
typedef void(* RelSyncCallbackFunction) (Datum arg, Oid relid)
 

Functions

void AcceptInvalidationMessages (void)
 
void AtEOXact_Inval (bool isCommit)
 
void PreInplace_Inval (void)
 
void AtInplace_Inval (void)
 
void ForgetInplace_Inval (void)
 
void AtEOSubXact_Inval (bool isCommit)
 
void PostPrepare_Inval (void)
 
void CommandEndInvalidationMessages (void)
 
void CacheInvalidateHeapTuple (Relation relation, HeapTuple tuple, HeapTuple newtuple)
 
void CacheInvalidateHeapTupleInplace (Relation relation, HeapTuple tuple, HeapTuple newtuple)
 
void CacheInvalidateCatalog (Oid catalogId)
 
void CacheInvalidateRelcache (Relation relation)
 
void CacheInvalidateRelcacheAll (void)
 
void CacheInvalidateRelcacheByTuple (HeapTuple classTuple)
 
void CacheInvalidateRelcacheByRelid (Oid relid)
 
void CacheInvalidateRelSync (Oid relid)
 
void CacheInvalidateRelSyncAll (void)
 
void CacheInvalidateSmgr (RelFileLocatorBackend rlocator)
 
void CacheInvalidateRelmap (Oid databaseId)
 
void CacheRegisterSyscacheCallback (int cacheid, SyscacheCallbackFunction func, Datum arg)
 
void CacheRegisterRelcacheCallback (RelcacheCallbackFunction func, Datum arg)
 
void CacheRegisterRelSyncCallback (RelSyncCallbackFunction func, Datum arg)
 
void CallSyscacheCallbacks (int cacheid, uint32 hashvalue)
 
void CallRelSyncCallbacks (Oid relid)
 
void InvalidateSystemCaches (void)
 
void InvalidateSystemCachesExtended (bool debug_discard)
 
void LogLogicalInvalidations (void)
 

Variables

PGDLLIMPORT int debug_discard_caches
 

Typedef Documentation

◆ RelcacheCallbackFunction

typedef void(* RelcacheCallbackFunction) (Datum arg, Oid relid)

Definition at line 24 of file inval.h.

◆ RelSyncCallbackFunction

typedef void(* RelSyncCallbackFunction) (Datum arg, Oid relid)

Definition at line 25 of file inval.h.

◆ SyscacheCallbackFunction

typedef void(* SyscacheCallbackFunction) (Datum arg, int cacheid, uint32 hashvalue)

Definition at line 23 of file inval.h.

Function Documentation

◆ AcceptInvalidationMessages()

void AcceptInvalidationMessages ( void  )

Definition at line 930 of file inval.c.

931{
932#ifdef USE_ASSERT_CHECKING
933 /* message handlers shall access catalogs only during transactions */
934 if (IsTransactionState())
936#endif
937
940
941 /*----------
942 * Test code to force cache flushes anytime a flush could happen.
943 *
944 * This helps detect intermittent faults caused by code that reads a cache
945 * entry and then performs an action that could invalidate the entry, but
946 * rarely actually does so. This can spot issues that would otherwise
947 * only arise with badly timed concurrent DDL, for example.
948 *
949 * The default debug_discard_caches = 0 does no forced cache flushes.
950 *
951 * If used with CLOBBER_FREED_MEMORY,
952 * debug_discard_caches = 1 (formerly known as CLOBBER_CACHE_ALWAYS)
953 * provides a fairly thorough test that the system contains no cache-flush
954 * hazards. However, it also makes the system unbelievably slow --- the
955 * regression tests take about 100 times longer than normal.
956 *
957 * If you're a glutton for punishment, try
958 * debug_discard_caches = 3 (formerly known as CLOBBER_CACHE_RECURSIVELY).
959 * This slows things by at least a factor of 10000, so I wouldn't suggest
960 * trying to run the entire regression tests that way. It's useful to try
961 * a few simple tests, to make sure that cache reload isn't subject to
962 * internal cache-flush hazards, but after you've done a few thousand
963 * recursive reloads it's unlikely you'll learn more.
964 *----------
965 */
966#ifdef DISCARD_CACHES_ENABLED
967 {
968 static int recursion_depth = 0;
969
971 {
975 }
976 }
977#endif
978}
static int recursion_depth
Definition: elog.c:150
void InvalidateSystemCachesExtended(bool debug_discard)
Definition: inval.c:785
void LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg)
Definition: inval.c:823
void InvalidateSystemCaches(void)
Definition: inval.c:916
int debug_discard_caches
Definition: inval.c:260
static void AssertCouldGetRelation(void)
Definition: relcache.h:44
void ReceiveSharedInvalidMessages(void(*invalFunction)(SharedInvalidationMessage *msg), void(*resetFunction)(void))
Definition: sinval.c:69
bool IsTransactionState(void)
Definition: xact.c:387

References AssertCouldGetRelation(), debug_discard_caches, InvalidateSystemCaches(), InvalidateSystemCachesExtended(), IsTransactionState(), LocalExecuteInvalidationMessage(), ReceiveSharedInvalidMessages(), and recursion_depth.

Referenced by apply_handle_commit_internal(), AtStart_Cache(), ConditionalLockDatabaseObject(), ConditionalLockRelation(), ConditionalLockRelationOid(), ConditionalLockSharedObject(), delay_execution_planner(), heap_inplace_update_and_unlock(), InitializeSessionUserId(), LockDatabaseObject(), LockRelation(), LockRelationId(), LockRelationOid(), LockSharedObject(), LogicalRepApplyLoop(), pgstat_init_function_usage(), ProcessCatchupInterrupt(), RangeVarGetRelidExtended(), relation_openrv(), relation_openrv_extended(), RelationBuildPartitionDesc(), RemoveRelations(), SearchSysCacheLocked1(), and write_relcache_init_file().

◆ AtEOSubXact_Inval()

void AtEOSubXact_Inval ( bool  isCommit)

Definition at line 1310 of file inval.c.

1311{
1312 int my_level;
1313 TransInvalidationInfo *myInfo;
1314
1315 /*
1316 * Successful inplace update must clear this, but we clear it on abort.
1317 * Inplace updates allocate this in CurrentMemoryContext, which has
1318 * lifespan <= subtransaction lifespan. Hence, don't free it explicitly.
1319 */
1320 if (isCommit)
1321 Assert(inplaceInvalInfo == NULL);
1322 else
1323 inplaceInvalInfo = NULL;
1324
1325 /* Quick exit if no transactional messages. */
1326 myInfo = transInvalInfo;
1327 if (myInfo == NULL)
1328 return;
1329
1330 /* Also bail out quickly if messages are not for this level. */
1331 my_level = GetCurrentTransactionNestLevel();
1332 if (myInfo->my_level != my_level)
1333 {
1334 Assert(myInfo->my_level < my_level);
1335 return;
1336 }
1337
1338 if (isCommit)
1339 {
1340 /* If CurrentCmdInvalidMsgs still has anything, fix it */
1342
1343 /*
1344 * We create invalidation stack entries lazily, so the parent might
1345 * not have one. Instead of creating one, moving all the data over,
1346 * and then freeing our own, we can just adjust the level of our own
1347 * entry.
1348 */
1349 if (myInfo->parent == NULL || myInfo->parent->my_level < my_level - 1)
1350 {
1351 myInfo->my_level--;
1352 return;
1353 }
1354
1355 /*
1356 * Pass up my inval messages to parent. Notice that we stick them in
1357 * PriorCmdInvalidMsgs, not CurrentCmdInvalidMsgs, since they've
1358 * already been locally processed. (This would trigger the Assert in
1359 * AppendInvalidationMessageSubGroup if the parent's
1360 * CurrentCmdInvalidMsgs isn't empty; but we already checked that in
1361 * PrepareInvalidationState.)
1362 */
1364 &myInfo->PriorCmdInvalidMsgs);
1365
1366 /* Must readjust parent's CurrentCmdInvalidMsgs indexes now */
1368 &myInfo->parent->PriorCmdInvalidMsgs);
1369
1370 /* Pending relcache inval becomes parent's problem too */
1371 if (myInfo->ii.RelcacheInitFileInval)
1372 myInfo->parent->ii.RelcacheInitFileInval = true;
1373
1374 /* Pop the transaction state stack */
1375 transInvalInfo = myInfo->parent;
1376
1377 /* Need not free anything else explicitly */
1378 pfree(myInfo);
1379 }
1380 else
1381 {
1384
1385 /* Pop the transaction state stack */
1386 transInvalInfo = myInfo->parent;
1387
1388 /* Need not free anything else explicitly */
1389 pfree(myInfo);
1390 }
1391}
Assert(PointerIsAligned(start, uint64))
static void ProcessInvalidationMessages(InvalidationMsgsGroup *group, void(*func)(SharedInvalidationMessage *msg))
Definition: inval.c:574
static InvalidationInfo * inplaceInvalInfo
Definition: inval.c:257
static TransInvalidationInfo * transInvalInfo
Definition: inval.c:255
static void AppendInvalidationMessages(InvalidationMsgsGroup *dest, InvalidationMsgsGroup *src)
Definition: inval.c:560
#define SetGroupToFollow(targetgroup, priorgroup)
Definition: inval.c:198
void CommandEndInvalidationMessages(void)
Definition: inval.c:1409
void pfree(void *pointer)
Definition: mcxt.c:2150
bool RelcacheInitFileInval
Definition: inval.c:236
InvalidationMsgsGroup CurrentCmdInvalidMsgs
Definition: inval.c:233
struct TransInvalidationInfo * parent
Definition: inval.c:249
struct InvalidationInfo ii
Definition: inval.c:243
InvalidationMsgsGroup PriorCmdInvalidMsgs
Definition: inval.c:246
int GetCurrentTransactionNestLevel(void)
Definition: xact.c:929

References AppendInvalidationMessages(), Assert(), CommandEndInvalidationMessages(), InvalidationInfo::CurrentCmdInvalidMsgs, GetCurrentTransactionNestLevel(), TransInvalidationInfo::ii, inplaceInvalInfo, LocalExecuteInvalidationMessage(), TransInvalidationInfo::my_level, TransInvalidationInfo::parent, pfree(), TransInvalidationInfo::PriorCmdInvalidMsgs, ProcessInvalidationMessages(), InvalidationInfo::RelcacheInitFileInval, SetGroupToFollow, and transInvalInfo.

Referenced by AbortSubTransaction(), and CommitSubTransaction().

◆ AtEOXact_Inval()

void AtEOXact_Inval ( bool  isCommit)

Definition at line 1199 of file inval.c.

1200{
1201 inplaceInvalInfo = NULL;
1202
1203 /* Quick exit if no transactional messages */
1204 if (transInvalInfo == NULL)
1205 return;
1206
1207 /* Must be at top of stack */
1209
1210 INJECTION_POINT("transaction-end-process-inval");
1211
1212 if (isCommit)
1213 {
1214 /*
1215 * Relcache init file invalidation requires processing both before and
1216 * after we send the SI messages. However, we need not do anything
1217 * unless we committed.
1218 */
1221
1224
1227
1230 }
1231 else
1232 {
1235 }
1236
1237 /* Need not free anything explicitly */
1238 transInvalInfo = NULL;
1239}
#define INJECTION_POINT(name)
static void ProcessInvalidationMessagesMulti(InvalidationMsgsGroup *group, void(*func)(const SharedInvalidationMessage *msgs, int n))
Definition: inval.c:586
void RelationCacheInitFilePostInvalidate(void)
Definition: relcache.c:6882
void RelationCacheInitFilePreInvalidate(void)
Definition: relcache.c:6857
void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs, int n)
Definition: sinval.c:47

References AppendInvalidationMessages(), Assert(), InvalidationInfo::CurrentCmdInvalidMsgs, TransInvalidationInfo::ii, INJECTION_POINT, inplaceInvalInfo, LocalExecuteInvalidationMessage(), TransInvalidationInfo::my_level, TransInvalidationInfo::parent, TransInvalidationInfo::PriorCmdInvalidMsgs, ProcessInvalidationMessages(), ProcessInvalidationMessagesMulti(), RelationCacheInitFilePostInvalidate(), RelationCacheInitFilePreInvalidate(), InvalidationInfo::RelcacheInitFileInval, SendSharedInvalidMessages(), and transInvalInfo.

Referenced by AbortTransaction(), CommitTransaction(), and PostPrepare_Inval().

◆ AtInplace_Inval()

◆ CacheInvalidateCatalog()

void CacheInvalidateCatalog ( Oid  catalogId)

Definition at line 1608 of file inval.c.

1609{
1610 Oid databaseId;
1611
1612 if (IsSharedRelation(catalogId))
1613 databaseId = InvalidOid;
1614 else
1615 databaseId = MyDatabaseId;
1616
1618 databaseId, catalogId);
1619}
bool IsSharedRelation(Oid relationId)
Definition: catalog.c:304
Oid MyDatabaseId
Definition: globals.c:95
static InvalidationInfo * PrepareInvalidationState(void)
Definition: inval.c:682
static void RegisterCatalogInvalidation(InvalidationInfo *info, Oid dbId, Oid catId)
Definition: inval.c:621
#define InvalidOid
Definition: postgres_ext.h:35
unsigned int Oid
Definition: postgres_ext.h:30

References InvalidOid, IsSharedRelation(), MyDatabaseId, PrepareInvalidationState(), and RegisterCatalogInvalidation().

Referenced by finish_heap_swap().

◆ CacheInvalidateHeapTuple()

void CacheInvalidateHeapTuple ( Relation  relation,
HeapTuple  tuple,
HeapTuple  newtuple 
)

Definition at line 1571 of file inval.c.

1574{
1575 CacheInvalidateHeapTupleCommon(relation, tuple, newtuple,
1577}
static void CacheInvalidateHeapTupleCommon(Relation relation, HeapTuple tuple, HeapTuple newtuple, InvalidationInfo *(*prepare_callback)(void))
Definition: inval.c:1436

References CacheInvalidateHeapTupleCommon(), and PrepareInvalidationState().

Referenced by AlterDomainAddConstraint(), AlterDomainDropConstraint(), heap_delete(), heap_inplace_update_and_unlock(), heap_insert(), heap_multi_insert(), and heap_update().

◆ CacheInvalidateHeapTupleInplace()

void CacheInvalidateHeapTupleInplace ( Relation  relation,
HeapTuple  tuple,
HeapTuple  newtuple 
)

Definition at line 1588 of file inval.c.

1591{
1592 CacheInvalidateHeapTupleCommon(relation, tuple, newtuple,
1594}
static InvalidationInfo * PrepareInplaceInvalidationState(void)
Definition: inval.c:752

References CacheInvalidateHeapTupleCommon(), and PrepareInplaceInvalidationState().

Referenced by heap_inplace_lock().

◆ CacheInvalidateRelcache()

◆ CacheInvalidateRelcacheAll()

◆ CacheInvalidateRelcacheByRelid()

void CacheInvalidateRelcacheByRelid ( Oid  relid)

Definition at line 1687 of file inval.c.

1688{
1689 HeapTuple tup;
1690
1691 tup = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
1692 if (!HeapTupleIsValid(tup))
1693 elog(ERROR, "cache lookup failed for relation %u", relid);
1695 ReleaseSysCache(tup);
1696}
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:225
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
Definition: inval.c:1665
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Definition: syscache.c:221

References CacheInvalidateRelcacheByTuple(), elog, ERROR, HeapTupleIsValid, ObjectIdGetDatum(), ReleaseSysCache(), and SearchSysCache1().

Referenced by AlterConstrUpdateConstraintEntry(), ATExecAlterConstraintInternal(), ATExecAttachPartition(), DefineIndex(), DetachPartitionFinalize(), heap_drop_with_catalog(), InvalidatePublicationRels(), ReindexRelationConcurrently(), RemoveStatisticsById(), and StorePartitionBound().

◆ CacheInvalidateRelcacheByTuple()

void CacheInvalidateRelcacheByTuple ( HeapTuple  classTuple)

Definition at line 1665 of file inval.c.

1666{
1667 Form_pg_class classtup = (Form_pg_class) GETSTRUCT(classTuple);
1668 Oid databaseId;
1669 Oid relationId;
1670
1671 relationId = classtup->oid;
1672 if (classtup->relisshared)
1673 databaseId = InvalidOid;
1674 else
1675 databaseId = MyDatabaseId;
1677 databaseId, relationId);
1678}
static void * GETSTRUCT(const HeapTupleData *tuple)
Definition: htup_details.h:728
FormData_pg_class * Form_pg_class
Definition: pg_class.h:156

References GETSTRUCT(), InvalidOid, MyDatabaseId, PrepareInvalidationState(), and RegisterRelcacheInvalidation().

Referenced by CacheInvalidateRelcacheByRelid(), copy_table_data(), CreateTriggerFiringOn(), index_update_stats(), RemoveRoleFromObjectPolicy(), SetRelationHasSubclass(), SetRelationRuleStatus(), and swap_relation_files().

◆ CacheInvalidateRelmap()

void CacheInvalidateRelmap ( Oid  databaseId)

Definition at line 1785 of file inval.c.

1786{
1788
1790 msg.rm.dbId = databaseId;
1791 /* check AddCatcacheInvalidationMessage() for an explanation */
1792 VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
1793
1795}
#define VALGRIND_MAKE_MEM_DEFINED(addr, size)
Definition: memdebug.h:26
#define SHAREDINVALRELMAP_ID
Definition: sinval.h:97
SharedInvalRelmapMsg rm
Definition: sinval.h:131

References SharedInvalRelmapMsg::dbId, SharedInvalRelmapMsg::id, SharedInvalidationMessage::rm, SendSharedInvalidMessages(), SHAREDINVALRELMAP_ID, and VALGRIND_MAKE_MEM_DEFINED.

Referenced by write_relmap_file().

◆ CacheInvalidateRelSync()

void CacheInvalidateRelSync ( Oid  relid)

Definition at line 1708 of file inval.c.

1709{
1711 MyDatabaseId, relid);
1712}
static void RegisterRelsyncInvalidation(InvalidationInfo *info, Oid dbId, Oid relId)
Definition: inval.c:660

References MyDatabaseId, PrepareInvalidationState(), and RegisterRelsyncInvalidation().

Referenced by CacheInvalidateRelSyncAll(), and InvalidatePubRelSyncCache().

◆ CacheInvalidateRelSyncAll()

void CacheInvalidateRelSyncAll ( void  )

Definition at line 1720 of file inval.c.

1721{
1723}
void CacheInvalidateRelSync(Oid relid)
Definition: inval.c:1708

References CacheInvalidateRelSync(), and InvalidOid.

Referenced by InvalidatePubRelSyncCache().

◆ CacheInvalidateSmgr()

void CacheInvalidateSmgr ( RelFileLocatorBackend  rlocator)

Definition at line 1751 of file inval.c.

1752{
1754
1755 /* verify optimization stated above stays valid */
1757 "MAX_BACKENDS_BITS is too big for inval.c");
1758
1759 msg.sm.id = SHAREDINVALSMGR_ID;
1760 msg.sm.backend_hi = rlocator.backend >> 16;
1761 msg.sm.backend_lo = rlocator.backend & 0xffff;
1762 msg.sm.rlocator = rlocator.locator;
1763 /* check AddCatcacheInvalidationMessage() for an explanation */
1764 VALGRIND_MAKE_MEM_DEFINED(&msg, sizeof(msg));
1765
1767}
#define StaticAssertStmt(condition, errmessage)
Definition: c.h:909
#define MAX_BACKENDS_BITS
Definition: procnumber.h:38
#define SHAREDINVALSMGR_ID
Definition: sinval.h:86
RelFileLocator locator
uint16 backend_lo
Definition: sinval.h:93
RelFileLocator rlocator
Definition: sinval.h:94
SharedInvalSmgrMsg sm
Definition: sinval.h:130

References RelFileLocatorBackend::backend, SharedInvalSmgrMsg::backend_hi, SharedInvalSmgrMsg::backend_lo, SharedInvalSmgrMsg::id, RelFileLocatorBackend::locator, MAX_BACKENDS_BITS, SharedInvalSmgrMsg::rlocator, SendSharedInvalidMessages(), SHAREDINVALSMGR_ID, SharedInvalidationMessage::sm, StaticAssertStmt, and VALGRIND_MAKE_MEM_DEFINED.

Referenced by smgrdounlinkall(), smgrtruncate(), and vm_extend().

◆ CacheRegisterRelcacheCallback()

void CacheRegisterRelcacheCallback ( RelcacheCallbackFunction  func,
Datum  arg 
)

Definition at line 1854 of file inval.c.

1856{
1858 elog(FATAL, "out of relcache_callback_list slots");
1859
1862
1864}
#define FATAL
Definition: elog.h:41
static int relcache_callback_count
Definition: inval.c:294
static struct RELCACHECALLBACK relcache_callback_list[MAX_RELCACHE_CALLBACKS]
#define MAX_RELCACHE_CALLBACKS
Definition: inval.c:273
void * arg
RelcacheCallbackFunction function
Definition: inval.c:290

References RELCACHECALLBACK::arg, arg, elog, FATAL, RELCACHECALLBACK::function, MAX_RELCACHE_CALLBACKS, relcache_callback_count, and relcache_callback_list.

Referenced by init_rel_sync_cache(), InitializeRelfilenumberMap(), InitPlanCache(), logicalrep_partmap_init(), logicalrep_relmap_init(), and lookup_type_cache().

◆ CacheRegisterRelSyncCallback()

void CacheRegisterRelSyncCallback ( RelSyncCallbackFunction  func,
Datum  arg 
)

Definition at line 1875 of file inval.c.

1877{
1879 elog(FATAL, "out of relsync_callback_list slots");
1880
1883
1885}
static int relsync_callback_count
Definition: inval.c:302
static struct RELSYNCCALLBACK relsync_callback_list[MAX_RELSYNC_CALLBACKS]
#define MAX_RELSYNC_CALLBACKS
Definition: inval.c:274
RelSyncCallbackFunction function
Definition: inval.c:298
Datum arg
Definition: inval.c:299

References RELSYNCCALLBACK::arg, arg, elog, FATAL, RELSYNCCALLBACK::function, MAX_RELSYNC_CALLBACKS, relsync_callback_count, and relsync_callback_list.

Referenced by pgoutput_startup().

◆ CacheRegisterSyscacheCallback()

void CacheRegisterSyscacheCallback ( int  cacheid,
SyscacheCallbackFunction  func,
Datum  arg 
)

Definition at line 1812 of file inval.c.

1815{
1816 if (cacheid < 0 || cacheid >= SysCacheSize)
1817 elog(FATAL, "invalid cache ID: %d", cacheid);
1819 elog(FATAL, "out of syscache_callback_list slots");
1820
1821 if (syscache_callback_links[cacheid] == 0)
1822 {
1823 /* first callback for this cache */
1825 }
1826 else
1827 {
1828 /* add to end of chain, so that older callbacks are called first */
1829 int i = syscache_callback_links[cacheid] - 1;
1830
1831 while (syscache_callback_list[i].link > 0)
1834 }
1835
1840
1842}
static struct SYSCACHECALLBACK syscache_callback_list[MAX_SYSCACHE_CALLBACKS]
#define MAX_SYSCACHE_CALLBACKS
Definition: inval.c:272
static int16 syscache_callback_links[SysCacheSize]
Definition: inval.c:284
static int syscache_callback_count
Definition: inval.c:286
int i
Definition: isn.c:77
SyscacheCallbackFunction function
Definition: inval.c:280
int16 link
Definition: inval.c:279

References SYSCACHECALLBACK::arg, arg, elog, FATAL, SYSCACHECALLBACK::function, i, SYSCACHECALLBACK::id, SYSCACHECALLBACK::link, MAX_SYSCACHE_CALLBACKS, syscache_callback_count, syscache_callback_links, and syscache_callback_list.

Referenced by BuildEventTriggerCache(), find_oper_cache_entry(), GetConnection(), init_rel_sync_cache(), init_ts_config_cache(), initialize_acl(), InitializeAttoptCache(), InitializeLogRepWorker(), InitializeSearchPath(), InitializeShippableCache(), InitializeTableSpaceCache(), InitPlanCache(), lookup_proof_cache(), lookup_ts_dictionary_cache(), lookup_ts_parser_cache(), lookup_type_cache(), ParallelApplyWorkerMain(), pgoutput_startup(), ri_InitHashTables(), SetupApplyOrSyncWorker(), and superuser_arg().

◆ CallRelSyncCallbacks()

void CallRelSyncCallbacks ( Oid  relid)

Definition at line 1916 of file inval.c.

1917{
1918 for (int i = 0; i < relsync_callback_count; i++)
1919 {
1920 struct RELSYNCCALLBACK *ccitem = relsync_callback_list + i;
1921
1922 ccitem->function(ccitem->arg, relid);
1923 }
1924}

References RELSYNCCALLBACK::arg, RELSYNCCALLBACK::function, i, relsync_callback_count, and relsync_callback_list.

Referenced by LocalExecuteInvalidationMessage().

◆ CallSyscacheCallbacks()

void CallSyscacheCallbacks ( int  cacheid,
uint32  hashvalue 
)

Definition at line 1894 of file inval.c.

1895{
1896 int i;
1897
1898 if (cacheid < 0 || cacheid >= SysCacheSize)
1899 elog(ERROR, "invalid cache ID: %d", cacheid);
1900
1901 i = syscache_callback_links[cacheid] - 1;
1902 while (i >= 0)
1903 {
1904 struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i;
1905
1906 Assert(ccitem->id == cacheid);
1907 ccitem->function(ccitem->arg, cacheid, hashvalue);
1908 i = ccitem->link - 1;
1909 }
1910}

References SYSCACHECALLBACK::arg, Assert(), elog, ERROR, SYSCACHECALLBACK::function, i, SYSCACHECALLBACK::id, SYSCACHECALLBACK::link, syscache_callback_links, and syscache_callback_list.

Referenced by CatalogCacheFlushCatalog(), and LocalExecuteInvalidationMessage().

◆ CommandEndInvalidationMessages()

void CommandEndInvalidationMessages ( void  )

Definition at line 1409 of file inval.c.

1410{
1411 /*
1412 * You might think this shouldn't be called outside any transaction, but
1413 * bootstrap does it, and also ABORT issued when not in a transaction. So
1414 * just quietly return if no state to work on.
1415 */
1416 if (transInvalInfo == NULL)
1417 return;
1418
1421
1422 /* WAL Log per-command invalidation messages for wal_level=logical */
1425
1428}
void LogLogicalInvalidations(void)
Definition: inval.c:1935
#define XLogLogicalInfoActive()
Definition: xlog.h:126

References AppendInvalidationMessages(), InvalidationInfo::CurrentCmdInvalidMsgs, TransInvalidationInfo::ii, LocalExecuteInvalidationMessage(), LogLogicalInvalidations(), TransInvalidationInfo::PriorCmdInvalidMsgs, ProcessInvalidationMessages(), transInvalInfo, and XLogLogicalInfoActive.

Referenced by AtCCI_LocalCache(), and AtEOSubXact_Inval().

◆ ForgetInplace_Inval()

void ForgetInplace_Inval ( void  )

Definition at line 1286 of file inval.c.

1287{
1288 inplaceInvalInfo = NULL;
1289}

References inplaceInvalInfo.

Referenced by heap_inplace_lock(), and heap_inplace_unlock().

◆ InvalidateSystemCaches()

◆ InvalidateSystemCachesExtended()

void InvalidateSystemCachesExtended ( bool  debug_discard)

Definition at line 785 of file inval.c.

786{
787 int i;
788
790 ResetCatalogCachesExt(debug_discard);
791 RelationCacheInvalidate(debug_discard); /* gets smgr and relmap too */
792
793 for (i = 0; i < syscache_callback_count; i++)
794 {
795 struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i;
796
797 ccitem->function(ccitem->arg, ccitem->id, 0);
798 }
799
800 for (i = 0; i < relcache_callback_count; i++)
801 {
802 struct RELCACHECALLBACK *ccitem = relcache_callback_list + i;
803
804 ccitem->function(ccitem->arg, InvalidOid);
805 }
806
807 for (i = 0; i < relsync_callback_count; i++)
808 {
809 struct RELSYNCCALLBACK *ccitem = relsync_callback_list + i;
810
811 ccitem->function(ccitem->arg, InvalidOid);
812 }
813}
void ResetCatalogCachesExt(bool debug_discard)
Definition: catcache.c:804
void RelationCacheInvalidate(bool debug_discard)
Definition: relcache.c:2994
void InvalidateCatalogSnapshot(void)
Definition: snapmgr.c:443

References SYSCACHECALLBACK::arg, RELCACHECALLBACK::arg, RELSYNCCALLBACK::arg, SYSCACHECALLBACK::function, RELCACHECALLBACK::function, RELSYNCCALLBACK::function, i, SYSCACHECALLBACK::id, InvalidateCatalogSnapshot(), InvalidOid, RelationCacheInvalidate(), relcache_callback_count, relcache_callback_list, relsync_callback_count, relsync_callback_list, ResetCatalogCachesExt(), syscache_callback_count, and syscache_callback_list.

Referenced by AcceptInvalidationMessages(), and InvalidateSystemCaches().

◆ LogLogicalInvalidations()

void LogLogicalInvalidations ( void  )

Definition at line 1935 of file inval.c.

1936{
1937 xl_xact_invals xlrec;
1938 InvalidationMsgsGroup *group;
1939 int nmsgs;
1940
1941 /* Quick exit if we haven't done anything with invalidation messages. */
1942 if (transInvalInfo == NULL)
1943 return;
1944
1946 nmsgs = NumMessagesInGroup(group);
1947
1948 if (nmsgs > 0)
1949 {
1950 /* prepare record */
1951 memset(&xlrec, 0, MinSizeOfXactInvals);
1952 xlrec.nmsgs = nmsgs;
1953
1954 /* perform insertion */
1958 XLogRegisterData(msgs,
1959 n * sizeof(SharedInvalidationMessage)));
1961 XLogRegisterData(msgs,
1962 n * sizeof(SharedInvalidationMessage)));
1964 }
1965}
#define NumMessagesInGroup(group)
Definition: inval.c:207
#define CatCacheMsgs
Definition: inval.c:171
#define ProcessMessageSubGroupMulti(group, subgroup, codeFragment)
Definition: inval.c:402
#define RelCacheMsgs
Definition: inval.c:172
int nmsgs
Definition: xact.h:304
#define MinSizeOfXactInvals
Definition: xact.h:307
#define XLOG_XACT_INVALIDATIONS
Definition: xact.h:175
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Definition: xloginsert.c:474
void XLogRegisterData(const void *data, uint32 len)
Definition: xloginsert.c:364
void XLogBeginInsert(void)
Definition: xloginsert.c:149

References CatCacheMsgs, InvalidationInfo::CurrentCmdInvalidMsgs, TransInvalidationInfo::ii, MinSizeOfXactInvals, xl_xact_invals::nmsgs, NumMessagesInGroup, ProcessMessageSubGroupMulti, RelCacheMsgs, transInvalInfo, XLOG_XACT_INVALIDATIONS, XLogBeginInsert(), XLogInsert(), and XLogRegisterData().

Referenced by CommandEndInvalidationMessages(), and RecordTransactionCommit().

◆ PostPrepare_Inval()

void PostPrepare_Inval ( void  )

Definition at line 993 of file inval.c.

994{
995 AtEOXact_Inval(false);
996}
void AtEOXact_Inval(bool isCommit)
Definition: inval.c:1199

References AtEOXact_Inval().

Referenced by PrepareTransaction().

◆ PreInplace_Inval()

Variable Documentation

◆ debug_discard_caches

PGDLLIMPORT int debug_discard_caches
extern

Definition at line 260 of file inval.c.

Referenced by AcceptInvalidationMessages(), LookupOpclassInfo(), and RelationBuildDesc().