1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * sinval.h |
4 | * POSTGRES shared cache invalidation communication definitions. |
5 | * |
6 | * |
7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
8 | * Portions Copyright (c) 1994, Regents of the University of California |
9 | * |
10 | * src/include/storage/sinval.h |
11 | * |
12 | *------------------------------------------------------------------------- |
13 | */ |
14 | #ifndef SINVAL_H |
15 | #define SINVAL_H |
16 | |
17 | #include <signal.h> |
18 | |
19 | #include "storage/relfilenode.h" |
20 | |
21 | /* |
22 | * We support several types of shared-invalidation messages: |
23 | * * invalidate a specific tuple in a specific catcache |
24 | * * invalidate all catcache entries from a given system catalog |
25 | * * invalidate a relcache entry for a specific logical relation |
26 | * * invalidate all relcache entries |
27 | * * invalidate an smgr cache entry for a specific physical relation |
28 | * * invalidate the mapped-relation mapping for a given database |
29 | * * invalidate any saved snapshot that might be used to scan a given relation |
30 | * More types could be added if needed. The message type is identified by |
31 | * the first "int8" field of the message struct. Zero or positive means a |
32 | * specific-catcache inval message (and also serves as the catcache ID field). |
33 | * Negative values identify the other message types, as per codes below. |
34 | * |
35 | * Catcache inval events are initially driven by detecting tuple inserts, |
36 | * updates and deletions in system catalogs (see CacheInvalidateHeapTuple). |
37 | * An update can generate two inval events, one for the old tuple and one for |
38 | * the new, but this is reduced to one event if the tuple's hash key doesn't |
39 | * change. Note that the inval events themselves don't actually say whether |
40 | * the tuple is being inserted or deleted. Also, since we transmit only a |
41 | * hash key, there is a small risk of unnecessary invalidations due to chance |
42 | * matches of hash keys. |
43 | * |
44 | * Note that some system catalogs have multiple caches on them (with different |
45 | * indexes). On detecting a tuple invalidation in such a catalog, separate |
46 | * catcache inval messages must be generated for each of its caches, since |
47 | * the hash keys will generally be different. |
48 | * |
49 | * Catcache, relcache, and snapshot invalidations are transactional, and so |
50 | * are sent to other backends upon commit. Internally to the generating |
51 | * backend, they are also processed at CommandCounterIncrement so that later |
52 | * commands in the same transaction see the new state. The generating backend |
53 | * also has to process them at abort, to flush out any cache state it's loaded |
54 | * from no-longer-valid entries. |
55 | * |
56 | * smgr and relation mapping invalidations are non-transactional: they are |
57 | * sent immediately when the underlying file change is made. |
58 | */ |
59 | |
60 | typedef struct |
61 | { |
62 | int8 id; /* cache ID --- must be first */ |
63 | Oid dbId; /* database ID, or 0 if a shared relation */ |
64 | uint32 hashValue; /* hash value of key for this catcache */ |
65 | } SharedInvalCatcacheMsg; |
66 | |
67 | #define SHAREDINVALCATALOG_ID (-1) |
68 | |
69 | typedef struct |
70 | { |
71 | int8 id; /* type field --- must be first */ |
72 | Oid dbId; /* database ID, or 0 if a shared catalog */ |
73 | Oid catId; /* ID of catalog whose contents are invalid */ |
74 | } SharedInvalCatalogMsg; |
75 | |
76 | #define SHAREDINVALRELCACHE_ID (-2) |
77 | |
78 | typedef struct |
79 | { |
80 | int8 id; /* type field --- must be first */ |
81 | Oid dbId; /* database ID, or 0 if a shared relation */ |
82 | Oid relId; /* relation ID, or 0 if whole relcache */ |
83 | } SharedInvalRelcacheMsg; |
84 | |
85 | #define SHAREDINVALSMGR_ID (-3) |
86 | |
87 | typedef struct |
88 | { |
89 | /* note: field layout chosen to pack into 16 bytes */ |
90 | int8 id; /* type field --- must be first */ |
91 | int8 backend_hi; /* high bits of backend ID, if temprel */ |
92 | uint16 backend_lo; /* low bits of backend ID, if temprel */ |
93 | RelFileNode rnode; /* spcNode, dbNode, relNode */ |
94 | } SharedInvalSmgrMsg; |
95 | |
96 | #define SHAREDINVALRELMAP_ID (-4) |
97 | |
98 | typedef struct |
99 | { |
100 | int8 id; /* type field --- must be first */ |
101 | Oid dbId; /* database ID, or 0 for shared catalogs */ |
102 | } SharedInvalRelmapMsg; |
103 | |
104 | #define SHAREDINVALSNAPSHOT_ID (-5) |
105 | |
106 | typedef struct |
107 | { |
108 | int8 id; /* type field --- must be first */ |
109 | Oid dbId; /* database ID, or 0 if a shared relation */ |
110 | Oid relId; /* relation ID */ |
111 | } SharedInvalSnapshotMsg; |
112 | |
113 | typedef union |
114 | { |
115 | int8 id; /* type field --- must be first */ |
116 | SharedInvalCatcacheMsg cc; |
117 | SharedInvalCatalogMsg cat; |
118 | SharedInvalRelcacheMsg rc; |
119 | SharedInvalSmgrMsg sm; |
120 | SharedInvalRelmapMsg rm; |
121 | SharedInvalSnapshotMsg sn; |
122 | } SharedInvalidationMessage; |
123 | |
124 | |
125 | /* Counter of messages processed; don't worry about overflow. */ |
126 | extern uint64 SharedInvalidMessageCounter; |
127 | |
128 | extern volatile sig_atomic_t catchupInterruptPending; |
129 | |
130 | extern void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs, |
131 | int n); |
132 | extern void ReceiveSharedInvalidMessages(void (*invalFunction) (SharedInvalidationMessage *msg), |
133 | void (*resetFunction) (void)); |
134 | |
135 | /* signal handler for catchup events (PROCSIG_CATCHUP_INTERRUPT) */ |
136 | extern void HandleCatchupInterrupt(void); |
137 | |
138 | /* |
139 | * enable/disable processing of catchup events directly from signal handler. |
140 | * The enable routine first performs processing of any catchup events that |
141 | * have occurred since the last disable. |
142 | */ |
143 | extern void ProcessCatchupInterrupt(void); |
144 | |
145 | extern int xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs, |
146 | bool *RelcacheInitFileInval); |
147 | extern void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, |
148 | int nmsgs, bool RelcacheInitFileInval, |
149 | Oid dbid, Oid tsid); |
150 | |
151 | extern void LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg); |
152 | |
153 | #endif /* SINVAL_H */ |
154 | |