~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/******************************************************
 
2
Database log
 
3
 
 
4
(c) 1995 Innobase Oy
 
5
 
 
6
Created 12/9/1995 Heikki Tuuri
 
7
*******************************************************/
 
8
 
 
9
#ifndef log0log_h
 
10
#define log0log_h
 
11
 
 
12
#include "univ.i"
 
13
#include "ut0byte.h"
 
14
#include "sync0sync.h"
 
15
#include "sync0rw.h"
 
16
 
 
17
typedef struct log_struct       log_t;
 
18
typedef struct log_group_struct log_group_t;
 
19
 
 
20
#ifdef UNIV_DEBUG
 
21
extern  ibool   log_do_write;
 
22
extern  ibool   log_debug_writes;
 
23
#else /* UNIV_DEBUG */
 
24
# define log_do_write TRUE
 
25
#endif /* UNIV_DEBUG */
 
26
 
 
27
/* Wait modes for log_write_up_to */
 
28
#define LOG_NO_WAIT             91
 
29
#define LOG_WAIT_ONE_GROUP      92
 
30
#define LOG_WAIT_ALL_GROUPS     93
 
31
#define LOG_MAX_N_GROUPS        32
 
32
 
 
33
/********************************************************************
 
34
Sets the global variable log_fsp_current_free_limit. Also makes a checkpoint,
 
35
so that we know that the limit has been written to a log checkpoint field
 
36
on disk. */
 
37
 
 
38
void
 
39
log_fsp_current_free_limit_set_and_checkpoint(
 
40
/*==========================================*/
 
41
        ulint   limit); /* in: limit to set */
 
42
/***********************************************************************
 
43
Calculates where in log files we find a specified lsn. */
 
44
 
 
45
ulint
 
46
log_calc_where_lsn_is(
 
47
/*==================*/
 
48
                                                /* out: log file number */
 
49
        ib_longlong*    log_file_offset,        /* out: offset in that file
 
50
                                                (including the header) */
 
51
        dulint          first_header_lsn,       /* in: first log file start
 
52
                                                lsn */
 
53
        dulint          lsn,                    /* in: lsn whose position to
 
54
                                                determine */
 
55
        ulint           n_log_files,            /* in: total number of log
 
56
                                                files */
 
57
        ib_longlong     log_file_size);         /* in: log file size
 
58
                                                (including the header) */
 
59
/****************************************************************
 
60
Writes to the log the string given. The log must be released with
 
61
log_release. */
 
62
UNIV_INLINE
 
63
dulint
 
64
log_reserve_and_write_fast(
 
65
/*=======================*/
 
66
                        /* out: end lsn of the log record, ut_dulint_zero if
 
67
                        did not succeed */
 
68
        byte*   str,    /* in: string */
 
69
        ulint   len,    /* in: string length */
 
70
        dulint* start_lsn,/* out: start lsn of the log record */
 
71
        ibool*  success);/* out: TRUE if success */
 
72
/***************************************************************************
 
73
Releases the log mutex. */
 
74
UNIV_INLINE
 
75
void
 
76
log_release(void);
 
77
/*=============*/
 
78
/***************************************************************************
 
79
Checks if there is need for a log buffer flush or a new checkpoint, and does
 
80
this if yes. Any database operation should call this when it has modified
 
81
more than about 4 pages. NOTE that this function may only be called when the
 
82
OS thread owns no synchronization objects except the dictionary mutex. */
 
83
UNIV_INLINE
 
84
void
 
85
log_free_check(void);
 
86
/*================*/
 
87
/****************************************************************
 
88
Opens the log for log_write_low. The log must be closed with log_close and
 
89
released with log_release. */
 
90
 
 
91
dulint
 
92
log_reserve_and_open(
 
93
/*=================*/
 
94
                        /* out: start lsn of the log record */
 
95
        ulint   len);   /* in: length of data to be catenated */
 
96
/****************************************************************
 
97
Writes to the log the string given. It is assumed that the caller holds the
 
98
log mutex. */
 
99
 
 
100
void
 
101
log_write_low(
 
102
/*==========*/
 
103
        byte*   str,            /* in: string */
 
104
        ulint   str_len);       /* in: string length */
 
105
/****************************************************************
 
106
Closes the log. */
 
107
 
 
108
dulint
 
109
log_close(void);
 
110
/*===========*/
 
111
                        /* out: lsn */
 
112
/****************************************************************
 
113
Gets the current lsn. */
 
114
UNIV_INLINE
 
115
dulint
 
116
log_get_lsn(void);
 
117
/*=============*/
 
118
                        /* out: current lsn */
 
119
/**********************************************************
 
120
Initializes the log. */
 
121
 
 
122
void
 
123
log_init(void);
 
124
/*==========*/
 
125
/**********************************************************************
 
126
Inits a log group to the log system. */
 
127
 
 
128
void
 
