1 : /* Copyright (C) 2006,2007 MySQL AB
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 as published by
5 : the Free Software Foundation; version 2 of the License.
6 :
7 : This program is distributed in the hope that it will be useful,
8 : but WITHOUT ANY WARRANTY; without even the implied warranty of
9 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 : GNU General Public License for more details.
11 :
12 : You should have received a copy of the GNU General Public License
13 : along with this program; if not, write to the Free Software
14 : Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
15 :
16 : /*
17 : WL#3071 Maria checkpoint
18 : First version written by Guilhem Bichot on 2006-04-27.
19 : Does not compile yet.
20 : */
21 :
22 : /* This is the interface of this module. */
23 :
24 : typedef enum enum_ma_checkpoint_level {
25 : CHECKPOINT_NONE= 0,
26 : /* just write dirty_pages, transactions table and sync files */
27 : CHECKPOINT_INDIRECT,
28 : /* also flush all dirty pages which were already dirty at prev checkpoint */
29 : CHECKPOINT_MEDIUM,
30 : /* also flush all dirty pages */
31 : CHECKPOINT_FULL
32 : } CHECKPOINT_LEVEL;
33 :
34 : C_MODE_START
35 : int ma_checkpoint_init(ulong interval);
36 : void ma_checkpoint_end(void);
37 : int ma_checkpoint_execute(CHECKPOINT_LEVEL level, my_bool no_wait);
38 : C_MODE_END
39 :
40 : /**
41 : @brief reads some LSNs with special trickery
42 :
43 : If a 64-bit variable transitions between both halves being zero to both
44 : halves being non-zero, and back, this function can be used to do a read of
45 : it (without mutex, without atomic load) which always produces a correct
46 : (though maybe slightly old) value (even on 32-bit CPUs). The value is at
47 : least as new as the latest mutex unlock done by the calling thread.
48 : The assumption is that the system sets both 4-byte halves either at the
49 : same time, or one after the other (in any order), but NOT some bytes of the
50 : first half then some bytes of the second half then the rest of bytes of the
51 : first half. With this assumption, the function can detect when it is
52 : seeing an inconsistent value.
53 :
54 : @param LSN pointer to the LSN variable to read
55 :
56 : @return LSN part (most significant byte always 0)
57 : */
58 : #if ( SIZEOF_CHARP >= 8 )
59 : /* 64-bit CPU, 64-bit reads are atomic */
60 : #define lsn_read_non_atomic LSN_WITH_FLAGS_TO_LSN
61 : #else
62 : static inline LSN lsn_read_non_atomic_32(const volatile LSN *x)
63 128 : {
64 : /*
65 : 32-bit CPU, 64-bit reads may give a mixed of old half and new half (old
66 : low bits and new high bits, or the contrary).
67 : */
68 : for (;;) /* loop until no atomicity problems */
69 : {
70 : /*
71 : Remove most significant byte in case this is a LSN_WITH_FLAGS object.
72 : Those flags in TRN::first_undo_lsn break the condition on transitions so
73 : they must be removed below.
74 : */
75 128 : LSN y= LSN_WITH_FLAGS_TO_LSN(*x);
76 128 : if (likely((y == LSN_IMPOSSIBLE) || LSN_VALID(y)))
77 128 : return y;
78 : }
79 : }
80 : #define lsn_read_non_atomic(x) lsn_read_non_atomic_32(&x)
81 : #endif
82 :
83 : /**
84 : prints a message from a task not connected to any user (checkpoint
85 : and recovery for example).
86 :
87 : @param level 0 if error, ME_JUST_WARNING if warning,
88 : ME_JUST_INFO if info
89 : @param sentence text to write
90 : */
91 : #define ma_message_no_user(level, sentence) \
92 : my_printf_error(HA_ERR_GENERIC, "Maria engine: %s", MYF(level), sentence)
|