~linuxjedi/drizzle/trunk-bug-667053

« back to all changes in this revision

Viewing changes to storage/innobase/include/log0recv.h

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************
 
2
Recovery
 
3
 
 
4
(c) 1997 Innobase Oy
 
5
 
 
6
Created 9/20/1997 Heikki Tuuri
 
7
*******************************************************/
 
8
 
 
9
#ifndef log0recv_h
 
10
#define log0recv_h
 
11
 
 
12
#include "univ.i"
 
13
#include "ut0byte.h"
 
14
#include "page0types.h"
 
15
#include "hash0hash.h"
 
16
#include "log0log.h"
 
17
 
 
18
#ifdef UNIV_HOTBACKUP
 
19
extern ibool    recv_replay_file_ops;
 
20
#endif /* UNIV_HOTBACKUP */
 
21
 
 
22
/***********************************************************************
 
23
Reads the checkpoint info needed in hot backup. */
 
24
 
 
25
ibool
 
26
recv_read_cp_info_for_backup(
 
27
/*=========================*/
 
28
                        /* out: TRUE if success */
 
29
        byte*   hdr,    /* in: buffer containing the log group header */
 
30
        dulint* lsn,    /* out: checkpoint lsn */
 
31
        ulint*  offset, /* out: checkpoint offset in the log group */
 
32
        ulint*  fsp_limit,/* out: fsp limit of space 0, 1000000000 if the
 
33
                        database is running with < version 3.23.50 of InnoDB */
 
34
        dulint* cp_no,  /* out: checkpoint number */
 
35
        dulint* first_header_lsn);
 
36
                        /* out: lsn of of the start of the first log file */
 
37
/***********************************************************************
 
38
Scans the log segment and n_bytes_scanned is set to the length of valid
 
39
log scanned. */
 
40
 
 
41
void
 
42
recv_scan_log_seg_for_backup(
 
43
/*=========================*/
 
44
        byte*           buf,            /* in: buffer containing log data */
 
45
        ulint           buf_len,        /* in: data length in that buffer */
 
46
        dulint*         scanned_lsn,    /* in/out: lsn of buffer start,
 
47
                                        we return scanned lsn */
 
48
        ulint*          scanned_checkpoint_no,
 
49
                                        /* in/out: 4 lowest bytes of the
 
50
                                        highest scanned checkpoint number so
 
51
                                        far */
 
52
        ulint*          n_bytes_scanned);/* out: how much we were able to
 
53
                                        scan, smaller than buf_len if log
 
54
                                        data ended here */
 
55
/***********************************************************************
 
56
Returns TRUE if recovery is currently running. */
 
57
UNIV_INLINE
 
58
ibool
 
59
recv_recovery_is_on(void);
 
60
/*=====================*/
 
61
/***********************************************************************
 
62
Returns TRUE if recovery from backup is currently running. */
 
63
UNIV_INLINE
 
64
ibool
 
65
recv_recovery_from_backup_is_on(void);
 
66
/*=================================*/
 
67
/****************************************************************************
 
68
Applies the hashed log records to the page, if the page lsn is less than the
 
69
lsn of a log record. This can be called when a buffer page has just been
 
70
read in, or also for a page already in the buffer pool. */
 
71
 
 
72
void
 
73
recv_recover_page(
 
74
/*==============*/
 
75
        ibool   recover_backup, /* in: TRUE if we are recovering a backup
 
76
                                page: then we do not acquire any latches
 
77
                                since the page was read in outside the
 
78
                                buffer pool */
 
79
        ibool   just_read_in,   /* in: TRUE if the i/o-handler calls this for
 
80
                                a freshly read page */
 
81
        page_t* page,           /* in: buffer page */
 
82
        ulint   space,          /* in: space id */
 
83
        ulint   page_no);       /* in: page number */
 
84
/************************************************************
 
85
Recovers from a checkpoint. When this function returns, the database is able
 
86
to start processing of new user transactions, but the function
 
87
recv_recovery_from_checkpoint_finish should be called later to complete
 
88
the recovery and free the resources used in it. */
 