129
log_group_init(
 
130
/*===========*/
 
131
        ulint   id,                     /* in: group id */
 
132
        ulint   n_files,                /* in: number of log files */
 
133
        ulint   file_size,              /* in: log file size in bytes */
 
134
        ulint   space_id,               /* in: space id of the file space
 
135
                                        which contains the log files of this
 
136
                                        group */
 
137
        ulint   archive_space_id);      /* in: space id of the file space
 
138
                                        which contains some archived log
 
139
                                        files for this group; currently, only
 
140
                                        for the first log group this is
 
141
                                        used */
 
142
/**********************************************************
 
143
Completes an i/o to a log file. */
 
144
 
 
145
void
 
146
log_io_complete(
 
147
/*============*/
 
148
        log_group_t*    group); /* in: log group */
 
149
/**********************************************************
 
150
This function is called, e.g., when a transaction wants to commit. It checks
 
151
that the log has been written to the log file up to the last log entry written
 
152
by the transaction. If there is a flush running, it waits and checks if the
 
153
flush flushed enough. If not, starts a new flush. */
 
154
 
 
155
void
 
156
log_write_up_to(
 
157
/*============*/
 
158
        dulint  lsn,    /* in: log sequence number up to which the log should
 
159
                        be written, ut_dulint_max if not specified */
 
160
        ulint   wait,   /* in: LOG_NO_WAIT, LOG_WAIT_ONE_GROUP,
 
161
                        or LOG_WAIT_ALL_GROUPS */
 
162
        ibool   flush_to_disk);
 
163
                        /* in: TRUE if we want the written log also to be
 
164
                        flushed to disk */
 
165
/********************************************************************
 
166
Does a syncronous flush of the log buffer to disk. */
 
167
 
 
168
void
 
169
log_buffer_flush_to_disk(void);
 
170
/*==========================*/
 
171
/********************************************************************
 
172
Advances the smallest lsn for which there are unflushed dirty blocks in the
 
173
buffer pool and also may make a new checkpoint. NOTE: this function may only
 
174
be called if the calling thread owns no synchronization objects! */
 
175
 
 
176
ibool
 
177
log_preflush_pool_modified_pages(
 
178
/*=============================*/
 
179
                                /* out: FALSE if there was a flush batch of
 
180
                                the same type running, which means that we
 
181
                                could not start this flush batch */
 
182
        dulint  new_oldest,     /* in: try to advance oldest_modified_lsn
 
183
                                at least to this lsn */
 
184
        ibool   sync);          /* in: TRUE if synchronous operation is
 
185
                                desired */
 
186
/**********************************************************
 
187
Makes a checkpoint. Note that this function does not flush dirty
 
188
blocks from the buffer pool: it only checks what is lsn of the oldest
 
189
modification in the pool, and writes information about the lsn in
 
190
log files. Use log_make_checkpoint_at to flush also the pool. */
 
191
 
 
192
ibool
 
193
log_checkpoint(
 
194
/*===========*/
 
195
                                /* out: TRUE if success, FALSE if a checkpoint
 
196
                                write was already running */
 
197
        ibool   sync,           /* in: TRUE if synchronous operation is
 
198
                                desired */
 
199
        ibool   write_always);  /* in: the function normally checks if the
 
200
                                the new checkpoint would have a greater
 
201
                                lsn than the previous one: if not, then no
 
202
                                physical write is done; by setting this
 
203
                                parameter TRUE, a physical write will always be
 
204
                                made to log files */
 
205
/********************************************************************
 
206
Makes a checkpoint at a given lsn or later. */
 
207
 
 
208
void
 
209
log_make_checkpoint_at(
 
210
/*===================*/
 
211
        dulint  lsn,            /* in: make a checkpoint at this or a later
 
212
                                lsn, if ut_dulint_max, makes a checkpoint at
 
213
                                the latest lsn */
 
214
        ibool   write_always);  /* in: the function normally checks if the
 
215
                                the new checkpoint would have a greater
 
216
                                lsn than the previous one: if not, then no
 
217
                                physical write is done; by setting this
 
218
                                parameter TRUE, a physical write will always be
 
219
                                made to log files */
 
220
/********************************************************************
 
221
Makes a checkpoint at the latest lsn and writes it to first page of each
 
222
data file in the database, so that we know that the file spaces contain
 
223
all modifications up to that lsn. This can only be called at database
 
224
shutdown. This function also writes all log in log files to the log archive. */
 
225
 
 
226
void
 
227
logs_empty_and_mark_files_at_shutdown(void);
 
228
/*=======================================*/
 
229
/**********************************************************
 
230
Reads a checkpoint info from a log group header to log_sys->checkpoint_buf. */
 
231
 
 
232
void
 
233
log_group_read_checkpoint_info(
 
234
/*===========================*/
 
235
        log_group_t*    group,  /* in: log group */
 
236
        ulint           field); /* in: LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 */
 
237
/***********************************************************************
 
238
Gets info from a checkpoint about a log group. */
 
239
 
 
240
void
 
