MySQL 26.7.0
Source Code Documentation
btr0mtib.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2023, 2026, 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/btr0mtib.h
29
30 Multi Threaded Index Build (MTIB) using BUF_BLOCK_MEMORY and dedicated
31 Bulk_flusher threads.
32
33 Created 09/Feb/2023 Annamalai Gurusami
34 *************************************************************************/
35
36#ifndef btr0mtib_h
37#define btr0mtib_h
38
39#include <cstddef>
40#include <vector>
41
42#include "api0api.h"
43#include "btr0load.h"
44#include "ddl0impl-compare.h"
45#include "dict0dict.h"
46#include "lob0bulk.h"
47#include "lob0lob.h"
48#include "page0cur.h"
49#include "row0mysql.h"
50#include "ut0class_life_cycle.h"
51#include "ut0new.h"
52#include "ut0object_cache.h"
53
54/* The Btree_multi namespace is used for multi-threaded parallel index build. */
55namespace Btree_multi {
56
57// Forward declaration.
58class Page_load;
59class Btree_load;
60struct Page_stat;
61
62using Blob_context = void *;
63
64namespace bulk {
65class Blob_inserter;
66} // namespace bulk
67
68/** Allocate, use, manage and flush one extent pages (FSP_EXTENT_SIZE). */
70 using Page_range_t = std::pair<page_no_t, page_no_t>;
71
72 /** Constructor.
73 @param[in] btree_load B-tree loader object.
74 @param[in] is_leaf true if this is part of leaf segment, false if this is
75 part of non-leaf (or top) segment. */
76 Page_extent(Btree_load *btree_load, const bool is_leaf);
77
78 /** Destructor. */
80
81 /** Next page number to be used. */
83
84 /** Page numbers of the pages that has been allocated in this extent.
85 The page range is [p1, p2), where p2 is not included. */
87
88 /** All the page loaders of the used pages. */
89 std::vector<Page_load *> m_page_loads;
90
91 bool is_btree_load_nullptr() const { return m_btree_load == nullptr; }
92
93 public:
94 /** Create an object of type Page_extent in the heap. */
95 static Page_extent *create(Btree_load *btree_load, const bool is_leaf,
96 const bool is_blob);
97
98 /** Release the page extent. Delete if not cached.
99 @param[in] extent extent to release */
100 static void drop(Page_extent *extent);
101
102 /** Number of pages in this extent. */
103 page_no_t page_count() const;
104
105 /** Reset the range with the given value.
106 @param[in] range new range value to be used. */
107 void reset_range(const Page_range_t &range);
108
109 /** Calculate the number of used pages.
110 return the number of used pages. */
111 size_t used_pages() const { return m_page_no - m_range.first; }
112
113 void get_page_numbers(std::vector<page_no_t> &page_numbers) const;
114
115 /** Get the index of the first unused page load.
116 @return index of the first unused page load. */
117 size_t last() const { return m_page_no - m_range.first; }
118
119 /** Check if the range is valid.
120 @return true if the range is valid, false otherwise. */
121 bool is_valid() const;
122
123 bool is_null() const {
124 return (m_range.first == FIL_NULL) && (m_range.second == FIL_NULL);
125 }
126
127 public:
128 /** Member of Page_extent. The index of page_load objects in the m_page_loads
129 corresponds to the page_no in the m_range. Here, check if a page_no already
130 has a Page_load object.
131 @param[in] page_no page_no for which we are looking for Page_load obj.
132 @return Page_load object if available, nullptr otherwise. */
134
135 /** Member of Page_extent. Associate the given page_no and the page load
136 object.
137 @param[in] page_no page number to associate.
138 @param[in] page_load page load object to associate. */
139 void set_page_load(page_no_t page_no, Page_load *page_load);
140
142
143 /** Initialize the next page number to be allocated. The page range should
144 have been already initialized. */
145 void init();
146
147 /** Check if no more pages are there to be used.
148 @return true if the page extent is completely used.
149 @return false if the page extent has more pages to be used. */
150 bool is_fully_used() const { return m_page_no == m_range.second; }
151
152 /** Check if there are any pages used.
153 @return true if at least one page is used.
154 @return false if no pages are used in this extent.*/
155 bool is_any_used() const {
156 ut_ad(m_page_no == m_range.first || m_page_loads.size() > 0);
157 return m_page_no > m_range.first;
158 }
159
160 public:
161 /** Allocate a page number. */
163
164 /** Save a page_load. */
165 void append(Page_load *page_load);
166
167 /** Flush the used pages to disk. It also frees the unused pages back to the
168 segment.
169 @param[in,out] node space file node
170 @return On success, return DB_SUCCESS. */
171 dberr_t flush(fil_node_t *node);
172
173 /** Flush one page at a time. This can be used when scatter/gather i/o is
174 not available for use.
175 @param[in,out] node space file node
176 @return On success, return DB_SUCCESS. */
178
179 /** Flush 1 extent pages at a time. Internally it will call OS dependent
180 API (either bulk_flush_win() on Windows or bulk_flush_linux() on other
181 operating systems.
182 @param[in,out] node space file node
183 @return DB_SUCCESS on success, error code on failure. */
185
186#ifdef UNIV_LINUX
187 /** Flush 1 extent pages at a time. Uses pwritev() i/o API.
188 @param[in,out] node space file node
189 @return DB_SUCCESS on success, error code on failure. */
190 dberr_t bulk_flush_linux(fil_node_t *node);
191#endif /* UNIV_LINUX */
192
193 /** Free all resources. */
195
196 /** Free any cached page load entries. */
197 void destroy_cached();
198
199 space_id_t space() const;
200
201 /** Mark the extent as cached. Flush thread should not free this extent. */
202 void set_cached() { m_is_cached.store(true); }
203
204 /** Set and unset free state of a cached extent.
205 @param[in] free state to be set */
206 void set_state(bool free) { m_is_free.store(free); }
207
208 /** @return true iff the cached element is in free state. */
209 bool is_free() const { return m_is_free.load(); }
210
211 /** @return true iff it is a cached extent. */
212 bool is_cached() const { return m_is_cached.load(); }
213
214 /** Reset page load cache to free all. */
216
217 public:
218 std::ostream &print(std::ostream &out) const;
219
220 /** Mark that this extent is used for blobs. */
221 void set_blob() { m_is_blob = true; }
222
223 /** Check if this is a blob extent.
224 @return true if it is a blob extent. */
225 bool is_blob() const { return m_is_blob; }
226
227 /** Free the BUF_BLOCK_MEMORY blocks used by this extent. */
228 void free_memory_blocks();
229
230#ifdef UNIV_DEBUG
231 /** True if this extent has been handed over to the bulk flusher. */
232 std::atomic_bool m_is_owned_by_bulk_flusher{false};
233#endif /* UNIV_DEBUG */
234
235 private:
237
238 /** true if this extent belongs to leaf segment. */
239 bool m_is_leaf{true};
240
241 /** true iff the extent is cached. */
242 std::atomic_bool m_is_cached{false};
243 /** true if the cached entry is free to be used. */
244 std::atomic_bool m_is_free{true};
245 /** Cached page loads. */
246 std::vector<Page_load *> m_cached_page_loads;
247 /** Next cached page load index. */
249
250 /** True if this extent is used for blobs. */
251 bool m_is_blob{false};
252
253 friend struct Level_ctx;
254};
255
257 std::vector<page_no_t> &page_numbers) const {
258 for (page_no_t i = m_range.first; i < m_page_no; ++i) {
259 page_numbers.push_back(i);
260 }
261}
262
264 Page_load *page_load) {
265 ut_ad(page_no >= m_range.first);
266 ut_ad(page_no < m_range.second);
267 const size_t idx = page_no - m_range.first;
268 if (idx == m_page_loads.size()) {
269 m_page_loads.push_back(page_load);
270 } else {
271 ut_ad(idx <= m_page_loads.size());
272 ut_ad(m_page_loads[idx] == nullptr);
273 m_page_loads[idx] = page_load;
274 }
275 ut_ad(m_page_loads.size() > 0);
276}
277
279 ut_ad(page_no >= m_range.first);
280 ut_ad(page_no < m_range.second);
281 const size_t idx = page_no - m_range.first;
282 if (m_page_loads.empty() || m_page_loads.size() <= idx) {
283 return nullptr;
284 }
285 return m_page_loads[idx];
286}
287
291 m_range.first = FIL_NULL;
292 m_range.second = FIL_NULL;
293 m_btree_load = nullptr;
294}
295
296inline bool Page_extent::is_valid() const {
297 ut_ad(m_range.first != 0);
298 ut_ad(m_range.second != 0);
299 if (is_null()) {
300 return true;
301 }
302 ut_ad(m_range.first < m_range.second);
303 ut_ad((m_range.second - m_range.first) <= FSP_EXTENT_SIZE);
304 return m_range.first < m_range.second;
305}
306
307inline std::ostream &Page_extent::print(std::ostream &out) const {
308 out << "[Page_extent: this=" << (void *)this
309 << ", m_range.first=" << m_range.first
310 << ", m_range.second=" << m_range.second
311 << ", page_loads=" << m_page_loads.size() << "]" << std::endl;
312 return out;
313}
314
315inline std::ostream &operator<<(std::ostream &out, const Page_extent &obj) {
316 return obj.print(out);
317}
318
320 ut_ad(range.first != 0);
321 ut_ad(range.second != 0);
322 ut_ad(range.first != FIL_NULL);
323 ut_ad(range.second != FIL_NULL);
324 m_range = range;
325 m_page_no = m_range.first;
326}
327
329 ut_ad(is_valid());
331
332 if (m_page_no == m_range.second) {
333 return FIL_NULL;
334 }
335 return m_page_no++;
336}
337
338inline void Page_extent::init() {
339 ut_ad(m_range.first != 0);
340 ut_ad(m_range.second != 0);
341 ut_ad(m_range.first != FIL_NULL);
342 ut_ad(m_range.second != FIL_NULL);
343 m_page_no = m_range.first;
344 m_page_loads.reserve(page_count());
345}
346
348 return m_range.second - m_range.first;
349}
350
351/** Context information for each level. */
352struct Level_ctx {
353 /** Static member function construct a Level_ctx object.
354 @param[in] index dictionary index object.
355 @param[in] level the B-tree level of this context object.
356 @param[in] btree_load a back pointer to the Btree_load object to which this
357 Level_ctx object is a part of.
358 @return level context object on success, nullptr on error. */
359 static Level_ctx *create(dict_index_t *index, size_t level,
360 Btree_load *btree_load);
361
362 /** Static member function to destroy a Level_ctx object.
363 @param[in] obj the Level_ctx object to destroy. */
364 static void destroy(Level_ctx *obj);
365
366 /** Constructor
367 @param[in] index dictionary index object.
368 @param[in] level the B-tree level of this context object.
369 @param[in] btree_load a back pointer to the Btree_load object to which this
370 Level_ctx object is a part of.*/
371 Level_ctx(dict_index_t *index, size_t level, Btree_load *btree_load)
372 : m_index(index),
373 m_level(level),
375 m_btree_load(btree_load) {}
376
377 /** Destructor. */
378 ~Level_ctx();
379
380 /** Initialize.
381 @return DB_SUCCESS on success, an error code on failure. */
382 dberr_t init();
383
384 /** Check if this is leaf level.
385 @return true if this is leaf level, false otherwise. */
386 bool is_leaf() const { return m_level == 0; }
387
389
390 /** Free the current page load. */
391 void free_page_load();
392
393 /** Allocate a page number. Subsequently a Page_load will be created with the
394 allocated page number.
395 @param[out] page_no page number that was allocated.
396 @return DB_SUCCESS on success, error code on failure.*/
398
399 /** Allocate one extent in the relevant file segment. No associated buffer
400 blocks are allocated.
401 @return DB_SUCCESS on success, error code on failure.*/
403
404 /** Allocate private memory buffer (BUF_BLOCK_MEMORY) block for given page
405 number. */
406 [[nodiscard]] buf_block_t *alloc(const page_no_t new_page_no) noexcept;
407
408 void set_current_page_load(Page_load *sibling);
409
410 Page_load *get_page_load() const;
411
412 trx_id_t get_trx_id() const;
413
414 /** The current extent that is being loaded. */
416
417 /** Build the extent cache. */
418 void build_extent_cache();
419
420 /** Load one extent from extent cache.
421 @return true iff successful. */
423
424 /** Build page loader cache for current exent. */
425 void build_page_cache();
426
427 /** Get a free page loader from cache
428 @return page loader or nullptr if not found. */
430
431 /** Pre allocated extents to prevent repeated allocation and free. */
432 std::vector<Page_extent *> m_cached_extents;
433
434 /** The page_no of the first page in this level. */
436
437 /** The page_no of the last page in this level. */
439
440 /** The index which is being built. */
442
443 /** The B-tree level whose context information is stored in this obj. */
444 const size_t m_level{};
445
446 /** The Page_load of the current page being loaded. */
448
449 /** A back pointer to conceptually higher level btree load object. */
451
452 /** Number of pages allocated at this level. */
454
455 /** Number of extents allocated at this level. */
457
458 /** True if the current extent is full. */
459 bool m_extent_full{true};
460
461#ifdef UNIV_DEBUG
462 bool is_page_tracked(const page_no_t &page_no) const;
463 std::vector<page_no_t> m_pages_allocated;
464#endif /* UNIV_DEBUG */
465};
466
468
470 m_page_load = sibling;
471}
472
474 public:
475 enum class Type {
476 /** Allocate by Page */
477 PAGE,
478 /** Allocate by extent. */
479 EXTENT
480 };
481
482 /** Destructor to ensure thread stop. */
484
485 /** Check size and set extent allocator size parameters
486 @param[in] table InnoDB dictionary table object
487 @param[in] index InnoDB index being built.
488 @param[in] trx transaction performing bulk load
489 @param[in] size total data size to be loaded
490 @param[in] num_threads number of concurrent threads
491 @param[in] in_pages if true, allocate in pages
492 @return tablespace extend size in bytes. */
493 uint64_t init(dict_table_t *table, dict_index_t *index, trx_t *trx,
494 size_t size, size_t num_threads, bool in_pages);
495
496 /* Start extent allocator thread. */
497 void start();
498
499 /** Stop extent allocator thread, if active. */
500 void stop();
501
502 /** Allocate a page range - currently ans Extent.
503 @param[in] is_leaf true if leaf segment, otherwise non-leaf segment
504 @param[in] alloc_page if true, allocate in pages otherwise allocate extent
505 @param[out] range page range
506 @param[in,out] fn_wait_begin begin callback if wait is needed
507 @param[in,out] fn_wait_end end callback if wait is needed
508 @return Innodb error code. */
509 dberr_t allocate(bool is_leaf, bool alloc_page, Page_range_t &range,
510 std::function<void()> &fn_wait_begin,
511 std::function<void()> &fn_wait_end);
512
513 private:
514 /** Upper bound for max ranges. */
515 static constexpr size_t S_MAX_RANGES = 2 * 1024;
516
517 /** Maximum size by which the tablespace is extended each time. */
518 static constexpr size_t S_BULK_EXTEND_SIZE_MAX = 64;
519
521 /** Initialize cache.
522 @param[in] max_range maximum number of extents to cache. */
523 void init(size_t max_range);
524
525 /** @return true if no available extent to consume. */
526 inline bool is_empty() const { return (m_num_allocated == m_num_consumed); }
527
528 /** @return true if cache is full and no more extents can be added. */
529 inline bool is_full() const {
531 }
532
533 /** Check for number of extents to be allocated and cached.
534 @param[out] num_alloc number of extents to allocate
535 @param[out] num_free number of free extents
536 @return true if succesful. */
537 bool check(size_t &num_alloc, size_t &num_free) const;
538
539 /** Get one page range from the cache.
540 @param[out] range the allocated page range
541 @param[out] alloc_trigger true, if need to trigger allocator
542 @return true if extent is successfully returned from cache. */
543 bool get_range(Page_range_t &range, bool &alloc_trigger);
544
545 /** Set allocated range(extent) in cache.
546 @param[in] index position of the range
547 @param[in] range page range to be set */
548 void set_range(size_t index, Page_range_t &range);
549
550 /** Cached page ranges already allocated to the segment. */
551 std::array<Page_range_t, S_MAX_RANGES> m_ranges;
552
553 /** Maximum number of ranges to pre-allocate. */
555
556 /** Total number of ranges allocated. */
557 std::atomic<size_t> m_num_allocated{0};
558
559 /** Total number of ranges allocated. */
560 std::atomic<size_t> m_num_consumed{0};
561 };
562
563 /** Extent thread executor.
564 @return innodb error code. */
565 dberr_t run();
566
567 /** Allocate extents and fill the cache.
568 @param[in] is_leaf true if leaf segment, otherwise non-leaf segment
569 @param[in] num_extents number of extents to allocate
570 @return innodb error code. */
571 dberr_t allocate_extents(bool is_leaf, size_t num_extents);
572
573 /** Allocator wait function. */
574 void allocator_wait() const;
575
576 /** Check if leaf and non-leaf extent cache needs to be filled.
577 @param[out] n_leaf number of leaf extents to allocate
578 @param[out] n_non_leaf number of non-leaf extents to allocate
579 @param[out] trigger true if consumers should be triggered
580 @return true if allocator should stop. */
581 bool check(size_t &n_leaf, size_t &n_non_leaf, bool &trigger);
582
583 /** Allocate one extent.
584 @param[in] is_leaf true if leaf segment, otherwise non-leaf segment
585 @param[in,out] mtr mini tranaction to be used for allocation
586 @param[out] range page rannge for the extent
587 @return innodb error code. */
588 dberr_t allocate_extent(bool is_leaf, mtr_t &mtr, Page_range_t &range);
589
590 /** Allocate one page.
591 @param[in] is_leaf true if leaf segment, otherwise non-leaf segment
592 @param[out] range page rannge for the page
593 @return innodb error code. */
594 dberr_t allocate_page(bool is_leaf, Page_range_t &range);
595
596 /** @return true if operation is interrupted. */
597 bool is_interrupted();
598
599 private:
600 /** Bulk extent allocator. */
601 std::thread m_thread;
602
603 /** Number of times consumer(s) had to wait. */
604 mutable size_t m_consumer_wait_count{};
605
606 /** Number of times allocator had to wait. */
607 mutable size_t m_allocator_wait_count{};
608
609 /** Total consumer wait time in micro seconds. */
610 mutable std::chrono::microseconds m_consumer_wait_time;
611
612 /** Total allocator wait time in micro seconds. */
613 mutable std::chrono::microseconds m_allocator_wait_time;
614
615 /** Page range type. */
617
618 /** Cached leaf extents. */
620
621 /** Cached non-leaf extents. */
623
624 /** This mutex protects the m_queue. */
625 mutable std::mutex m_mutex;
626
627 /** Condition variable for allocator thread. */
628 mutable std::condition_variable m_allocator_condition;
629
630 /** Condition variable for extent consumer threads. */
631 mutable std::condition_variable m_consumer_condition;
632
633 /** Flag to indicate if the bulk allocator thread should stop. */
634 bool m_stop{false};
635
636 /** Error code, protected by m_mutex */
638
639 /** Innodb dictionary table object. */
642
643 /** Innodb transaction - used for checking interrupt. */
645
646 /** Number of concurrent consumers. */
648};
649
651 public:
652 /** Thread main function.
653 @return innodb error code. */
654 dberr_t run();
655
656 /** Check if work is available for the bulk flusher thread.
657 @return true if work is available. */
658 bool is_work_available();
659
660 /** Start a new thread to do the flush work.
661 @param[in] space_id space for flushing pages to
662 @param[in] index loader index
663 @param[in] queue_size flusher queue size */
664 void start(space_id_t space_id, size_t index, size_t queue_size);
665
666 /** Add a page extent to the bulk flush queue.
667 @param[in,out] page_extent extent to be added to the queue
668 @param[in,out] fn_wait_begin begin callback if wait is needed
669 @param[in,out] fn_wait_end end callback if wait is needed */
670 void add(Page_extent *page_extent, std::function<void()> &fn_wait_begin,
671 std::function<void()> &fn_wait_end);
672
673 /** Check for flusher error and wake up flusher thread.
674 @return Innodb error code. */
676
677 /** Wait till the bulk flush thread stops. */
678 void wait_to_stop();
679
680 /** Get the maximum allowed queue size.
681 @return the maximum allowed queue size. */
682 size_t get_max_queue_size() const { return m_max_queue_size; }
683
684 /** Destructor. */
686
687 /** @return true iff error has occurred. */
688 bool is_error() const { return m_is_error.load(); }
689
690 /** @return error code */
691 dberr_t get_error() const;
692
693 void add_to_free_queue(Page_extent *page_extent);
694
696
697 private:
698 /** Do the actual work of flushing.
699 @param[in,out] node space file node */
700 void do_work(fil_node_t *node);
701
702 /** Check if the bulk flush thread should stop working. */
703 bool should_i_stop() const { return m_stop.load(); }
704
705 /** When no work is available, put the thread to sleep. */
706 void wait();
707
708 /** Print useful information to the server log file while exiting. */
709 void info();
710
711 /** This queue is protected by the m_mutex. */
712 std::vector<Page_extent *> m_queue;
713
714 /** This mutex protects the m_queue. */
715 mutable std::mutex m_mutex;
716
717 /** Condition variable to wait upon. */
718 mutable std::condition_variable m_condition;
719
720 /** This queue is protected by the m_free_mutex. It is used to cache the
721 Page_extent objects that have been flushed and ready for re-use. */
722 std::vector<Page_extent *> m_free_queue;
723
724 /** This mutex protects the m_free_queue. */
725 mutable std::mutex m_free_mutex;
726
727 /** Flag to indicate if the bulk flusher thread should stop. If true, the
728 bulk flusher thread will stop after emptying the queue. If false, the
729 bulk flusher thread will go to sleep after emptying the queue. */
730 std::atomic<bool> m_stop{false};
731
732 /** Set if error is encountered during flush. */
733 std::atomic<bool> m_is_error{false};
734
735 /** Error code, protected by m_mutex */
737
738 /** Set error code.
739 @param[in] error_code error code to set. It could be DB_SUCCESS.*/
740 void set_error(dberr_t error_code);
741
742 /** Private queue (private to the bulk flush thread) containing the extents to
743 flush. */
744 std::vector<Page_extent *> m_priv_queue;
745
746 /** Bulk flusher thread. */
747 std::thread m_flush_thread;
748
749 /** Number of times slept */
750 size_t m_n_sleep{};
751
752 /** Total sleep time in micro seconds. */
753 std::chrono::microseconds m_wait_time;
754
755 /** The sleep duration in milliseconds. */
757
758 /** Maximum queue size, defaults to 4 */
760
761 /** Number of pages flushed. */
763
764 /** Bulk flusher is specific to a tablespace for now. */
766
767 /** Flusher ID. */
768 size_t m_id{};
769
770#ifdef UNIV_DEBUG
771 public:
772 /** Vector of page numbers that are flushed by this Bulk_flusher object. */
773 std::vector<page_no_t> m_flushed_page_nos;
774#endif /* UNIV_DEBUG */
775};
776
777namespace bulk {
778
779class Blob_handle;
780
781/** Used to insert many blobs into InnoDB. */
783 public:
784 /** Constructor.
785 @param[in] btree_load the B-tree into which blobs are inserted. */
786 Blob_inserter(Btree_load &btree_load);
787
789
790 /** Initialize by allocating necessary resources.
791 @return DB_SUCCESS on success or a failure error code. */
792 dberr_t init();
793
794 void finish();
795
797 Blob_context blob_ctx;
798 dberr_t err = open_blob(blob_ctx, ref);
799 if (err != DB_SUCCESS) {
800 return err;
801 }
802 const byte *data = (const byte *)dfield->data;
803 err = write_blob(blob_ctx, ref, data, dfield->len);
804 if (err != DB_SUCCESS) {
805 return err;
806 }
807 return close_blob(blob_ctx, ref);
808 }
809
810 /** Create a blob.
811 @param[out] blob_ctx pointer to an opaque object representing a blob.
812 @param[out] ref blob reference to be placed in the record.
813 @return DB_SUCCESS on success or a failure error code. */
815
816 /** Write data into the blob.
817 @param[in] blob_ctx pointer to blob into which data is written.
818 @param[out] ref blob reference to be placed in the record.
819 @param[in] data buffer containing data to be written
820 @param[in] len length of the data to be written.
821 @return DB_SUCCESS on success or a failure error code. */
822 dberr_t write_blob(Blob_context blob_ctx, lob::ref_t &ref, const byte *data,
823 size_t len);
824
825 /** Indicate that the blob has been completed, so that resources can be
826 removed, and as necessary flushing can be done.
827 @param[in] blob_ctx pointer to blob which has been completely written.
828 @param[out] ref a blob ref object.
829 @return DB_SUCCESS on success or a failure error code. */
831
832 /** Allocate a LOB first page
833 @return a LOB first page. */
835
836 /** Allocate a data page
837 @return a LOB data page. */
839
840 /** Allocate a LOB index page.
841 @return a LOB index page. */
843
844 /** Get the current transaction id.
845 @return the current transaction id. */
846 trx_id_t get_trx_id() const;
847
849 return ctx == m_blob_handle.get();
850 }
851
852 private:
854
856
858
859 /** Page extent from which to allocate first pages of blobs.
860 @ref lob::bulk::first_page_t. */
862
864
865 /** Page extent from which to allocate data pages of blobs.
866 @ref lob::bulk::data_page_t. */
868
869 /** Page extent from which to allocate index pages of blobs.
870 @ref lob::bulk::node_page_t. */
871 std::list<Page_extent *> m_index_extents;
872
873 /** The current blob being inserted. */
875
876 /** Cache of Page_load objects. */
878
879 /** Cache of Page_extent objects. */
881
882 /** Only one blob handle per sub-tree */
884};
885
886} /* namespace bulk */
887
888/** @note We should call commit(false) for a Page_load object, which is not in
889m_page_loaders after page_commit, and we will commit or abort Page_load
890objects in function "finish". */
892 public:
893 /** Merge multiple Btree_load sub-trees together. */
894 class Merger;
895
896 /** Class used to read the target table when the table is not empty. We bulk
897 load into a duplicate and migrate the data into it. */
898 class Table_reader;
899
901 return m_full_blob_inserter.insert_blob(ref, dfield);
902 }
903
904 /** Create a blob.
905 @param[out] blob_ctx pointer to an opaque object representing a blob.
906 @param[out] ref blob reference to be placed in the record.
907 @return DB_SUCCESS on success or a failure error code. */
909 return m_blob_inserter.open_blob(blob_ctx, ref);
910 }
911
912 /** Write data into the blob.
913 @param[in] blob_ctx pointer to blob into which data is written.
914 @param[in,out] ref blob reference of the current blob
915 @param[in] data buffer containing data to be written
916 @param[in] len length of the data to be written.
917 @return DB_SUCCESS on success or a failure error code. */
918 dberr_t write_blob(Blob_context blob_ctx, lob::ref_t &ref, const byte *data,
919 size_t len) {
920 return m_blob_inserter.write_blob(blob_ctx, ref, data, len);
921 }
922
923 /** Indicate that the blob has been completed, so that resources can be
924 removed, and as necessary flushing can be done.
925 @param[in] blob_ctx pointer to blob which has been completely written.
926 @param[out] ref blob reference of the closed blob.
927 @return DB_SUCCESS on success or a failure error code. */
929 return m_blob_inserter.close_blob(blob_ctx, ref);
930 }
931
932 public:
933 using Level_ctxs = std::vector<Level_ctx *, ut::allocator<Level_ctx *>>;
934
935 /** Helper to set wait callbacks for the current scope. */
937 public:
938 using Function = std::function<void()>;
939 friend class Btree_load;
940
942 : m_btree_load(btree_load) {
945 }
946
948 m_btree_load->m_fn_wait_begin = nullptr;
949 m_btree_load->m_fn_wait_end = nullptr;
950 }
951
952 private:
953 /** Btree Load for the wait callbacks. */
955 };
956
957 /** Constructor
958 @param[in] index B-tree index.
959 @param[in] trx Transaction object.
960 @param[in] loader_num loader index
961 @param[in] flush_queue_size bulk flusher queue size
962 @param[in] allocator extent allocator */
963 Btree_load(dict_index_t *index, trx_t *trx, size_t loader_num,
964 size_t flush_queue_size,
965 Bulk_extent_allocator &allocator) noexcept;
966
967 /** Destructor */
969
970 /** Initialize. Allocates the m_heap_order memory heap.
971 @return DB_SUCCESS on success or an error code on failure. */
972 dberr_t init();
973
974#ifdef UNIV_DEBUG
975 /** Save flushed page numbers for debugging purposes.
976 @param[in] page_no page number of the page that is flushed. */
978 m_bulk_flusher.m_flushed_page_nos.push_back(page_no);
979 }
980#endif /* UNIV_DEBUG */
981
982 /** Check if the index build operation has been interrupted.
983 @return true if the index build operation is interrupted, false otherwise.*/
984 bool is_interrupted() const;
985
986 /** Trigger flusher thread and check for error.
987 @return Innodb error code. */
989
990 bool is_pk() const { return m_index->is_clustered(); }
991
992 /** Get the index object.
993 @return index object. */
994 dict_index_t *index() const { return m_index; }
995
996 const char *get_table_name() const { return m_index->table->name.m_name; }
997
998 /** Get the root page number of this tree/subtree.
999 @return the root page number of this tree/subtree. */
1001
1002 /** Get the level of the root page.
1003 @return the level of the root page. */
1004 size_t get_root_level() const { return m_root_level; }
1005
1006 /** Get information about root page. */
1007 void get_root_page_stat(Page_stat &stat);
1008
1009 /** Get the transaction id.
1010 @return the transaction id. */
1011 trx_id_t get_trx_id() const;
1012
1014
1015 /** Btree bulk load finish. We commit the last page in each level
1016 and copy the last page in top level to the root page of the index
1017 if no error occurs.
1018 @param[in] is_err Whether bulk load was successful until now
1019 @param[in] subtree true if a subtree is being built, false otherwise.
1020 @return error code */
1021 [[nodiscard]] dberr_t finish(bool is_err, const bool subtree) noexcept;
1022
1023 /** Insert a tuple to a page in a level
1024 @param[in] dtuple Tuple to insert
1025 @param[in] level B-tree level
1026 @return error code */
1027 [[nodiscard]] dberr_t insert(dtuple_t *dtuple, size_t level) noexcept;
1028
1029 /** Split the right most block of the tree at the given level.
1030 @param[in,out] block the right most block at the given level.
1031 @param[in] level level of the given block.
1032 @param[in] node_ptr node pointer to be inserted in the block after
1033 splitting.
1034 @param[in] mtr mini transaction context.
1035 @param[in,out] highest_level highest level among all the subtrees.*/
1036 void split_rightmost(buf_block_t *block, size_t level, dtuple_t *node_ptr,
1037 mtr_t *mtr, size_t &highest_level);
1038
1039 /** Split the left most block of the tree at the given level.
1040 @param[in,out] block the left most block at the given level. it will be
1041 updated with the new left most block.
1042 @param[in] level level of the given block.
1043 @param[in] node_ptr node pointer to be inserted in the block after
1044 splitting.
1045 @param[in] mtr mini transaction context.
1046 @param[in,out] highest_level highest level among all the subtrees.*/
1047 void split_leftmost(buf_block_t *&block, size_t level, dtuple_t *node_ptr,
1048 mtr_t *mtr, size_t &highest_level);
1049
1050 private:
1051 /** Set the root page on completion.
1052 @param[in] last_page_no Last page number (the new root).
1053 @return DB_SUCCESS or error code. */
1054 [[nodiscard]] dberr_t load_root_page(page_no_t last_page_no) noexcept;
1055
1056 public:
1057 /** Commit(finish) a page. We set next/prev page no, insert a node pointer to
1058 father page if needed, and commit mini-transaction.
1059 @param[in] page_load Page to commit
1060 @param[in] next_page_load Next page
1061 @param[in] insert_father Flag whether need to insert node ptr
1062 @return error code */
1063 [[nodiscard]] dberr_t page_commit(Page_load *page_load,
1064 Page_load *next_page_load,
1065 bool insert_father) noexcept;
1066
1067 /** Prepare space to insert a tuple.
1068 @param[in,out] page_load Page bulk that will be used to store the record.
1069 It may be replaced if there is not enough space
1070 to hold the record.
1071 @param[in] level B-tree level
1072 @param[in] rec_size Record size
1073 @return error code */
1074 [[nodiscard]] dberr_t prepare_space(Page_load *&page_load, size_t level,
1075 size_t rec_size) noexcept;
1076
1077 /** Insert a tuple to a page.
1078 @param[in] page_load Page bulk object
1079 @param[in] tuple Tuple to insert
1080 @param[in] big_rec Big record vector, maybe NULL if there is no
1081 Data to be stored externally.
1082 @param[in] rec_size Record size
1083 @return error code */
1084 [[nodiscard]] dberr_t insert(Page_load *page_load, dtuple_t *tuple,
1085 big_rec_t *big_rec, size_t rec_size) noexcept;
1086
1087 /** Btree page bulk load finish. Commits the last page in each level
1088 if no error occurs. Also releases all page bulks.
1089 @param[in] is_err Whether bulk load was successful until now
1090 @param[out] last_page_no Last page number
1091 @return error code */
1092 [[nodiscard]] dberr_t finalize_page_loads(bool is_err,
1093 page_no_t &last_page_no) noexcept;
1094
1095 public:
1096 /** Allocate an extent.
1097 @param[in,out] page_range the range of pages allocated.
1098 @param[in] level btree level for which pages are allocated.
1099 @return status code. */
1100 dberr_t alloc_extent(Page_range_t &page_range, size_t level);
1101
1102 /** Initiate a direct file write operation.
1103 @param[in] block block to be written to disk.
1104 @return error code. */
1105 [[nodiscard]] dberr_t fil_io(buf_block_t *block) noexcept;
1106
1107 /** Flush the blob pages.
1108 @return status code. */
1110
1111 /** Add the given block the internal cache of blocks.
1112 @param[in] block the block to be cached. */
1113 inline void block_put(buf_block_t *block);
1114
1115 /** Remove the given block from the internal cache of blocks.
1116 @param[in] page_no the page number of block to be removed from cache. */
1117 inline void block_remove(const page_no_t page_no);
1118
1119 /** Search for a BUF_BLOCK_MEMORY block with given page number in the local
1120 cache.
1121 @param[in] page_no the page number of block to be fetched.
1122 @return buffer block with given page number. */
1123 [[nodiscard]] inline buf_block_t *block_get(page_no_t page_no) const noexcept;
1124
1125 /** Evict all the pages in the given range from the buffer pool.
1126 @param[in] range range of page numbers.
1127 @param[in] dirty_is_ok it is OK for a page to be dirty. */
1128 void force_evict(const Page_range_t &range, const bool dirty_is_ok = true);
1129
1130 public:
1131 /** Check if a new level is needed. */
1132 bool is_new_level(size_t level) const { return level >= m_level_ctxs.size(); }
1133
1134 /** Last page numbers of each level. */
1135 std::vector<page_no_t, ut::allocator<page_no_t>> m_last_page_nos{};
1136
1137 /** First page numbers of each level. */
1138 std::vector<page_no_t, ut::allocator<page_no_t>> m_first_page_nos{};
1139
1140 /** Get the level context object.
1141 @param[in] level the level number. level 0 is leaf level.
1142 @return the level context object. */
1143 Level_ctx *get_level(size_t level) const;
1144
1145 /** Page numbers of the pages that has been allocated in the leaf level.
1146 The page range is [p1, p2), where p2 is not included. */
1148
1149 /** Page numbers of the pages that has been allocated in the non-leaf level.
1150 The page range is [p1, p2), where p2 is not included. */
1152
1155
1156 /** State of the index. Used for asserting at the end of a
1157 bulk load operation to ensure that the online status of the
1158 index does not change */
1160
1161 /** Number of extents allocated for this B-tree. */
1163
1164 /** Number of pages allocated for this B-tree. */
1166
1167 public:
1168 std::ostream &print_left_pages(std::ostream &out) const;
1169 std::ostream &print_right_pages(std::ostream &out) const;
1170
1171 dberr_t check_key_overlap(const Btree_load *r_btree) const;
1172
1173#ifdef UNIV_DEBUG
1174 void print_tree_pages() const;
1175 std::string print_pages_in_level(const size_t level) const;
1176 /** Check size and validate index of limited size.
1177 @param[in] index Index to validate
1178 @return true if successful. */
1179 static bool validate_index(dict_index_t *index);
1180#endif /* UNIV_DEBUG */
1181
1182 /** All allocated extents registers with Btree_load. */
1183 void track_extent(Page_extent *page_extent);
1184
1185 /** Add fully used extents to the bulk flusher. Call this whenever a new
1186 Page_load is allocated, with finish set to false. Only in
1187 Btree_load::finish(), the finish argument will be true.
1188 @param[in] finish if true, add all the tracked extents to the bulk flusher,
1189 irrespective of whether it is fully used or not. */
1190 void add_to_bulk_flusher(bool finish = false);
1191
1192 /** Add blob extents to the bulk flusher and wait till they are flushed. */
1194
1195 /** Add the given page extent object to the bulk flusher.
1196 @param[in] page_extent the extent to be flushed. */
1197 void add_to_bulk_flusher(Page_extent *page_extent);
1198
1199 /** Check if transparent page compression (TPC) is enabled.
1200 @return true if TPC is enabled. */
1201 bool is_tpc_enabled() const;
1202
1203 /** Check if transparent page encryption (TPE) is enabled.
1204 @return true if TPE is enabled. */
1205 bool is_tpe_enabled() const;
1206
1207 /** @return get flush queue size limit. */
1210 }
1211
1212 /** If the data is already sorted and checked for duplicates, then we can
1213 disable doing it again. */
1215
1217
1220 }
1221
1222 private:
1223 /** Page allocation type. We allocate in extents by default. */
1226
1227 /** Number of records inserted. */
1228 uint64_t m_n_recs{};
1229
1230 /** B-tree index */
1232
1234
1235 /** Transaction id */
1237
1238 /** Root page level */
1240
1241 /** Context information for each level of the B-tree. The leaf level is at
1242 m_level_ctxs[0]. */
1244
1245 /** Reference to global extent allocator. */
1247
1248 /** Extents that are being tracked. */
1249 std::list<Page_extent *> m_extents_tracked;
1250
1251 /** If true, check if data is inserted in sorted order. */
1252 bool m_check_order{true};
1253
1254 /** Memory heap to be used for sort order checks. */
1256
1257 /** Function object to compare two tuples. */
1259
1260 /** The previous tuple that has been inserted. */
1262
1263 bool is_extent_tracked(const Page_extent *page_extent) const;
1264
1265 /** Loader number. */
1267
1269
1270 /* Begin wait callback function. */
1272
1273 /* End wait callback function. */
1275
1276 /** Blob inserter to handle the externally stored fields of InnoDB. This
1277 is used when blobs are inserted using multiple calls like open_blob(),
1278 write_blob() and close_blob(). */
1280
1281 /** Need another blob inserter to store blobs with a single call using
1282 insert_blob() */
1284
1285 /* Dedicated thread to flush pages. */
1287
1289};
1290
1292 public:
1293 using Btree_loads = std::vector<Btree_load *, ut::allocator<Btree_load *>>;
1294
1295 Merger(const size_t n_threads, Btree_loads &loads, dict_index_t *index,
1296 const trx_t *trx)
1297 : m_n_threads(n_threads),
1298 m_btree_loads(loads),
1299 m_index(index),
1300 m_trx(trx),
1302
1303 dberr_t merge(bool sort);
1304
1305 private:
1306 /** Get the maximum free space available in an empty page in bytes.
1307 @return the maximum free space available in an empty page. */
1308 size_t get_max_free() const {
1310 }
1311
1312 /** Remove any empty sub-trees with no records. */
1313 void remove_empty_subtrees();
1314
1315#ifdef UNIV_DEBUG
1316 /** Validate sub-tree boundaries. */
1317 void validate_boundaries();
1318
1319#endif /* UNIV_DEBUG */
1320
1321 /** Stich sub-trees together to form a tree with one or multiple
1322 nodes at highest leve.
1323 @param[out] highest_level highest level of the merged tree.
1324 @return innodb error code. */
1325 dberr_t subtree_link_levels(size_t &highest_level);
1326
1327 /** Create root node for the stiched sub-trees by combining the nodes
1328 at highest level creating another level if required.
1329 @param[in] highest_level highest level of the merged tree.
1330 @return innodb error code. */
1331 dberr_t add_root_for_subtrees(const size_t highest_level);
1332
1333 /** Insert the given list of node pointers into pages at the given level.
1334 @param[in,out] all_node_ptrs list of node pointers
1335 @param[in,out] total_node_ptrs_size total space in bytes needed to insert
1336 all the node pointers.
1337 @param[in] level the level at which the node pointers are inserted.
1338 @return DB_SUCCESS if successful.
1339 @return error code on failure. */
1340 dberr_t insert_node_ptrs(std::vector<dtuple_t *> &all_node_ptrs,
1341 size_t &total_node_ptrs_size, size_t level);
1342
1343 /** Load the left page and update its FIL_PAGE_NEXT.
1344 @param[in] l_page_no left page number
1345 @param[in] r_page_no right page number. */
1346 void link_right_sibling(const page_no_t l_page_no, const page_no_t r_page_no);
1347
1348 private:
1349 /** Number of loader threads. */
1350 const size_t m_n_threads;
1351
1352 /** Refernce to the subtrees to be merged. */
1354
1355 /** Index which is being built. */
1357
1358 /** Transaction making the changes. */
1359 const trx_t *m_trx{};
1360
1361 /** Memory heap to store node pointers. */
1363};
1364
1366 const Page_extent *page_extent) const {
1367 for (auto e : m_extents_tracked) {
1368 if (page_extent == e) {
1369 return true;
1370 }
1371 }
1372 return false;
1373}
1374
1375/** The proper function call sequence of Page_load is as below:
1376-- Page_load::init
1377-- Page_load::insert
1378-- Page_load::finish
1379-- Page_load::commit */
1381 public:
1383
1384 /** Ctor.
1385 @param[in] index B-tree index
1386 @param[in] btree_load btree object to which this page belongs. */
1387 Page_load(dict_index_t *index, Btree_load *btree_load);
1388
1389 /** Destructor. */
1391
1392 /** Check if page is corrupted.
1393 @return true if corrupted, false otherwise. */
1394 bool is_corrupted() const;
1395
1396 /** Print the child page numbers. */
1398
1399 /** Check if state of this page is BUF_BLOCK_MEMORY.
1400 @return true if page state is BUF_BLOCK_MEMORY, false otherwise.*/
1401 bool is_memory() const { return m_block->is_memory(); }
1402
1403 /** A static member function to create this object.
1404 @param[in] btree_load the bulk load object to which this Page_load belongs.
1405 @param[in] page_extent page extent to which this page belongs. */
1406 static Page_load *create(Btree_load *btree_load, Page_extent *page_extent);
1407
1408 /** Release the page loader. Delete if not cached.
1409 @param[in] page_load page loader to delete. */
1410 static void drop(Page_load *page_load);
1411
1412 /** Constructor
1413 @param[in] index B-tree index
1414 @param[in] trx_id Transaction id
1415 @param[in] page_no Page number
1416 @param[in] level Page level
1417 @param[in] observer Flush observer
1418 @param[in] btree_load btree object to which this page belongs. */
1420 size_t level, Flush_observer *observer,
1421 Btree_load *btree_load = nullptr) noexcept
1422 : m_index(index),
1423 m_trx_id(trx_id),
1424 m_page_no(page_no),
1425 m_level(level),
1427 m_flush_observer(observer),
1428 m_btree_load(btree_load) {
1430 }
1431
1432 /** Set the transaction id.
1433 @param[in] trx_id the transaction id to used. */
1434 void set_trx_id(const trx_id_t trx_id) { m_trx_id = trx_id; }
1435
1436 /** Get the current transaction identifier.
1437 @return the current transaction identifier.*/
1438 trx_id_t get_trx_id() const { return m_trx_id; }
1439
1440 /** Set the flush observer.
1441 @param[in] observer the flush observer object to use. */
1443 m_flush_observer = observer;
1444 }
1445
1446 bool is_leaf() const { return m_level == 0; }
1447
1448 /** Set the page number of this object. */
1449 void set_page_no(const page_no_t page_no);
1450
1451 void set_leaf_seg(const fseg_header_t *hdr) {
1453 }
1454 void set_top_seg(const fseg_header_t *hdr) {
1456 }
1457
1458 /** Initialize members and allocate page if needed and start mtr.
1459 @note Must be called and only once right after constructor.
1460 @return error code */
1461 [[nodiscard]] dberr_t init() noexcept;
1462 [[nodiscard]] dberr_t init_mem(const page_no_t new_page_no,
1463 Page_extent *page_extent) noexcept;
1464
1465 /** Initialize a memory block to be used for storing blobs.
1466 @param[in] page_no the page number to be set in the memory block.
1467 @param[in] page_extent extent to which this page belongs.
1468 @return DB_SUCCESS on success, error code on failure.*/
1469 [[nodiscard]] dberr_t init_mem_blob(const page_no_t page_no,
1470 Page_extent *page_extent) noexcept;
1471
1472 /** Allocate a page for this Page_load object.
1473 @return DB_SUCCESS on success, error code on failure. */
1475
1476 /** Re-initialize this page. */
1477 [[nodiscard]] dberr_t reinit() noexcept;
1478
1479 /** Reset this object so that Page_load::init() can be called again on this
1480 object. */
1481 void reset() noexcept;
1482
1483 /** Insert a tuple in the page.
1484 @param[in] tuple Tuple to insert
1485 @param[in] big_rec External record
1486 @param[in] rec_size Record size
1487 @return error code */
1488 [[nodiscard]] dberr_t insert(const dtuple_t *tuple, const big_rec_t *big_rec,
1489 size_t rec_size) noexcept;
1490
1491 /** Mark end of insertion to the page. Scan records to set page dirs,
1492 and set page header members. The scan is incremental (slots and records
1493 which assignment could be "finalized" are not checked again. Check the
1494 m_slotted_rec_no usage, note it could be reset in some cases like
1495 during split.
1496 Note: we refer to page_copy_rec_list_end_to_created_page.*/
1497 void finish() noexcept;
1498
1499 /** Commit mtr for a page
1500 @return DB_SUCCESS on success, error code on failure. */
1502
1503 /** Commit mtr for a page */
1504 void rollback() noexcept;
1505
1506 /** Check whether the record needs to be stored externally.
1507 @return false if the entire record can be stored locally on the page */
1508 [[nodiscard]] bool need_ext(const dtuple_t *tuple,
1509 size_t rec_size) const noexcept;
1510
1511 /** Store externally the first possible field of the given tuple.
1512 @return true if a field was stored externally, false if it was not possible
1513 to store any of the fields externally. */
1514 [[nodiscard]] bool make_ext(dtuple_t *tuple);
1515
1516 /** Get node pointer
1517 @return node pointer */
1518 [[nodiscard]] dtuple_t *get_node_ptr() noexcept;
1519
1520 /** Get node pointer
1521 @param[in] heap allocate node pointer in the given heap.
1522 @return node pointer */
1523 [[nodiscard]] dtuple_t *get_node_ptr(mem_heap_t *heap) noexcept;
1524
1525 /** Copy all records from page.
1526 @param[in] src_page Page with records to copy. */
1527 size_t copy_all(const page_t *src_page) noexcept;
1528
1529 /** Distribute all records from this page to the given pages.
1530 @param[in,out] to_pages array of Page_load objects.
1531 return total number of records processed. */
1532 size_t copy_to(std::vector<Page_load *> &to_pages);
1533
1534 /** Set next page
1535 @param[in] next_page_no Next page no */
1536 void set_next(page_no_t next_page_no) noexcept;
1537
1538 /** Set previous page
1539 @param[in] prev_page_no Previous page no */
1540 void set_prev(page_no_t prev_page_no) noexcept;
1541
1542 /** Get previous page (FIL_PAGE_PREV). */
1544
1545 /** Start mtr and latch block */
1547
1548 /** Check if required space is available in the page for the rec
1549 to be inserted. We check fill factor & padding here.
1550 @param[in] rec_size Required space
1551 @return true if space is available */
1552 [[nodiscard]] inline bool is_space_available(size_t rec_size) const noexcept;
1553
1554 /** Get the page number of this page load object.
1555 @return the page number of this page load object. */
1556 [[nodiscard]] page_no_t get_page_no() const noexcept { return m_page_no; }
1557
1558 [[nodiscard]] page_id_t get_page_id() const noexcept {
1559 return m_block->page.id;
1560 }
1561
1562 /** Get the physical page size of the underlying tablespace.
1563 @return the physical page size of the tablespace. */
1564 size_t get_page_size() const noexcept;
1565
1566 /** Get the table space ID.
1567 @return the table space ID. */
1568 space_id_t space() const noexcept;
1569
1570#ifdef UNIV_DEBUG
1571 /** Obtain tablespace id from the frame and the buffer block and ensure that
1572 they are the same.
1573 @return true if space id is same in both places. */
1574 bool verify_space_id() const;
1575#endif /* UNIV_DEBUG */
1576
1577 /** Get page level */
1578 [[nodiscard]] size_t get_level() const noexcept { return m_level; }
1579
1580 /** Set the level of this page. */
1581 void set_level(size_t level) noexcept { m_level = level; }
1582
1583 /** Get record no */
1584 [[nodiscard]] size_t get_rec_no() const { return m_rec_no; }
1585
1586 /** Get page */
1587 [[nodiscard]] const page_t *get_page() const noexcept {
1589 }
1590
1591 [[nodiscard]] page_t *get_page() noexcept {
1593 }
1594
1595 public:
1596 void init_for_writing();
1597 size_t get_data_size() const { return page_get_data_size(m_page); }
1598
1599#ifdef UNIV_DEBUG
1600 /** Check if index is X locked
1601 @return true if index is locked. */
1603#endif /* UNIV_DEBUG */
1604
1605 /** Copy given and all following records.
1606 @param[in] first_rec First record to copy */
1607 size_t copy_records(const rec_t *first_rec) noexcept;
1608
1609 /** Insert a record in the page, check for duplicates too.
1610 @param[in] rec Record
1611 @param[in] offsets Record offsets
1612 @return DB_SUCCESS or error code. */
1613 dberr_t insert(const rec_t *rec, Rec_offsets offsets) noexcept;
1614
1615 public:
1616 /** Store external record
1617 Since the record is not logged yet, so we don't log update to the record.
1618 the blob data is logged first, then the record is logged in bulk mode.
1619 @param[in] big_rec External record
1620 @param[in] offsets Record offsets
1621 @return error code */
1622 [[nodiscard]] dberr_t store_ext(const big_rec_t *big_rec,
1623 Rec_offsets offsets) noexcept;
1624
1625 /** Set the REC_INFO_MIN_REC_FLAG on the first user record in this page.
1626 @param[in] mtr mini transaction context. */
1627 void set_min_rec_flag(mtr_t *mtr);
1628
1629 /** Set the REC_INFO_MIN_REC_FLAG on the first user record in this page. */
1630 void set_min_rec_flag();
1631 bool is_min_rec_flag() const;
1632
1633 /** Set the level context object for this page load
1634 @param[in] level_ctx the level context object. */
1635 void set_level_ctx(Level_ctx *level_ctx) { m_level_ctx = level_ctx; }
1636
1637 /** Check if this page load object contains a level context object.
1638 @return true if the page load contains a level context object.
1639 @return false if the page load does NOT contain a level context object.*/
1640 bool has_level_ctx() const { return m_level_ctx != nullptr; }
1641
1642 /** Free the memory block. */
1643 void free();
1644
1646
1648
1649 void set_page_extent(Page_extent *page_extent) {
1650 m_page_extent = page_extent;
1651 }
1652
1653 /** Mark the Page load as cached. Flush thread should not free this Page. */
1654 void set_cached() { m_is_cached.store(true); }
1655
1656 /** @return true iff it is a cached Page Load. */
1657 bool is_cached() const { return m_is_cached.load(); }
1658
1659 private:
1660 /** Memory heap for internal allocation */
1662
1663 /** The index B-tree */
1665
1666 /** The min-transaction */
1668
1669 /** The transaction id */
1671
1672 /** The buffer block */
1674
1675 /** The page */
1677
1678 /** The current rec, just before the next insert rec */
1680
1681 /** The page no */
1683
1684 /** The page level in B-tree */
1685 size_t m_level{};
1686
1687 /** Flag: is page in compact format */
1688 const bool m_is_comp{};
1689
1690 /** The heap top in page for next insert */
1691 byte *m_heap_top{};
1692
1693 /** User record no */
1694 size_t m_rec_no{};
1695
1696 /** The free space left in the page */
1698
1699 /** The reserved space for fill factor */
1701
1702 /** Total data in the page */
1704
1705 /** The modify clock value of the buffer block
1706 when the block is re-pinned */
1707 uint64_t m_modify_clock{};
1708
1709 /** Flush observer */
1711
1712 /** Last record assigned to a slot. */
1714
1715 /** Number of records assigned to slots. */
1717
1718 /** Page modified flag. */
1720
1722
1724
1726
1727 /** true iff the Page load is cached. */
1728 std::atomic_bool m_is_cached{false};
1729
1730 friend class Btree_load;
1731};
1732
1734 return get_node_ptr(m_heap);
1735}
1736
1738
1739inline size_t Page_load::get_page_size() const noexcept {
1740 const page_size_t page_size = m_index->get_page_size();
1741 return page_size.physical();
1742}
1743
1744inline Level_ctx *Btree_load::get_level(size_t level) const {
1745 ut_a(m_level_ctxs.size() > level);
1746 return m_level_ctxs[level];
1747}
1748
1749/** Information about a buffer page. */
1751 /** Number of user records in the page. */
1752 size_t m_n_recs;
1753
1754 /** Number of bytes of data. */
1756};
1757
1758inline void Page_extent::append(Page_load *page_load) {
1759 ut_ad(page_load->get_block() != nullptr);
1760 ut_ad(page_load->is_memory());
1761 ut_ad(page_load->get_page_no() >= m_range.first);
1762 ut_ad(page_load->get_page_no() < m_range.second);
1763 for (auto &iter : m_page_loads) {
1764 if (iter->get_page_no() == page_load->get_page_no()) {
1765 /* Page already appended. Don't append again. */
1766 return;
1767 }
1768 }
1770 m_page_loads.push_back(page_load);
1771}
1772
1774 return m_btree_load->get_trx_id();
1775}
1776
1778 return m_btree_load->index()->space;
1779}
1780
1781inline Page_extent::Page_extent(Btree_load *btree_load, const bool is_leaf)
1782 : m_page_no(FIL_NULL),
1783 m_range(FIL_NULL, FIL_NULL),
1784 m_btree_load(btree_load),
1785 m_is_leaf(is_leaf) {
1787}
1788
1790 const bool is_leaf, bool skip_track) {
1791 Page_extent *p = ut::new_withkey<Page_extent>(UT_NEW_THIS_FILE_PSI_KEY,
1792 btree_load, is_leaf);
1793 if (!skip_track) {
1794 btree_load->track_extent(p);
1795 }
1796 p->m_is_cached.store(false);
1797 return p;
1798}
1799
1800inline void Page_extent::drop(Page_extent *extent) {
1801 if (extent == nullptr) {
1802 return;
1803 }
1804 if (extent->is_cached()) {
1805 ut_a(!extent->is_free());
1806 bool free = true;
1807 extent->set_state(free);
1808 return;
1809 }
1810 ut::delete_(extent);
1811}
1812
1813/** Function object to compare two Btree_load objects. */
1816 bool operator()(const Btree_load *l_btree, const Btree_load *r_btree);
1818};
1819
1820#ifdef UNIV_DEBUG
1823#endif /* UNIV_DEBUG */
1824
1826 for (auto page_load : m_page_loads) {
1827 page_load->free();
1828 }
1829}
1830
1831namespace bulk {
1833 return m_btree_load.get_trx_id();
1834}
1835} /* namespace bulk */
1836
1837} /* namespace Btree_multi */
1838
1839#endif /* btr0mtib_h */
InnoDB Native API.
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:49
uint32_t page_no_t
Page number.
Definition: api0api.h:47
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
std::pair< page_no_t, page_no_t > Page_range_t
Definition: btr0btr.h:134
The B-tree bulk load.
static buf_frame_t * buf_block_get_frame(const buf_block_t *block)
Gets a pointer to the memory frame of a block.
Definition: btr0load.h:51
Definition: btr0mtib.h:1291
Merger(const size_t n_threads, Btree_loads &loads, dict_index_t *index, const trx_t *trx)
Definition: btr0mtib.h:1295
Btree_loads & m_btree_loads
Refernce to the subtrees to be merged.
Definition: btr0mtib.h:1353
std::vector< Btree_load *, ut::allocator< Btree_load * > > Btree_loads
Definition: btr0mtib.h:1293
const trx_t * m_trx
Transaction making the changes.
Definition: btr0mtib.h:1359
dict_index_t * m_index
Index which is being built.
Definition: btr0mtib.h:1356
void validate_boundaries()
Validate sub-tree boundaries.
Definition: btr0mtib.cc:2709
dberr_t insert_node_ptrs(std::vector< dtuple_t * > &all_node_ptrs, size_t &total_node_ptrs_size, size_t level)
Insert the given list of node pointers into pages at the given level.
Definition: btr0mtib.cc:3175
size_t get_max_free() const
Get the maximum free space available in an empty page in bytes.
Definition: btr0mtib.h:1308
void remove_empty_subtrees()
Remove any empty sub-trees with no records.
Definition: btr0mtib.cc:2696
dberr_t add_root_for_subtrees(const size_t highest_level)
Create root node for the stiched sub-trees by combining the nodes at highest level creating another l...
Definition: btr0mtib.cc:3017
Scoped_heap m_tuple_heap
Memory heap to store node pointers.
Definition: btr0mtib.h:1362
dberr_t merge(bool sort)
Definition: btr0mtib.cc:2635
const size_t m_n_threads
Number of loader threads.
Definition: btr0mtib.h:1350
void link_right_sibling(const page_no_t l_page_no, const page_no_t r_page_no)
Load the left page and update its FIL_PAGE_NEXT.
Definition: btr0mtib.cc:3147
dberr_t subtree_link_levels(size_t &highest_level)
Stich sub-trees together to form a tree with one or multiple nodes at highest leve.
Definition: btr0mtib.cc:2719
Helper to set wait callbacks for the current scope.
Definition: btr0mtib.h:936
~Wait_callbacks()
Definition: btr0mtib.h:947
Wait_callbacks(Btree_load *btree_load, Function &begin, Function &end)
Definition: btr0mtib.h:941
Btree_load * m_btree_load
Btree Load for the wait callbacks.
Definition: btr0mtib.h:954
std::function< void()> Function
Definition: btr0mtib.h:938
Definition: btr0mtib.h:891
~Btree_load() noexcept
Destructor.
Definition: btr0mtib.cc:1619
bulk::Blob_inserter m_full_blob_inserter
Need another blob inserter to store blobs with a single call using insert_blob()
Definition: btr0mtib.h:1283
dict_index_t * m_index
B-tree index.
Definition: btr0mtib.h:1231
Bulk_flusher m_bulk_flusher
Definition: btr0mtib.h:1286
dberr_t finish(bool is_err, const bool subtree) noexcept
Btree bulk load finish.
Definition: btr0mtib.cc:1974
Flush_observer * get_flush_observer() const
Definition: btr0mtib.cc:1615
dberr_t load_root_page(page_no_t last_page_no) noexcept
Set the root page on completion.
Definition: btr0mtib.cc:1850
dberr_t trigger_flusher() const
Trigger flusher thread and check for error.
Definition: btr0mtib.h:988
bool is_tpe_enabled() const
Check if transparent page encryption (TPE) is enabled.
Definition: btr0mtib.cc:2627
Bulk_extent_allocator & m_allocator
Reference to global extent allocator.
Definition: btr0mtib.h:1246
bool is_new_level(size_t level) const
Check if a new level is needed.
Definition: btr0mtib.h:1132
bool is_pk() const
Definition: btr0mtib.h:990
dberr_t check_key_overlap(const Btree_load *r_btree) const
Definition: btr0mtib.cc:3275
Btree_load(dict_index_t *index, trx_t *trx, size_t loader_num, size_t flush_queue_size, Bulk_extent_allocator &allocator) noexcept
Constructor.
Definition: btr0mtib.cc:1596
dict_index_t * index() const
Get the index object.
Definition: btr0mtib.h:994
size_t get_max_flush_queue_size() const
Definition: btr0mtib.h:1208
void block_remove(const page_no_t page_no)
Remove the given block from the internal cache of blocks.
dberr_t insert(dtuple_t *dtuple, size_t level) noexcept
Insert a tuple to a page in a level.
Definition: btr0mtib.cc:1746
dtuple_t * m_prev_tuple
The previous tuple that has been inserted.
Definition: btr0mtib.h:1261
void force_evict(const Page_range_t &range, const bool dirty_is_ok=true)
Evict all the pages in the given range from the buffer pool.
Definition: btr0mtib.cc:2077
std::ostream & print_right_pages(std::ostream &out) const
Definition: btr0mtib.cc:2038
size_t m_root_level
Root page level.
Definition: btr0mtib.h:1239
std::vector< page_no_t, ut::allocator< page_no_t > > m_first_page_nos
First page numbers of each level.
Definition: btr0mtib.h:1138
byte m_fseg_hdr_leaf[FSEG_HEADER_SIZE]
Definition: btr0mtib.h:1153
void block_put(buf_block_t *block)
Add the given block the internal cache of blocks.
dberr_t init()
Initialize.
Definition: btr0mtib.cc:2170
void add_blobs_to_bulk_flusher()
Add blob extents to the bulk flusher and wait till they are flushed.
Definition: btr0mtib.cc:1706
Bulk_extent_allocator::Type m_alloc_type
Page allocation type.
Definition: btr0mtib.h:1224
Page_range_t m_page_range_leaf
Page numbers of the pages that has been allocated in the leaf level.
Definition: btr0mtib.h:1147
void get_root_page_stat(Page_stat &stat)
Get information about root page.
Definition: btr0mtib.cc:2088
size_t m_loader_num
Loader number.
Definition: btr0mtib.h:1266
Level_ctxs m_level_ctxs
Context information for each level of the B-tree.
Definition: btr0mtib.h:1243
page_no_t get_subtree_root() const
Get the root page number of this tree/subtree.
Definition: btr0mtib.h:1000
size_t m_stat_n_pages
Number of pages allocated for this B-tree.
Definition: btr0mtib.h:1165
trx_t * m_trx
Transaction id.
Definition: btr0mtib.h:1236
dberr_t flush_blobs() noexcept
Flush the blob pages.
dberr_t open_blob(Blob_context &blob_ctx, lob::ref_t &ref)
Create a blob.
Definition: btr0mtib.h:908
mem_heap_t * m_heap_order
Memory heap to be used for sort order checks.
Definition: btr0mtib.h:1255
dberr_t prepare_space(Page_load *&page_load, size_t level, size_t rec_size) noexcept
Prepare space to insert a tuple.
Definition: btr0mtib.cc:1627
std::list< Page_extent * > m_extents_tracked
Extents that are being tracked.
Definition: btr0mtib.h:1249
void track_page_flush(page_no_t page_no)
Save flushed page numbers for debugging purposes.
Definition: btr0mtib.h:977
std::ostream & print_left_pages(std::ostream &out) const
Definition: btr0mtib.cc:2029
ddl::Compare_key m_compare_key
Function object to compare two tuples.
Definition: btr0mtib.h:1258
bulk::Blob_inserter m_blob_inserter
Blob inserter to handle the externally stored fields of InnoDB.
Definition: btr0mtib.h:1279
size_t get_root_level() const
Get the level of the root page.
Definition: btr0mtib.h:1004
dberr_t alloc_extent(Page_range_t &page_range, size_t level)
Allocate an extent.
Definition: btr0mtib.cc:694
bool is_extent_tracked(const Page_extent *page_extent) const
Definition: btr0mtib.h:1365
dberr_t insert_blob(lob::ref_t &ref, const dfield_t *dfield)
Definition: btr0mtib.h:900
bool m_check_order
If true, check if data is inserted in sorted order.
Definition: btr0mtib.h:1252
bool is_tpc_enabled() const
Check if transparent page compression (TPC) is enabled.
Definition: btr0mtib.cc:2617
static bool validate_index(dict_index_t *index)
Check size and validate index of limited size.
Definition: btr0mtib.cc:1954
trx_id_t get_trx_id() const
Get the transaction id.
Definition: btr0mtib.cc:1614
void disable_check_order()
If the data is already sorted and checked for duplicates, then we can disable doing it again.
Definition: btr0mtib.h:1214
bool is_interrupted() const
Check if the index build operation has been interrupted.
Definition: btr0mtib.cc:3340
uint64_t m_n_recs
Number of records inserted.
Definition: btr0mtib.h:1228
Wait_callbacks::Function m_fn_wait_begin
Definition: btr0mtib.h:1271
const char * get_table_name() const
Definition: btr0mtib.h:996
void track_extent(Page_extent *page_extent)
All allocated extents registers with Btree_load.
Definition: btr0mtib.cc:2114
void split_rightmost(buf_block_t *block, size_t level, dtuple_t *node_ptr, mtr_t *mtr, size_t &highest_level)
Split the right most block of the tree at the given level.
Definition: btr0mtib.cc:3357
fil_space_t * m_space
Definition: btr0mtib.h:1233
Page_range_t m_page_range_top
Page numbers of the pages that has been allocated in the non-leaf level.
Definition: btr0mtib.h:1151
Wait_callbacks::Function m_fn_wait_end
Definition: btr0mtib.h:1274
void add_to_bulk_flusher(bool finish=false)
Add fully used extents to the bulk flusher.
Definition: btr0mtib.cc:1722
unsigned m_index_online
State of the index.
Definition: btr0mtib.h:1159
byte m_fseg_hdr_top[FSEG_HEADER_SIZE]
Definition: btr0mtib.h:1154
dberr_t page_commit(Page_load *page_load, Page_load *next_page_load, bool insert_father) noexcept
Commit(finish) a page.
Definition: btr0mtib.cc:1555
void split_leftmost(buf_block_t *&block, size_t level, dtuple_t *node_ptr, mtr_t *mtr, size_t &highest_level)
Split the left most block of the tree at the given level.
Definition: btr0mtib.cc:3456
dberr_t fil_io(buf_block_t *block) noexcept
Initiate a direct file write operation.
dberr_t finalize_page_loads(bool is_err, page_no_t &last_page_no) noexcept
Btree page bulk load finish.
Definition: btr0mtib.cc:1818
std::string print_pages_in_level(const size_t level) const
Definition: btr0mtib.cc:1901
void print_tree_pages() const
Definition: btr0mtib.cc:2048
Level_ctx * get_level(size_t level) const
Get the level context object.
Definition: btr0mtib.h:1744
dberr_t close_blob(Blob_context blob_ctx, lob::ref_t &ref)
Indicate that the blob has been completed, so that resources can be removed, and as necessary flushin...
Definition: btr0mtib.h:928
const page_size_t m_page_size
Definition: btr0mtib.h:1268
Bulk_extent_allocator & get_extent_allocator()
Definition: btr0mtib.h:1216
std::vector< Level_ctx *, ut::allocator< Level_ctx * > > Level_ctxs
Definition: btr0mtib.h:933
buf_block_t * block_get(page_no_t page_no) const noexcept
Search for a BUF_BLOCK_MEMORY block with given page number in the local cache.
std::vector< page_no_t, ut::allocator< page_no_t > > m_last_page_nos
Last page numbers of each level.
Definition: btr0mtib.h:1135
bool verify_blob_context(Blob_context ctx) const
Definition: btr0mtib.h:1218
size_t m_stat_n_extents
Number of extents allocated for this B-tree.
Definition: btr0mtib.h:1162
dberr_t write_blob(Blob_context blob_ctx, lob::ref_t &ref, const byte *data, size_t len)
Write data into the blob.
Definition: btr0mtib.h:918
Definition: btr0mtib.h:473
~Bulk_extent_allocator()
Destructor to ensure thread stop.
Definition: btr0mtib.h:483
Extent_cache m_leaf_extents
Cached leaf extents.
Definition: btr0mtib.h:619
dict_table_t * m_table
Innodb dictionary table object.
Definition: btr0mtib.h:640
std::chrono::microseconds m_allocator_wait_time
Total allocator wait time in micro seconds.
Definition: btr0mtib.h:613
size_t m_allocator_wait_count
Number of times allocator had to wait.
Definition: btr0mtib.h:607
size_t m_concurrency
Number of concurrent consumers.
Definition: btr0mtib.h:647
uint64_t init(dict_table_t *table, dict_index_t *index, trx_t *trx, size_t size, size_t num_threads, bool in_pages)
Check size and set extent allocator size parameters.
Definition: btr0mtib.cc:2202
std::condition_variable m_consumer_condition
Condition variable for extent consumer threads.
Definition: btr0mtib.h:631
bool check(size_t &n_leaf, size_t &n_non_leaf, bool &trigger)
Check if leaf and non-leaf extent cache needs to be filled.
Definition: btr0mtib.cc:2476
std::thread m_thread
Bulk extent allocator.
Definition: btr0mtib.h:601
size_t m_consumer_wait_count
Number of times consumer(s) had to wait.
Definition: btr0mtib.h:604
static constexpr size_t S_BULK_EXTEND_SIZE_MAX
Maximum size by which the tablespace is extended each time.
Definition: btr0mtib.h:518
dberr_t allocate(bool is_leaf, bool alloc_page, Page_range_t &range, std::function< void()> &fn_wait_begin, std::function< void()> &fn_wait_end)
Allocate a page range - currently ans Extent.
Definition: btr0mtib.cc:2360
dberr_t m_error
Error code, protected by m_mutex.
Definition: btr0mtib.h:637
static constexpr size_t S_MAX_RANGES
Upper bound for max ranges.
Definition: btr0mtib.h:515
dict_index_t * m_index
Definition: btr0mtib.h:641
trx_t * m_trx
Innodb transaction - used for checking interrupt.
Definition: btr0mtib.h:644
Extent_cache m_non_leaf_extents
Cached non-leaf extents.
Definition: btr0mtib.h:622
void allocator_wait() const
Allocator wait function.
Definition: btr0mtib.cc:2496
dberr_t allocate_extent(bool is_leaf, mtr_t &mtr, Page_range_t &range)
Allocate one extent.
Definition: btr0mtib.cc:2355
bool is_interrupted()
Definition: btr0mtib.cc:2306
dberr_t allocate_page(bool is_leaf, Page_range_t &range)
Allocate one page.
Definition: btr0mtib.cc:2310
dberr_t run()
Extent thread executor.
Definition: btr0mtib.cc:2563
void start()
Definition: btr0mtib.cc:2273
std::mutex m_mutex
This mutex protects the m_queue.
Definition: btr0mtib.h:625
Type m_type
Page range type.
Definition: btr0mtib.h:616
Type
Definition: btr0mtib.h:475
bool m_stop
Flag to indicate if the bulk allocator thread should stop.
Definition: btr0mtib.h:634
std::chrono::microseconds m_consumer_wait_time
Total consumer wait time in micro seconds.
Definition: btr0mtib.h:610
dberr_t allocate_extents(bool is_leaf, size_t num_extents)
Allocate extents and fill the cache.
Definition: btr0mtib.cc:2515
void stop()
Stop extent allocator thread, if active.
Definition: btr0mtib.cc:2281
std::condition_variable m_allocator_condition
Condition variable for allocator thread.
Definition: btr0mtib.h:628
Definition: btr0mtib.h:650
dberr_t check_and_notify() const
Check for flusher error and wake up flusher thread.
Definition: btr0mtib.cc:152
dberr_t m_error
Error code, protected by m_mutex.
Definition: btr0mtib.h:736
void add_to_free_queue(Page_extent *page_extent)
Definition: btr0mtib.cc:173
size_t m_pages_flushed
Number of pages flushed.
Definition: btr0mtib.h:762
space_id_t m_space_id
Bulk flusher is specific to a tablespace for now.
Definition: btr0mtib.h:765
std::atomic< bool > m_is_error
Set if error is encountered during flush.
Definition: btr0mtib.h:733
std::atomic< bool > m_stop
Flag to indicate if the bulk flusher thread should stop.
Definition: btr0mtib.h:730
dberr_t get_error() const
Definition: btr0mtib.cc:87
std::vector< Page_extent * > m_free_queue
This queue is protected by the m_free_mutex.
Definition: btr0mtib.h:722
dberr_t run()
Thread main function.
Definition: btr0mtib.cc:224
size_t m_id
Flusher ID.
Definition: btr0mtib.h:768
bool is_error() const
Definition: btr0mtib.h:688
Page_extent * get_free_extent()
Definition: btr0mtib.cc:163
std::mutex m_free_mutex
This mutex protects the m_free_queue.
Definition: btr0mtib.h:725
bool should_i_stop() const
Check if the bulk flush thread should stop working.
Definition: btr0mtib.h:703
size_t m_n_sleep
Number of times slept.
Definition: btr0mtib.h:750
std::mutex m_mutex
This mutex protects the m_queue.
Definition: btr0mtib.h:715
~Bulk_flusher()
Destructor.
Definition: btr0mtib.cc:101
void set_error(dberr_t error_code)
Set error code.
Definition: btr0mtib.cc:92
std::vector< Page_extent * > m_queue
This queue is protected by the m_mutex.
Definition: btr0mtib.h:712
std::thread m_flush_thread
Bulk flusher thread.
Definition: btr0mtib.h:747
size_t m_max_queue_size
Maximum queue size, defaults to 4.
Definition: btr0mtib.h:759
void start(space_id_t space_id, size_t index, size_t queue_size)
Start a new thread to do the flush work.
Definition: btr0mtib.cc:73
std::chrono::microseconds m_wait_time
Total sleep time in micro seconds.
Definition: btr0mtib.h:753
bool is_work_available()
Check if work is available for the bulk flusher thread.
Definition: btr0mtib.cc:208
std::vector< Page_extent * > m_priv_queue
Private queue (private to the bulk flush thread) containing the extents to flush.
Definition: btr0mtib.h:744
void wait_to_stop()
Wait till the bulk flush thread stops.
Definition: btr0mtib.cc:112
std::vector< page_no_t > m_flushed_page_nos
Vector of page numbers that are flushed by this Bulk_flusher object.
Definition: btr0mtib.h:773
size_t get_max_queue_size() const
Get the maximum allowed queue size.
Definition: btr0mtib.h:682
std::condition_variable m_condition
Condition variable to wait upon.
Definition: btr0mtib.h:718
void info()
Print useful information to the server log file while exiting.
Definition: btr0mtib.cc:2187
void wait()
When no work is available, put the thread to sleep.
Definition: btr0mtib.cc:272
void add(Page_extent *page_extent, std::function< void()> &fn_wait_begin, std::function< void()> &fn_wait_end)
Add a page extent to the bulk flush queue.
Definition: btr0mtib.cc:178
static constexpr std::chrono::milliseconds s_sleep_duration
The sleep duration in milliseconds.
Definition: btr0mtib.h:756
void do_work(fil_node_t *node)
Do the actual work of flushing.
Definition: btr0mtib.cc:125
The proper function call sequence of Page_load is as below: – Page_load::init – Page_load::insert – P...
Definition: btr0mtib.h:1380
dberr_t init_mem(const page_no_t new_page_no, Page_extent *page_extent) noexcept
Definition: btr0mtib.cc:956
dberr_t store_ext(const big_rec_t *big_rec, Rec_offsets offsets) noexcept
Store external record Since the record is not logged yet, so we don't log update to the record.
void set_level(size_t level) noexcept
Set the level of this page.
Definition: btr0mtib.h:1581
buf_block_t * get_block()
Definition: btr0mtib.h:1647
space_id_t space() const noexcept
Get the table space ID.
Definition: btr0mtib.h:1737
void rollback() noexcept
Commit mtr for a page.
Definition: btr0mtib.cc:1397
dberr_t init_mem_blob(const page_no_t page_no, Page_extent *page_extent) noexcept
Initialize a memory block to be used for storing blobs.
Definition: btr0mtib.cc:919
bool is_corrupted() const
Check if page is corrupted.
Definition: btr0mtib.cc:317
trx_id_t m_trx_id
The transaction id.
Definition: btr0mtib.h:1670
byte * m_heap_top
The heap top in page for next insert.
Definition: btr0mtib.h:1691
size_t get_level() const noexcept
Get page level.
Definition: btr0mtib.h:1578
rec_t * m_last_slotted_rec
Last record assigned to a slot.
Definition: btr0mtib.h:1713
bool make_ext(dtuple_t *tuple)
Store externally the first possible field of the given tuple.
Definition: btr0mtib.cc:1521
dict_index_t * index()
Definition: btr0mtib.h:1645
void set_level_ctx(Level_ctx *level_ctx)
Set the level context object for this page load.
Definition: btr0mtib.h:1635
void set_trx_id(const trx_id_t trx_id)
Set the transaction id.
Definition: btr0mtib.h:1434
size_t copy_to(std::vector< Page_load * > &to_pages)
Distribute all records from this page to the given pages.
Definition: btr0mtib.cc:1435
size_t copy_records(const rec_t *first_rec) noexcept
Copy given and all following records.
Definition: btr0mtib.cc:1466
void set_flush_observer(Flush_observer *observer)
Set the flush observer.
Definition: btr0mtib.h:1442
void set_page_extent(Page_extent *page_extent)
Definition: btr0mtib.h:1649
size_t get_rec_no() const
Get record no.
Definition: btr0mtib.h:1584
trx_id_t get_trx_id() const
Get the current transaction identifier.
Definition: btr0mtib.h:1438
void set_min_rec_flag()
Set the REC_INFO_MIN_REC_FLAG on the first user record in this page.
Definition: btr0mtib.cc:2058
page_no_t get_page_no() const noexcept
Get the page number of this page load object.
Definition: btr0mtib.h:1556
void set_next(page_no_t next_page_no) noexcept
Set next page.
Definition: btr0mtib.cc:1485
size_t get_page_size() const noexcept
Get the physical page size of the underlying tablespace.
Definition: btr0mtib.h:1739
dict_index_t * m_index
The index B-tree.
Definition: btr0mtib.h:1664
size_t m_slotted_rec_no
Number of records assigned to slots.
Definition: btr0mtib.h:1716
dberr_t insert(const dtuple_t *tuple, const big_rec_t *big_rec, size_t rec_size) noexcept
Insert a tuple in the page.
Definition: btr0mtib.cc:1267
Flush_observer * m_flush_observer
Flush observer.
Definition: btr0mtib.h:1710
bool verify_space_id() const
Obtain tablespace id from the frame and the buffer block and ensure that they are the same.
Definition: btr0mtib.cc:3345
void free()
Free the memory block.
Definition: btr0mtib.cc:2106
uint64_t m_modify_clock
The modify clock value of the buffer block when the block is re-pinned.
Definition: btr0mtib.h:1707
void set_prev(page_no_t prev_page_no) noexcept
Set previous page.
Definition: btr0mtib.cc:1489
bool has_level_ctx() const
Check if this page load object contains a level context object.
Definition: btr0mtib.h:1640
Page_load(dict_index_t *index, Btree_load *btree_load)
Ctor.
Definition: btr0mtib.cc:887
size_t m_rec_no
User record no.
Definition: btr0mtib.h:1694
std::atomic_bool m_is_cached
true iff the Page load is cached.
Definition: btr0mtib.h:1728
static void drop(Page_load *page_load)
Release the page loader.
Definition: btr0mtib.cc:668
bool is_memory() const
Check if state of this page is BUF_BLOCK_MEMORY.
Definition: btr0mtib.h:1401
bool is_leaf() const
Definition: btr0mtib.h:1446
bool is_space_available(size_t rec_size) const noexcept
Check if required space is available in the page for the rec to be inserted.
Definition: btr0mtib.cc:1497
void reset() noexcept
Reset this object so that Page_load::init() can be called again on this object.
Definition: btr0mtib.cc:1100
size_t get_data_size() const
Definition: btr0mtib.h:1597
bool need_ext(const dtuple_t *tuple, size_t rec_size) const noexcept
Check whether the record needs to be stored externally.
Definition: btr0mtib.cc:1539
size_t m_level
The page level in B-tree.
Definition: btr0mtib.h:1685
rec_t * m_cur_rec
The current rec, just before the next insert rec.
Definition: btr0mtib.h:1679
dberr_t alloc() noexcept
Allocate a page for this Page_load object.
Definition: btr0mtib.cc:1049
void set_page_no(const page_no_t page_no)
Set the page number of this object.
Definition: btr0mtib.cc:878
size_t m_reserved_space
The reserved space for fill factor.
Definition: btr0mtib.h:1700
mem_heap_t * m_heap
Memory heap for internal allocation.
Definition: btr0mtib.h:1661
static Page_load * create(Btree_load *btree_load, Page_extent *page_extent)
A static member function to create this object.
Definition: btr0mtib.cc:658
page_id_t get_page_id() const noexcept
Definition: btr0mtib.h:1558
void latch() noexcept
Start mtr and latch block.
Page_extent * m_page_extent
Definition: btr0mtib.h:1725
bool is_cached() const
Definition: btr0mtib.h:1657
page_t * get_page() noexcept
Definition: btr0mtib.h:1591
bool is_index_locked() noexcept
Check if index is X locked.
Definition: btr0mtib.cc:1546
Page_load(dict_index_t *index, trx_id_t trx_id, page_no_t page_no, size_t level, Flush_observer *observer, Btree_load *btree_load=nullptr) noexcept
Constructor.
Definition: btr0mtib.h:1419
void set_top_seg(const fseg_header_t *hdr)
Definition: btr0mtib.h:1454
dberr_t reinit() noexcept
Re-initialize this page.
Definition: btr0mtib.cc:1028
~Page_load() noexcept
Destructor.
Definition: btr0mtib.cc:3329
void set_leaf_seg(const fseg_header_t *hdr)
Definition: btr0mtib.h:1451
bool is_min_rec_flag() const
Definition: btr0mtib.cc:2060
dberr_t commit() noexcept
Commit mtr for a page.
Definition: btr0mtib.cc:1363
size_t copy_all(const page_t *src_page) noexcept
Copy all records from page.
Definition: btr0mtib.cc:1426
size_t m_free_space
The free space left in the page.
Definition: btr0mtib.h:1697
void set_cached()
Mark the Page load as cached.
Definition: btr0mtib.h:1654
const bool m_is_comp
Flag: is page in compact format.
Definition: btr0mtib.h:1688
Btree_load * m_btree_load
Definition: btr0mtib.h:1721
page_no_t get_prev() noexcept
Get previous page (FIL_PAGE_PREV).
Definition: btr0mtib.cc:1493
mtr_t * m_mtr
The min-transaction.
Definition: btr0mtib.h:1667
const page_t * get_page() const noexcept
Get page.
Definition: btr0mtib.h:1587
bool m_modified
Page modified flag.
Definition: btr0mtib.h:1719
buf_block_t * m_block
The buffer block.
Definition: btr0mtib.h:1673
void print_child_page_nos() noexcept
Print the child page numbers.
Definition: btr0mtib.cc:1410
page_no_t m_page_no
The page no.
Definition: btr0mtib.h:1682
Level_ctx * m_level_ctx
Definition: btr0mtib.h:1723
dberr_t init() noexcept
Initialize members and allocate page if needed and start mtr.
Definition: btr0mtib.cc:1132
size_t m_total_data
Total data in the page.
Definition: btr0mtib.h:1703
void init_for_writing()
Definition: btr0mtib.cc:332
void finish() noexcept
Mark end of insertion to the page.
Definition: btr0mtib.cc:1304
page_t * m_page
The page.
Definition: btr0mtib.h:1676
dtuple_t * get_node_ptr() noexcept
Get node pointer.
Definition: btr0mtib.h:1733
Used to insert many blobs into InnoDB.
Definition: btr0mtib.h:782
Page_load * alloc_data_page()
Allocate a data page.
Definition: btr0mtib.cc:3921
Page_range_t m_page_range_first
Definition: btr0mtib.h:863
Page_load * alloc_first_page()
Allocate a LOB first page.
Definition: btr0mtib.cc:3901
Page_load * alloc_index_page()
Allocate a LOB index page.
Definition: btr0mtib.cc:3905
ut::Object_cache< Page_load > m_page_load_cache
Cache of Page_load objects.
Definition: btr0mtib.h:877
Page_extent * alloc_free_extent()
Definition: btr0mtib.cc:3860
Blob_inserter(Btree_load &btree_load)
Constructor.
Definition: btr0mtib.cc:3699
Page_load * alloc_page_from_extent(Page_extent *&m_page_extent)
Definition: btr0mtib.cc:3869
trx_id_t get_trx_id() const
Get the current transaction id.
Definition: btr0mtib.h:1832
~Blob_inserter()
Definition: btr0mtib.cc:3948
Page_extent * m_page_extent_first
Page extent from which to allocate first pages of blobs.
Definition: btr0mtib.h:861
dberr_t write_blob(Blob_context blob_ctx, lob::ref_t &ref, const byte *data, size_t len)
Write data into the blob.
Definition: btr0mtib.cc:3826
ut::Object_cache< Page_extent > m_page_extent_cache
Cache of Page_extent objects.
Definition: btr0mtib.h:880
dberr_t close_blob(Blob_context blob_ctx, lob::ref_t &ref)
Indicate that the blob has been completed, so that resources can be removed, and as necessary flushin...
Definition: btr0mtib.cc:3832
void finish()
Definition: btr0mtib.cc:3929
bool verify_blob_context(Blob_context ctx) const
Definition: btr0mtib.h:848
std::list< Page_extent * > m_index_extents
Page extent from which to allocate index pages of blobs.
Definition: btr0mtib.h:871
Blob_context m_blob
The current blob being inserted.
Definition: btr0mtib.h:874
dberr_t insert_blob(lob::ref_t &ref, const dfield_t *dfield)
Definition: btr0mtib.h:796
dberr_t open_blob(Blob_context &blob_ctx, lob::ref_t &ref)
Create a blob.
Definition: btr0mtib.cc:3821
dberr_t init()
Initialize by allocating necessary resources.
Definition: btr0mtib.cc:3706
Btree_load & m_btree_load
Definition: btr0mtib.h:857
ut::unique_ptr< Blob_handle > m_blob_handle
Only one blob handle per sub-tree.
Definition: btr0mtib.h:883
Page_extent * m_page_extent_data
Page extent from which to allocate data pages of blobs.
Definition: btr0mtib.h:867
We use Flush_observer to track flushing of non-redo logged pages in bulk create index(btr0load....
Definition: buf0flu.h:283
The proper function call sequence of Page_load is as below: – Page_load::init – Page_load::insert – P...
Definition: btr0load.cc:55
A helper RAII wrapper for otherwise difficult to use sequence of:
Definition: rem0rec.h:292
page_id_t id
Page id.
Definition: buf0buf.h:1379
Node of a tablespace encapsulating handle required for any IO operations on this node.
Definition: fil0fil.h:177
Tablespace or log data space.
Definition: fil0fil.h:506
Page identifier.
Definition: buf0types.h:191
Page size descriptor.
Definition: page0size.h:50
size_t physical() const
Retrieve the physical page size (on-disk).
Definition: page0size.h:129
A utility class which, if inherited from, prevents the descendant class from being copied,...
Definition: ut0class_life_cycle.h:41
A class to manage objects of type T.
Definition: ut0object_cache.h:40
const char * p
Definition: ctype-mb.cc:1227
dberr_t
Definition: db0err.h:39
@ DB_SUCCESS
Definition: db0err.h:43
DDL key comparison.
Data dictionary system.
static bool dict_table_is_comp(const dict_table_t *table)
Check whether the table uses the compact page format.
static ulint dict_index_is_spatial(const dict_index_t *index)
Check whether the index is a Spatial Index.
constexpr page_no_t FIL_NULL
'null' (undefined) page offset in the context of file spaces
Definition: fil0fil.h:1502
#define FSP_EXTENT_SIZE
File space extent size in pages page size | file space extent size -------—+--------------------— 4 K...
Definition: fsp0types.h:64
constexpr uint32_t FSEG_HEADER_SIZE
Length of the file system header, in bytes.
Definition: fsp0types.h:94
byte fseg_header_t
Data type for file segment header.
Definition: fsp0types.h:85
#define free(A)
Definition: lexyy.cc:915
For bulk loading large objects.
Implements the large objects (LOB) module.
Definition: btr0mtib.cc:59
void * Blob_context
Definition: btr0mtib.h:62
void bulk_load_enable_slow_io_debug()
Definition: btr0mtib.cc:64
void bulk_load_disable_slow_io_debug()
Definition: btr0mtib.cc:65
std::ostream & operator<<(std::ostream &out, const Page_extent &obj)
Definition: btr0mtib.h:315
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Used for bulk load of data.
Definition: fut0lst.cc:411
PT & ref(PT *tp)
Definition: tablespace_impl.cc:359
bool index(const std::string &value, const String &search_for, uint32_t *idx)
Definition: contains.h:76
static Value err()
Create a Value object that represents an error condition.
Definition: json_binary.cc:943
std::chrono::milliseconds milliseconds
Definition: authorize_manager.cc:69
noexcept
The return type for any call_and_catch(f, args...) call where f(args...) returns Type.
Definition: call_and_catch.h:76
const char * begin(const char *const c)
Definition: base64.h:44
size_t size(const char *const c)
Definition: base64.h:46
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
Define std::hash<Gtid>.
Definition: gtid.h:355
std::vector< T, ut::allocator< T > > vector
Specialization of vector which uses allocator.
Definition: ut0new.h:2724
void delete_(T *ptr) noexcept
Releases storage which has been dynamically allocated through any of the ut::new*() variants.
Definition: ut0new.h:651
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2284
The page cursor.
static ulint page_get_free_space_of_empty(bool comp)
Calculates free space if a page is emptied.
static ulint page_get_data_size(const page_t *page)
Returns the sum of the sizes of the records in the record list excluding the infimum and supremum rec...
constexpr uint32_t PAGE_HEADER
index page header starts at this offset
Definition: page0types.h:53
constexpr uint32_t PAGE_BTR_SEG_LEAF
file segment header for the leaf pages in a B-tree: defined only on the root page of a B-tree,...
Definition: page0types.h:90
constexpr uint32_t PAGE_BTR_SEG_TOP
Definition: page0types.h:98
byte page_t
Type of the index page.
Definition: page0types.h:152
byte rec_t
Definition: rem0types.h:41
Interface between Innobase row operations and MySQL.
Function object to compare two Btree_load objects.
Definition: btr0mtib.h:1814
dict_index_t * m_index
Definition: btr0mtib.h:1817
bool operator()(const Btree_load *l_btree, const Btree_load *r_btree)
Definition: btr0mtib.cc:2125
Btree_load_compare(dict_index_t *index)
Definition: btr0mtib.h:1815
bool is_empty() const
Definition: btr0mtib.h:526
size_t m_max_range
Maximum number of ranges to pre-allocate.
Definition: btr0mtib.h:554
void init(size_t max_range)
Initialize cache.
Definition: btr0mtib.cc:2194
bool check(size_t &num_alloc, size_t &num_free) const
Check for number of extents to be allocated and cached.
Definition: btr0mtib.cc:2457
std::array< Page_range_t, S_MAX_RANGES > m_ranges
Cached page ranges already allocated to the segment.
Definition: btr0mtib.h:551
std::atomic< size_t > m_num_consumed
Total number of ranges allocated.
Definition: btr0mtib.h:560
void set_range(size_t index, Page_range_t &range)
Set allocated range(extent) in cache.
Definition: btr0mtib.cc:2448
std::atomic< size_t > m_num_allocated
Total number of ranges allocated.
Definition: btr0mtib.h:557
bool is_full() const
Definition: btr0mtib.h:529
bool get_range(Page_range_t &range, bool &alloc_trigger)
Get one page range from the cache.
Definition: btr0mtib.cc:2428
Context information for each level.
Definition: btr0mtib.h:352
size_t m_stat_n_extents
Number of extents allocated at this level.
Definition: btr0mtib.h:456
buf_block_t * alloc(const page_no_t new_page_no) noexcept
Allocate private memory buffer (BUF_BLOCK_MEMORY) block for given page number.
Definition: btr0mtib.cc:848
dict_index_t * m_index
The index which is being built.
Definition: btr0mtib.h:441
void build_page_cache()
Build page loader cache for current exent.
Definition: btr0mtib.cc:761
bool load_extent_from_cache()
Load one extent from extent cache.
Definition: btr0mtib.cc:708
dberr_t init()
Initialize.
Definition: btr0mtib.cc:801
Btree_load * m_btree_load
A back pointer to conceptually higher level btree load object.
Definition: btr0mtib.h:450
void set_current_page_load(Page_load *sibling)
Definition: btr0mtib.h:469
page_no_t m_last_page
The page_no of the last page in this level.
Definition: btr0mtib.h:438
~Level_ctx()
Destructor.
Definition: btr0mtib.cc:3327
const size_t m_level
The B-tree level whose context information is stored in this obj.
Definition: btr0mtib.h:444
void build_extent_cache()
Build the extent cache.
Definition: btr0mtib.cc:775
void free_page_load()
Free the current page load.
Definition: btr0mtib.cc:689
Page_load * create_page_load()
Definition: btr0mtib.cc:675
std::vector< page_no_t > m_pages_allocated
Definition: btr0mtib.h:463
trx_id_t get_trx_id() const
Definition: btr0mtib.h:1773
static void destroy(Level_ctx *obj)
Static member function to destroy a Level_ctx object.
Definition: btr0mtib.cc:644
std::vector< Page_extent * > m_cached_extents
Pre allocated extents to prevent repeated allocation and free.
Definition: btr0mtib.h:432
dberr_t alloc_page_num(page_no_t &page_no)
Allocate a page number.
Definition: btr0mtib.cc:577
Level_ctx(dict_index_t *index, size_t level, Btree_load *btree_load)
Constructor.
Definition: btr0mtib.h:371
bool m_extent_full
True if the current extent is full.
Definition: btr0mtib.h:459
dberr_t alloc_extent()
Allocate one extent in the relevant file segment.
Definition: btr0mtib.cc:614
size_t m_stat_n_pages
Number of pages allocated at this level.
Definition: btr0mtib.h:453
bool is_page_tracked(const page_no_t &page_no) const
Definition: btr0mtib.cc:608
Page_load * m_page_load
The Page_load of the current page being loaded.
Definition: btr0mtib.h:447
Page_load * get_page_load_from_cache()
Get a free page loader from cache.
Definition: btr0mtib.cc:743
Page_extent * m_page_extent
The current extent that is being loaded.
Definition: btr0mtib.h:415
page_no_t m_first_page
The page_no of the first page in this level.
Definition: btr0mtib.h:435
Page_load * get_page_load() const
Definition: btr0mtib.h:467
bool is_leaf() const
Check if this is leaf level.
Definition: btr0mtib.h:386
static Level_ctx * create(dict_index_t *index, size_t level, Btree_load *btree_load)
Static member function construct a Level_ctx object.
Definition: btr0mtib.cc:636
Allocate, use, manage and flush one extent pages (FSP_EXTENT_SIZE).
Definition: btr0mtib.h:69
Page_extent(Btree_load *btree_load, const bool is_leaf)
Constructor.
Definition: btr0mtib.h:1781
static void drop(Page_extent *extent)
Release the page extent.
Definition: btr0mtib.h:1800
bool is_blob() const
Check if this is a blob extent.
Definition: btr0mtib.h:225
void set_cached()
Mark the extent as cached.
Definition: btr0mtib.h:202
size_t m_next_cached_page_load_index
Next cached page load index.
Definition: btr0mtib.h:248
void get_page_numbers(std::vector< page_no_t > &page_numbers) const
Definition: btr0mtib.h:256
std::atomic_bool m_is_free
true if the cached entry is free to be used.
Definition: btr0mtib.h:244
std::vector< Page_load * > m_page_loads
All the page loaders of the used pages.
Definition: btr0mtib.h:89
bool is_null() const
Definition: btr0mtib.h:123
bool is_valid() const
Check if the range is valid.
Definition: btr0mtib.h:296
bool m_is_blob
True if this extent is used for blobs.
Definition: btr0mtib.h:251
bool is_any_used() const
Check if there are any pages used.
Definition: btr0mtib.h:155
page_no_t alloc()
Allocate a page number.
Definition: btr0mtib.h:328
void init()
Initialize the next page number to be allocated.
Definition: btr0mtib.h:338
std::ostream & print(std::ostream &out) const
Definition: btr0mtib.h:307
dberr_t destroy()
Free all resources.
Definition: btr0mtib.cc:567
std::pair< page_no_t, page_no_t > Page_range_t
Definition: btr0mtib.h:70
std::vector< Page_load * > m_cached_page_loads
Cached page loads.
Definition: btr0mtib.h:246
size_t used_pages() const
Calculate the number of used pages.
Definition: btr0mtib.h:111
void set_page_load(page_no_t page_no, Page_load *page_load)
Member of Page_extent.
Definition: btr0mtib.h:263
page_no_t page_count() const
Number of pages in this extent.
Definition: btr0mtib.h:347
dberr_t flush_one_by_one(fil_node_t *node)
Flush one page at a time.
Definition: btr0mtib.cc:404
page_no_t m_page_no
Next page number to be used.
Definition: btr0mtib.h:82
void set_blob()
Mark that this extent is used for blobs.
Definition: btr0mtib.h:221
void reset_range(const Page_range_t &range)
Reset the range with the given value.
Definition: btr0mtib.h:319
std::atomic_bool m_is_owned_by_bulk_flusher
True if this extent has been handed over to the bulk flusher.
Definition: btr0mtib.h:232
Page_range_t m_range
Page numbers of the pages that has been allocated in this extent.
Definition: btr0mtib.h:86
bool is_fully_used() const
Check if no more pages are there to be used.
Definition: btr0mtib.h:150
dberr_t flush(fil_node_t *node)
Flush the used pages to disk.
Definition: btr0mtib.cc:496
bool is_free() const
Definition: btr0mtib.h:209
void destroy_cached()
Free any cached page load entries.
Definition: btr0mtib.cc:559
void append(Page_load *page_load)
Save a page_load.
Definition: btr0mtib.h:1758
Page_range_t pages_to_free() const
size_t last() const
Get the index of the first unused page load.
Definition: btr0mtib.h:117
void set_state(bool free)
Set and unset free state of a cached extent.
Definition: btr0mtib.h:206
std::atomic_bool m_is_cached
true iff the extent is cached.
Definition: btr0mtib.h:242
void free_memory_blocks()
Free the BUF_BLOCK_MEMORY blocks used by this extent.
Definition: btr0mtib.h:1825
bool is_btree_load_nullptr() const
Definition: btr0mtib.h:91
dberr_t bulk_flush(fil_node_t *node)
Flush 1 extent pages at a time.
Definition: btr0mtib.cc:482
bool is_cached() const
Definition: btr0mtib.h:212
void reset_cached_page_loads()
Reset page load cache to free all.
Definition: btr0mtib.h:215
space_id_t space() const
Definition: btr0mtib.h:1777
static Page_extent * create(Btree_load *btree_load, const bool is_leaf, const bool is_blob)
Create an object of type Page_extent in the heap.
Definition: btr0mtib.h:1789
Page_load * get_page_load(page_no_t page_no)
Member of Page_extent.
Definition: btr0mtib.h:278
~Page_extent()
Destructor.
Definition: btr0mtib.h:288
Btree_load * m_btree_load
Definition: btr0mtib.h:236
bool m_is_leaf
true if this extent belongs to leaf segment.
Definition: btr0mtib.h:239
Information about a buffer page.
Definition: btr0mtib.h:1750
size_t m_n_recs
Number of user records in the page.
Definition: btr0mtib.h:1752
size_t m_data_size
Number of bytes of data.
Definition: btr0mtib.h:1755
Heap wrapper that destroys the heap instance when it goes out of scope.
Definition: mem0mem.h:432
Storage format for overflow data in a big record, that is, a clustered index record which needs exter...
Definition: data0data.h:865
The buffer control block structure.
Definition: buf0buf.h:1756
buf_page_t page
page information; this must be the first field, so that buf_pool->page_hash can point to buf_page_t o...
Definition: buf0buf.h:1762
bool is_memory() const noexcept
Definition: buf0buf.h:2003
Compare the keys of an index.
Definition: ddl0impl-compare.h:41
Structure for an SQL data field.
Definition: data0data.h:625
unsigned len
data length; UNIV_SQL_NULL if SQL null
Definition: data0data.h:631
void * data
pointer to data
Definition: data0data.h:626
Data structure for an index.
Definition: dict0mem.h:1069
unsigned space
space where the index tree is placed
Definition: dict0mem.h:1086
bool is_clustered() const
Definition: dict0mem.h:1316
dict_table_t * table
back pointer to table
Definition: dict0mem.h:1083
page_size_t get_page_size() const
Get the page size of the tablespace to which this index belongs.
Definition: dict0mem.cc:927
Data structure for a database table.
Definition: dict0mem.h:1927
table_name_t name
Table name.
Definition: dict0mem.h:2002
Structure for an SQL data tuple of fields (logical record)
Definition: data0data.h:706
The struct 'lob::ref_t' represents an external field reference.
Definition: lob0lob.h:198
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:295
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:174
Definition: gen_lex_token.cc:149
char * m_name
The name in internal representation.
Definition: dict0mem.h:468
Definition: trx0trx.h:670
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
#define IF_DEBUG(...)
Definition: univ.i:677
unsigned long int ulint
Definition: univ.i:403
Utilities related to class lifecycle.
#define UT_LOCATION_HERE
Definition: ut0core.h:73
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:109
#define ut_a(EXPR)
Abort execution if EXPR does not evaluate to nonzero.
Definition: ut0dbg.h:97
Dynamic memory allocation routines and custom allocators specifically crafted to support memory instr...
#define UT_NEW_THIS_FILE_PSI_KEY
Definition: ut0new.h:408
Manage a cache of objects.