~drizzle-trunk/drizzle/development

641.2.2 by Monty Taylor
InnoDB Plugin 1.0.3
1
/*****************************************************************************
2
3
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
4
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
8
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15
Place, Suite 330, Boston, MA 02111-1307 USA
16
17
*****************************************************************************/
18
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
19
/**************************************************//**
20
@file include/buf0flu.h
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
21
The database buffer pool flush algorithm
22
23
Created 11/5/1995 Heikki Tuuri
24
*******************************************************/
25
26
#ifndef buf0flu_h
27
#define buf0flu_h
28
29
#include "univ.i"
30
#include "ut0byte.h"
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
31
#ifndef UNIV_HOTBACKUP
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
32
#include "mtr0types.h"
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
33
#include "buf0types.h"
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
34
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
35
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
36
Remove a block from the flush list of modified blocks. */
37
UNIV_INTERN
38
void
39
buf_flush_remove(
40
/*=============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
41
	buf_page_t*	bpage);	/*!< in: pointer to the block in question */
42
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
43
Updates the flush system data structures when a write is completed. */
44
UNIV_INTERN
45
void
46
buf_flush_write_complete(
47
/*=====================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
48
	buf_page_t*	bpage);	/*!< in: pointer to the block in question */
49
/*********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
50
Flushes pages from the end of the LRU list if there is too small
51
a margin of replaceable pages there. */
52
UNIV_INTERN
53
void
54
buf_flush_free_margin(void);
55
/*=======================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
56
#endif /* !UNIV_HOTBACKUP */
57
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
58
Initializes a page for writing to the tablespace. */
59
UNIV_INTERN
60
void
61
buf_flush_init_for_writing(
62
/*=======================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
63
	byte*		page,		/*!< in/out: page */
64
	void*		page_zip_,	/*!< in/out: compressed page, or NULL */
65
	ib_uint64_t	newest_lsn);	/*!< in: newest modification lsn
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
66
					to the page */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
67
#ifndef UNIV_HOTBACKUP
68
/*******************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
69
This utility flushes dirty blocks from the end of the LRU list or flush_list.
70
NOTE 1: in the case of an LRU flush the calling thread may own latches to
71
pages: to avoid deadlocks, this function must be written so that it cannot
72
end up waiting for these latches! NOTE 2: in the case of a flush list flush,
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
73
the calling thread is not allowed to own any latches on pages!
74
@return number of blocks for which the write request was queued;
75
ULINT_UNDEFINED if there was a flush of the same type already running */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
76
UNIV_INTERN
77
ulint
78
buf_flush_batch(
79
/*============*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
80
	enum buf_flush	flush_type,	/*!< in: BUF_FLUSH_LRU or
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
81
					BUF_FLUSH_LIST; if BUF_FLUSH_LIST,
82
					then the caller must not own any
83
					latches on pages */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
84
	ulint		min_n,		/*!< in: wished minimum mumber of blocks
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
85
					flushed (it is not guaranteed that the
86
					actual number is that big, though) */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
87
	ib_uint64_t	lsn_limit);	/*!< in the case BUF_FLUSH_LIST all
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
88
					blocks whose oldest_modification is
89
					smaller than this should be flushed
90
					(if their number does not exceed
91
					min_n), otherwise ignored */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
92
/******************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
93
Waits until a flush batch of the given type ends */
94
UNIV_INTERN
95
void
96
buf_flush_wait_batch_end(
97
/*=====================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
98
	enum buf_flush	type);	/*!< in: BUF_FLUSH_LRU or BUF_FLUSH_LIST */
99
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
100
This function should be called at a mini-transaction commit, if a page was
101
modified in it. Puts the block to the list of modified blocks, if it not
102
already in it. */
103
UNIV_INLINE
104
void
105
buf_flush_note_modification(
106
/*========================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
107
	buf_block_t*	block,	/*!< in: block which is modified */
108
	mtr_t*		mtr);	/*!< in: mtr */
109
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
110
This function should be called when recovery has modified a buffer page. */
111
UNIV_INLINE
112
void
113
buf_flush_recv_note_modification(
114
/*=============================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
115
	buf_block_t*	block,		/*!< in: block which is modified */
116
	ib_uint64_t	start_lsn,	/*!< in: start lsn of the first mtr in a
117
					set of mtr's */
118
	ib_uint64_t	end_lsn);	/*!< in: end lsn of the last mtr in the
119
					set of mtr's */
120
/********************************************************************//**
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
121
Returns TRUE if the file page block is immediately suitable for replacement,
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
122
i.e., transition FILE_PAGE => NOT_USED allowed.
123
@return	TRUE if can replace immediately */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
124
UNIV_INTERN
125
ibool
126
buf_flush_ready_for_replace(
127
/*========================*/
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
128
	buf_page_t*	bpage);	/*!< in: buffer control block, must be
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
129
				buf_page_in_file(bpage) and in the LRU list */
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
130
131
/** @brief Statistics for selecting flush rate based on redo log
132
generation speed.
133
134
These statistics are generated for heuristics used in estimating the
135
rate at which we should flush the dirty blocks to avoid bursty IO
136
activity. Note that the rate of flushing not only depends on how many
137
dirty pages we have in the buffer pool but it is also a fucntion of
138
how much redo the workload is generating and at what rate. */
139
140
struct buf_flush_stat_struct
141
{
142
	ib_uint64_t	redo;		/**< amount of redo generated. */
143
	ulint		n_flushed;	/**< number of pages flushed. */
144
};
145
146
/** Statistics for selecting flush rate of dirty pages. */
147
typedef struct buf_flush_stat_struct buf_flush_stat_t;
148
/*********************************************************************
149
Update the historical stats that we are collecting for flush rate
150
heuristics at the end of each interval. */
151
UNIV_INTERN
152
void
153
buf_flush_stat_update(void);
154
/*=======================*/
155
/*********************************************************************
156
Determines the fraction of dirty pages that need to be flushed based
157
on the speed at which we generate redo log. Note that if redo log
158
is generated at significant rate without a corresponding increase
159
in the number of dirty pages (for example, an in-memory workload)
160
it can cause IO bursts of flushing. This function implements heuristics
161
to avoid this burstiness.
162
@return	number of dirty pages to be flushed / second */
163
UNIV_INTERN
164
ulint
165
buf_flush_get_desired_flush_rate(void);
166
/*==================================*/
167
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
168
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
169
/******************************************************************//**
170
Validates the flush list.
171
@return	TRUE if ok */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
172
UNIV_INTERN
173
ibool
174
buf_flush_validate(void);
175
/*====================*/
176
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
177
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
178
/** When buf_flush_free_margin is called, it tries to make this many blocks
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
179
available to replacement in the free list and at the end of the LRU list (to
180
make sure that a read-ahead batch can be read efficiently in a single
181
sweep). */
182
#define BUF_FLUSH_FREE_BLOCK_MARGIN	(5 + BUF_READ_AHEAD_AREA)
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
183
/** Extra margin to apply above BUF_FLUSH_FREE_BLOCK_MARGIN */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
184
#define BUF_FLUSH_EXTRA_MARGIN		(BUF_FLUSH_FREE_BLOCK_MARGIN / 4 + 100)
641.2.3 by Monty Taylor
InnoDB Plugin 1.0.4
185
#endif /* !UNIV_HOTBACKUP */
641.1.2 by Monty Taylor
Imported 1.0.1 with clean - with no changes.
186
187
#ifndef UNIV_NONINL
188
#include "buf0flu.ic"
189
#endif
190
191
#endif