241
log_checkpoint_get_nth_group_info(
 
242
/*==============================*/
 
243
        byte*   buf,    /* in: buffer containing checkpoint info */
 
244
        ulint   n,      /* in: nth slot */
 
245
        ulint*  file_no,/* out: archived file number */
 
246
        ulint*  offset);/* out: archived file offset */
 
247
/**********************************************************
 
248
Writes checkpoint info to groups. */
 
249
 
 
250
void
 
251
log_groups_write_checkpoint_info(void);
 
252
/*==================================*/
 
253
/**********************************************************
 
254
Writes info to a buffer of a log group when log files are created in
 
255
backup restoration. */
 
256
 
 
257
void
 
258
log_reset_first_header_and_checkpoint(
 
259
/*==================================*/
 
260
        byte*   hdr_buf,/* in: buffer which will be written to the start
 
261
                        of the first log file */
 
262
        dulint  start); /* in: lsn of the start of the first log file;
 
263
                        we pretend that there is a checkpoint at
 
264
                        start + LOG_BLOCK_HDR_SIZE */
 
265
/************************************************************************
 
266
Starts an archiving operation. */
 
267
 
 
268
ibool
 
269
log_archive_do(
 
270
/*===========*/
 
271
                        /* out: TRUE if succeed, FALSE if an archiving
 
272
                        operation was already running */
 
273
        ibool   sync,   /* in: TRUE if synchronous operation is desired */
 
274
        ulint*  n_bytes);/* out: archive log buffer size, 0 if nothing to
 
275
                        archive */
 
276
/********************************************************************
 
277
Writes the log contents to the archive up to the lsn when this function was
 
278
called, and stops the archiving. When archiving is started again, the archived
 
279
log file numbers start from a number one higher, so that the archiving will
 
280
not write again to the archived log files which exist when this function
 
281
returns. */
 
282
 
 
283
ulint
 
284
log_archive_stop(void);
 
285
/*==================*/
 
286
                                /* out: DB_SUCCESS or DB_ERROR */
 
287
/********************************************************************
 
288
Starts again archiving which has been stopped. */
 
289
 
 
290
ulint
 
291
log_archive_start(void);
 
292
/*===================*/
 
293
                        /* out: DB_SUCCESS or DB_ERROR */
 
294
/********************************************************************
 
295
Stop archiving the log so that a gap may occur in the archived log files. */
 
296
 
 
297
ulint
 
298
log_archive_noarchivelog(void);
 
299
/*==========================*/
 
300
                        /* out: DB_SUCCESS or DB_ERROR */
 
301
/********************************************************************
 
302
Start archiving the log so that a gap may occur in the archived log files. */
 
303
 
 
304
ulint
 
305
log_archive_archivelog(void);
 
306
/*========================*/
 
307
                        /* out: DB_SUCCESS or DB_ERROR */
 
308
/**********************************************************
 
309
Generates an archived log file name. */
 
310
 
 
311
void
 
312
log_archived_file_name_gen(
 
313
/*=======================*/
 
314
        char*   buf,    /* in: buffer where to write */
 
315
        ulint   id,     /* in: group id */
 
316
        ulint   file_no);/* in: file number */
 
317
/************************************************************************
 
318
Checks that there is enough free space in the log to start a new query step.
 
319
Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this
 
320
function may only be called if the calling thread owns no synchronization
 
321
objects! */
 
322
 
 
323
void
 
324
log_check_margins(void);
 
325
/*===================*/
 
326
/**********************************************************
 
327
Reads a specified log segment to a buffer. */
 
328
 
 
329
void
 
330
log_group_read_log_seg(
 
331
/*===================*/
 
332
        ulint           type,           /* in: LOG_ARCHIVE or LOG_RECOVER */
 
333
        byte*           buf,            /* in: buffer where to read */
 
334
        log_group_t*    group,          /* in: log group */
 
335
        dulint          start_lsn,      /* in: read area start */
 
336
        dulint          end_lsn);       /* in: read area end */
 
337
/**********************************************************
 
338
Writes a buffer to a log file group. */
 
339
 
 
340
void
 
341
log_group_write_buf(
 
342
/*================*/
 
343
        log_group_t*    group,          /* in: log group */
 
344
        byte*           buf,            /* in: buffer */
 
345
        ulint           len,            /* in: buffer len; must be divisible
 
346
                                        by OS_FILE_LOG_BLOCK_SIZE */
 
347
        dulint          start_lsn,      /* in: start lsn of the buffer; must
 
348
                                        be divisible by
 
349
                                        OS_FILE_LOG_BLOCK_SIZE */
 
350
        ulint           new_data_offset);/* in: start offset of new data in
 
351
                                        buf: this parameter is used to decide
 
352
                                        if we have to write a new log file
 
353
                                        header */
 
354
/************************************************************
 
355
Sets the field values in group to correspond to a given lsn. For this function
 
356
to work, the values must already be correctly initialized to correspond to
 
357
some lsn, for instance, a checkpoint lsn. */
 
