MySQL 9.1.0
Source Code Documentation
trx0types.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1996, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/trx0types.h
29 Transaction system global type definitions
30
31 Created 3/26/1996 Heikki Tuuri
32 *******************************************************/
33
34#ifndef trx0types_h
35#define trx0types_h
36
37#include "page0size.h"
38#include "sync0rw.h"
39#include "ut0byte.h"
40#include "ut0mutex.h"
41#include "ut0new.h"
42
43#include <atomic>
44#include <queue>
45#include <set>
46#include <vector>
47
48/** printf(3) format used for printing DB_TRX_ID and other system fields */
49#define TRX_ID_FMT IB_ID_FMT
50
51/** Space id of the transaction system page (the system tablespace) */
52static const space_id_t TRX_SYS_SPACE = 0;
53
54/** Page number of the transaction system page */
56
57/** Random value to check for corruption of trx_t */
58static const ulint TRX_MAGIC_N = 91118598;
59
60/** If this flag is set then the transaction cannot be rolled back
61asynchronously. */
62static const uint32_t TRX_FORCE_ROLLBACK_DISABLE = 1 << 29;
63
64/** Mark the transaction for forced rollback */
65static const uint32_t TRX_FORCE_ROLLBACK = 1U << 31;
66
67/** For masking out the above flags */
68static const uint32_t TRX_FORCE_ROLLBACK_MASK = 0x1FFFFFFF;
69
70/** Transaction execution states when trx->state == TRX_STATE_ACTIVE */
72 TRX_QUE_RUNNING, /*!< transaction is running */
73 TRX_QUE_LOCK_WAIT, /*!< transaction is waiting for
74 a lock */
75 TRX_QUE_ROLLING_BACK, /*!< transaction is rolling back */
76 TRX_QUE_COMMITTING /*!< transaction is committing */
77};
78
79/** Transaction states (trx_t::state) */
81
83
84 /** Same as not started but with additional semantics that it
85 was rolled back asynchronously the last time it was active. */
87
89
90 /** Support for 2PC/XA */
92
94};
95
96/** Type of data dictionary operation */
98 /** The transaction is not modifying the data dictionary. */
100 /** The transaction is creating a table or an index, or
101 dropping a table. The table must be dropped in crash
102 recovery. This and TRX_DICT_OP_NONE are the only possible
103 operation modes in crash recovery. */
105 /** The transaction is creating or dropping an index in an
106 existing table. In crash recovery, the data dictionary
107 must be locked, but the table must not be dropped. */
110
111/** Memory objects */
112/** @{ */
113/** Transaction */
114struct trx_t;
115/** The locks and state of an active transaction */
116struct trx_lock_t;
117/** Transaction system */
118struct trx_sys_t;
119/** Signal */
120struct trx_sig_t;
121/** Rollback segment */
122struct trx_rseg_t;
123/** Transaction undo log */
124struct trx_undo_t;
125/** The control structure used in the purge operation */
126struct trx_purge_t;
127/** Rollback command node in a query graph */
128struct roll_node_t;
129/** Commit command node in a query graph */
130struct commit_node_t;
131/** SAVEPOINT command node in a query graph */
132struct trx_named_savept_t;
133/** @} */
134
135/** Row identifier (DB_ROW_ID, DATA_ROW_ID) */
137/** Transaction identifier (DB_TRX_ID, DATA_TRX_ID) */
139/** Rollback pointer (DB_ROLL_PTR, DATA_ROLL_PTR) */
141/** Undo number */
143
144/** Maximum transaction identifier */
146
147/** Transaction savepoint */
149 undo_no_t least_undo_no; /*!< least undo number to undo */
150};
151
152/** File objects */
153/** @{ */
154/** Transaction system header */
155typedef byte trx_sysf_t;
156/** Rollback segment array header */
157typedef byte trx_rsegsf_t;
158/** Rollback segment header */
159typedef byte trx_rsegf_t;
160/** Undo segment header */
161typedef byte trx_usegf_t;
162/** Undo log header */
163typedef byte trx_ulogf_t;
164/** Undo log page header */
165typedef byte trx_upagef_t;
166/** Undo log record */
167typedef byte trx_undo_rec_t;
168/** @} */
169
170typedef ib_mutex_t RsegMutex;
171typedef ib_mutex_t TrxMutex;
172typedef ib_mutex_t UndoMutex;
173typedef ib_mutex_t PQMutex;
174typedef ib_mutex_t TrxSysMutex;
175
176/** Used to identify trx uniquely over time */
178 /** The immutable id of trx_t object - if you have a pointer to trx_t then we
179 guarantee that immutable id of it will not change over time. Also there are
180 never two trx_t objects at the same time with same immutable id. However it
181 may happen that two different transactions that do not occur at the same time
182 reuse the same trx_t and thus have same immutable id. Use m_version to detect
183 this situation. */
184 uint64_t m_immutable_id{};
185
186 /** As trx_t objects and thus immutable ids can be reused we need also trx's
187 version, which is incremented each time trx_t object gets reused. */
188 uint64_t m_version{};
189
190 /** Initializes trx_guid_t object to a value which doesn't match any real
191 transaction. */
192 trx_guid_t() = default;
193
194 /** Initializes trx_guid_t with data uniquely identifying the transaction
195 represented by trx_t object.
196 @param[in] trx the object representing the transaction */
197 trx_guid_t(const trx_t &trx);
198
199 /** Checks if two guids represent the same transaction:
200 they refer to the same trx_t struct and it was not reused meanwhile.
201 @param[in] rhs another guid to compare against
202 @return true iff the two guids are equal and thus represent same transaction*/
203 bool operator==(const trx_guid_t &rhs) const {
204 return m_immutable_id == rhs.m_immutable_id && m_version == rhs.m_version;
205 }
206
207 /** Checks if the instance is non-empty, i.e. was not default-constructed,
208 but rather initialized to correspond to a real trx_t.
209 @return true iff this guid was initialized to match a real transaction */
210 operator bool() const { return m_immutable_id != 0; }
211};
212
213/** The rollback segment memory object */
215#ifdef UNIV_DEBUG
216 /** Validate the curr_size member by re-calculating it.
217 @param[in] take_mutex take the rseg->mutex. default is true.
218 @return true if valid, false otherwise. */
219 bool validate_curr_size(bool take_mutex = true);
220#endif /* UNIV_DEBUG */
221
222 /** Enter the rseg->mutex. */
223 void latch() {
226 }
227
228 /** Exit the rseg->mutex. */
229 void unlatch() {
232 }
233
234 /** Decrement the current size of the rollback segment by the given number
235 of pages.
236 @param[in] npages number of pages to reduce in size. */
237 void decr_curr_size(page_no_t npages = 1) {
238 ut_ad(curr_size >= npages);
239 curr_size -= npages;
240 }
241
242 /** Increment the current size of the rollback segment by the given number
243 of pages. */
245
246 /* Get the current size of the rollback segment in pages.
247 @return current size of the rollback segment in pages. */
248 page_no_t get_curr_size() const { return (curr_size); }
249
250 /* Set the current size of the rollback segment in pages.
251 @param[in] npages new value for the current size. */
252 void set_curr_size(page_no_t npages) { curr_size = npages; }
253
254 /*--------------------------------------------------------*/
255 /** rollback segment id == the index of its slot in the trx
256 system file copy */
257 size_t id{};
258
259 /** mutex protecting the fields in this struct except id,space,page_no
260 which are constant */
262
263 /** space ID where the rollback segment header is placed */
265
266 /** page number of the rollback segment header */
268
269 /** page size of the relevant tablespace */
271
272 /** maximum allowed size in pages */
274
275 private:
276 /** current size in pages */
278
279 public:
281 /*--------------------------------------------------------*/
282 /* Fields for update undo logs */
283 /** List of update undo logs */
285
286 /** List of update undo log segments cached for fast reuse */
288
289 /*--------------------------------------------------------*/
290 /* Fields for insert undo logs */
291 /** List of insert undo logs */
293
294 /** List of insert undo log segments cached for fast reuse */
296
297 /*--------------------------------------------------------*/
298
299 /** Page number of the last not yet purged log header in the history
300 list; FIL_NULL if all list purged */
302
303 /** Byte offset of the last not yet purged log header */
304 size_t last_offset{};
305
306 /** Transaction number of the last not yet purged log */
308
309 /** true if the last not yet purged log needs purging */
311
312 /** Reference counter to track rseg allocated transactions. */
313 std::atomic<size_t> trx_ref_count{};
314
315 std::ostream &print(std::ostream &out) const {
316 out << "[trx_rseg_t: this=" << (void *)this << ", id=" << id
317 << ", space_id=" << space_id << ", page_no=" << page_no
318 << ", curr_size=" << curr_size << "]";
319 return (out);
320 }
321};
322
323inline std::ostream &operator<<(std::ostream &out, const trx_rseg_t &rseg) {
324 return (rseg.print(out));
325}
326
327using Rsegs_Vector = std::vector<trx_rseg_t *, ut::allocator<trx_rseg_t *>>;
328using Rseg_Iterator = Rsegs_Vector::iterator;
329
330/** This is a wrapper for a std::vector of trx_rseg_t object pointers. */
331class Rsegs {
332 public:
333 /** Default constructor */
335#ifndef UNIV_HOTBACKUP
336 init();
337#endif /* !UNIV_HOTBACKUP */
338 }
339
341#ifndef UNIV_HOTBACKUP
342 deinit();
343#endif /* !UNIV_HOTBACKUP */
344 }
345
346 /** Initialize */
347 void init();
348
349 /** De-initialize */
350 void deinit();
351
352 /** Clear the vector of cached rollback segments leaving the
353 reserved space allocated. */
354 void clear();
355
356 /** Add rollback segment.
357 @param[in] rseg rollback segment to add. */
358 void push_back(trx_rseg_t *rseg) { m_rsegs.push_back(rseg); }
359
360 /** Number of registered rsegs.
361 @return size of rseg list. */
362 ulint size() { return (m_rsegs.size()); }
363
364 /** beginning iterator
365 @return an iterator to the first element */
366 Rseg_Iterator begin() { return (m_rsegs.begin()); }
367
368 /** ending iterator
369 @return an iterator to the end */
370 Rseg_Iterator end() { return (m_rsegs.end()); }
371
372 /** Find the rseg at the given slot in this vector.
373 @param[in] slot a slot within the vector.
374 @return an iterator to the end */
375 trx_rseg_t *at(ulint slot) { return (m_rsegs.at(slot)); }
376
377 /** Find an rseg in the std::vector that uses the rseg_id given.
378 @param[in] rseg_id A slot in a durable array such as
379 the TRX_SYS page or RSEG_ARRAY page.
380 @return a pointer to an trx_rseg_t that uses the rseg_id. */
381 trx_rseg_t *find(ulint rseg_id);
382
383 /** Sort the vector on trx_rseg_t::id */
384 void sort() {
385 if (m_rsegs.empty()) {
386 return;
387 }
388
389 std::sort(
390 m_rsegs.begin(), m_rsegs.end(),
391 [](trx_rseg_t *lhs, trx_rseg_t *rhs) { return (rhs->id > lhs->id); });
392 }
393
394 /** Acquire the shared lock on m_rsegs. */
396
397 /** Release the shared lock on m_rsegs. */
399
400 /** Acquire the exclusive lock on m_rsegs. */
402
403 /** Release the exclusive lock on m_rsegs. */
405
406 /** Return whether the undo tablespace is active.
407 @return true if active */
408 bool is_active() { return (m_state == ACTIVE); }
409
410 /** Return whether the undo tablespace is inactive due to
411 implicit selection by the purge thread.
412 @return true if marked for truncation by the purge thread */
414
415 /** Return whether the undo tablespace was made inactive by
416 ALTER TABLESPACE.
417 @return true if altered */
419
420 /** Return whether the undo tablespace is empty and ready
421 to be dropped.
422 @return true if empty */
423 bool is_empty() { return (m_state == EMPTY); }
424
425 /** Return whether the undo tablespace is being initialized.
426 @return true if empty */
427 bool is_init() { return (m_state == INIT); }
428
429 /** Set the state of the rollback segments in this undo tablespace
430 to ACTIVE for use by new transactions. */
432
433 /** Set the state of the rollback segments in this undo
434 tablespace to inactive_implicit. This means that it will be
435 truncated and then made active again by the purge thread.
436 It will not be used for new transactions until it becomes
437 active again. */
441 }
442
443 /** Make the undo tablespace inactive so that it will not be
444 used for new transactions. The purge thread will clear out
445 all the undo logs, truncate it, and then mark it empty. */
447
448 /** Set the state of the undo tablespace to empty so that it
449 can be dropped. */
450 void set_empty() {
452 m_state == INIT || m_state == EMPTY);
453 m_state = EMPTY;
454 }
455
456 /** std::vector of rollback segments */
458
459 private:
460 /** RW lock to protect m_rsegs vector, m_active, and each
461 trx_rseg_t::trx_ref_count within it.
462 m_rsegs: x for adding elements, s for scanning, size etc.
463 m_active: x for modification, s for read
464 each trx_rseg_t::trx_ref_count within m_rsegs
465 s and atomic increment for modification, x for read */
467
468 /* The four states of an undo tablespace.
469 INIT: The initial state of an undo space that is being created or opened.
470 ACTIVE: The rollback segments in this tablespace can be allocated to new
471 transactions. The undo tablespace is ready for undo logs.
472 INACTIVE_IMPLICIT: These rollback segments are no longer being used by new
473 transactions. They are 'inactive'. The truncate process
474 is happening. This undo tablespace was selected by the
475 purge thread implicitly. When the truncation process
476 is complete, the next state is ACTIVE.
477 INACTIVE_EXPLICIT: These rollback segments are no longer being used by new
478 transactions. They are 'inactive'. The truncate process
479 is happening. This undo tablespace was selected by the
480 an ALTER UNDO TABLESPACE SET INACTIVE command. When the
481 truncation process is complete, the next state is EMPTY.
482 EMPTY: The undo tablespace has been truncated but is no longer
483 active. It is ready to be either dropped or set active
484 explicitly. This state is also used when the undo tablespace and
485 its rollback segments are being inititalized.
486
487 These states are changed under an exclusive lock on m_latch and are read
488 under a shared lock.
489
490 The following actions can cause changes in these states:
491 Init: Implicit undo spaces are created at startup.
492 Create: Explicit undo tablespace creation at runtime.
493 Mark: Purge thread implicitly selects an undo space to truncate.
494 SetInactive: This ALTER UNDO TABLESPACE causes an explicit truncation.
495 SetActive: This ALTER UNDO TABLESPACE changes the target state from
496 EMPTY to ACTIVE.
497 Truncate: The truncate process is completed by the purge thread.
498 Drop: Delete an EMPTY undo tablespace
499 Crash: A crash occurs
500 Fixup: At startup, if an undo space was being truncated with a crash.
501 SaveDDState: At startup, once the DD is available the state saved there
502 will be applied. INACTIVE_IMPLICIT is never saved to the DD.
503 So the DD state INACTIVE means INACTIVE_EXPLICIT.
504 See apply_dd_undo_state()
505
506 State changes allowed: (Actions on states not mentioned are not allowed.)
507 Init from null -> INIT -> ACTIVE see srv_start()
508 from null -> INIT -> EMPTY see trx_rsegs_init()
509 Create from null -> EMPTY -> ACTIVE
510 Mark from INACTIVE_EXPLICIT -> INACTIVE_EXPLICIT -> Truncate
511 from ACTIVE -> INACTIVE_IMPLICIT -> Truncate
512 SetInactive from ACTIVE -> INACTIVE_EXPLICIT -> Mark
513 from INACTIVE_IMPLICIT -> INACTIVE_EXPLICIT
514 from INACTIVE_EXPLICIT -> INACTIVE_EXPLICIT
515 from EMPTY -> EMPTY
516 SetActive from ACTIVE -> ACTIVE
517 from INACTIVE_IMPLICIT -> INACTIVE_IMPLICIT
518 from INACTIVE_EXPLICIT -> INACTIVE_IMPLICIT
519 from EMPTY -> ACTIVE
520 Truncate from INACTIVE_IMPLICIT -> ACTIVE
521 from INACTIVE_EXPLICIT -> EMPTY
522 Drop if ACTIVE -> error returned
523 if INACTIVE_IMPLICIT -> error returned
524 if INACTIVE_EXPLICIT -> error returned
525 from EMPTY -> null
526 Crash if ACTIVE, at startup: ACTIVE
527 if INACTIVE_IMPLICIT, at startup: Fixup
528 if INACTIVE_EXPLICIT, at startup: Fixup
529 if EMPTY, at startup: EMPTY
530 Fixup from INACTIVE_IMPLICIT before crash -> INACTIVE_IMPLICIT -> Mark
531 from INACTIVE_EXPLICIT before crash -> INACTIVE_IMPLICIT -> Mark
532 SaveDDState from ACTIVE before crash -> ACTIVE
533 from INACTIVE_IMPLICIT before crash -> ACTIVE
534 from INACTIVE_EXPLICIT before crash -> INACTIVE_EXPLICIT -> Mark
535 from EMPTY -> EMPTY
536 */
542 EMPTY
543 };
544
545 /** The current state of this undo tablespace. */
547};
548
549template <size_t N>
550using Rsegs_array = std::array<trx_rseg_t *, N>;
551
552/** Rollback segments from a given transaction with trx-no
553scheduled for purge. */
555 public:
556 explicit TrxUndoRsegs(trx_id_t trx_no) : m_trx_no(trx_no) {
557 for (auto &rseg : m_rsegs) {
558 rseg = nullptr;
559 }
560 }
561
562 /** Default constructor */
564
565 void set_trx_no(trx_id_t trx_no) { m_trx_no = trx_no; }
566
567 /** Get transaction number
568 @return trx_id_t - get transaction number. */
569 trx_id_t get_trx_no() const { return (m_trx_no); }
570
571 /** Add rollback segment.
572 @param rseg rollback segment to add. */
573 void insert(trx_rseg_t *rseg) {
574 for (size_t i = 0; i < m_rsegs_n; ++i) {
575 if (m_rsegs[i] == rseg) {
576 return;
577 }
578 }
579 ut_a(m_rsegs_n < 2);
580 m_rsegs[m_rsegs_n++] = rseg;
581 }
582
583 /** Number of registered rsegs.
584 @return size of rseg list. */
585 size_t size() const { return (m_rsegs_n); }
586
587 /**
588 @return an iterator to the first element */
589 typename Rsegs_array<2>::iterator begin() { return m_rsegs.begin(); }
590
591 /**
592 @return an iterator to the end */
594 return m_rsegs.begin() + m_rsegs_n;
595 }
596
597 /** Append rollback segments from referred instance to current
598 instance. */
599 void insert(const TrxUndoRsegs &append_from) {
600 ut_ad(get_trx_no() == append_from.get_trx_no());
601 for (size_t i = 0; i < append_from.m_rsegs_n; ++i) {
602 insert(append_from.m_rsegs[i]);
603 }
604 }
605
606 /** Compare two TrxUndoRsegs based on trx_no.
607 @param lhs first element to compare
608 @param rhs second element to compare
609 @return true if elem1 > elem2 else false.*/
610 bool operator()(const TrxUndoRsegs &lhs, const TrxUndoRsegs &rhs) {
611 return (lhs.m_trx_no > rhs.m_trx_no);
612 }
613
614 /** Compiler defined copy-constructor/assignment operator
615 should be fine given that there is no reference to a memory
616 object outside scope of class object.*/
617
618 private:
619 /** The rollback segments transaction number. */
621
622 size_t m_rsegs_n{};
623
624 /** Rollback segments of a transaction, scheduled for purge. */
626};
627
628typedef std::priority_queue<
629 TrxUndoRsegs, std::vector<TrxUndoRsegs, ut::allocator<TrxUndoRsegs>>,
632
633typedef std::vector<trx_id_t, ut::allocator<trx_id_t>> trx_ids_t;
634
636 TrxVersion(trx_t *trx);
637
639 uint64_t m_version;
640};
641
642typedef std::vector<TrxVersion, ut::allocator<TrxVersion>> hit_list_t;
643#endif /* trx0types_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:48
uint32_t page_no_t
Page number.
Definition: api0api.h:46
This is a wrapper for a std::vector of trx_rseg_t object pointers.
Definition: trx0types.h:331
~Rsegs()
Definition: trx0types.h:340
void set_empty()
Set the state of the undo tablespace to empty so that it can be dropped.
Definition: trx0types.h:450
void set_inactive_implicit()
Set the state of the rollback segments in this undo tablespace to inactive_implicit.
Definition: trx0types.h:438
rw_lock_t * m_latch
RW lock to protect m_rsegs vector, m_active, and each trx_rseg_t::trx_ref_count within it.
Definition: trx0types.h:466
trx_rseg_t * find(ulint rseg_id)
Find an rseg in the std::vector that uses the rseg_id given.
Definition: trx0rseg.cc:776
void clear()
Clear the vector of cached rollback segments leaving the reserved space allocated.
Definition: trx0rseg.cc:764
Rsegs_Vector m_rsegs
std::vector of rollback segments
Definition: trx0types.h:457
void push_back(trx_rseg_t *rseg)
Add rollback segment.
Definition: trx0types.h:358
void set_active()
Set the state of the rollback segments in this undo tablespace to ACTIVE for use by new transactions.
Definition: trx0types.h:431
void s_lock()
Acquire the shared lock on m_rsegs.
Definition: trx0types.h:395
bool is_empty()
Return whether the undo tablespace is empty and ready to be dropped.
Definition: trx0types.h:423
undo_space_states m_state
The current state of this undo tablespace.
Definition: trx0types.h:546
Rseg_Iterator end()
ending iterator
Definition: trx0types.h:370
Rsegs()
Default constructor.
Definition: trx0types.h:334
void sort()
Sort the vector on trx_rseg_t::id.
Definition: trx0types.h:384
bool is_init()
Return whether the undo tablespace is being initialized.
Definition: trx0types.h:427
bool is_inactive_implicit()
Return whether the undo tablespace is inactive due to implicit selection by the purge thread.
Definition: trx0types.h:413
bool is_inactive_explicit()
Return whether the undo tablespace was made inactive by ALTER TABLESPACE.
Definition: trx0types.h:418
ulint size()
Number of registered rsegs.
Definition: trx0types.h:362
void s_unlock()
Release the shared lock on m_rsegs.
Definition: trx0types.h:398
void set_inactive_explicit()
Make the undo tablespace inactive so that it will not be used for new transactions.
Definition: trx0types.h:446
bool is_active()
Return whether the undo tablespace is active.
Definition: trx0types.h:408
Rseg_Iterator begin()
beginning iterator
Definition: trx0types.h:366
void x_unlock()
Release the exclusive lock on m_rsegs.
Definition: trx0types.h:404
undo_space_states
Definition: trx0types.h:537
@ EMPTY
Definition: trx0types.h:542
@ INACTIVE_IMPLICIT
Definition: trx0types.h:540
@ INIT
Definition: trx0types.h:538
@ ACTIVE
Definition: trx0types.h:539
@ INACTIVE_EXPLICIT
Definition: trx0types.h:541
void deinit()
De-initialize.
Definition: trx0rseg.cc:754
void x_lock()
Acquire the exclusive lock on m_rsegs.
Definition: trx0types.h:401
trx_rseg_t * at(ulint slot)
Find the rseg at the given slot in this vector.
Definition: trx0types.h:375
void init()
Initialize.
Definition: trx0rseg.cc:744
Rollback segments from a given transaction with trx-no scheduled for purge.
Definition: trx0types.h:554
TrxUndoRsegs(trx_id_t trx_no)
Definition: trx0types.h:556
trx_id_t get_trx_no() const
Get transaction number.
Definition: trx0types.h:569
Rsegs_array< 2 > m_rsegs
Rollback segments of a transaction, scheduled for purge.
Definition: trx0types.h:625
size_t size() const
Number of registered rsegs.
Definition: trx0types.h:585
Rsegs_array< 2 >::iterator end()
Definition: trx0types.h:593
trx_id_t m_trx_no
Compiler defined copy-constructor/assignment operator should be fine given that there is no reference...
Definition: trx0types.h:620
size_t m_rsegs_n
Definition: trx0types.h:622
Rsegs_array< 2 >::iterator begin()
Definition: trx0types.h:589
bool operator()(const TrxUndoRsegs &lhs, const TrxUndoRsegs &rhs)
Compare two TrxUndoRsegs based on trx_no.
Definition: trx0types.h:610
void set_trx_no(trx_id_t trx_no)
Definition: trx0types.h:565
void insert(const TrxUndoRsegs &append_from)
Append rollback segments from referred instance to current instance.
Definition: trx0types.h:599
TrxUndoRsegs()
Default constructor.
Definition: trx0types.h:563
void insert(trx_rseg_t *rseg)
Add rollback segment.
Definition: trx0types.h:573
Page size descriptor.
Definition: page0size.h:50
constexpr uint32_t FSP_TRX_SYS_PAGE_NO
transaction system header, in tablespace 0
Definition: fsp0types.h:170
A class describing a page size.
Definition: trx0types.h:635
uint64_t m_version
Definition: trx0types.h:639
TrxVersion(trx_t *trx)
Constructor.
Definition: trx0trx.cc:97
trx_t * m_trx
Definition: trx0types.h:638
Commit command node in a query graph.
Definition: trx0trx.h:1337
Rollback command node in a query graph.
Definition: trx0roll.h:156
The structure used in the spin lock implementation of a read-write lock.
Definition: sync0rw.h:363
Used to identify trx uniquely over time.
Definition: trx0types.h:177
bool operator==(const trx_guid_t &rhs) const
Checks if two guids represent the same transaction: they refer to the same trx_t struct and it was no...
Definition: trx0types.h:203
trx_guid_t()=default
Initializes trx_guid_t object to a value which doesn't match any real transaction.
uint64_t m_version
As trx_t objects and thus immutable ids can be reused we need also trx's version, which is incremente...
Definition: trx0types.h:188
uint64_t m_immutable_id
The immutable id of trx_t object - if you have a pointer to trx_t then we guarantee that immutable id...
Definition: trx0types.h:184
Latching protocol for trx_lock_t::que_state.
Definition: trx0trx.h:401
A savepoint set with SQL's "SAVEPOINT savepoint_id" command.
Definition: trx0roll.h:168
The control structure used in the purge operation.
Definition: trx0purge.h:986
The rollback segment memory object.
Definition: trx0types.h:214
std::ostream & print(std::ostream &out) const
Definition: trx0types.h:315
trx_id_t last_trx_no
Transaction number of the last not yet purged log.
Definition: trx0types.h:307
Undo_list insert_undo_list
List of insert undo logs.
Definition: trx0types.h:292
size_t last_offset
Byte offset of the last not yet purged log header.
Definition: trx0types.h:304
bool last_del_marks
true if the last not yet purged log needs purging
Definition: trx0types.h:310
page_no_t get_curr_size() const
Definition: trx0types.h:248
void set_curr_size(page_no_t npages)
Definition: trx0types.h:252
RsegMutex mutex
mutex protecting the fields in this struct except id,space,page_no which are constant
Definition: trx0types.h:261
space_id_t space_id
space ID where the rollback segment header is placed
Definition: trx0types.h:264
void decr_curr_size(page_no_t npages=1)
Decrement the current size of the rollback segment by the given number of pages.
Definition: trx0types.h:237
page_no_t curr_size
current size in pages
Definition: trx0types.h:277
page_no_t page_no
page number of the rollback segment header
Definition: trx0types.h:267
page_size_t page_size
page size of the relevant tablespace
Definition: trx0types.h:270
Undo_list update_undo_cached
List of update undo log segments cached for fast reuse.
Definition: trx0types.h:287
std::atomic< size_t > trx_ref_count
Reference counter to track rseg allocated transactions.
Definition: trx0types.h:313
page_no_t max_size
maximum allowed size in pages
Definition: trx0types.h:273
void incr_curr_size()
Increment the current size of the rollback segment by the given number of pages.
Definition: trx0types.h:244
bool validate_curr_size(bool take_mutex=true)
Validate the curr_size member by re-calculating it.
Definition: trx0rseg.cc:1171
page_no_t last_page_no
Page number of the last not yet purged log header in the history list; FIL_NULL if all list purged.
Definition: trx0types.h:301
UT_LIST_BASE_NODE_T_EXTERN(trx_undo_t, undo_list) Undo_list
Definition: trx0types.h:280
Undo_list update_undo_list
List of update undo logs.
Definition: trx0types.h:284
Undo_list insert_undo_cached
List of insert undo log segments cached for fast reuse.
Definition: trx0types.h:295
void unlatch()
Exit the rseg->mutex.
Definition: trx0types.h:229
void latch()
Enter the rseg->mutex.
Definition: trx0types.h:223
Transaction savepoint.
Definition: trx0types.h:148
undo_no_t least_undo_no
least undo number to undo
Definition: trx0types.h:149
The transaction system central memory data structure.
Definition: trx0sys.h:453
Definition: trx0trx.h:675
Transaction undo log memory object; this is protected by the undo_mutex in the corresponding transact...
Definition: trx0undo.h:339
The read-write lock (for threads, not for database transactions)
static void rw_lock_s_unlock(rw_lock_t *L)
Definition: sync0rw.h:808
static void rw_lock_x_lock(rw_lock_t *M, ut::Location L)
Definition: sync0rw.h:782
static void rw_lock_s_lock(rw_lock_t *M, ut::Location L)
Definition: sync0rw.h:731
static void rw_lock_x_unlock(rw_lock_t *L)
Definition: sync0rw.h:811
static const uint32_t TRX_FORCE_ROLLBACK_MASK
For masking out the above flags.
Definition: trx0types.h:68
ib_mutex_t TrxMutex
Definition: trx0types.h:171
std::vector< trx_rseg_t *, ut::allocator< trx_rseg_t * > > Rsegs_Vector
Definition: trx0types.h:327
byte trx_undo_rec_t
Undo log record.
Definition: trx0types.h:167
Rsegs_Vector::iterator Rseg_Iterator
Definition: trx0types.h:328
trx_state_t
Transaction states (trx_t::state)
Definition: trx0types.h:80
@ TRX_STATE_FORCED_ROLLBACK
Same as not started but with additional semantics that it was rolled back asynchronously the last tim...
Definition: trx0types.h:86
@ TRX_STATE_ACTIVE
Definition: trx0types.h:88
@ TRX_STATE_COMMITTED_IN_MEMORY
Definition: trx0types.h:93
@ TRX_STATE_NOT_STARTED
Definition: trx0types.h:82
@ TRX_STATE_PREPARED
Support for 2PC/XA.
Definition: trx0types.h:91
constexpr trx_id_t TRX_ID_MAX
Maximum transaction identifier.
Definition: trx0types.h:145
static const ulint TRX_MAGIC_N
Random value to check for corruption of trx_t.
Definition: trx0types.h:58
trx_que_t
Transaction execution states when trx->state == TRX_STATE_ACTIVE.
Definition: trx0types.h:71
@ TRX_QUE_LOCK_WAIT
transaction is waiting for a lock
Definition: trx0types.h:73
@ TRX_QUE_RUNNING
transaction is running
Definition: trx0types.h:72
@ TRX_QUE_COMMITTING
transaction is committing
Definition: trx0types.h:76
@ TRX_QUE_ROLLING_BACK
transaction is rolling back
Definition: trx0types.h:75
std::priority_queue< TrxUndoRsegs, std::vector< TrxUndoRsegs, ut::allocator< TrxUndoRsegs > >, TrxUndoRsegs > purge_pq_t
Definition: trx0types.h:631
std::vector< trx_id_t, ut::allocator< trx_id_t > > trx_ids_t
Definition: trx0types.h:633
ib_id_t row_id_t
Row identifier (DB_ROW_ID, DATA_ROW_ID)
Definition: trx0types.h:132
ib_id_t undo_no_t
Undo number.
Definition: trx0types.h:142
byte trx_upagef_t
Undo log page header.
Definition: trx0types.h:165
byte trx_usegf_t
Undo segment header.
Definition: trx0types.h:161
std::ostream & operator<<(std::ostream &out, const trx_rseg_t &rseg)
Definition: trx0types.h:323
byte trx_rsegsf_t
Rollback segment array header.
Definition: trx0types.h:157
static const uint32_t TRX_FORCE_ROLLBACK
Mark the transaction for forced rollback.
Definition: trx0types.h:65
byte trx_ulogf_t
Undo log header.
Definition: trx0types.h:163
std::array< trx_rseg_t *, N > Rsegs_array
Definition: trx0types.h:550
ib_mutex_t PQMutex
Definition: trx0types.h:173
byte trx_rsegf_t
Rollback segment header.
Definition: trx0types.h:159
ib_mutex_t RsegMutex
Definition: trx0types.h:170
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
constexpr uint32_t TRX_SYS_PAGE_NO
Page number of the transaction system page.
Definition: trx0types.h:55
byte trx_sysf_t
File objects.
Definition: trx0types.h:155
static const uint32_t TRX_FORCE_ROLLBACK_DISABLE
If this flag is set then the transaction cannot be rolled back asynchronously.
Definition: trx0types.h:62
ib_mutex_t UndoMutex
Definition: trx0types.h:172
std::vector< TrxVersion, ut::allocator< TrxVersion > > hit_list_t
Definition: trx0types.h:642
static const space_id_t TRX_SYS_SPACE
Space id of the transaction system page (the system tablespace)
Definition: trx0types.h:52
ib_id_t roll_ptr_t
Rollback pointer (DB_ROLL_PTR, DATA_ROLL_PTR)
Definition: trx0types.h:140
ib_mutex_t TrxSysMutex
Definition: trx0types.h:174
trx_dict_op_t
Type of data dictionary operation.
Definition: trx0types.h:97
@ TRX_DICT_OP_TABLE
The transaction is creating a table or an index, or dropping a table.
Definition: trx0types.h:104
@ TRX_DICT_OP_NONE
The transaction is not modifying the data dictionary.
Definition: trx0types.h:99
@ TRX_DICT_OP_INDEX
The transaction is creating or dropping an index in an existing table.
Definition: trx0types.h:108
uint64_t ib_id_t
The generic InnoDB system object identifier data type.
Definition: univ.i:443
unsigned long int ulint
Definition: univ.i:406
constexpr ib_id_t IB_ID_MAX
Definition: univ.i:444
Utilities for byte operations.
#define UT_LOCATION_HERE
Definition: ut0core.h:73
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:105
#define ut_a(EXPR)
Abort execution if EXPR does not evaluate to nonzero.
Definition: ut0dbg.h:93
#define UT_LIST_BASE_NODE_T_EXTERN(t, m)
A variant of UT_LIST_BASE_NODE_T to be used in rare cases where the full definition of t is not yet i...
Definition: ut0lst.h:279
Policy based mutexes.
#define mutex_exit(M)
Definition: ut0mutex.h:123
#define mutex_enter(M)
Definition: ut0mutex.h:117
Dynamic memory allocation routines and custom allocators specifically crafted to support memory instr...