MySQL 9.1.0
Source Code Documentation
zstd_comp.h
Go to the documentation of this file.
1/* Copyright (c) 2019, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef MYSQL_BINLOG_EVENT_COMPRESSION_ZSTD_COMP_H
25#define MYSQL_BINLOG_EVENT_COMPRESSION_ZSTD_COMP_H
26
27#define ZSTD_STATIC_LINKING_ONLY 1
28#include <zstd.h>
29
30#include "mysql/allocators/memory_resource.h" // Memory_resource
34
35struct ZSTD_outBuffer_s;
36
38
39/// Compressor class that uses the ZSTD library.
40class Zstd_comp : public Compressor {
41 public:
42 using typename Compressor::Char_t;
44 using typename Compressor::Size_t;
47 static constexpr type type_code = ZSTD;
48
49 /// The default compression level for this compressor.
51
52 Zstd_comp(const Memory_resource_t &memory_resource = Memory_resource_t());
53
54 ~Zstd_comp() override;
55
56 Zstd_comp(const Zstd_comp &) = delete;
57 Zstd_comp(const Zstd_comp &&) = delete;
58 Zstd_comp &operator=(const Zstd_comp &rhs) = delete;
59 Zstd_comp &operator=(const Zstd_comp &&rhs) = delete;
60
61 /// Set the compression level for this compressor.
62 ///
63 /// This function may be invoked at any time, but will only take
64 /// effect the next time a new frame starts, i.e., at the first call
65 /// to @c feed after the frame has been reset.
66 ///
67 /// @param compression_level the new compression level.
68 void set_compression_level(Compression_level_t compression_level);
69
70 private:
71 /// @return ZSTD
72 type do_get_type_code() const override;
73
74 /// @copydoc Compressor::do_reset
75 void do_reset() override;
76
77 /// @copydoc Compressor::do_feed
78 void do_feed(const Char_t *input_data, Size_t input_size) override;
79
80 /// @copydoc Compressor::do_compress
82 Managed_buffer_sequence_t &out) override;
83
84 /// @copydoc Compressor::do_finish
86 Managed_buffer_sequence_t &out) override;
87
88 /// @copydoc Compressor::do_get_grow_constraint_hint
90
91 /// Deallocate the ZSTD compression context.
92 void destroy();
93
94 /// Reset just the ZSTD compressor state, not other state.
95 void reset_compressor();
96
97 /// Make the ZSTD buffer point to the next available buffer;
98 /// allocate one if necessary.
99 ///
100 /// @param[in,out] managed_buffer_sequence owns the data and
101 /// manages the growth.
102 ///
103 /// @param[out] obuf ZSTD buffer that will be altered to point to
104 /// the next available byte in buffer_sequence.
105 ///
106 /// @retval success managed_buffer_sequence was not full, or its
107 /// capacity has been incremented successfully. obuf has been set
108 /// to point to next available byte.
109 ///
110 /// @retval out_of_memory buffer_sequence was full and an out of
111 /// memory error occurred. buffer_sequence has not been modified.
112 ///
113 /// @retval exceeds_max_size buffer_sequence was full and at its max
114 /// capacity. buffer_sequence has not been modified.
116 Managed_buffer_sequence_t &managed_buffer_sequence,
117 ZSTD_outBuffer_s &obuf);
118
119 /// Account for having written to the output buffer.
120 ///
121 /// This moves the read/write boundary in the
122 /// Managed_buffer_sequence, and also increments
123 /// m_total_output_size.
124 ///
125 /// @param managed_buffer_sequence The buffer sequence that has
126 /// been written to.
127 ///
128 /// @param delta The number of bytes that have been written.
129 void move_position(Managed_buffer_sequence_t &managed_buffer_sequence,
130 Size_t delta);
131
132 /// The ZSTD compression context.
133 ZSTD_CStream *m_ctx{nullptr};
134
135 /// The input buffer.
136 ZSTD_inBuffer m_ibuf{nullptr, 0, 0};
137
138 /// Value used to indicate that no compression level has been specified.
140
141 /// True when @c compress has been called and neither @c finish nor
142 /// @c reset has yet been called.
143 bool m_started{false};
144
145 /// Compression level that was set in the @c m_ctx object.
148
149 /// Compression level that was given in @c set_compression_level
151
152 /// Instrumented memory allocator object
154
155 /// ZSTD memory allocator objects and functions
156 ZSTD_customMem m_zstd_custom_mem;
157 static void *zstd_mem_res_alloc(void *opaque, size_t size);
158 static void zstd_mem_res_free(void *opaque, void *address);
159};
160
161} // namespace mysql::binlog::event::compression
162
163#endif // MYSQL_BINLOG_EVENT_COMPRESSION_ZSTD_COMP_H
Container class that provides a sequence of buffers to the caller.
Polymorphism-free memory resource class with custom allocator and deallocator functions.
Definition: memory_resource.h:88
Abstract base class for compressors.
Definition: compressor.h:80
Managed_buffer_sequence_t::Size_t Size_t
Definition: compressor.h:85
Managed_buffer_sequence_t::Char_t Char_t
Definition: compressor.h:84
mysql::containers::buffers::Managed_buffer_sequence<> Managed_buffer_sequence_t
Definition: compressor.h:83
Compressor class that uses the ZSTD library.
Definition: zstd_comp.h:40
ZSTD_inBuffer m_ibuf
The input buffer.
Definition: zstd_comp.h:136
void reset_compressor()
Reset just the ZSTD compressor state, not other state.
Definition: zstd_comp.cpp:67
Compress_status do_compress(Managed_buffer_sequence_t &out) override
Implement compress.
Definition: zstd_comp.cpp:94
bool m_started
True when compress has been called and neither finish nor reset has yet been called.
Definition: zstd_comp.h:143
static constexpr Compression_level_t default_compression_level
The default compression level for this compressor.
Definition: zstd_comp.h:50
mysql::allocators::Memory_resource Memory_resource_t
Definition: zstd_comp.h:45
void move_position(Managed_buffer_sequence_t &managed_buffer_sequence, Size_t delta)
Account for having written to the output buffer.
Definition: zstd_comp.cpp:189
static constexpr Compression_level_t uninitialized_compression_level
Value used to indicate that no compression level has been specified.
Definition: zstd_comp.h:139
Zstd_comp & operator=(const Zstd_comp &&rhs)=delete
~Zstd_comp() override
Definition: zstd_comp.cpp:37
Compress_status do_finish(Managed_buffer_sequence_t &out) override
Implement finish.
Definition: zstd_comp.cpp:161
ZSTD_customMem m_zstd_custom_mem
ZSTD memory allocator objects and functions.
Definition: zstd_comp.h:156
Zstd_comp & operator=(const Zstd_comp &rhs)=delete
type do_get_type_code() const override
Definition: zstd_comp.cpp:47
static void * zstd_mem_res_alloc(void *opaque, size_t size)
Definition: zstd_comp.cpp:225
void set_compression_level(Compression_level_t compression_level)
Set the compression level for this compressor.
Definition: zstd_comp.cpp:49
Compress_status get_obuf(Managed_buffer_sequence_t &managed_buffer_sequence, ZSTD_outBuffer_s &obuf)
Make the ZSTD buffer point to the next available buffer; allocate one if necessary.
Definition: zstd_comp.cpp:194
void do_feed(const Char_t *input_data, Size_t input_size) override
Implement feed.
Definition: zstd_comp.cpp:81
void do_reset() override
Implement reset.
Definition: zstd_comp.cpp:53
Compression_level_t m_next_compression_level
Compression level that was given in set_compression_level.
Definition: zstd_comp.h:150
Compression_level_t m_current_compression_level
Compression level that was set in the m_ctx object.
Definition: zstd_comp.h:146
static constexpr type type_code
Definition: zstd_comp.h:47
int Compression_level_t
Definition: zstd_comp.h:46
Zstd_comp(const Memory_resource_t &memory_resource=Memory_resource_t())
Definition: zstd_comp.cpp:32
static void zstd_mem_res_free(void *opaque, void *address)
Definition: zstd_comp.cpp:230
Memory_resource_t m_memory_resource
Instrumented memory allocator object.
Definition: zstd_comp.h:153
ZSTD_CStream * m_ctx
The ZSTD compression context.
Definition: zstd_comp.h:133
void destroy()
Deallocate the ZSTD compression context.
Definition: zstd_comp.cpp:39
Grow_constraint_t do_get_grow_constraint_hint() const override
Implement get_grow_constraint_hint.
Definition: zstd_comp.cpp:217
Description of a heuristic to determine how much memory to allocate.
Definition: grow_constraint.h:66
Owned, non-contiguous, growable memory buffer.
Definition: managed_buffer_sequence.h:115
Class that wraps resources in a polymorphic manner.
Definition: base.cpp:27
@ ZSTD
Definition: base.h:42
Grow_status
Error statuses for classes that use Grow_calculator.
Definition: grow_status.h:38
size_t size(const char *const c)
Definition: base64.h:46
#define NODISCARD
The function attribute [[NODISCARD]] is a replacement for [[nodiscard]] to workaround a gcc bug.
Definition: nodiscard.h:47