358
 
 
359
void
 
360
log_group_set_fields(
 
361
/*=================*/
 
362
        log_group_t*    group,  /* in: group */
 
363
        dulint          lsn);   /* in: lsn for which the values should be
 
364
                                set */
 
365
/**********************************************************
 
366
Calculates the data capacity of a log group, when the log file headers are not
 
367
included. */
 
368
 
 
369
ulint
 
370
log_group_get_capacity(
 
371
/*===================*/
 
372
                                /* out: capacity in bytes */
 
373
        log_group_t*    group); /* in: log group */
 
374
/****************************************************************
 
375
Gets a log block flush bit. */
 
376
UNIV_INLINE
 
377
ibool
 
378
log_block_get_flush_bit(
 
379
/*====================*/
 
380
                                /* out: TRUE if this block was the first
 
381
                                to be written in a log flush */
 
382
        byte*   log_block);     /* in: log block */
 
383
/****************************************************************
 
384
Gets a log block number stored in the header. */
 
385
UNIV_INLINE
 
386
ulint
 
387
log_block_get_hdr_no(
 
388
/*=================*/
 
389
                                /* out: log block number stored in the block
 
390
                                header */
 
391
        byte*   log_block);     /* in: log block */
 
392
/****************************************************************
 
393
Gets a log block data length. */
 
394
UNIV_INLINE
 
395
ulint
 
396
log_block_get_data_len(
 
397
/*===================*/
 
398
                                /* out: log block data length measured as a
 
399
                                byte offset from the block start */
 
400
        byte*   log_block);     /* in: log block */
 
401
/****************************************************************
 
402
Sets the log block data length. */
 
403
UNIV_INLINE
 
404
void
 
405
log_block_set_data_len(
 
406
/*===================*/
 
407
        byte*   log_block,      /* in: log block */
 
408
        ulint   len);           /* in: data length */
 
409
/****************************************************************
 
410
Calculates the checksum for a log block. */
 
411
UNIV_INLINE
 
412
ulint
 
413
log_block_calc_checksum(
 
414
/*====================*/
 
415
                        /* out: checksum */
 
416
        byte*   block); /* in: log block */
 
417
/****************************************************************
 
418
Gets a log block checksum field value. */
 
419
UNIV_INLINE
 
420
ulint
 
421
log_block_get_checksum(
 
422
/*===================*/
 
423
                                /* out: checksum */
 
424
        byte*   log_block);     /* in: log block */
 
425
/****************************************************************
 
426
Sets a log block checksum field value. */
 
427
UNIV_INLINE
 
428
void
 
429
log_block_set_checksum(
 
430
/*===================*/
 
431
        byte*   log_block,      /* in: log block */
 
432
        ulint   checksum);      /* in: checksum */
 
433
/****************************************************************
 
434
Gets a log block first mtr log record group offset. */
 
435
UNIV_INLINE
 
436
ulint
 
437
log_block_get_first_rec_group(
 
438
/*==========================*/
 
439
                                /* out: first mtr log record group byte offset
 
440
                                from the block start, 0 if none */
 
441
        byte*   log_block);     /* in: log block */
 
442
/****************************************************************
 
443
Sets the log block first mtr log record group offset. */
 
444
UNIV_INLINE
 
445
void
 
446
log_block_set_first_rec_group(
 
447
/*==========================*/
 
448
        byte*   log_block,      /* in: log block */
 
449
        ulint   offset);        /* in: offset, 0 if none */
 
450
/****************************************************************
 
451
Gets a log block checkpoint number field (4 lowest bytes). */
 
452
UNIV_INLINE
 
453
ulint
 
454
log_block_get_checkpoint_no(
 
455
/*========================*/
 
456
                                /* out: checkpoint no (4 lowest bytes) */
 
457
        byte*   log_block);     /* in: log block */
 
458
/****************************************************************
 
459
Initializes a log block in the log buffer. */
 
460
UNIV_INLINE
 
461
void
 
462
log_block_init(
 
463
/*===========*/
 
464
        byte*   log_block,      /* in: pointer to the log buffer */
 
465
        dulint  lsn);           /* in: lsn within the log block */
 
466
/****************************************************************
 
467
Initializes a log block in the log buffer in the old, < 3.23.52 format, where
 
468
there was no checksum yet. */
 
469
UNIV_INLINE
 
470
void
 
471
log_block_init_in_old_format(
 
472
/*=========================*/
 
473
        byte*   log_block,      /* in: pointer to the log buffer */
 
474
        dulint  lsn);           /* in: lsn within the log block */
 
475
/****************************************************************
 
476
Converts a lsn to a log block number. */
 
477
UNIV_INLINE
 
478
ulint
 
479
log_block_convert_lsn_to_no(
 
480
/*========================*/
 
481
                        /* out: log block number, it is > 0 and <= 1G */
 
482
        dulint  lsn);   /* in: lsn of a byte within the block */
 
483
/**********************************************************
 
484
Prints info of the log. */
 
