MySQL 8.0.40
Source Code Documentation
ddl0impl-merge.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2020, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/ddl0impl-merge.h
29 DDL cluster merge sort data structures.
30 Created 2020-11-01 by Sunny Bains. */
31
32#ifndef ddl0impl_merge_h
33#define ddl0impl_merge_h
34
35#include <vector>
36
38
39namespace ddl {
40
41// Forward declaration.
42struct Builder;
43
44/** Merge the blocks in the file. */
46 // Forward declarations.
47 struct Cursor;
48 struct Output_file;
49
50 /** The design is generalized as an N way merge, however we stick
51 with 2 for now. */
52 static constexpr size_t N_WAY_MERGE = 2;
53
54 /** Context to use for merging the files/runs. */
55 struct Context {
56 /** File to sort. */
58
59 /** For reporting duplicates, it has the index instance too. */
61
62 /** Number of scan threads used, for memory buffer calculation. */
63 size_t m_n_threads{};
64
65 /** PFS progress monitoring. */
67 };
68
69 /** Offsets of record lists to merge. Two adjacent entries make one list or
70 range */
71 using Ranges = std::vector<os_offset_t>;
72
73 /** Constructor.
74 @param[in,out] merge_ctx Data blocks merge meta data. */
75 explicit Merge_file_sort(Context *merge_ctx) noexcept
76 : m_merge_ctx(merge_ctx) {}
77
78 /** Merge the the blocks.
79 @param[in,out] builder Builder instance used for building index.
80 @param[in,out] offsets Offsets from where to start the merge.
81 @return DB_SUCCESS or error code. */
82 [[nodiscard]] dberr_t sort(Builder *builder, Merge_offsets &offsets) noexcept;
83
84 /** @return the number of rows in the sorted file. */
85 [[nodiscard]] uint64_t get_n_rows() const noexcept { return m_n_rows; }
86
87 private:
88 /** Merge the rows.
89 @param[in,out] cursor To iterate over the rows to merge.
90 @param[in,out] output_file Output file to write the merged rows.
91 @return DB_SUCCESS or error code. */
92 [[nodiscard]] dberr_t merge_rows(Cursor &cursor,
93 Output_file &output_file) noexcept;
94
95 /** Merge the blocks in the ranges.
96 @param[in,out] cursor To iterate over the rows to merge.
97 @param[in,out] offsets Starting offsets of record lists to merge.
98 @param[in,out] output_file Output file to write the merged rows.
99 @param[in] buffer_size IO buffer size for reads.
100 @return DB_SUCCESS or error code. */
101 [[nodiscard]] dberr_t merge_ranges(Cursor &cursor, Merge_offsets &offsets,
102 Output_file &output_file,
103 size_t buffer_size) noexcept;
104
105 /** Move to the next ranges of pages to merge.
106 @param[in,out] offsets Current offsets to start the merge from.
107 @return the next range to merge. */
108 Ranges next_ranges(Merge_offsets &offsets) noexcept;
109
110 private:
111 /** To check and report duplicates. */
113
114 /** Meta data for merging blocks. */
116
117 /** Page numbers to merge for the next pass. */
119
120 /** Number of rows in the sorted file. */
121 uint64_t m_n_rows{};
122};
123
124} // namespace ddl
125
126#endif /* !ddl0impl_merge_h */
Class used to report ALTER TABLE progress via performance_schema.
Definition: ut0stage.h:81
dberr_t
Definition: db0err.h:39
For scanning the temporary file.
The general architecture is that the work is done in two phases, roughly the read and write phase.
Definition: btr0load.cc:42
std::deque< os_offset_t, ut::allocator< os_offset_t > > Merge_offsets
Start offsets in the file, from where to merge records.
Definition: ddl0impl.h:64
size_t buffer_size(const ConstBufferSequence &buffers) noexcept
Definition: buffer.h:315
For loading indexes.
Definition: ddl0impl-builder.h:48
Cursor for reading the data.
Definition: ddl0impl-cursor.h:41
Structure for reporting duplicate records.
Definition: ddl0ddl.h:132
Context to use for merging the files/runs.
Definition: ddl0impl-merge.h:55
Alter_stage * m_stage
PFS progress monitoring.
Definition: ddl0impl-merge.h:66
size_t m_n_threads
Number of scan threads used, for memory buffer calculation.
Definition: ddl0impl-merge.h:63
Dup * m_dup
For reporting duplicates, it has the index instance too.
Definition: ddl0impl-merge.h:60
ddl::file_t * m_file
File to sort.
Definition: ddl0impl-merge.h:57
Cursor for merging blocks from the same file.
Definition: ddl0merge.cc:41
For writing out the merged rows.
Definition: ddl0merge.cc:96
Merge the blocks in the file.
Definition: ddl0impl-merge.h:45
std::vector< os_offset_t > Ranges
Offsets of record lists to merge.
Definition: ddl0impl-merge.h:71
uint64_t m_n_rows
Number of rows in the sorted file.
Definition: ddl0impl-merge.h:121
dberr_t merge_rows(Cursor &cursor, Output_file &output_file) noexcept
Merge the rows.
Definition: ddl0merge.cc:397
Dup * m_dup
To check and report duplicates.
Definition: ddl0impl-merge.h:112
Merge_file_sort(Context *merge_ctx) noexcept
Constructor.
Definition: ddl0impl-merge.h:75
Context * m_merge_ctx
Meta data for merging blocks.
Definition: ddl0impl-merge.h:115
Ranges next_ranges(Merge_offsets &offsets) noexcept
Move to the next ranges of pages to merge.
Definition: ddl0merge.cc:380
Merge_offsets m_next_offsets
Page numbers to merge for the next pass.
Definition: ddl0impl-merge.h:118
static constexpr size_t N_WAY_MERGE
The design is generalized as an N way merge, however we stick with 2 for now.
Definition: ddl0impl-merge.h:52
dberr_t merge_ranges(Cursor &cursor, Merge_offsets &offsets, Output_file &output_file, size_t buffer_size) noexcept
Merge the blocks in the ranges.
Definition: ddl0merge.cc:424
dberr_t sort(Builder *builder, Merge_offsets &offsets) noexcept
Merge the the blocks.
Definition: ddl0merge.cc:463
uint64_t get_n_rows() const noexcept
Definition: ddl0impl-merge.h:85
Information about temporary files used in merge sort.
Definition: ddl0impl.h:67