MySQL 9.2.0
Source Code Documentation
trx0purge.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/trx0purge.h
29 Purge old versions
30
31 Created 3/26/1996 Heikki Tuuri
32 *******************************************************/
33
34#ifndef trx0purge_h
35#define trx0purge_h
36
37#include "fil0fil.h"
38#include "mtr0mtr.h"
39#include "page0page.h"
40#include "que0types.h"
41#include "read0types.h"
42#include "trx0sys.h"
43#include "trx0types.h"
44#include "univ.i"
45#include "usr0sess.h"
46#ifdef UNIV_HOTBACKUP
47#include "trx0sys.h"
48#endif /* UNIV_HOTBACKUP */
49
50/** The global data structure coordinating a purge */
52
53/** Calculates the file address of an undo log header when we have the file
54 address of its history list node.
55 @return file address of the log */
57 fil_addr_t node_addr); /*!< in: file address of the history
58 list node of the log */
59
60/** Initialize in-memory purge structures */
62
63/** Creates the global purge system control structure and inits the history
64mutex.
65@param[in] n_purge_threads number of purge threads
66@param[in,out] purge_queue UNDO log min binary heap */
67void trx_purge_sys_initialize(uint32_t n_purge_threads,
68 purge_pq_t *purge_queue);
69
70/** Frees the global purge system control structure. */
71void trx_purge_sys_close(void);
72
73/************************************************************************
74Adds the update undo log as the first log in the history list. Removes the
75update undo log segment from the rseg slot if it is too big for reuse. */
77 trx_t *trx, /*!< in: transaction */
78 trx_undo_ptr_t *undo_ptr, /*!< in: update undo log. */
79 page_t *undo_page, /*!< in: update undo log header page,
80 x-latched */
81 bool update_rseg_history_len,
82 /*!< in: if true: update rseg history
83 len else skip updating it. */
84 ulint n_added_logs, /*!< in: number of logs added */
85 mtr_t *mtr); /*!< in: mtr */
86
87/** This function runs a purge batch.
88 @return number of undo log pages handled in the batch */
89ulint trx_purge(ulint n_purge_threads, /*!< in: number of purge tasks to
90 submit to task queue. */
91 ulint limit, /*!< in: the maximum number of
92 records to purge in one batch */
93 bool truncate); /*!< in: truncate history if true */
94
95/** Stop purge and wait for it to stop, move to PURGE_STATE_STOP. */
96void trx_purge_stop(void);
97/** Resume purge, move to PURGE_STATE_RUN. */
98void trx_purge_run(void);
99
100/** Purge states */
102 PURGE_STATE_INIT, /*!< Purge instance created */
103 PURGE_STATE_RUN, /*!< Purge should be running */
104 PURGE_STATE_STOP, /*!< Purge should be stopped */
105 PURGE_STATE_EXIT, /*!< Purge has been shutdown */
106 PURGE_STATE_DISABLED /*!< Purge was never started */
108
109/** Get the purge state.
110 @return purge state. */
112
113// Forward declaration
115
116/** This is the purge pointer/iterator. We need both the undo no and the
117transaction no up to which purge has parsed and applied the records. */
120 // Do nothing
121 }
122
123 /** Purge has advanced past all transactions whose number
124 is less than this */
126
127 /** Purge has advanced past all records whose undo number
128 is less than this. */
130
131 /** The last undo record resided in this space id */
133
134 /** The transaction that created the undo log record,
135 the Modifier trx id */
137};
138
139/* Namespace to hold all the related functions and variables needed
140to truncate an undo tablespace. */
141namespace undo {
142
143/** Magic Number to indicate truncate action is complete. */
144const uint32_t s_magic = 76845412;
145
146/** Truncate Log file Prefix. */
147const char *const s_log_prefix = "undo_";
148
149/** Truncate Log file Extension. */
150const char *const s_log_ext = "trunc.log";
151
152/** The currently used undo space IDs for an undo space number
153along with a boolean showing whether the undo space number is in use. */
156 bool in_use;
157};
158
159/** List of currently used undo space IDs for each undo space number
160along with a boolean showing whether the undo space number is in use. */
161extern struct space_id_account *space_id_bank;
162
163/** Check if the space_id is an undo space ID in the reserved range.
164@param[in] space_id undo tablespace ID
165@return true if it is in the reserved undo space ID range. */
166inline bool is_reserved(space_id_t space_id) {
167 return (space_id >= dict_sys_t::s_min_undo_space_id &&
169}
170
171/** Convert an undo space number (from 1 to 127) into the undo space_id,
172given an index indicating which space_id from the pool assigned to that
173undo number.
174@param[in] space_num undo tablespace number
175@param[in] ndx index of the space_id within that undo number
176@return space_id of the undo tablespace */
177inline space_id_t num2id(space_id_t space_num, size_t ndx) {
178 ut_ad(space_num > 0);
179 ut_ad(space_num <= FSP_MAX_UNDO_TABLESPACES);
181
182 space_id_t space_id = dict_sys_t::s_max_undo_space_id + 1 - space_num -
183 static_cast<space_id_t>(ndx * FSP_MAX_UNDO_TABLESPACES);
184
185 return (space_id);
186}
187
188/** Convert an undo space number (from 1 to 127) into an undo space_id.
189Use the undo::space_id_bank to return the current space_id assigned to
190that undo number.
191@param[in] space_num undo tablespace number
192@return space_id of the undo tablespace */
193inline space_id_t num2id(space_id_t space_num) {
194 ut_ad(space_num > 0);
195 ut_ad(space_num <= FSP_MAX_UNDO_TABLESPACES);
196
197 size_t slot = space_num - 1;
198
199 /* The space_id_back is normally protected by undo::spaces::m_latch.
200 But this can only be called on a specific slot when truncation is not
201 happening on that slot, i.e. the undo tablespace is in use. */
202 ut_ad(undo::space_id_bank[slot].in_use);
203
204 return (undo::space_id_bank[slot].space_id);
205}
206
207/* clang-format off */
208/** Convert an undo space ID into an undo space number.
209NOTE: This may be an undo space_id from a pre-exisiting 5.7
210database which used space_ids from 1 to 127. If so, the
211space_id is the space_num.
212The space_ids are assigned to number ranges in reverse from high to low.
213In addition, the first space IDs for each undo number occur sequentially
214and descending before the second space_id.
215
216Since s_max_undo_space_id = 0xFFFFFFEF, FSP_MAX_UNDO_TABLESPACES = 127
217and s_undo_space_id_range = 400,000:
218 Space ID Space Num Space ID Space Num ... Space ID Space Num
219 0xFFFFFFEF 1 0xFFFFFFEe 2 ... 0xFFFFFF71 127
220 0xFFFFFF70 1 0xFFFFFF6F 2 ... 0xFFFFFEF2 127
221 0xFFFFFEF1 1 0xFFFFFEF0 2 ... 0xFFFFFE73 127
222...
223
224This is done to maintain backward compatibility to when there was only one
225space_id per undo space number.
226@param[in] space_id undo tablespace ID
227@return space number of the undo tablespace */
228/* clang-format on */
229inline space_id_t id2num(space_id_t space_id) {
230 if (!is_reserved(space_id)) {
231 return (space_id);
232 }
233
234 return (((dict_sys_t::s_max_undo_space_id - space_id) %
236 1);
237}
238
239/* Given a reserved undo space_id, return the next space_id for the associated
240undo space number. */
242 ut_ad(is_reserved(space_id));
243
244 space_id_t space_num = id2num(space_id);
245 space_id_t first_id = dict_sys_t::s_max_undo_space_id + 1 - space_num;
246 space_id_t last_id = first_id - (FSP_MAX_UNDO_TABLESPACES *
248
249 return (space_id == SPACE_UNKNOWN || space_id == last_id
250 ? first_id
251 : space_id - FSP_MAX_UNDO_TABLESPACES);
252}
253
254/** Initialize the undo tablespace space_id bank which is a lock free
255repository for information about the space IDs used for undo tablespaces.
256It is used during creation in order to assign an unused space number and
257during truncation in order to assign the next space_id within that
258space_number range. */
259void init_space_id_bank();
260
261/** Note that the undo space number for a space ID is being used.
262Put that space_id into the space_id_bank.
263@param[in] space_id undo tablespace number */
264void use_space_id(space_id_t space_id);
265
266/** Mark that the given undo space number is being used and
267return the next available space_id for that space number.
268@param[in] space_num undo tablespace number
269@return the next tablespace ID to use */
271
272/** Mark an undo number associated with a given space_id as unused and
273available to be reused. This happens when the fil_space_t is closed
274associated with a drop undo tablespace.
275@param[in] space_id Undo Tablespace ID */
276void unuse_space_id(space_id_t space_id);
277
278/** Given a valid undo space_id or SPACE_UNKNOWN, return the next space_id
279for the given space number.
280@param[in] space_id undo tablespace ID
281@param[in] space_num undo tablespace number
282@return the next tablespace ID to use */
283space_id_t next_space_id(space_id_t space_id, space_id_t space_num);
284
285/** Given a valid undo space_id, return the next space_id for that
286space number.
287@param[in] space_id undo tablespace ID
288@return the next tablespace ID to use */
290
291/** Return the next available undo space ID to be used for a new explicit
292undo tablespaces. The slot will be marked as in-use.
293@return next available undo space number if successful.
294@return SPACE_UNKNOWN if failed */
296
297/** Build a standard undo tablespace name from a space_id.
298@param[in] space_id id of the undo tablespace.
299@return tablespace name of the undo tablespace file */
300char *make_space_name(space_id_t space_id);
301
302/** Build a standard undo tablespace file name from a space_id.
303This will create a name like 'undo_001' if the space_id is in the
304reserved range, else it will be like 'undo001'.
305@param[in] space_id id of the undo tablespace.
306@return file_name of the undo tablespace file */
307char *make_file_name(space_id_t space_id);
308
309/** An undo::Tablespace object is used to easily convert between
310undo_space_id and undo_space_num and to create the automatic file_name
311and space name. In addition, it is used in undo::Tablespaces to track
312the trx_rseg_t objects in an Rsegs vector. So we do not allocate the
313Rsegs vector for each object, only when requested by the constructor. */
315 /** Constructor
316 @param[in] id tablespace id */
318 : m_id(id),
319 m_new(false),
320 m_space_name(),
321 m_file_name(),
324 m_rsegs() {}
325
326 /** Copy Constructor
327 @param[in] other undo tablespace to copy */
329 : m_id(other.id()),
330 m_new(other.is_new()),
331 m_space_name(),
332 m_file_name(),
335 m_rsegs() {
336 ut_ad(m_id == 0 || is_reserved(m_id));
337
338 set_space_name(other.space_name());
339 set_file_name(other.file_name());
340
341 /* When the copy constructor is used, add an Rsegs
342 vector. This constructor is only used in the global
343 undo::Tablespaces object where rollback segments are
344 tracked. */
345 m_rsegs = ut::new_withkey<Rsegs>(UT_NEW_THIS_FILE_PSI_KEY);
346 }
347
348 /** Destructor */
350 if (m_space_name != nullptr) {
352 m_space_name = nullptr;
353 }
354
355 if (m_file_name != nullptr) {
357 m_file_name = nullptr;
358 }
359
360 if (m_log_file_name != nullptr) {
362 m_log_file_name = nullptr;
363 }
364
365 if (m_log_file_name_old != nullptr) {
367 m_log_file_name_old = nullptr;
368 }
369
370 /* Clear the cached rollback segments. */
371 if (m_rsegs != nullptr) {
373 m_rsegs = nullptr;
374 }
375 }
376
377 /* Determine if this undo space needs to be truncated.
378 @return true if it should be truncated, false if not. */
379 bool needs_truncation();
380
381 /** Change the space_id from its current value.
382 @param[in] space_id The new undo tablespace ID */
383 void set_space_id(space_id_t space_id);
384
385 /** Replace the standard undo space name if it exists with a copy
386 of the undo tablespace name provided.
387 @param[in] new_space_name non-standard undo space name */
388 void set_space_name(const char *new_space_name);
389
390 /** Get the undo tablespace name. Make it if not yet made.
391 NOTE: This is only called from stack objects so there is no
392 race condition. If it is ever called from a shared object
393 like undo::spaces, then it must be protected by the caller.
394 @return tablespace name created from the space_id */
395 char *space_name() {
396 if (m_space_name == nullptr) {
397#ifndef UNIV_HOTBACKUP
399#endif /* !UNIV_HOTBACKUP */
400 }
401
402 return (m_space_name);
403 }
404
405 /** Replace the standard undo file name if it exists with a copy
406 of the file name provided. This name can come in three forms:
407 absolute path, relative path, and basename. Undo ADD DATAFILE
408 does not accept a relative path. So if that comes in here, it
409 was the scanned name and is relative to the datadir.
410 If this is just a basename, add it to srv_undo_dir.
411 @param[in] file_name explicit undo file name */
412 void set_file_name(const char *file_name);
413
414 /** Get the undo space filename. Make it if not yet made.
415 NOTE: This is only called from stack objects so there is no
416 race condition. If it is ever called from a shared object
417 like undo::spaces, then it must be protected by the caller.
418 @return tablespace filename created from the space_id */
419 char *file_name() {
420 if (m_file_name == nullptr) {
422 }
423
424 return (m_file_name);
425 }
426
427 /** Build a log file name based on space_id
428 @param[in] space_id id of the undo tablespace.
429 @param[in] location directory location of the file.
430 @return DB_SUCCESS or error code */
431 char *make_log_file_name(space_id_t space_id, const char *location);
432
433 /** Get the undo log filename. Make it if not yet made.
434 NOTE: This is only called from stack objects so there is no
435 race condition. If it is ever called from a shared object
436 like undo::spaces, then it must be protected by the caller.
437 @return tablespace filename created from the space_id */
439 if (m_log_file_name == nullptr) {
441 }
442
443 return (m_log_file_name);
444 }
445
446 /** Get the old undo log filename from the srv_log_group_home_dir.
447 Make it if not yet made. */
449 if (m_log_file_name_old == nullptr) {
451 }
452
453 return (m_log_file_name_old);
454 }
455
456 /** Get the undo tablespace ID.
457 @return tablespace ID */
458 space_id_t id() { return (m_id); }
459
460 /** Get the undo tablespace number. This is the same as m_id
461 if m_id is 0 or this is a v5.6-5.7 undo tablespace. v8+ undo
462 tablespaces use a space_id from the reserved range.
463 @return undo tablespace number */
465 const auto n = undo::id2num(m_id);
467 return n;
468 }
469
470 /** Get a reference to the List of rollback segments within
471 this undo tablespace.
472 @return a reference to the Rsegs vector. */
473 Rsegs *rsegs() { return (m_rsegs); }
474
475 /** Report whether this undo tablespace was explicitly created
476 by an SQL statement.
477 @return true if the tablespace was created explicitly. */
479
480 /** Report whether this undo tablespace was created at startup.
481 @retval true if created at startup.
482 @retval false if pre-existed at startup. */
483 bool is_new() { return (m_new); }
484
485 /** Note that this undo tablespace is being created. */
486 void set_new() { m_new = true; }
487
488 /** Return whether the undo tablespace is active.
489 @return true if active */
490 bool is_active() {
491 if (m_rsegs == nullptr) {
492 return (false);
493 }
494 m_rsegs->s_lock();
495 bool ret = m_rsegs->is_active();
496 m_rsegs->s_unlock();
497 return (ret);
498 }
499
500 /** Return whether the undo tablespace is active. For optimization purposes,
501 do not take a latch.
502 @return true if active */
504 if (m_rsegs == nullptr) {
505 return (false);
506 }
507 return (m_rsegs->is_active());
508 }
509
510 /** Return the rseg at the requested rseg slot if the undo space is active.
511 @param[in] slot The slot of the rseg. 1 to 127
512 @return Rseg pointer of nullptr if the space is not active. */
514 m_rsegs->s_lock();
515 if (!m_rsegs->is_active()) {
516 m_rsegs->s_unlock();
517 return (nullptr);
518 }
519
520 /* Mark the chosen rseg so that it will not be selected
521 for UNDO truncation. */
522 trx_rseg_t *rseg = m_rsegs->at(slot);
523 rseg->trx_ref_count++;
524
525 m_rsegs->s_unlock();
526
527 return (rseg);
528 }
529
530 /** Return whether the undo tablespace is inactive due to
531 implicit selection by the purge thread.
532 @return true if marked for truncation by the purge thread */
534 if (m_rsegs == nullptr) {
535 return (false);
536 }
537 m_rsegs->s_lock();
538 bool ret = m_rsegs->is_inactive_implicit();
539 m_rsegs->s_unlock();
540 return (ret);
541 }
542
543 /** Return whether the undo tablespace was made inactive by
544 ALTER TABLESPACE.
545 @return true if altered inactive */
547 if (m_rsegs == nullptr) {
548 return (false);
549 }
550 m_rsegs->s_lock();
551 bool ret = m_rsegs->is_inactive_explicit();
552 m_rsegs->s_unlock();
553 return (ret);
554 }
555
556 /** Return whether the undo tablespace is empty and ready
557 to be dropped.
558 @return true if empty */
559 bool is_empty() {
560 if (m_rsegs == nullptr) {
561 return (true);
562 }
563 m_rsegs->s_lock();
564 bool ret = m_rsegs->is_empty();
565 m_rsegs->s_unlock();
566 return (ret);
567 }
568
569 /** Set the undo tablespace active for use by transactions. */
570 void set_active() {
571 m_rsegs->x_lock();
573 m_rsegs->x_unlock();
574 }
575
576 /** Set the state of the rollback segments in this undo tablespace to
577 inactive_implicit if currently active. If the state is inactive_explicit,
578 leave as is. Then put the space_id into the callers marked_space_id.
579 This is done when marking a space for truncate. It will not be used
580 for new transactions until it becomes active again. */
581 void set_inactive_implicit(space_id_t *marked_space_id) {
582 m_rsegs->x_lock();
583 if (m_rsegs->is_active()) {
585 }
586 *marked_space_id = m_id;
587
588 m_rsegs->x_unlock();
589 }
590
591 /** Make the undo tablespace inactive so that it will not be
592 used for new transactions. The purge thread will clear out
593 all the undo logs, truncate it, and then mark it empty. */
595 m_rsegs->x_lock();
597 m_rsegs->x_unlock();
598 }
599
600 /** Make the undo tablespace active again so that it will
601 be used for new transactions.
602 If current State is ___ then do:
603 empty: Set active.
604 active_implicit: Ignore. It was not altered inactive. When it is done
605 being truncated it will go back to active.
606 active_explicit: Depends if it is marked for truncation.
607 marked: Set to inactive_implicit. the next state will be active.
608 not yet: Set to active so that it does not get truncated. */
609 void alter_active();
610
611 /** Set the state of the undo tablespace to empty so that it
612 can be dropped. */
613 void set_empty() {
614 m_rsegs->x_lock();
616 m_rsegs->x_unlock();
617 }
618
619 private:
620 /** Undo Tablespace ID. */
622
623 /** True if this undo tablespace was implicitly created when
624 this instance started up. False if it pre-existed. */
625 bool m_new;
626
627 /** The tablespace name, auto-generated when needed from
628 the space number. */
630
631 /** The tablespace file name, auto-generated when needed
632 from the space number. */
634
635 /** The truncation log file name, auto-generated when needed
636 from the space number and the srv_undo_dir. */
638
639 /** The old truncation log file name, auto-generated when needed
640 from the space number and the srv_log_group_home_dir. */
642
643 /** List of rollback segments within this tablespace.
644 This is not always used. Must call init_rsegs to use it. */
646};
647
648/** List of undo tablespaces, each containing a list of
649rollback segments. */
652 std::vector<Tablespace *, ut::allocator<Tablespace *>>;
653
654 public:
656
658
659 /** Initialize */
660 void init();
661
662 /** De-initialize */
663 void deinit();
664
665 /** Clear the contents of the list of Tablespace objects.
666 This does not deallocate any memory. */
667 void clear() {
668 for (auto undo_space : m_spaces) {
669 ut::delete_(undo_space);
670 }
671 m_spaces.clear();
672 }
673
674 /** Get the number of tablespaces tracked by this object. */
675 ulint size() { return (m_spaces.size()); }
676
677 /** See if the list of tablespaces is empty. */
678 bool empty() { return (m_spaces.empty()); }
679
680 /** Get the Tablespace tracked at a position. */
681 Tablespace *at(size_t pos) { return (m_spaces.at(pos)); }
682
683 /** Add a new undo::Tablespace to the back of the vector.
684 The vector has been pre-allocated to 128 so read threads will
685 not loose what is pointed to. If tablespace_name and file_name
686 are standard names, they are optional.
687 @param[in] ref_undo_space undo tablespace */
688 void add(Tablespace &ref_undo_space);
689
690 /** Drop an existing explicit undo::Tablespace.
691 @param[in] undo_space pointer to undo space */
692 void drop(Tablespace *undo_space);
693
694 /** Drop an existing explicit undo::Tablespace.
695 @param[in] ref_undo_space reference to undo space */
696 void drop(Tablespace &ref_undo_space);
697
698 /** Check if the given space_id is in the vector.
699 @param[in] num undo tablespace number
700 @return true if space_id is found, else false */
701 bool contains(space_id_t num) { return (find(num) != nullptr); }
702
703 /** Find the given space_num in the vector.
704 @param[in] num undo tablespace number
705 @return pointer to an undo::Tablespace struct */
707 if (m_spaces.empty()) {
708 return (nullptr);
709 }
710
711 /* The sort method above puts this vector in order by
712 Tablespace::num. If there are no gaps, then we should
713 be able to find it quickly. */
714 space_id_t slot = num - 1;
715 if (slot < m_spaces.size()) {
716 auto undo_space = m_spaces.at(slot);
717 if (undo_space->num() == num) {
718 return (undo_space);
719 }
720 }
721
722 /* If there are gaps in the numbering, do a search. */
723 for (auto undo_space : m_spaces) {
724 if (undo_space->num() == num) {
725 return (undo_space);
726 }
727 }
728
729 return (nullptr);
730 }
731
732 /** Find the first undo space that is marked inactive explicitly.
733 @param[in,out] num_active If there are no inactive_explicit spaces
734 found, this will contain the number of
735 active spaces found.
736 @return pointer to an undo::Tablespace struct */
738 ut_ad(own_latch());
739
740 if (m_spaces.empty()) {
741 return (nullptr);
742 }
743
744 for (auto undo_space : m_spaces) {
745 if (undo_space->is_inactive_explicit()) {
746 return (undo_space);
747 }
748
749 if (num_active != nullptr && undo_space->is_active()) {
750 (*num_active)++;
751 }
752 }
753
754 return (nullptr);
755 }
756
757#ifdef UNIV_DEBUG
758 /** Determine if this thread owns a lock on m_latch. */
759 bool own_latch() {
761 }
762#endif /* UNIV_DEBUG */
763
764 /** Get a shared lock on m_spaces. */
766
767 /** Release a shared lock on m_spaces. */
769
770 /** Get an exclusive lock on m_spaces. */
772
773 /** Release an exclusive lock on m_spaces. */
775
777
778 private:
779 /** RW lock to protect m_spaces.
780 x for adding elements, s for scanning, size() etc. */
782};
783
784/** Mutex for serializing undo tablespace related DDL. These have to do with
785creating and dropping undo tablespaces. */
786extern ib_mutex_t ddl_mutex;
787
788/** A global object that contains a vector of undo::Tablespace structs. */
789extern Tablespaces *spaces;
790
791#ifdef UNIV_DEBUG
792/** Inject a crash if a certain SET GLOBAL DEBUG has been set.
793Before DBUG_SUICIDE(), write an entry about this crash to the error log
794and flush the redo log. */
795void inject_crash(const char *injection_point_name);
796
797/** Inject a failure in the undo truncation debug compiled code at various
798places so that it fails the first time it hits and succeeds after that. */
801 const char *m_inject_name;
802
803 public:
804 Inject_failure_once(const char *inject_name)
805 : m_already_failed{false}, m_inject_name{inject_name} {}
806
807 /** If a certain SET GLOBAL DEBUG has been set and this is the first time
808 this has been called for that injection point, write an entry to the
809 error log and return true so that the caller can cause the failure.
810 @return true iff compiled with debug and the debug point has been set
811 and this it the first call for this debug point. */
812 bool should_fail();
813};
814
815#endif /* UNIV_DEBUG */
816
817/** Create the truncate log file. Needed to track the state of truncate during
818a crash. An auxiliary redo log file undo_<space_id>_trunc.log will be created
819while the truncate of the UNDO is in progress. This file is required during
820recovery to complete the truncate.
821@param[in] undo_space undo tablespace to truncate.
822@return DB_SUCCESS or error code.*/
823dberr_t start_logging(Tablespace *undo_space);
824
825/** Mark completion of undo truncate action by writing magic number
826to the log file and then removing it from the disk.
827If we are going to remove it from disk then why write magic number?
828This is to safeguard from unlink (file-system) anomalies that will
829keep the link to the file even after unlink action is successful
830and ref-count = 0.
831@param[in] space_num number of the undo tablespace to truncate. */
832void done_logging(space_id_t space_num);
833
834/** Check if TRUNCATE_DDL_LOG file exist.
835@param[in] space_num undo tablespace number
836@return true if exist else false. */
838
839/** list of undo tablespaces that need header pages and rollback
840segments written to them at startup. This can be because they are
841newly initialized, were being truncated and the system crashed, or
842they were an old format at startup and were replaced when they were
843opened. Old format undo tablespaces do not have space_ids between
844dict_sys_t::s_min_undo_space_id and dict_sys_t::s_max_undo_space_id
845and they do not contain an RSEG_ARRAY page. */
847
848/** Add undo tablespace to s_under_construction vector.
849@param[in] space_id space id of tablespace to
850truncate */
852
853/** Clear the s_under_construction vector. */
855
856/** Is an undo tablespace under construction at the moment.
857@param[in] space_id space id to check
858@return true if marked for truncate, else false. */
859bool is_under_construction(space_id_t space_id);
860
861/** Set an undo tablespace active. */
862void set_active(space_id_t space_id);
863
864/* Return whether the undo tablespace is active. If this is a
865non-undo tablespace, then it will not be found in spaces and it
866will not be under construction, so this function will return true.
867@param[in] space_id Undo Tablespace ID
868@param[in] get_latch Specifies whether the rsegs->s_lock() is needed.
869@return true if active (non-undo spaces are always active) */
870bool is_active(space_id_t space_id, bool get_latch = true);
871
872constexpr ulint TRUNCATE_FREQUENCY = 128;
873
874/** Track an UNDO tablespace marked for truncate. */
875class Truncate {
876 public:
877 /** Constructor. */
879
880 /** Destructor. */
881 ~Truncate() = default;
882
883 /** Is tablespace selected for truncate.
884 @return true if undo tablespace is marked for truncate */
885 bool is_marked() const { return (m_space_id_marked != SPACE_UNKNOWN); }
886
887 /** Mark the undo tablespace selected for truncate as empty
888 so that it will be truncated next. */
890
891 /** Is the tablespace selected for truncate empty of undo logs yet?
892 @return true if the marked undo tablespace has no more undo logs */
894
895 /** Mark the tablespace for truncate.
896 @param[in] undo_space undo tablespace to truncate. */
897 void mark(Tablespace *undo_space);
898
899 /** Get the ID of the tablespace marked for truncate.
900 @return tablespace ID marked for truncate. */
902 return (id2num(m_space_id_marked));
903 }
904
905 /** Reset for next rseg truncate. */
906 void reset() {
907 reset_timer();
910 }
911
912 /** Get the undo tablespace number to start a scan.
913 Re-adjust in case the spaces::size() went down.
914 @return undo space_num to start scanning. */
917
918 Tablespace *undo_space = undo::spaces->at(s_scan_pos);
919
920 return (undo_space->num());
921 }
922
923 /** Increment the scanning position in a round-robin fashion.
924 @return undo space_num at incremented scanning position. */
926 /** Round-robin way of selecting an undo tablespace for the truncate
927 operation. Once we reach the end of the list of known undo tablespace
928 IDs, move back to the first undo tablespace ID. This will scan active
929 as well as inactive undo tablespaces. */
931
932 return (get_scan_space_num());
933 }
934
935 /** Check if the given space id is equal to the space ID that is marked for
936 truncation.
937 @return true if they are equal, false otherwise. */
938 bool is_equal(space_id_t space_id) const {
939 return (m_space_id_marked == space_id);
940 }
941
942 /** @return the number of milliseconds since last reset. */
943 int64_t check_timer() const { return (m_timer.elapsed()); }
944
945 /** Reset the timer. */
947
948 private:
949 /** UNDO space ID that is marked for truncate. */
951
952 /** This is true if the marked space is empty of undo logs and ready
953 to truncate. We leave the rsegs object 'inactive' until after it is
954 truncated and rebuilt. This allow the code to do the check for undo
955 logs only once. */
957
958 /** Elapsed time since last truncate check. */
960
961 /** Start scanning for UNDO tablespace from this vector position. This is
962 to avoid bias selection of one tablespace always. */
963 static size_t s_scan_pos;
964
965}; /* class Truncate */
966
967} /* namespace undo */
968
969/** The control structure used in the purge operation */
971 /** System session running the purge query */
973
974 /** System transaction running the purge query: this trx is not in the trx
975 list of the trx system and it never ends */
977#ifndef UNIV_HOTBACKUP
978 /** The latch protecting the purge view. A purge operation must acquire an
979 x-latch here for the instant at which it changes the purge view: an undo
980 log operation can prevent this by obtaining an s-latch here. It also
981 protects state and running */
983#endif /* !UNIV_HOTBACKUP */
984
985 /** State signal event */
987
988 /** Counter to track number stops */
990
991 /** true, if purge is active, we check this without the latch too */
992 volatile bool running;
993
994 /** Purge coordinator thread states, we check this in several places without
995 holding the latch. */
997
998 /** The query graph which will do the parallelized purge operation */
1000
1001 /** The purge will not remove undo logs which are >= this view (purge view) */
1003
1004 /** Count of total tasks submitted to the task queue */
1006
1007 /** Count of total tasks completed */
1008 std::atomic<ulint> n_completed;
1009
1010 /* The following two fields form the 'purge pointer' which advances
1011 during a purge, and which is used in history list truncation */
1012
1013 /** Limit up to which we have read and parsed the UNDO log records. Not
1014 necessarily purged from the indexes. Note that this can never be less than
1015 the limit below, we check for this invariant in trx0purge.cc */
1017
1018 /** The 'purge pointer' which advances during a purge, and which is used in
1019 history list truncation */
1021#ifdef UNIV_DEBUG
1022 /** Indicate 'purge pointer' which have purged already accurately. */
1024#endif /* UNIV_DEBUG */
1025
1026 /** true if the info of the next record to purge is stored below: if yes, then
1027 the transaction number and the undo number of the record are stored in
1028 purge_trx_no and purge_undo_no above */
1030
1031 /** Rollback segment for the next undo record to purge */
1033
1034 /** Page number for the next undo record to purge, page number of the log
1035 header, if dummy record */
1037
1038 /** Page offset for the next undo record to purge, 0 if the dummy record */
1040
1041 /** Header page of the undo log where the next record to purge belongs */
1043
1044 /** Header byte offset on the page */
1046
1047 /** Iterator to get the next rseg to process */
1049
1050 /** Binary min-heap, ordered on TrxUndoRsegs::trx_no. It is protected
1051 by the pq_mutex */
1053
1054 /** Mutex protecting purge_queue */
1056
1057 /** Track UNDO tablespace marked for truncate. */
1059
1060 /** Heap for reading the undo log records */
1062
1063 /** Is the this thread related to purge? This is false by default and set to
1064 true by srv_purge_coordinator_thread() and srv_worker_thread() only. */
1065 static inline thread_local bool is_this_a_purge_thread{false};
1066
1067 /** Set of all rseg queue. */
1068 std::vector<trx_rseg_t *> rsegs_queue;
1069};
1070
1071/** Choose the rollback segment with the smallest trx_no. */
1073 /** Constructor */
1075
1076 /** Sets the next rseg to purge in m_purge_sys.
1077 @return page size of the table for which the log is.
1078 NOTE: if rseg is NULL when this function returns this means that
1079 there are no rollback segments to purge and then the returned page
1080 size object should not be used. */
1081 const page_size_t set_next();
1082
1083 private:
1084 // Disable copying
1087
1088 /** The purge system pointer */
1090
1091 /** The current element to process */
1093
1094 /** Track the current element in m_trx_undo_rseg */
1096
1097 /** Sentinel value */
1099};
1100
1101#include "trx0purge.ic"
1102
1103#endif /* trx0purge_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:48
uint32_t page_no_t
Page number.
Definition: api0api.h:46
Read view lists the trx ids of those transactions for which a consistent read should not see the modi...
Definition: read0types.h:48
This is a wrapper for a std::vector of trx_rseg_t object pointers.
Definition: trx0types.h:331
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
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
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
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
void x_unlock()
Release the exclusive lock on m_rsegs.
Definition: trx0types.h:404
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
List of undo tablespace IDs.
Definition: trx0sys.h:351
Data structure that contains the information about shared tablespaces.
Definition: fsp0space.h:47
Rollback segments from a given transaction with trx-no scheduled for purge.
Definition: trx0types.h:554
For measuring time elapsed.
Definition: ut0ut.h:306
void reset()
Reset the timer to the current time.
Definition: ut0ut.h:315
int64_t elapsed() const noexcept
Definition: ut0ut.h:319
Page size descriptor.
Definition: page0size.h:50
Inject a failure in the undo truncation debug compiled code at various places so that it fails the fi...
Definition: trx0purge.h:799
const char * m_inject_name
Definition: trx0purge.h:801
bool should_fail()
If a certain SET GLOBAL DEBUG has been set and this is the first time this has been called for that i...
Definition: trx0purge.cc:921
bool m_already_failed
Definition: trx0purge.h:800
Inject_failure_once(const char *inject_name)
Definition: trx0purge.h:804
List of undo tablespaces, each containing a list of rollback segments.
Definition: trx0purge.h:650
ulint size()
Get the number of tablespaces tracked by this object.
Definition: trx0purge.h:675
void s_unlock()
Release a shared lock on m_spaces.
Definition: trx0purge.h:768
Tablespace * find_first_inactive_explicit(size_t *num_active)
Find the first undo space that is marked inactive explicitly.
Definition: trx0purge.h:737
Tablespaces()
Definition: trx0purge.h:655
~Tablespaces()
Definition: trx0purge.h:657
std::vector< Tablespace *, ut::allocator< Tablespace * > > Tablespaces_Vector
Definition: trx0purge.h:652
void init()
Initialize.
Definition: trx0purge.cc:2588
void s_lock()
Get a shared lock on m_spaces.
Definition: trx0purge.h:765
Tablespaces_Vector m_spaces
Definition: trx0purge.h:776
void add(Tablespace &ref_undo_space)
Add a new undo::Tablespace to the back of the vector.
Definition: trx0purge.cc:2617
void x_unlock()
Release an exclusive lock on m_spaces.
Definition: trx0purge.h:774
bool contains(space_id_t num)
Check if the given space_id is in the vector.
Definition: trx0purge.h:701
void deinit()
De-initialize.
Definition: trx0purge.cc:2603
void x_lock()
Get an exclusive lock on m_spaces.
Definition: trx0purge.h:771
bool own_latch()
Determine if this thread owns a lock on m_latch.
Definition: trx0purge.h:759
void drop(Tablespace *undo_space)
Drop an existing explicit undo::Tablespace.
Definition: trx0purge.cc:2632
bool empty()
See if the list of tablespaces is empty.
Definition: trx0purge.h:678
void clear()
Clear the contents of the list of Tablespace objects.
Definition: trx0purge.h:667
rw_lock_t * m_latch
RW lock to protect m_spaces.
Definition: trx0purge.h:781
Tablespace * at(size_t pos)
Get the Tablespace tracked at a position.
Definition: trx0purge.h:681
Tablespace * find(space_id_t num)
Find the given space_num in the vector.
Definition: trx0purge.h:706
Track an UNDO tablespace marked for truncate.
Definition: trx0purge.h:875
Truncate()
Constructor.
Definition: trx0purge.h:878
void reset()
Reset for next rseg truncate.
Definition: trx0purge.h:906
void set_marked_space_empty()
Mark the undo tablespace selected for truncate as empty so that it will be truncated next.
Definition: trx0purge.h:889
bool is_equal(space_id_t space_id) const
Check if the given space id is equal to the space ID that is marked for truncation.
Definition: trx0purge.h:938
ib::Timer m_timer
Elapsed time since last truncate check.
Definition: trx0purge.h:959
void reset_timer()
Reset the timer.
Definition: trx0purge.h:946
space_id_t get_scan_space_num() const
Get the undo tablespace number to start a scan.
Definition: trx0purge.h:915
~Truncate()=default
Destructor.
bool m_marked_space_is_empty
This is true if the marked space is empty of undo logs and ready to truncate.
Definition: trx0purge.h:956
int64_t check_timer() const
Definition: trx0purge.h:943
bool is_marked_space_empty() const
Is the tablespace selected for truncate empty of undo logs yet?
Definition: trx0purge.h:893
bool is_marked() const
Is tablespace selected for truncate.
Definition: trx0purge.h:885
space_id_t m_space_id_marked
UNDO space ID that is marked for truncate.
Definition: trx0purge.h:950
space_id_t get_marked_space_num() const
Get the ID of the tablespace marked for truncate.
Definition: trx0purge.h:901
static size_t s_scan_pos
Start scanning for UNDO tablespace from this vector position.
Definition: trx0purge.h:963
void mark(Tablespace *undo_space)
Mark the tablespace for truncate.
Definition: trx0purge.cc:1311
space_id_t increment_scan() const
Increment the scanning position in a round-robin fashion.
Definition: trx0purge.h:925
dberr_t
Definition: db0err.h:39
The low-level file system.
constexpr space_id_t SPACE_UNKNOWN
Unknown space id.
Definition: fil0fil.h:1165
constexpr size_t FSP_MAX_UNDO_TABLESPACES
Definition: fsp0types.h:403
constexpr size_t FSP_IMPLICIT_UNDO_TABLESPACES
Definition: fsp0types.h:404
constexpr size_t FSP_MAX_ROLLBACK_SEGMENTS
Definition: fsp0types.h:405
Mini-transaction buffer.
size_t size(const char *const c)
Definition: base64.h:46
Definition: trx0purge.h:141
bool is_active_truncate_log_present(space_id_t space_num)
Check if TRUNCATE_DDL_LOG file exist.
Definition: trx0purge.cc:1037
void done_logging(space_id_t space_num)
Mark completion of undo truncate action by writing magic number to the log file and then removing it ...
Definition: trx0purge.cc:985
char * make_space_name(space_id_t space_id)
Build a standard undo tablespace name from a space_id.
Definition: trx0purge.cc:776
char * make_file_name(space_id_t space_id)
Build a standard undo tablespace file name from a space_id.
Definition: trx0purge.cc:796
space_id_t use_next_space_id(space_id_t space_num)
Mark that the given undo space number is being used and return the next available space_id for that s...
Definition: trx0purge.cc:692
const char *const s_log_prefix
Truncate Log file Prefix.
Definition: trx0purge.h:147
ib_mutex_t ddl_mutex
Mutex for serializing undo tablespace related DDL.
Definition: trx0purge.cc:604
bool is_reserved(space_id_t space_id)
Check if the space_id is an undo space ID in the reserved range.
Definition: trx0purge.h:166
struct space_id_account * space_id_bank
List of currently used undo space IDs for each undo space number along with a boolean showing whether...
Definition: trx0purge.cc:611
space_id_t get_next_available_space_num()
Return the next available undo space ID to be used for a new explicit undo tablespaces.
Definition: trx0purge.cc:710
space_id_t id2next_id(space_id_t space_id)
Definition: trx0purge.h:241
void clear_construction_list()
Clear the s_under_construction vector.
Definition: trx0purge.cc:1119
dberr_t start_logging(Tablespace *undo_space)
Create the truncate log file.
Definition: trx0purge.cc:934
const uint32_t s_magic
Magic Number to indicate truncate action is complete.
Definition: trx0purge.h:144
constexpr ulint TRUNCATE_FREQUENCY
Definition: trx0purge.h:872
void set_active(space_id_t space_id)
Set an undo tablespace active.
Definition: trx0purge.cc:1135
space_id_t id2num(space_id_t space_id)
Convert an undo space ID into an undo space number.
Definition: trx0purge.h:229
void inject_crash(const char *injection_point_name)
Inject a crash if a certain SET GLOBAL DEBUG has been set.
Definition: trx0purge.cc:915
bool is_under_construction(space_id_t space_id)
Is an undo tablespace under construction at the moment.
Definition: trx0purge.cc:1124
Space_Ids s_under_construction
list of undo tablespaces that need header pages and rollback segments written to them at startup.
Definition: trx0purge.cc:1187
void add_space_to_construction_list(space_id_t space_id)
Add undo tablespace to s_under_construction vector.
Definition: trx0purge.cc:1114
Tablespaces * spaces
A global object that contains a vector of undo::Tablespace structs.
Definition: trx0purge.cc:607
space_id_t next_space_id(space_id_t space_id, space_id_t space_num)
Given a valid undo space_id or SPACE_UNKNOWN, return the next space_id for the given space number.
Definition: trx0purge.cc:662
void unuse_space_id(space_id_t space_id)
Mark an undo number associated with a given space_id as unused and available to be reused.
Definition: trx0purge.cc:648
space_id_t num2id(space_id_t space_num, size_t ndx)
Convert an undo space number (from 1 to 127) into the undo space_id, given an index indicating which ...
Definition: trx0purge.h:177
void use_space_id(space_id_t space_id)
Note that the undo space number for a space ID is being used.
Definition: trx0purge.cc:635
bool is_active(space_id_t space_id, bool get_latch=true)
Definition: trx0purge.cc:1154
void init_space_id_bank()
Initialize the undo tablespace space_id bank which is a lock free repository for information about th...
Definition: trx0purge.cc:621
const char *const s_log_ext
Truncate Log file Extension.
Definition: trx0purge.h:150
void delete_(T *ptr) noexcept
Releases storage which has been dynamically allocated through any of the ut::new*() variants.
Definition: ut0new.h:811
void free(void *ptr) noexcept
Releases storage which has been dynamically allocated through any of the ut::malloc*(),...
Definition: ut0new.h:719
Index page routines.
byte page_t
Type of the index page.
Definition: page0types.h:152
Query graph global types.
Cursor read.
char * srv_log_group_home_dir
Definition: srv0srv.cc:239
char * srv_undo_dir
Server undo tablespaces directory, can be absolute path.
Definition: srv0srv.cc:156
Choose the rollback segment with the smallest trx_no.
Definition: trx0purge.h:1072
const page_size_t set_next()
Sets the next rseg to purge in m_purge_sys.
Definition: trx0purge.cc:108
static const TrxUndoRsegs NullElement
Sentinel value.
Definition: trx0purge.h:1098
TrxUndoRsegsIterator(trx_purge_t *purge_sys)
Constructor.
Definition: trx0purge.cc:98
Rsegs_array< 2 >::iterator m_iter
Track the current element in m_trx_undo_rseg.
Definition: trx0purge.h:1095
TrxUndoRsegsIterator(const TrxUndoRsegsIterator &)
TrxUndoRsegs m_trx_undo_rsegs
The current element to process.
Definition: trx0purge.h:1092
TrxUndoRsegsIterator & operator=(const TrxUndoRsegsIterator &)
trx_purge_t * m_purge_sys
The purge system pointer.
Definition: trx0purge.h:1089
static constexpr space_id_t s_undo_space_id_range
The number of space IDs dedicated to each undo tablespace.
Definition: dict0dict.h:1108
static constexpr space_id_t s_max_undo_space_id
The highest undo tablespace ID.
Definition: dict0dict.h:1115
static constexpr space_id_t s_min_undo_space_id
The lowest undo tablespace ID.
Definition: dict0dict.h:1111
File space address.
Definition: fil0fil.h:1176
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:177
InnoDB condition variable.
Definition: os0event.cc:63
This is the purge pointer/iterator.
Definition: trx0purge.h:118
purge_iter_t()
Definition: trx0purge.h:119
undo_no_t undo_no
Purge has advanced past all records whose undo number is less than this.
Definition: trx0purge.h:129
trx_id_t modifier_trx_id
The transaction that created the undo log record, the Modifier trx id.
Definition: trx0purge.h:136
space_id_t undo_rseg_space
The last undo record resided in this space id.
Definition: trx0purge.h:132
trx_id_t trx_no
Purge has advanced past all transactions whose number is less than this.
Definition: trx0purge.h:125
Definition: que0que.h:301
The structure used in the spin lock implementation of a read-write lock.
Definition: sync0rw.h:363
Definition: usr0sess.h:54
The control structure used in the purge operation.
Definition: trx0purge.h:970
purge_pq_t * purge_queue
Binary min-heap, ordered on TrxUndoRsegs::trx_no.
Definition: trx0purge.h:1052
bool next_stored
true if the info of the next record to purge is stored below: if yes, then the transaction number and...
Definition: trx0purge.h:1029
volatile purge_state_t state
Purge coordinator thread states, we check this in several places without holding the latch.
Definition: trx0purge.h:996
ulint offset
Page offset for the next undo record to purge, 0 if the dummy record.
Definition: trx0purge.h:1039
purge_iter_t iter
Limit up to which we have read and parsed the UNDO log records.
Definition: trx0purge.h:1016
TrxUndoRsegsIterator * rseg_iter
Iterator to get the next rseg to process.
Definition: trx0purge.h:1048
std::vector< trx_rseg_t * > rsegs_queue
Set of all rseg queue.
Definition: trx0purge.h:1068
mem_heap_t * heap
Heap for reading the undo log records.
Definition: trx0purge.h:1061
purge_iter_t limit
The 'purge pointer' which advances during a purge, and which is used in history list truncation.
Definition: trx0purge.h:1020
static thread_local bool is_this_a_purge_thread
Is the this thread related to purge? This is false by default and set to true by srv_purge_coordinato...
Definition: trx0purge.h:1065
volatile bool running
true, if purge is active, we check this without the latch too
Definition: trx0purge.h:992
purge_iter_t done
Indicate 'purge pointer' which have purged already accurately.
Definition: trx0purge.h:1023
ReadView view
The purge will not remove undo logs which are >= this view (purge view)
Definition: trx0purge.h:1002
que_t * query
The query graph which will do the parallelized purge operation.
Definition: trx0purge.h:999
trx_t * trx
System transaction running the purge query: this trx is not in the trx list of the trx system and it ...
Definition: trx0purge.h:976
ulint hdr_offset
Header byte offset on the page.
Definition: trx0purge.h:1045
ulint n_submitted
Count of total tasks submitted to the task queue.
Definition: trx0purge.h:1005
page_no_t page_no
Page number for the next undo record to purge, page number of the log header, if dummy record.
Definition: trx0purge.h:1036
undo::Truncate undo_trunc
Track UNDO tablespace marked for truncate.
Definition: trx0purge.h:1058
page_no_t hdr_page_no
Header page of the undo log where the next record to purge belongs.
Definition: trx0purge.h:1042
ulint n_stop
Counter to track number stops.
Definition: trx0purge.h:989
PQMutex pq_mutex
Mutex protecting purge_queue.
Definition: trx0purge.h:1055
std::atomic< ulint > n_completed
Count of total tasks completed.
Definition: trx0purge.h:1008
sess_t * sess
System session running the purge query.
Definition: trx0purge.h:972
trx_rseg_t * rseg
Rollback segment for the next undo record to purge.
Definition: trx0purge.h:1032
rw_lock_t latch
The latch protecting the purge view.
Definition: trx0purge.h:982
os_event_t event
State signal event.
Definition: trx0purge.h:986
The rollback segment memory object.
Definition: trx0types.h:214
std::atomic< size_t > trx_ref_count
Reference counter to track rseg allocated transactions.
Definition: trx0types.h:313
Definition: trx0trx.h:675
The transaction handle.
Definition: trx0trx.h:635
An undo::Tablespace object is used to easily convert between undo_space_id and undo_space_num and to ...
Definition: trx0purge.h:314
space_id_t num()
Get the undo tablespace number.
Definition: trx0purge.h:464
void set_inactive_explicit()
Make the undo tablespace inactive so that it will not be used for new transactions.
Definition: trx0purge.h:594
void set_file_name(const char *file_name)
Replace the standard undo file name if it exists with a copy of the file name provided.
Definition: trx0purge.cc:840
Rsegs * m_rsegs
List of rollback segments within this tablespace.
Definition: trx0purge.h:645
char * space_name()
Get the undo tablespace name.
Definition: trx0purge.h:395
char * m_file_name
The tablespace file name, auto-generated when needed from the space number.
Definition: trx0purge.h:633
void set_space_name(const char *new_space_name)
Replace the standard undo space name if it exists with a copy of the undo tablespace name provided.
Definition: trx0purge.cc:827
Rsegs * rsegs()
Get a reference to the List of rollback segments within this undo tablespace.
Definition: trx0purge.h:473
bool is_active()
Return whether the undo tablespace is active.
Definition: trx0purge.h:490
char * m_space_name
The tablespace name, auto-generated when needed from the space number.
Definition: trx0purge.h:629
trx_rseg_t * get_active(ulint slot)
Return the rseg at the requested rseg slot if the undo space is active.
Definition: trx0purge.h:513
char * make_log_file_name(space_id_t space_id, const char *location)
Build a log file name based on space_id.
Definition: trx0purge.cc:875
bool is_active_no_latch()
Return whether the undo tablespace is active.
Definition: trx0purge.h:503
void set_inactive_implicit(space_id_t *marked_space_id)
Set the state of the rollback segments in this undo tablespace to inactive_implicit if currently acti...
Definition: trx0purge.h:581
char * m_log_file_name_old
The old truncation log file name, auto-generated when needed from the space number and the srv_log_gr...
Definition: trx0purge.h:641
space_id_t id()
Get the undo tablespace ID.
Definition: trx0purge.h:458
void set_active()
Set the undo tablespace active for use by transactions.
Definition: trx0purge.h:570
void set_new()
Note that this undo tablespace is being created.
Definition: trx0purge.h:486
~Tablespace()
Destructor.
Definition: trx0purge.h:349
Tablespace(space_id_t id)
Constructor.
Definition: trx0purge.h:317
Tablespace(Tablespace &other)
Copy Constructor.
Definition: trx0purge.h:328
bool is_inactive_implicit()
Return whether the undo tablespace is inactive due to implicit selection by the purge thread.
Definition: trx0purge.h:533
bool needs_truncation()
Definition: trx0purge.cc:724
bool is_explicit()
Report whether this undo tablespace was explicitly created by an SQL statement.
Definition: trx0purge.h:478
char * log_file_name()
Get the undo log filename.
Definition: trx0purge.h:438
void set_space_id(space_id_t space_id)
Change the space_id from its current value.
Definition: trx0purge.cc:768
void alter_active()
Make the undo tablespace active again so that it will be used for new transactions.
Definition: trx0purge.cc:899
char * log_file_name_old()
Get the old undo log filename from the srv_log_group_home_dir.
Definition: trx0purge.h:448
bool is_inactive_explicit()
Return whether the undo tablespace was made inactive by ALTER TABLESPACE.
Definition: trx0purge.h:546
bool is_new()
Report whether this undo tablespace was created at startup.
Definition: trx0purge.h:483
space_id_t m_id
Undo Tablespace ID.
Definition: trx0purge.h:621
bool is_empty()
Return whether the undo tablespace is empty and ready to be dropped.
Definition: trx0purge.h:559
char * m_log_file_name
The truncation log file name, auto-generated when needed from the space number and the srv_undo_dir.
Definition: trx0purge.h:637
char * file_name()
Get the undo space filename.
Definition: trx0purge.h:419
bool m_new
True if this undo tablespace was implicitly created when this instance started up.
Definition: trx0purge.h:625
void set_empty()
Set the state of the undo tablespace to empty so that it can be dropped.
Definition: trx0purge.h:613
The currently used undo space IDs for an undo space number along with a boolean showing whether the u...
Definition: trx0purge.h:154
space_id_t space_id
Definition: trx0purge.h:155
bool in_use
Definition: trx0purge.h:156
bool rw_lock_own(const rw_lock_t *lock, ulint lock_type)
Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0.
Definition: sync0rw.cc:858
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
@ RW_LOCK_S
Definition: sync0types.h:208
@ RW_LOCK_X
Definition: sync0types.h:209
void trx_purge_add_update_undo_to_history(trx_t *trx, trx_undo_ptr_t *undo_ptr, page_t *undo_page, bool update_rseg_history_len, ulint n_added_logs, mtr_t *mtr)
in: mtr
Definition: trx0purge.cc:315
void trx_purge_sys_initialize(uint32_t n_purge_threads, purge_pq_t *purge_queue)
Creates the global purge system control structure and inits the history mutex.
Definition: trx0purge.cc:237
void trx_purge_sys_close(void)
Frees the global purge system control structure.
Definition: trx0purge.cc:270
purge_state_t
Purge states.
Definition: trx0purge.h:101
@ PURGE_STATE_DISABLED
Purge was never started.
Definition: trx0purge.h:106
@ PURGE_STATE_EXIT
Purge has been shutdown.
Definition: trx0purge.h:105
@ PURGE_STATE_RUN
Purge should be running.
Definition: trx0purge.h:103
@ PURGE_STATE_STOP
Purge should be stopped.
Definition: trx0purge.h:104
@ PURGE_STATE_INIT
Purge instance created.
Definition: trx0purge.h:102
trx_purge_t * purge_sys
The global data structure coordinating a purge.
Definition: trx0purge.cc:77
void trx_purge_sys_mem_create()
Initialize in-memory purge structures.
Definition: trx0purge.cc:215
ulint trx_purge(ulint n_purge_threads, ulint limit, bool truncate)
This function runs a purge batch.
Definition: trx0purge.cc:2385
void trx_purge_run(void)
Resume purge, move to PURGE_STATE_RUN.
Definition: trx0purge.cc:2548
purge_state_t trx_purge_state(void)
Get the purge state.
Definition: trx0purge.cc:2476
static fil_addr_t trx_purge_get_log_from_hist(fil_addr_t node_addr)
Calculates the file address of an undo log header when we have the file address of its history list n...
void trx_purge_stop(void)
Stop purge and wait for it to stop, move to PURGE_STATE_STOP.
Definition: trx0purge.cc:2489
Purge old versions.
Transaction system.
Transaction system global type definitions.
std::priority_queue< TrxUndoRsegs, std::vector< TrxUndoRsegs, ut::allocator< TrxUndoRsegs > >, TrxUndoRsegs > purge_pq_t
Definition: trx0types.h:631
ib_id_t undo_no_t
Undo number.
Definition: trx0types.h:142
std::array< trx_rseg_t *, N > Rsegs_array
Definition: trx0types.h:550
ib_mutex_t PQMutex
Definition: trx0types.h:173
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:406
Sessions.
#define UT_LOCATION_HERE
Definition: ut0core.h:73
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:105
#define UT_NEW_THIS_FILE_PSI_KEY
Definition: ut0new.h:566
int n
Definition: xcom_base.cc:509