485
 
 
486
void
 
487
log_print(
 
488
/*======*/
 
489
        FILE*   file);  /* in: file where to print */
 
490
/**********************************************************
 
491
Peeks the current lsn. */
 
492
 
 
493
ibool
 
494
log_peek_lsn(
 
495
/*=========*/
 
496
                        /* out: TRUE if success, FALSE if could not get the
 
497
                        log system mutex */
 
498
       dulint*  lsn);   /* out: if returns TRUE, current lsn is here */
 
499
/**************************************************************************
 
500
Refreshes the statistics used to print per-second averages. */
 
501
 
 
502
void
 
503
log_refresh_stats(void);
 
504
/*===================*/
 
505
 
 
506
extern log_t*   log_sys;
 
507
 
 
508
/* Values used as flags */
 
509
#define LOG_FLUSH       7652559
 
510
#define LOG_CHECKPOINT  78656949
 
511
#define LOG_ARCHIVE     11122331
 
512
#define LOG_RECOVER     98887331
 
513
 
 
514
/* The counting of lsn's starts from this value: this must be non-zero */
 
515
#define LOG_START_LSN   ut_dulint_create(0, 16 * OS_FILE_LOG_BLOCK_SIZE)
 
516
 
 
517
#define LOG_BUFFER_SIZE         (srv_log_buffer_size * UNIV_PAGE_SIZE)
 
518
#define LOG_ARCHIVE_BUF_SIZE    (srv_log_buffer_size * UNIV_PAGE_SIZE / 4)
 
519
 
 
520
/* Offsets of a log block header */
 
521
#define LOG_BLOCK_HDR_NO        0       /* block number which must be > 0 and
 
522
                                        is allowed to wrap around at 2G; the
 
523
                                        highest bit is set to 1 if this is the
 
524
                                        first log block in a log flush write
 
525
                                        segment */
 
526
#define LOG_BLOCK_FLUSH_BIT_MASK 0x80000000UL
 
527
                                        /* mask used to get the highest bit in
 
528
                                        the preceding field */
 
529
#define LOG_BLOCK_HDR_DATA_LEN  4       /* number of bytes of log written to
 
530
                                        this block */
 
531
#define LOG_BLOCK_FIRST_REC_GROUP 6     /* offset of the first start of an
 
532
                                        mtr log record group in this log block,
 
533
                                        0 if none; if the value is the same
 
534
                                        as LOG_BLOCK_HDR_DATA_LEN, it means
 
535
                                        that the first rec group has not yet
 
536
                                        been catenated to this log block, but
 
537
                                        if it will, it will start at this
 
538
                                        offset; an archive recovery can
 
539
                                        start parsing the log records starting
 
540
                                        from this offset in this log block,
 
541
                                        if value not 0 */
 
542
#define LOG_BLOCK_CHECKPOINT_NO 8       /* 4 lower bytes of the value of
 
543
                                        log_sys->next_checkpoint_no when the
 
544
                                        log block was last written to: if the
 
545
                                        block has not yet been written full,
 
546
                                        this value is only updated before a
 
547
                                        log buffer flush */
 
548
#define LOG_BLOCK_HDR_SIZE      12      /* size of the log block header in
 
549
                                        bytes */
 
550
 
 
551
/* Offsets of a log block trailer from the end of the block */
 
552
#define LOG_BLOCK_CHECKSUM      4       /* 4 byte checksum of the log block
 
553
                                        contents; in InnoDB versions
 
554
                                        < 3.23.52 this did not contain the
 
555
                                        checksum but the same value as
 
556
                                        .._HDR_NO */
 
557
#define LOG_BLOCK_TRL_SIZE      4       /* trailer size in bytes */
 
558
 
 
559
/* Offsets for a checkpoint field */
 
560
#define LOG_CHECKPOINT_NO               0
 
561
#define LOG_CHECKPOINT_LSN              8
 
562
#define LOG_CHECKPOINT_OFFSET           16
 
563
#define LOG_CHECKPOINT_LOG_BUF_SIZE     20
 
564
#define LOG_CHECKPOINT_ARCHIVED_LSN     24
 
565
#define LOG_CHECKPOINT_GROUP_ARRAY      32
 
566
 
 
567
/* For each value < LOG_MAX_N_GROUPS the following 8 bytes: */
 
568
 
 
569
#define LOG_CHECKPOINT_ARCHIVED_FILE_NO 0
 
570
#define LOG_CHECKPOINT_ARCHIVED_OFFSET  4
 
571
 
 
572
#define LOG_CHECKPOINT_ARRAY_END        (LOG_CHECKPOINT_GROUP_ARRAY\
 
573
                                                        + LOG_MAX_N_GROUPS * 8)
 
574
#define LOG_CHECKPOINT_CHECKSUM_1       LOG_CHECKPOINT_ARRAY_END
 
575
#define LOG_CHECKPOINT_CHECKSUM_2       (4 + LOG_CHECKPOINT_ARRAY_END)
 