89
 
 
90
ulint
 
91
recv_recovery_from_checkpoint_start(
 
92
/*================================*/
 
93
                                /* out: error code or DB_SUCCESS */
 
94
        ulint   type,           /* in: LOG_CHECKPOINT or LOG_ARCHIVE */
 
95
        dulint  limit_lsn,      /* in: recover up to this lsn if possible */
 
96
        dulint  min_flushed_lsn,/* in: min flushed lsn from data files */
 
97
        dulint  max_flushed_lsn);/* in: max flushed lsn from data files */
 
98
/************************************************************
 
99
Completes recovery from a checkpoint. */
 
100
 
 
101
void
 
102
recv_recovery_from_checkpoint_finish(void);
 
103
/*======================================*/
 
104
/***********************************************************
 
105
Scans log from a buffer and stores new log data to the parsing buffer. Parses
 
106
and hashes the log records if new data found. */
 
107
 
 
108
ibool
 
109
recv_scan_log_recs(
 
110
/*===============*/
 
111
                                /* out: TRUE if limit_lsn has been reached, or
 
112
                                not able to scan any more in this log group */
 
113
        ibool   apply_automatically,/* in: TRUE if we want this function to
 
114
                                apply log records automatically when the
 
115
                                hash table becomes full; in the hot backup tool
 
116
                                the tool does the applying, not this
 
117
                                function */
 
118
        ulint   available_memory,/* in: we let the hash table of recs to grow
 
119
                                to this size, at the maximum */
 
120
        ibool   store_to_hash,  /* in: TRUE if the records should be stored
 
121
                                to the hash table; this is set to FALSE if just
 
122
                                debug checking is needed */
 
123
        byte*   buf,            /* in: buffer containing a log segment or
 
124
                                garbage */
 
125
        ulint   len,            /* in: buffer length */
 
126
        dulint  start_lsn,      /* in: buffer start lsn */
 
127
        dulint* contiguous_lsn, /* in/out: it is known that all log groups
 
128
                                contain contiguous log data up to this lsn */
 
129
        dulint* group_scanned_lsn);/* out: scanning succeeded up to this lsn */
 
130
/**********************************************************
 
131
Resets the logs. The contents of log files will be lost! */
 
132
 
 
133
void
 
134
recv_reset_logs(
 
135
/*============*/
 
136
        dulint  lsn,            /* in: reset to this lsn rounded up to
 
137
                                be divisible by OS_FILE_LOG_BLOCK_SIZE,
 
138
                                after which we add LOG_BLOCK_HDR_SIZE */
 
139
#ifdef UNIV_LOG_ARCHIVE
 
140
        ulint   arch_log_no,    /* in: next archived log file number */
 
141
#endif /* UNIV_LOG_ARCHIVE */
 
142
        ibool   new_logs_created);/* in: TRUE if resetting logs is done
 
143
                                at the log creation; FALSE if it is done
 
144
                                after archive recovery */
 
145
#ifdef UNIV_HOTBACKUP
 
146
/**********************************************************
 
147
Creates new log files after a backup has been restored. */
 
148
 
 
149
void
 
150
recv_reset_log_files_for_backup(
 
151
/*============================*/
 
152
        const char*     log_dir,        /* in: log file directory path */
 
153
        ulint           n_log_files,    /* in: number of log files */
 
154
        ulint           log_file_size,  /* in: log file size */
 
155
        dulint          lsn);           /* in: new start lsn, must be
 
156
                                        divisible by OS_FILE_LOG_BLOCK_SIZE */
 
157
#endif /* UNIV_HOTBACKUP */
 
158
/************************************************************
 
159
Creates the recovery system. */
 
160
 
 
161
void
 
162
recv_sys_create(void);
 
163
/*=================*/
 
164
/************************************************************
 
165
Inits the recovery system for a recovery operation. */
 
166
 
 
167
void
 
168
recv_sys_init(
 
169
/*==========*/
 
170
        ibool   recover_from_backup,    /* in: TRUE if this is called
 
171
                                        to recover from a hot backup */
 
172
        ulint   available_memory);      /* in: available memory in bytes */
 
