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