576
#define LOG_CHECKPOINT_FSP_FREE_LIMIT   (8 + LOG_CHECKPOINT_ARRAY_END)
 
577
                                        /* current fsp free limit in
 
578
                                        tablespace 0, in units of one
 
579
                                        megabyte; this information is only used
 
580
                                        by ibbackup to decide if it can
 
581
                                        truncate unused ends of
 
582
                                        non-auto-extending data files in space
 
583
                                        0 */
 
584
#define LOG_CHECKPOINT_FSP_MAGIC_N      (12 + LOG_CHECKPOINT_ARRAY_END)
 
585
                                        /* this magic number tells if the
 
586
                                        checkpoint contains the above field:
 
587
                                        the field was added to
 
588
                                        InnoDB-3.23.50 */
 
589
#define LOG_CHECKPOINT_SIZE             (16 + LOG_CHECKPOINT_ARRAY_END)
 
590
 
 
591
#define LOG_CHECKPOINT_FSP_MAGIC_N_VAL  1441231243
 
592
 
 
593
/* Offsets of a log file header */
 
594
#define LOG_GROUP_ID            0       /* log group number */
 
595
#define LOG_FILE_START_LSN      4       /* lsn of the start of data in this
 
596
                                        log file */
 
597
#define LOG_FILE_NO             12      /* 4-byte archived log file number;
 
598
                                        this field is only defined in an
 
599
                                        archived log file */
 
600
#define LOG_FILE_WAS_CREATED_BY_HOT_BACKUP 16
 
601
                                        /* a 32-byte field which contains
 
602
                                        the string 'ibbackup' and the
 
603
                                        creation time if the log file was
 
604
                                        created by ibbackup --restore;
 
605
                                        when mysqld is first time started
 
606
                                        on the restored database, it can
 
607
                                        print helpful info for the user */
 
608
#define LOG_FILE_ARCH_COMPLETED OS_FILE_LOG_BLOCK_SIZE
 
609
                                        /* this 4-byte field is TRUE when
 
610
                                        the writing of an archived log file
 
611
                                        has been completed; this field is
 
612
                                        only defined in an archived log file */
 
613
#define LOG_FILE_END_LSN        (OS_FILE_LOG_BLOCK_SIZE + 4)
 
614
                                        /* lsn where the archived log file
 
615
                                        at least extends: actually the
 
616
                                        archived log file may extend to a
 
617
                                        later lsn, as long as it is within the
 
618
                                        same log block as this lsn; this field
 
619
                                        is defined only when an archived log
 
620
                                        file has been completely written */
 
621
#define LOG_CHECKPOINT_1        OS_FILE_LOG_BLOCK_SIZE
 
622
                                        /* first checkpoint field in the log
 
623
                                        header; we write alternately to the
 
624
                                        checkpoint fields when we make new
 
625
                                        checkpoints; this field is only defined
 
626
                                        in the first log file of a log group */
 
627
#define LOG_CHECKPOINT_2        (3 * OS_FILE_LOG_BLOCK_SIZE)
 
628
                                        /* second checkpoint field in the log
 
629
                                        header */
 
630
#define LOG_FILE_HDR_SIZE       (4 * OS_FILE_LOG_BLOCK_SIZE)
 
631
 
 
632
#define LOG_GROUP_OK            301
 
633
#define LOG_GROUP_CORRUPTED     302
 
634
 
 
635
/* Log group consists of a number of log files, each of the same size; a log
 
636
group is implemented as a space in the sense of the module fil0fil. */
 
637
 
 
638
struct log_group_struct{
 
639
        /* The following fields are protected by log_sys->mutex */
 
640
        ulint           id;             /* log group id */
 
641
        ulint           n_files;        /* number of files in the group */
 
642
        ulint           file_size;      /* individual log file size in bytes,
 
643
                                        including the log file header */
 
644
        ulint           space_id;       /* file space which implements the log
 
645
                                        group */
 
646
        ulint           state;          /* LOG_GROUP_OK or
 
647
                                        LOG_GROUP_CORRUPTED */
 
648
        dulint          lsn;            /* lsn used to fix coordinates within
 
649
                                        the log group */
 
650
        ulint           lsn_offset;     /* the offset of the above lsn */
 
651
        ulint           n_pending_writes;/* number of currently pending flush
 
652
                                        writes for this log group */
 
653
        byte**          file_header_bufs;/* buffers for each file header in the
 
654
                                        group */
 
655
        /*-----------------------------*/
 
656
        byte**          archive_file_header_bufs;/* buffers for each file
 
657
                                        header in the group */
 
658
        ulint           archive_space_id;/* file space which implements the log
 
659
                                        group archive */
 
660
        ulint           archived_file_no;/* file number corresponding to
 
661
                                        log_sys->archived_lsn */
 
662
        ulint           archived_offset;/* file offset corresponding to
 
663
                                        log_sys->archived_lsn, 0 if we have
 
664
                                        not yet written to the archive file
 
665
                                        number archived_file_no */
 
666
        ulint           next_archived_file_no;/* during an archive write,
 
667
                                        until the write is completed, we
 
668
                                        store the next value for
 
669
                                        archived_file_no here: the write
 
670
                                        completion function then sets the new
 
671
                                        value to ..._file_no */
 
672
        ulint           next_archived_offset; /* like the preceding field */
 
673
        /*-----------------------------*/
 
674
        dulint          scanned_lsn;    /* used only in recovery: recovery scan
 
675
                                        succeeded up to this lsn in this log
 
676
                                        group */
 
677
        byte*           checkpoint_buf; /* checkpoint header is written from
 
678
                                        this buffer to the group */
 
679
        UT_LIST_NODE_T(log_group_t)
 
680
                        log_groups;     /* list of log groups */
 
681
};
 