173
/***********************************************************************
 
174
Empties the hash table of stored log records, applying them to appropriate
 
175
pages. */
 
176
 
 
177
void
 
178
recv_apply_hashed_log_recs(
 
179
/*=======================*/
 
180
        ibool   allow_ibuf);    /* in: if TRUE, also ibuf operations are
 
181
                                allowed during the application; if FALSE,
 
182
                                no ibuf operations are allowed, and after
 
183
                                the application all file pages are flushed to
 
184
                                disk and invalidated in buffer pool: this
 
185
                                alternative means that no new log records
 
186
                                can be generated during the application */
 
187
#ifdef UNIV_HOTBACKUP
 
188
/***********************************************************************
 
189
Applies log records in the hash table to a backup. */
 
190
 
 
191
void
 
192
recv_apply_log_recs_for_backup(void);
 
193
/*================================*/
 
194
#endif
 
195
#ifdef UNIV_LOG_ARCHIVE
 
196
/************************************************************
 
197
Recovers from archived log files, and also from log files, if they exist. */
 
198
 
 
199
ulint
 
200
recv_recovery_from_archive_start(
 
201
/*=============================*/
 
202
                                /* out: error code or DB_SUCCESS */
 
203
        dulint  min_flushed_lsn,/* in: min flushed lsn field from the
 
204
                                data files */
 
205
        dulint  limit_lsn,      /* in: recover up to this lsn if possible */
 
206
        ulint   first_log_no);  /* in: number of the first archived log file
 
207
                                to use in the recovery; the file will be
 
208
                                searched from INNOBASE_LOG_ARCH_DIR specified
 
209
                                in server config file */
 
210
/************************************************************
 
211
Completes recovery from archive. */
 
212
 
 
213
void
 
214
recv_recovery_from_archive_finish(void);
 
215
/*===================================*/
 
216
#endif /* UNIV_LOG_ARCHIVE */
 
217
 
 
218
/* Block of log record data */
 
219
typedef struct recv_data_struct recv_data_t;
 
220
struct recv_data_struct{
 
221
        recv_data_t*    next;   /* pointer to the next block or NULL */
 
222
                                /* the log record data is stored physically
 
223
                                immediately after this struct, max amount
 
224
                                RECV_DATA_BLOCK_SIZE bytes of it */
 
225
};
 
226
 
 
227
/* Stored log record struct */
 
228
typedef struct recv_struct      recv_t;
 
229
struct recv_struct{
 
230
        byte            type;   /* log record type */
 
231
        ulint           len;    /* log record body length in bytes */
 
232
        recv_data_t*    data;   /* chain of blocks containing the log record
 
233
                                body */
 
234
        dulint          start_lsn;/* start lsn of the log segment written by
 
235
                                the mtr which generated this log record: NOTE
 
236
                                that this is not necessarily the start lsn of
 
237
                                this log record */
 
238
        dulint          end_lsn;/* end lsn of the log segment written by
 
239
                                the mtr which generated this log record: NOTE
 
240
                                that this is not necessarily the end lsn of
 
241
                                this log record */
 
242
        UT_LIST_NODE_T(recv_t)
 
243
                        rec_list;/* list of log records for this page */
 
244
};
 
245
 
 
246
/* Hashed page file address struct */
 
247
typedef struct recv_addr_struct recv_addr_t;
 
248
struct recv_addr_struct{
 
249
        ulint           state;  /* RECV_NOT_PROCESSED, RECV_BEING_PROCESSED,
 
250
                                or RECV_PROCESSED */
 
251
        ulint           space;  /* space id */
 
252
        ulint           page_no;/* page number */
 
253
        UT_LIST_BASE_NODE_T(recv_t)
 
254
                        rec_list;/* list of log records for this page */
 
255
        hash_node_t     addr_hash;
 
256
};
 
257
 
 
258
/* Recovery system data structure */
 
259
typedef struct recv_sys_struct  recv_sys_t;
 
