|
134 | 134 | #include "replication/logical.h" |
135 | 135 | #include "replication/reorderbuffer.h" |
136 | 136 | #include "replication/snapbuild.h" |
| 137 | +#include "replication/snapbuild_internal.h" |
137 | 138 | #include "storage/fd.h" |
138 | 139 | #include "storage/lmgr.h" |
139 | 140 | #include "storage/proc.h" |
|
143 | 144 | #include "utils/memutils.h" |
144 | 145 | #include "utils/snapmgr.h" |
145 | 146 | #include "utils/snapshot.h" |
146 | | - |
147 | | -/* |
148 | | - * This struct contains the current state of the snapshot building |
149 | | - * machinery. Besides a forward declaration in the header, it is not exposed |
150 | | - * to the public, so we can easily change its contents. |
151 | | - */ |
152 | | -struct SnapBuild |
153 | | -{ |
154 | | - /* how far are we along building our first full snapshot */ |
155 | | - SnapBuildState state; |
156 | | - |
157 | | - /* private memory context used to allocate memory for this module. */ |
158 | | - MemoryContext context; |
159 | | - |
160 | | - /* all transactions < than this have committed/aborted */ |
161 | | - TransactionId xmin; |
162 | | - |
163 | | - /* all transactions >= than this are uncommitted */ |
164 | | - TransactionId xmax; |
165 | | - |
166 | | - /* |
167 | | - * Don't replay commits from an LSN < this LSN. This can be set externally |
168 | | - * but it will also be advanced (never retreat) from within snapbuild.c. |
169 | | - */ |
170 | | - XLogRecPtr start_decoding_at; |
171 | | - |
172 | | - /* |
173 | | - * LSN at which two-phase decoding was enabled or LSN at which we found a |
174 | | - * consistent point at the time of slot creation. |
175 | | - * |
176 | | - * The prepared transactions, that were skipped because previously |
177 | | - * two-phase was not enabled or are not covered by initial snapshot, need |
178 | | - * to be sent later along with commit prepared and they must be before |
179 | | - * this point. |
180 | | - */ |
181 | | - XLogRecPtr two_phase_at; |
182 | | - |
183 | | - /* |
184 | | - * Don't start decoding WAL until the "xl_running_xacts" information |
185 | | - * indicates there are no running xids with an xid smaller than this. |
186 | | - */ |
187 | | - TransactionId initial_xmin_horizon; |
188 | | - |
189 | | - /* Indicates if we are building full snapshot or just catalog one. */ |
190 | | - bool building_full_snapshot; |
191 | | - |
192 | | - /* |
193 | | - * Indicates if we are using the snapshot builder for the creation of a |
194 | | - * logical replication slot. If it's true, the start point for decoding |
195 | | - * changes is not determined yet. So we skip snapshot restores to properly |
196 | | - * find the start point. See SnapBuildFindSnapshot() for details. |
197 | | - */ |
198 | | - bool in_slot_creation; |
199 | | - |
200 | | - /* |
201 | | - * Snapshot that's valid to see the catalog state seen at this moment. |
202 | | - */ |
203 | | - Snapshot snapshot; |
204 | | - |
205 | | - /* |
206 | | - * LSN of the last location we are sure a snapshot has been serialized to. |
207 | | - */ |
208 | | - XLogRecPtr last_serialized_snapshot; |
209 | | - |
210 | | - /* |
211 | | - * The reorderbuffer we need to update with usable snapshots et al. |
212 | | - */ |
213 | | - ReorderBuffer *reorder; |
214 | | - |
215 | | - /* |
216 | | - * TransactionId at which the next phase of initial snapshot building will |
217 | | - * happen. InvalidTransactionId if not known (i.e. SNAPBUILD_START), or |
218 | | - * when no next phase necessary (SNAPBUILD_CONSISTENT). |
219 | | - */ |
220 | | - TransactionId next_phase_at; |
221 | | - |
222 | | - /* |
223 | | - * Array of transactions which could have catalog changes that committed |
224 | | - * between xmin and xmax. |
225 | | - */ |
226 | | - struct |
227 | | - { |
228 | | - /* number of committed transactions */ |
229 | | - size_t xcnt; |
230 | | - |
231 | | - /* available space for committed transactions */ |
232 | | - size_t xcnt_space; |
233 | | - |
234 | | - /* |
235 | | - * Until we reach a CONSISTENT state, we record commits of all |
236 | | - * transactions, not just the catalog changing ones. Record when that |
237 | | - * changes so we know we cannot export a snapshot safely anymore. |
238 | | - */ |
239 | | - bool includes_all_transactions; |
240 | | - |
241 | | - /* |
242 | | - * Array of committed transactions that have modified the catalog. |
243 | | - * |
244 | | - * As this array is frequently modified we do *not* keep it in |
245 | | - * xidComparator order. Instead we sort the array when building & |
246 | | - * distributing a snapshot. |
247 | | - * |
248 | | - * TODO: It's unclear whether that reasoning has much merit. Every |
249 | | - * time we add something here after becoming consistent will also |
250 | | - * require distributing a snapshot. Storing them sorted would |
251 | | - * potentially also make it easier to purge (but more complicated wrt |
252 | | - * wraparound?). Should be improved if sorting while building the |
253 | | - * snapshot shows up in profiles. |
254 | | - */ |
255 | | - TransactionId *xip; |
256 | | - } committed; |
257 | | - |
258 | | - /* |
259 | | - * Array of transactions and subtransactions that had modified catalogs |
260 | | - * and were running when the snapshot was serialized. |
261 | | - * |
262 | | - * We normally rely on some WAL record types such as HEAP2_NEW_CID to know |
263 | | - * if the transaction has changed the catalog. But it could happen that |
264 | | - * the logical decoding decodes only the commit record of the transaction |
265 | | - * after restoring the previously serialized snapshot in which case we |
266 | | - * will miss adding the xid to the snapshot and end up looking at the |
267 | | - * catalogs with the wrong snapshot. |
268 | | - * |
269 | | - * Now to avoid the above problem, we serialize the transactions that had |
270 | | - * modified the catalogs and are still running at the time of snapshot |
271 | | - * serialization. We fill this array while restoring the snapshot and then |
272 | | - * refer it while decoding commit to ensure if the xact has modified the |
273 | | - * catalog. We discard this array when all the xids in the list become old |
274 | | - * enough to matter. See SnapBuildPurgeOlderTxn for details. |
275 | | - */ |
276 | | - struct |
277 | | - { |
278 | | - /* number of transactions */ |
279 | | - size_t xcnt; |
280 | | - |
281 | | - /* This array must be sorted in xidComparator order */ |
282 | | - TransactionId *xip; |
283 | | - } catchange; |
284 | | -}; |
285 | | - |
286 | 147 | /* |
287 | 148 | * Starting a transaction -- which we need to do while exporting a snapshot -- |
288 | 149 | * removes knowledge about the previously used resowner, so we save it here. |
@@ -1557,40 +1418,6 @@ SnapBuildWaitSnapshot(xl_running_xacts *running, TransactionId cutoff) |
1557 | 1418 | } |
1558 | 1419 | } |
1559 | 1420 |
|
1560 | | -/* ----------------------------------- |
1561 | | - * Snapshot serialization support |
1562 | | - * ----------------------------------- |
1563 | | - */ |
1564 | | - |
1565 | | -/* |
1566 | | - * We store current state of struct SnapBuild on disk in the following manner: |
1567 | | - * |
1568 | | - * struct SnapBuildOnDisk; |
1569 | | - * TransactionId * committed.xcnt; (*not xcnt_space*) |
1570 | | - * TransactionId * catchange.xcnt; |
1571 | | - * |
1572 | | - */ |
1573 | | -typedef struct SnapBuildOnDisk |
1574 | | -{ |
1575 | | - /* first part of this struct needs to be version independent */ |
1576 | | - |
1577 | | - /* data not covered by checksum */ |
1578 | | - uint32 magic; |
1579 | | - pg_crc32c checksum; |
1580 | | - |
1581 | | - /* data covered by checksum */ |
1582 | | - |
1583 | | - /* version, in case we want to support pg_upgrade */ |
1584 | | - uint32 version; |
1585 | | - /* how large is the on disk data, excluding the constant sized part */ |
1586 | | - uint32 length; |
1587 | | - |
1588 | | - /* version dependent part */ |
1589 | | - SnapBuild builder; |
1590 | | - |
1591 | | - /* variable amount of TransactionIds follows */ |
1592 | | -} SnapBuildOnDisk; |
1593 | | - |
1594 | 1421 | #define SnapBuildOnDiskConstantSize \ |
1595 | 1422 | offsetof(SnapBuildOnDisk, builder) |
1596 | 1423 | #define SnapBuildOnDiskNotChecksummedSize \ |
|
0 commit comments