682
 
 
683
struct log_struct{
 
684
        byte            pad[64];        /* padding to prevent other memory
 
685
                                        update hotspots from residing on the
 
686
                                        same memory cache line */
 
687
        dulint          lsn;            /* log sequence number */
 
688
        ulint           buf_free;       /* first free offset within the log
 
689
                                        buffer */
 
690
        mutex_t         mutex;          /* mutex protecting the log */
 
691
        byte*           buf;            /* log buffer */
 
692
        ulint           buf_size;       /* log buffer size in bytes */
 
693
        ulint           max_buf_free;   /* recommended maximum value of
 
694
                                        buf_free, after which the buffer is
 
695
                                        flushed */
 
696
        ulint           old_buf_free;   /* value of buf free when log was
 
697
                                        last time opened; only in the debug
 
698
                                        version */
 
699
        dulint          old_lsn;        /* value of lsn when log was last time
 
700
                                        opened; only in the debug version */
 
701
        ibool           check_flush_or_checkpoint;
 
702
                                        /* this is set to TRUE when there may
 
703
                                        be need to flush the log buffer, or
 
704
                                        preflush buffer pool pages, or make
 
705
                                        a checkpoint; this MUST be TRUE when
 
706
                                        lsn - last_checkpoint_lsn >
 
707
                                        max_checkpoint_age; this flag is
 
708
                                        peeked at by log_free_check(), which
 
709
                                        does not reserve the log mutex */
 
710
        UT_LIST_BASE_NODE_T(log_group_t)
 
711
                        log_groups;     /* log groups */
 
712
 
 
713
        /* The fields involved in the log buffer flush */
 
714
 
 
715
        ulint           buf_next_to_write;/* first offset in the log buffer
 
716
                                        where the byte content may not exist
 
717
                                        written to file, e.g., the start
 
718
                                        offset of a log record catenated
 
719
                                        later; this is advanced when a flush
 
720
                                        operation is completed to all the log
 
721
                                        groups */
 
722
        dulint          written_to_some_lsn;
 
723
                                        /* first log sequence number not yet
 
724
                                        written to any log group; for this to
 
725
                                        be advanced, it is enough that the
 
726
                                        write i/o has been completed for any
 
727
                                        one log group */
 
728
        dulint          written_to_all_lsn;
 
729
                                        /* first log sequence number not yet
 
730
                                        written to some log group; for this to
 
731
                                        be advanced, it is enough that the
 
732
                                        write i/o has been completed for all
 
733
                                        log groups */
 
734
        dulint          write_lsn;      /* end lsn for the current running
 
735
                                        write */
 
736
        ulint           write_end_offset;/* the data in buffer has been written
 
737
                                        up to this offset when the current
 
738
                                        write ends: this field will then
 
739
                                        be copied to buf_next_to_write */
 
740
        dulint          current_flush_lsn;/* end lsn for the current running
 
741
                                        write + flush operation */
 
742
        dulint          flushed_to_disk_lsn;
 
743
                                        /* how far we have written the log
 
744
                                        AND flushed to disk */
 
745
        ulint           n_pending_writes;/* number of currently pending flushes
 
746
                                        or writes */
 
747
        /* NOTE on the 'flush' in names of the fields below: starting from
 
748
        4.0.14, we separate the write of the log file and the actual fsync()
 
749
        or other method to flush it to disk. The names below shhould really
 
750
        be 'flush_or_write'! */
 
751
        os_event_t      no_flush_event; /* this event is in the reset state
 
752
                                        when a flush or a write is running;
 
753
                                        a thread should wait for this without
 
754
                                        owning the log mutex, but NOTE that
 
755
                                        to set or reset this event, the
 
756
                                        thread MUST own the log mutex! */
 
757
        ibool           one_flushed;    /* during a flush, this is first FALSE
 
758
                                        and becomes TRUE when one log group
 
759
                                        has been written or flushed */
 
760
        os_event_t      one_flushed_event;/* this event is reset when the
 
761
                                        flush or write has not yet completed
 
762
                                        for any log group; e.g., this means
 
763
                                        that a transaction has been committed
 
764
                                        when this is set; a thread should wait
 
765
                                        for this without owning the log mutex,
 
766
                                        but NOTE that to set or reset this
 
767
                                        event, the thread MUST own the log
 
768
                                        mutex! */
 
769
        ulint           n_log_ios;      /* number of log i/os initiated thus
 
770
                                        far */
 
771
        ulint           n_log_ios_old;  /* number of log i/o's at the
 
772
                                        previous printout */
 
773
        time_t          last_printout_time;/* when log_print was last time
 
774
                                        called */
 
775
 
 
776
        /* Fields involved in checkpoints */
 
777
        ulint           log_group_capacity; /* capacity of the log group; if
 
778
                                        the checkpoint age exceeds this, it is
 
779
                                        a serious error because it is possible
 
780
                                        we will then overwrite log and spoil
 
781
                                        crash recovery */
 
782
        ulint           max_modified_age_async;
 
783
                                        /* when this recommended value for lsn
 
784
                                        - buf_pool_get_oldest_modification()
 
785
                                        is exceeded, we start an asynchronous
 
786
                                        preflush of pool pages */
 
787
        ulint           max_modified_age_sync;
 
788
                                        /* when this recommended value for lsn
 
789
                                        - buf_pool_get_oldest_modification()
 
790
                                        is exceeded, we start a synchronous
 
791
                                        preflush of pool pages */
 
792
        ulint           adm_checkpoint_interval;
 
793
                                        /* administrator-specified checkpoint
 
794
                                        interval in terms of log growth in
 
795
                                        bytes; the interval actually used by
 
796
                                        the database can be smaller */
 
797
        ulint           max_checkpoint_age_async;
 
798
                                        /* when this checkpoint age is exceeded
 
799
                                        we start an asynchronous writing of a
 
800
                                        new checkpoint */
 
801
        ulint           max_checkpoint_age;
 
802
                                        /* this is the maximum allowed value
 
803
                                        for lsn - last_checkpoint_lsn when a
 
804
                                        new query step is started */
 
805
        dulint          next_checkpoint_no;
 
806
                                        /* next checkpoint number */
 
807
        dulint          last_checkpoint_lsn;
 
808
                                        /* latest checkpoint lsn */
 
809
        dulint          next_checkpoint_lsn;
 
810
                                        /* next checkpoint lsn */
 
811
        ulint           n_pending_checkpoint_writes;
 
812
                                        /* number of currently pending
 
813
                                        checkpoint writes */
 
814
        rw_lock_t       checkpoint_lock;/* this latch is x-locked when a
 
815
                                        checkpoint write is running; a thread
 
816
                                        should wait for this without owning
 
817
                                        the log mutex */
 
818
        byte*           checkpoint_buf; /* checkpoint header is read to this
 
819
                                        buffer */
 
820
        /* Fields involved in archiving */
 
821
        ulint           archiving_state;/* LOG_ARCH_ON, LOG_ARCH_STOPPING
 
822
                                        LOG_ARCH_STOPPED, LOG_ARCH_OFF */
 
823
        dulint          archived_lsn;   /* archiving has advanced to this
 
824
                                        lsn */
 
825
        ulint           max_archived_lsn_age_async;
 
826
                                        /* recommended maximum age of
 
827
                                        archived_lsn, before we start
 
828
                                        asynchronous copying to the archive */
 
829
        ulint           max_archived_lsn_age;
 
830
                                        /* maximum allowed age for
 
831
                                        archived_lsn */
 
832
        dulint          next_archived_lsn;/* during an archive write,
 
833
                                        until the write is completed, we
 
834
                                        store the next value for
 
835
                                        archived_lsn here: the write
 
836
                                        completion function then sets the new
 
837
                                        value to archived_lsn */
 
838
        ulint           archiving_phase;/* LOG_ARCHIVE_READ or
 
839
                                        LOG_ARCHIVE_WRITE */
 
840
        ulint           n_pending_archive_ios;
 
841
                                        /* number of currently pending reads
 
842
                                        or writes in archiving */
 
843
        rw_lock_t       archive_lock;   /* this latch is x-locked when an
 
844
                                        archive write is running; a thread
 
845
                                        should wait for this without owning
 
846
                                        the log mutex */
 
847
        ulint           archive_buf_size;/* size of archive_buf */
 
848
        byte*           archive_buf;    /* log segment is written to the
 
849
                                        archive from this buffer */
 
850
        os_event_t      archiving_on;   /* if archiving has been stopped,
 
851
                                        a thread can wait for this event to
 
852
                                        become signaled */
 
853
};
 
854
 
 
855
#define LOG_ARCH_ON             71
 
856
#define LOG_ARCH_STOPPING       72
 
857
#define LOG_ARCH_STOPPING2      73
 
858
#define LOG_ARCH_STOPPED        74
 
859
#define LOG_ARCH_OFF            75
 
860
 
 
861
#ifndef UNIV_NONINL
 
862
#include "log0log.ic"
 
863
#endif
 
864
 
 
865
#endif