260
struct recv_sys_struct{
 
261
        mutex_t         mutex;  /* mutex protecting the fields apply_log_recs,
 
262
                                n_addrs, and the state field in each recv_addr
 
263
                                struct */
 
264
        ibool           apply_log_recs;
 
265
                                /* this is TRUE when log rec application to
 
266
                                pages is allowed; this flag tells the
 
267
                                i/o-handler if it should do log record
 
268
                                application */
 
269
        ibool           apply_batch_on;
 
270
                                /* this is TRUE when a log rec application
 
271
                                batch is running */
 
272
        dulint          lsn;    /* log sequence number */
 
273
        ulint           last_log_buf_size;
 
274
                                /* size of the log buffer when the database
 
275
                                last time wrote to the log */
 
276
        byte*           last_block;
 
277
                                /* possible incomplete last recovered log
 
278
                                block */
 
279
        byte*           last_block_buf_start;
 
280
                                /* the nonaligned start address of the
 
281
                                preceding buffer */
 
282
        byte*           buf;    /* buffer for parsing log records */
 
283
        ulint           len;    /* amount of data in buf */
 
284
        dulint          parse_start_lsn;
 
285
                                /* this is the lsn from which we were able to
 
286
                                start parsing log records and adding them to
 
287
                                the hash table; ut_dulint_zero if a suitable
 
288
                                start point not found yet */
 
289
        dulint          scanned_lsn;
 
290
                                /* the log data has been scanned up to this
 
291
                                lsn */
 
292
        ulint           scanned_checkpoint_no;
 
293
                                /* the log data has been scanned up to this
 
294
                                checkpoint number (lowest 4 bytes) */
 
295
        ulint           recovered_offset;
 
296
                                /* start offset of non-parsed log records in
 
297
                                buf */
 
298
        dulint          recovered_lsn;
 
299
                                /* the log records have been parsed up to
 
300
                                this lsn */
 
301
        dulint          limit_lsn;/* recovery should be made at most up to this
 
302
                                lsn */
 
303
        ibool           found_corrupt_log;
 
304
                                /* this is set to TRUE if we during log
 
305
                                scan find a corrupt log block, or a corrupt
 
306
                                log record, or there is a log parsing
 
307
                                buffer overflow */
 
308
        log_group_t*    archive_group;
 
309
                                /* in archive recovery: the log group whose
 
310
                                archive is read */
 
311
        mem_heap_t*     heap;   /* memory heap of log records and file
 
312
                                addresses*/
 
313
        hash_table_t*   addr_hash;/* hash table of file addresses of pages */
 
314
        ulint           n_addrs;/* number of not processed hashed file
 
315
                                addresses in the hash table */
 
316
};
 
317
 
 
318
extern recv_sys_t*      recv_sys;
 
319
extern ibool            recv_recovery_on;
 
320
extern ibool            recv_no_ibuf_operations;
 
321
extern ibool            recv_needed_recovery;
 
322
 
 
323
extern ibool            recv_lsn_checks_on;
 
324
#ifdef UNIV_HOTBACKUP
 
325
extern ibool            recv_is_making_a_backup;
 
326
#endif /* UNIV_HOTBACKUP */
 
327
extern ulint            recv_max_parsed_page_no;
 
328
 
 
329
/* Size of the parsing buffer; it must accommodate RECV_SCAN_SIZE many
 
330
times! */
 
331
#define RECV_PARSING_BUF_SIZE   (2 * 1024 * 1024)
 
332
 
 
333
/* Size of block reads when the log groups are scanned forward to do a
 
334
roll-forward */
 
335
#define RECV_SCAN_SIZE          (4 * UNIV_PAGE_SIZE)
 
336
 
 
337
/* States of recv_addr_struct */
 
338
#define RECV_NOT_PROCESSED      71
 
339
#define RECV_BEING_READ         72
 
340
#define RECV_BEING_PROCESSED    73
 
341
#define RECV_PROCESSED          74
 
342
 
 
343
extern ulint    recv_n_pool_free_frames;
 
344
 
 
345
#ifndef UNIV_NONINL
 
346
#include "log0recv.ic"
 
347
#endif
 
348
 
 
349
#endif