1
/******************************************************
6
Created 7/19/1997 Heikki Tuuri
7
*******************************************************/
15
#include "dict0dict.h"
17
#include "que0types.h"
18
#include "ibuf0types.h"
23
/**********************************************************************
24
Creates the insert buffer data struct for a single tablespace. Reads the
25
root page of the insert buffer tree in the tablespace. This function can
26
be called only after the dictionary system has been initialized, as this
27
creates also the insert buffer table and index for this tablespace. */
30
ibuf_data_init_for_space(
31
/*=====================*/
32
/* out, own: ibuf data struct, linked to the list
33
in ibuf control structure. */
34
ulint space); /* in: space id */
35
/**********************************************************************
36
Creates the insert buffer data structure at a database startup and
37
initializes the data structures for the insert buffer of each tablespace. */
40
ibuf_init_at_db_start(void);
41
/*=======================*/
42
/*************************************************************************
43
Reads the biggest tablespace id from the high end of the insert buffer
44
tree and updates the counter in fil_system. */
47
ibuf_update_max_tablespace_id(void);
48
/*===============================*/
49
/*************************************************************************
50
Initializes an ibuf bitmap page. */
53
ibuf_bitmap_page_init(
54
/*==================*/
55
page_t* page, /* in: bitmap page */
56
mtr_t* mtr); /* in: mtr */
57
/****************************************************************************
58
Resets the free bits of the page in the ibuf bitmap. This is done in a
59
separate mini-transaction, hence this operation does not restrict further
60
work to only ibuf bitmap operations, which would result if the latch to the
61
bitmap page were kept. */
64
ibuf_reset_free_bits_with_type(
65
/*===========================*/
66
ulint type, /* in: index type */
67
page_t* page); /* in: index page; free bits are set to 0 if the index
68
is non-clustered and non-unique and the page level is
70
/****************************************************************************
71
Resets the free bits of the page in the ibuf bitmap. This is done in a
72
separate mini-transaction, hence this operation does not restrict further
73
work to solely ibuf bitmap operations, which would result if the latch to
74
the bitmap page were kept. */
79
dict_index_t* index, /* in: index */
80
page_t* page); /* in: index page; free bits are set to 0 if
81
the index is non-clustered and non-unique and
82
the page level is 0 */
83
/****************************************************************************
84
Updates the free bits of the page in the ibuf bitmap if there is not enough
85
free on the page any more. This is done in a separate mini-transaction, hence
86
this operation does not restrict further work to only ibuf bitmap operations,
87
which would result if the latch to the bitmap page were kept. */
90
ibuf_update_free_bits_if_full(
91
/*==========================*/
92
dict_index_t* index, /* in: index */
93
page_t* page, /* in: index page to which we have added new
94
records; the free bits are updated if the
95
index is non-clustered and non-unique and
96
the page level is 0, and the page becomes
98
ulint max_ins_size,/* in: value of maximum insert size with
99
reorganize before the latest operation
100
performed to the page */
101
ulint increase);/* in: upper limit for the additional space
102
used in the latest operation, if known, or
104
/**************************************************************************
105
Updates the free bits for the page to reflect the present state. Does this
106
in the mtr given, which means that the latching order rules virtually
107
prevent any further operations for this OS thread until mtr is committed. */
110
ibuf_update_free_bits_low(
111
/*======================*/
112
dict_index_t* index, /* in: index */
113
page_t* page, /* in: index page */
114
ulint max_ins_size, /* in: value of maximum insert size
115
with reorganize before the latest
116
operation performed to the page */
117
mtr_t* mtr); /* in: mtr */
118
/**************************************************************************
119
Updates the free bits for the two pages to reflect the present state. Does
120
this in the mtr given, which means that the latching order rules virtually
121
prevent any further operations until mtr is committed. */
124
ibuf_update_free_bits_for_two_pages_low(
125
/*====================================*/
126
dict_index_t* index, /* in: index */
127
page_t* page1, /* in: index page */
128
page_t* page2, /* in: index page */
129
mtr_t* mtr); /* in: mtr */
130
/**************************************************************************
131
A basic partial test if an insert to the insert buffer could be possible and
137
dict_index_t* index, /* in: index where to insert */
138
ulint ignore_sec_unique); /* in: if != 0, we should
139
ignore UNIQUE constraint on
140
a secondary index when we
142
/**********************************************************************
143
Returns TRUE if the current OS thread is performing an insert buffer
149
/* out: TRUE if inside an insert buffer routine: for instance,
150
a read-ahead of non-ibuf pages is then forbidden */
151
/***************************************************************************
152
Checks if a page address is an ibuf bitmap page (level 3 page) address. */
157
/* out: TRUE if a bitmap page */
158
ulint page_no);/* in: page number */
159
/***************************************************************************
160
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
165
/* out: TRUE if level 2 or level 3 page */
166
ulint space, /* in: space id */
167
ulint page_no);/* in: page number */
168
/***************************************************************************
169
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. */
174
/* out: TRUE if level 2 or level 3 page */
175
ulint space, /* in: space id */
176
ulint page_no,/* in: page number */
177
mtr_t* mtr); /* in: mtr which will contain an x-latch to the
178
bitmap page if the page is not one of the fixed
179
address ibuf pages */
180
/***************************************************************************
181
Frees excess pages from the ibuf free list. This function is called when an OS
182
thread calls fsp services to allocate a new file segment, or a new page to a
183
file segment, and the thread did not own the fsp latch before this call. */
186
ibuf_free_excess_pages(
187
/*===================*/
188
ulint space); /* in: space id */
189
/*************************************************************************
190
Makes an index insert to the insert buffer, instead of directly to the disk
191
page, if this is possible. Does not do insert if the index is clustered
197
/* out: TRUE if success */
198
dtuple_t* entry, /* in: index entry to insert */
199
dict_index_t* index, /* in: index where to insert */
200
ulint space, /* in: space id where to insert */
201
ulint page_no,/* in: page number where to insert */
202
que_thr_t* thr); /* in: query thread */
203
/*************************************************************************
204
When an index page is read from a disk to the buffer pool, this function
205
inserts to the page the possible index entries buffered in the insert buffer.
206
The entries are deleted from the insert buffer. If the page is not read, but
207
created in the buffer pool, this function deletes its buffered entries from
208
the insert buffer; there can exist entries for such a page if the page
209
belonged to an index which subsequently was dropped. */
212
ibuf_merge_or_delete_for_page(
213
/*==========================*/
214
page_t* page, /* in: if page has been read from disk, pointer to
215
the page x-latched, else NULL */
216
ulint space, /* in: space id of the index page */
217
ulint page_no,/* in: page number of the index page */
218
ibool update_ibuf_bitmap);/* in: normally this is set to TRUE, but if
219
we have deleted or are deleting the tablespace, then we
220
naturally do not want to update a non-existent bitmap
222
/*************************************************************************
223
Deletes all entries in the insert buffer for a given space id. This is used
224
in DISCARD TABLESPACE and IMPORT TABLESPACE.
225
NOTE: this does not update the page free bitmaps in the space. The space will
226
become CORRUPT when you call this function! */
229
ibuf_delete_for_discarded_space(
230
/*============================*/
231
ulint space); /* in: space id */
232
/*************************************************************************
233
Contracts insert buffer trees by reading pages to the buffer pool. */
238
/* out: a lower limit for the combined size in bytes
239
of entries which will be merged from ibuf trees to the
240
pages read, 0 if ibuf is empty */
241
ibool sync); /* in: TRUE if the caller wants to wait for the
242
issued read with the highest tablespace address
244
/*************************************************************************
245
Contracts insert buffer trees by reading pages to the buffer pool. */
248
ibuf_contract_for_n_pages(
249
/*======================*/
250
/* out: a lower limit for the combined size in bytes
251
of entries which will be merged from ibuf trees to the
252
pages read, 0 if ibuf is empty */
253
ibool sync, /* in: TRUE if the caller wants to wait for the
254
issued read with the highest tablespace address
256
ulint n_pages);/* in: try to read at least this many pages to
257
the buffer pool and merge the ibuf contents to
259
/*************************************************************************
260
Parses a redo log record of an ibuf bitmap page init. */
263
ibuf_parse_bitmap_init(
264
/*===================*/
265
/* out: end of log record or NULL */
266
byte* ptr, /* in: buffer */
267
byte* end_ptr,/* in: buffer end */
268
page_t* page, /* in: page or NULL */
269
mtr_t* mtr); /* in: mtr or NULL */
270
#ifdef UNIV_IBUF_DEBUG
271
/**********************************************************************
272
Gets the ibuf count for a given page. */
277
/* out: number of entries in the insert buffer
278
currently buffered for this page */
279
ulint space, /* in: space id */
280
ulint page_no);/* in: page number */
282
/**********************************************************************
283
Looks if the insert buffer is empty. */
288
/* out: TRUE if empty */
289
/**********************************************************************
290
Prints info of ibuf. */
295
FILE* file); /* in: file where to print */
297
#define IBUF_HEADER_PAGE_NO FSP_IBUF_HEADER_PAGE_NO
298
#define IBUF_TREE_ROOT_PAGE_NO FSP_IBUF_TREE_ROOT_PAGE_NO
300
/* The ibuf header page currently contains only the file segment header
301
for the file segment from which the pages for the ibuf tree are allocated */
302
#define IBUF_HEADER PAGE_DATA
303
#define IBUF_TREE_SEG_HEADER 0 /* fseg header for ibuf tree */
306
#include "ibuf0ibuf.ic"