MySQL  8.0.20
Source Code Documentation
rpl_info_handler.h
Go to the documentation of this file.
1 /* Copyright (c) 2010, 2019, Oracle and/or its affiliates. All rights reserved.
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 also distributed 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 included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef RPL_INFO_HANDLER_H
24 #define RPL_INFO_HANDLER_H
25 
26 #include <stddef.h>
27 #include <sys/types.h>
28 #include <type_traits>
29 
30 #include "my_bitmap.h"
31 #include "my_inttypes.h"
32 
33 class Rpl_info_values;
34 class Server_ids;
35 
40  /*
41  Add new types of repository before this
42  entry.
43  */
45 };
46 
47 /*
48  Defines status on the repository.
49 */
55 };
56 
58  friend class Rpl_info_factory;
59 
60  public:
61  /*
62  * enum class to indicate the status of getting field using
63  * do_get_info() of handler classes.
64  */
65  enum class enum_field_get_status : int {
66  /* status is success but field has NULL value. */
69  FAILURE = 2
70  };
71 
72  Rpl_info_handler(const Rpl_info_handler &handler) = delete;
73  Rpl_info_handler &operator=(const Rpl_info_handler &handler) = delete;
74 
75  /**
76  After creating an object and assembling components, this method is
77  used to initialize internal structures. Everything that does not
78  depend on other components (e.g. mutexes) should be placed in the
79  object's constructor though.
80 
81  @retval false success,
82  @retval true otherwise error.
83  */
84  int init_info() { return do_init_info(); }
85 
86  /**
87  Checks the repository's status.
88 
89  @retval REPOSITORY_EXISTS reposistory is ready to
90  be used.
91  @retval REPOSITORY_DOES_NOT_EXIST repository needs to be
92  configured.
93  @retval ERROR_CHECKING_REPOSITORY error while checking the
94  reposistory.
95  */
97 
98  /**
99  Flushes and syncs in-memory information into a stable storage (i.e.
100  repository). Usually, syncing after flushing depends on other options
101  such as @c relay-log-info-sync, @c master-info-sync. These options
102  dictate after how many events or transactions the information
103  should be synced. We can ignore them and always sync by setting the
104  parameter @c force, which is by default @c false, to @c true.
105 
106  So if the number of events is below a threshold, the parameter
107  @c force is false and we are using a file system as a storage
108  system, it may happen that the changes will only end up in the
109  operating system's cache and a crash may lead to inconsistencies.
110 
111  @retval false No error
112  @retval true Failure
113  */
114  int flush_info(const bool force) { return do_flush_info(force); }
115 
116  /**
117  Deletes any information in it and in some cases the repository.
118  The decision to remove the repository is delegated to the
119  developer.
120 
121  @retval false No error
122  @retval true Failure
123  */
124  int remove_info() { return do_remove_info(); }
125 
126  /**
127  Deletes any information in the repository. In contrast to the
128  @c remove_info() method, the repository is not removed.
129 
130  @retval false No error
131  @retval true Failure
132  */
133  int clean_info() { return do_clean_info(); }
134 
135  /**
136  Closes access to the repository.
137 
138  @retval false No error
139  @retval true Failure
140  */
141  void end_info() { do_end_info(); }
142 
143  /**
144  Enables the storage system to receive reads, i.e.
145  getters.
146 
147  @retval false No error
148  @retval true Failure
149  */
151 
152  /**
153  Enables the storage system to receive writes, i.e.
154  setters.
155 
156  @retval false No error
157  @retval true Failure
158  */
160 
161  /**
162  Gets the type of the repository that is used.
163 
164  @return Type of repository.
165  */
167  /**
168  Returns a string corresponding to the type.
169  */
170  const char *get_rpl_info_type_str();
171 
172  /**
173  Sets the value of a field to @c value.
174  Any call must be done in the right order which
175  is defined by the caller that wants to persist
176  the information.
177 
178  @param[in] value Value to be set.
179 
180  @retval false No error
181  @retval true Failure
182  */
183  template <class TypeHandler>
184  bool set_info(TypeHandler const value) {
185  if (cursor >= ninfo || prv_error) return true;
186 
187  if (!(prv_error = do_set_info(cursor, value))) cursor++;
188 
189  return (prv_error);
190  }
191 
192  template <class TypeHandler>
193  bool set_info(TypeHandler const value, const size_t size) {
194  if (cursor >= ninfo || prv_error) return true;
195 
196  if (!(prv_error = do_set_info(cursor, value, size))) cursor++;
197 
198  return (prv_error);
199  }
200 
201  /**
202  set the value of a field pointed at @c pk_cursor to
203  @ value.
204 
205  @param[in] pk_cursor cursor for the filed value.
206  @param[in] value fieled[pk_cursor] would be set
207  this value.
208 
209  @retval false ok
210  @retval true error.
211  */
212 
213  template <class TypeHandler>
214  bool set_info(int pk_cursor, TypeHandler const value) {
215  if (pk_cursor >= ninfo) return true;
216 
217  return (do_set_info(pk_cursor, value));
218  }
219 
220  /**
221  Returns the value of a field.
222  Any call must be done in the right order which
223  is defined by the caller that wants to return
224  the information.
225 
226  @param[in] value Value to be set.
227  @param[in] default_value Returns a default value
228  if the field is empty.
229 
230  @retval false No error
231  @retval true Failure
232  */
233  template <class TypeHandlerPointer, class TypeHandler>
235  TypeHandler const default_value) {
238 
239  if ((prv_get_error = do_get_info(cursor, value, default_value)) !=
241  cursor++;
242 
243  return (prv_get_error);
244  }
245 
246  /**
247  Returns the value of a string field.
248  Any call must be done in the right order which
249  is defined by the caller that wants to return
250  the information.
251 
252  @param[in] value Value to be returned.
253  @param[in] size Max size of the string to be
254  returned.
255  @param[in] default_value Returns a default value
256  if the field is empty.
257 
258  TypeHandler is either char* or uchar*, while
259  default_value is const char* or const uchar*.
260  Some type trait magic is required to make
261  char* / uchar* into const char* / uchar*.
262 
263  @retval false No error
264  @retval true Failure
265  */
266  template <class TypeHandler>
268  TypeHandler value, const size_t size,
269  std::add_const_t<std::remove_pointer_t<TypeHandler>> *default_value) {
272 
273  if ((prv_get_error = do_get_info(cursor, value, size, default_value)) !=
275  cursor++;
276 
277  return (prv_get_error);
278  }
279 
280  /**
281  Returns the value of a Server_id field.
282  Any call must be done in the right order which
283  is defined by the caller that wants to return
284  the information.
285 
286  @param[out] value Value to be return.
287  @param[in] default_value Returns a default value
288  if the field is empty.
289 
290  @retval false No error
291  @retval true Failure
292  */
294  const Server_ids *default_value) {
297 
298  if ((prv_get_error = do_get_info(cursor, value, default_value)) !=
300  cursor++;
301 
302  return (prv_get_error);
303  }
304 
305  /**
306  Returns the number of fields handled by this handler.
307 
308  @return Number of fields handled by the handler.
309  */
310  int get_number_info() { return ninfo; }
311 
312  /**
313  Configures the number of events after which the info (e.g.
314  master info, relay log info) must be synced when flush() is
315  called.
316 
317  @param[in] period Number of events.
318  */
319  void set_sync_period(uint period);
320 
321  /**
322  Returns a string describing the repository. For instance, if the
323  repository is a file, the returned string is path where data is
324  stored.
325 
326  @return a pointer to a string.
327  */
329 
330  /**
331  Any transactional repository may have its updates rolled back in case
332  of a failure. If this is possible, the repository is classified as
333  transactional.
334 
335  @retval true If transactional.
336  @retval false Otherwise.
337  */
339 
340  /**
341  Updates the value returned by the member function is_transactional()
342  because it may be expensive to compute it whenever is_transactional()
343  is called.
344 
345  In the current implementation, the type of the repository can only be
346  changed when replication, i.e. slave, is stopped. For that reason,
347  this member function, i.e. update_is__transactional(), must be called
348  when slave is starting.
349 
350  @retval false No error
351  @retval true Failure
352  */
354 
355  /*
356  Pre-store information before writing it to the repository and if
357  necessary after reading it from the repository. The decision is
358  delegated to the sub-classes.
359  */
361 
362  virtual ~Rpl_info_handler();
363 
364  protected:
365  /* Number of fields to be stored in the repository. */
366  int ninfo;
367 
368  /* From/To where we should start reading/writing. */
369  int cursor;
370 
371  /* Registers if there was failure while accessing a field/information. */
372  bool prv_error;
374  /*
375  Keeps track of the number of events before fsyncing. The option
376  --sync-master-info and --sync-relay-log-info determine how many
377  events should be processed before fsyncing.
378  */
380 
381  /*
382  The number of events after which we should fsync.
383  */
385 
386  /**
387  Bitset holding which of the fields are allowed to be `NULL`.
388  */
390 
391  Rpl_info_handler(const int nparam, MY_BITMAP const *nullable_bitmap);
392 
393  /**
394  Checks whether or not the field at position `pos` is allowed to be `NULL`.
395 
396  @return true if the field is allowed to be `NULL` and false otherwise.
397  */
398  bool is_field_nullable(int pos);
399 
400  private:
401  virtual int do_init_info() = 0;
402  virtual int do_init_info(uint instance) = 0;
403  virtual enum_return_check do_check_info() = 0;
404  virtual enum_return_check do_check_info(uint instance) = 0;
405  virtual int do_flush_info(const bool force) = 0;
406  virtual int do_remove_info() = 0;
407  virtual int do_clean_info() = 0;
408  virtual void do_end_info() = 0;
409  virtual int do_prepare_info_for_read() = 0;
410  virtual int do_prepare_info_for_write() = 0;
411 
412  virtual bool do_set_info(const int pos, const char *value) = 0;
413  virtual bool do_set_info(const int pos, const uchar *value,
414  const size_t size) = 0;
415  virtual bool do_set_info(const int pos, const ulong value) = 0;
416  virtual bool do_set_info(const int pos, const int value) = 0;
417  virtual bool do_set_info(const int pos, const float value) = 0;
418  virtual bool do_set_info(const int pos, const Server_ids *value) = 0;
419  virtual bool do_set_info(const int pos, const std::nullptr_t value) = 0;
420  virtual bool do_set_info(const int pos, const std::nullptr_t value,
421  const size_t size) = 0;
422  virtual enum_field_get_status do_get_info(const int pos, char *value,
423  const size_t size,
424  const char *default_value) = 0;
425  virtual enum_field_get_status do_get_info(const int pos, uchar *value,
426  const size_t size,
427  const uchar *default_value) = 0;
428  virtual enum_field_get_status do_get_info(const int pos, ulong *value,
429  const ulong default_value) = 0;
430  virtual enum_field_get_status do_get_info(const int pos, int *value,
431  const int default_value) = 0;
432  virtual enum_field_get_status do_get_info(const int pos, float *value,
433  const float default_value) = 0;
435  const int pos, Server_ids *value, const Server_ids *default_value) = 0;
436  virtual char *do_get_description_info() = 0;
437  virtual bool do_is_transactional() = 0;
438  virtual bool do_update_is_transactional() = 0;
439  virtual uint do_get_rpl_info_type() = 0;
440 };
441 
443 
444 #ifndef DBUG_OFF
445 extern ulong w_rr;
447 #endif
448 #endif /* RPL_INFO_HANDLER_H */
int prepare_info_for_read()
Enables the storage system to receive reads, i.e.
Definition: rpl_info_handler.h:150
int get_number_info()
Returns the number of fields handled by this handler.
Definition: rpl_info_handler.h:310
bool set_info(int pk_cursor, TypeHandler const value)
set the value of a field pointed at pk_cursor to @ value.
Definition: rpl_info_handler.h:214
unsigned char uchar
Definition: my_inttypes.h:51
Definition: rpl_info_handler.h:54
Definition: rpl_info_handler.h:52
int init_info()
After creating an object and assembling components, this method is used to initialize internal struct...
Definition: rpl_info_handler.h:84
bool set_info(TypeHandler const value, const size_t size)
Definition: rpl_info_handler.h:193
Definition: rpl_info_handler.h:57
Some integer typedefs for easier portability.
Definition: rpl_info_handler.h:39
virtual int do_prepare_info_for_write()=0
uint sync_counter
Definition: rpl_info_handler.h:379
bool is_transactional()
Any transactional repository may have its updates rolled back in case of a failure.
Definition: rpl_info_handler.h:338
virtual uint do_get_rpl_info_type()=0
Definition: dynamic_ids.h:32
void end_info()
Closes access to the repository.
Definition: rpl_info_handler.h:141
enum_field_get_status get_info(TypeHandler value, const size_t size, std::add_const_t< std::remove_pointer_t< TypeHandler >> *default_value)
Returns the value of a string field.
Definition: rpl_info_handler.h:267
Definition: rpl_info_factory.h:43
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:3986
virtual char * do_get_description_info()=0
ulong w_rr
Definition: rpl_rli_pdb.cc:76
enum_field_get_status get_info(Server_ids *value, const Server_ids *default_value)
Returns the value of a Server_id field.
Definition: rpl_info_handler.h:293
bool update_is_transactional()
Updates the value returned by the member function is_transactional() because it may be expensive to c...
Definition: rpl_info_handler.h:353
Definition: rpl_info_handler.h:37
Definition: rpl_info_handler.h:51
enum_field_get_status get_info(TypeHandlerPointer value, TypeHandler const default_value)
Returns the value of a field.
Definition: rpl_info_handler.h:234
virtual int do_prepare_info_for_read()=0
Rpl_info_values * field_values
Definition: rpl_info_handler.h:360
int ninfo
Definition: rpl_info_handler.h:366
char * pos
Definition: do_ctype.cc:76
MY_BITMAP nullable_fields
Bitset holding which of the fields are allowed to be NULL.
Definition: rpl_info_handler.h:389
bool prv_error
Definition: rpl_info_handler.h:372
Definition: my_bitmap.h:41
Definition: rpl_info_handler.h:38
virtual int do_remove_info()=0
bool set_info(TypeHandler const value)
Sets the value of a field to value.
Definition: rpl_info_handler.h:184
enum_field_get_status
Definition: rpl_info_handler.h:65
Definition: rpl_info_values.h:30
unsigned int uint
Definition: uca-dump.cc:29
Definition: rpl_info_handler.h:53
void set_sync_period(uint period)
Configures the number of events after which the info (e.g.
Definition: rpl_info_handler.cc:63
virtual bool do_update_is_transactional()=0
virtual enum_field_get_status do_get_info(const int pos, char *value, const size_t size, const char *default_value)=0
enum_return_check check_info()
Checks the repository&#39;s status.
Definition: rpl_info_handler.h:96
uint mts_debug_concurrent_access
Definition: rpl_rli_pdb.cc:77
virtual bool do_is_transactional()=0
virtual enum_return_check do_check_info()=0
int remove_info()
Deletes any information in it and in some cases the repository.
Definition: rpl_info_handler.h:124
uint get_rpl_info_type()
Gets the type of the repository that is used.
Definition: rpl_info_handler.h:166
virtual int do_clean_info()=0
virtual ~Rpl_info_handler()
Definition: rpl_info_handler.cc:58
char * get_description_info()
Returns a string describing the repository.
Definition: rpl_info_handler.h:328
enum_return_check
Definition: rpl_info_handler.h:50
bool operator!(Rpl_info_handler::enum_field_get_status status)
Definition: rpl_info_handler.cc:28
virtual bool do_set_info(const int pos, const char *value)=0
int flush_info(const bool force)
Flushes and syncs in-memory information into a stable storage (i.e.
Definition: rpl_info_handler.h:114
enum_info_repository
Definition: rpl_info_handler.h:36
int clean_info()
Deletes any information in the repository.
Definition: rpl_info_handler.h:133
const char * get_rpl_info_type_str()
Returns a string corresponding to the type.
Definition: rpl_info_handler.cc:65
const string value("\alue\)
static STATUS status
Definition: mysql.cc:198
bool is_field_nullable(int pos)
Checks whether or not the field at position pos is allowed to be NULL.
Definition: rpl_info_handler.cc:79
virtual void do_end_info()=0
virtual int do_flush_info(const bool force)=0
uint sync_period
Definition: rpl_info_handler.h:384
int prepare_info_for_write()
Enables the storage system to receive writes, i.e.
Definition: rpl_info_handler.h:159
Rpl_info_handler(const Rpl_info_handler &handler)=delete
virtual int do_init_info()=0
enum_field_get_status prv_get_error
Definition: rpl_info_handler.h:373
Rpl_info_handler & operator=(const Rpl_info_handler &handler)=delete
int cursor
Definition: rpl_info_handler.h:369
Definition: rpl_info_handler.h:44