]>
Commit | Line | Data |
---|---|---|
36400f81 | 1 | diff -ruN a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c |
eccb488f ER |
2 | --- a/innobase/btr/btr0cur.c Mon Dec 22 00:33:03 2008 -0800 |
3 | +++ b/innobase/btr/btr0cur.c Mon Dec 22 00:33:11 2008 -0800 | |
4 | @@ -516,6 +516,14 @@ | |
5 | == index->table->comp); | |
6 | } | |
7 | ||
8 | + if (level == 0) { | |
9 | + /* Initializes status counters */ | |
10 | + innobase_mysql_thd_init_innodb_scan_cont(); | |
11 | + innobase_mysql_thd_init_innodb_scan_jump(); | |
12 | + innobase_mysql_thd_init_innodb_scan_data(); | |
13 | + innobase_mysql_thd_init_innodb_scan_garbage(); | |
14 | + } | |
15 | + | |
16 | break; | |
17 | } | |
18 | ||
36400f81 | 19 | @@ -664,6 +672,12 @@ |
eccb488f ER |
20 | root_height); |
21 | } | |
36400f81 | 22 | |
eccb488f ER |
23 | + /* Initializes status counters */ |
24 | + innobase_mysql_thd_init_innodb_scan_cont(); | |
25 | + innobase_mysql_thd_init_innodb_scan_jump(); | |
26 | + innobase_mysql_thd_init_innodb_scan_data(); | |
27 | + innobase_mysql_thd_init_innodb_scan_garbage(); | |
36400f81 | 28 | + |
eccb488f ER |
29 | break; |
30 | } | |
36400f81 ER |
31 | |
32 | diff -ruN a/innobase/btr/btr0pcur.c b/innobase/btr/btr0pcur.c | |
eccb488f ER |
33 | --- a/innobase/btr/btr0pcur.c Mon Dec 22 00:33:03 2008 -0800 |
34 | +++ b/innobase/btr/btr0pcur.c Mon Dec 22 00:33:11 2008 -0800 | |
35 | @@ -381,6 +381,7 @@ | |
36 | last record of the current page */ | |
37 | mtr_t* mtr) /* in: mtr */ | |
38 | { | |
39 | + ulint page_no; | |
40 | ulint next_page_no; | |
41 | ulint space; | |
42 | page_t* page; | |
36400f81 | 43 | @@ -393,12 +394,23 @@ |
eccb488f ER |
44 | cursor->old_stored = BTR_PCUR_OLD_NOT_STORED; |
45 | ||
46 | page = btr_pcur_get_page(cursor); | |
47 | + page_no = buf_frame_get_page_no(page); | |
48 | ||
49 | next_page_no = btr_page_get_next(page, mtr); | |
50 | space = buf_frame_get_space_id(page); | |
51 | ||
52 | ut_ad(next_page_no != FIL_NULL); | |
36400f81 | 53 | |
eccb488f ER |
54 | + if (next_page_no - page_no == 1) { |
55 | + innobase_mysql_thd_increment_innodb_scan_cont(1); | |
56 | + } else { | |
57 | + innobase_mysql_thd_increment_innodb_scan_jump(1); | |
58 | + } | |
59 | + innobase_mysql_thd_increment_innodb_scan_data( | |
60 | + page_get_data_size(page)); | |
61 | + innobase_mysql_thd_increment_innodb_scan_garbage( | |
62 | + page_header_get_field(page, PAGE_GARBAGE)); | |
36400f81 | 63 | + |
eccb488f ER |
64 | next_page = btr_page_get(space, next_page_no, cursor->latch_mode, mtr); |
65 | ut_a(page_is_comp(next_page) == page_is_comp(page)); | |
36400f81 | 66 | buf_block_align(next_page)->check_index_page_at_flush = TRUE; |
eccb488f ER |
67 | @@ -427,6 +439,7 @@ |
68 | record of the current page */ | |
69 | mtr_t* mtr) /* in: mtr */ | |
70 | { | |
71 | + ulint page_no; | |
72 | ulint prev_page_no; | |
73 | ulint space; | |
74 | page_t* page; | |
36400f81 | 75 | @@ -462,10 +475,21 @@ |
eccb488f ER |
76 | btr_pcur_restore_position(latch_mode2, cursor, mtr); |
77 | ||
78 | page = btr_pcur_get_page(cursor); | |
79 | + page_no = buf_frame_get_page_no(page); | |
80 | ||
81 | prev_page_no = btr_page_get_prev(page, mtr); | |
82 | space = buf_frame_get_space_id(page); | |
36400f81 | 83 | |
eccb488f ER |
84 | + if (page_no - prev_page_no == 1) { |
85 | + innobase_mysql_thd_increment_innodb_scan_cont(1); | |
86 | + } else { | |
87 | + innobase_mysql_thd_increment_innodb_scan_jump(1); | |
88 | + } | |
89 | + innobase_mysql_thd_increment_innodb_scan_data( | |
90 | + page_get_data_size(page)); | |
91 | + innobase_mysql_thd_increment_innodb_scan_garbage( | |
92 | + page_header_get_field(page, PAGE_GARBAGE)); | |
36400f81 | 93 | + |
eccb488f ER |
94 | if (btr_pcur_is_before_first_on_page(cursor, mtr) |
95 | && (prev_page_no != FIL_NULL)) { | |
36400f81 ER |
96 | |
97 | diff -ruN a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c | |
eccb488f ER |
98 | --- a/innobase/btr/btr0sea.c Mon Dec 22 00:33:03 2008 -0800 |
99 | +++ b/innobase/btr/btr0sea.c Mon Dec 22 00:33:11 2008 -0800 | |
36400f81 | 100 | @@ -888,6 +888,12 @@ |
eccb488f ER |
101 | |
102 | buf_pool->n_page_gets++; | |
103 | ||
104 | + /* Initializes status counters */ | |
105 | + innobase_mysql_thd_init_innodb_scan_cont(); | |
106 | + innobase_mysql_thd_init_innodb_scan_jump(); | |
107 | + innobase_mysql_thd_init_innodb_scan_data(); | |
108 | + innobase_mysql_thd_init_innodb_scan_garbage(); | |
109 | + | |
110 | return(TRUE); | |
111 | ||
112 | /*-------------------------------------------*/ | |
36400f81 | 113 | diff -ruN a/innobase/include/btr0cur.h b/innobase/include/btr0cur.h |
eccb488f ER |
114 | --- a/innobase/include/btr0cur.h Mon Dec 22 00:33:03 2008 -0800 |
115 | +++ b/innobase/include/btr0cur.h Mon Dec 22 00:33:11 2008 -0800 | |
116 | @@ -697,6 +697,17 @@ | |
117 | extern ulint btr_cur_n_non_sea_old; | |
118 | extern ulint btr_cur_n_sea_old; | |
119 | ||
120 | +/*--------------------------------------*/ | |
121 | +/* prototypes for new functions added to ha_innodb.cc */ | |
122 | +void innobase_mysql_thd_init_innodb_scan_cont(); | |
123 | +void innobase_mysql_thd_increment_innodb_scan_cont(ulong length); | |
124 | +void innobase_mysql_thd_init_innodb_scan_jump(); | |
125 | +void innobase_mysql_thd_increment_innodb_scan_jump(ulong length); | |
126 | +void innobase_mysql_thd_init_innodb_scan_data(); | |
127 | +void innobase_mysql_thd_increment_innodb_scan_data(ulong length); | |
128 | +void innobase_mysql_thd_init_innodb_scan_garbage(); | |
129 | +void innobase_mysql_thd_increment_innodb_scan_garbage(ulong length); | |
130 | + | |
131 | #ifndef UNIV_NONINL | |
132 | #include "btr0cur.ic" | |
133 | #endif | |
36400f81 | 134 | diff -ruN /dev/null b/patch_info/innodb_check_fragmentation.info |
eccb488f ER |
135 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 |
136 | +++ b/patch_info/innodb_check_fragmentation.info Mon Dec 22 00:33:11 2008 -0800 | |
137 | @@ -0,0 +1,6 @@ | |
138 | +File=innodb_check_fragmentation.patch | |
139 | +Name=Session status to check fragmentation of the last InnoDB scan | |
140 | +Version=1.0 | |
141 | +Author=Percona <info@percona.com> | |
142 | +License=GPL | |
143 | +Comment=The names are Innodb_scan_* | |
36400f81 | 144 | diff -ruN a/sql/ha_innodb.cc b/sql/ha_innodb.cc |
eccb488f ER |
145 | --- a/sql/ha_innodb.cc Mon Dec 22 00:33:03 2008 -0800 |
146 | +++ b/sql/ha_innodb.cc Mon Dec 22 00:33:11 2008 -0800 | |
36400f81 | 147 | @@ -759,6 +759,102 @@ |
eccb488f ER |
148 | } |
149 | ||
150 | /************************************************************************* | |
151 | +Initializes Innodb_scan_blocks_contiguous. */ | |
152 | +extern "C" | |
153 | +void | |
154 | +innobase_mysql_thd_init_innodb_scan_cont() | |
155 | +{ | |
156 | + THD *thd=current_thd; | |
157 | + if (likely(thd != 0)) { | |
158 | + thd->status_var.innodb_scan_cont = 0; | |
159 | + } | |
160 | +} | |
161 | + | |
162 | +/************************************************************************* | |
163 | +Increments Innodb_scan_blocks_contiguous. */ | |
164 | +extern "C" | |
165 | +void | |
166 | +innobase_mysql_thd_increment_innodb_scan_cont(ulong length) | |
167 | +{ | |
168 | + THD *thd=current_thd; | |
169 | + if (likely(thd != 0)) { | |
170 | + thd->status_var.innodb_scan_cont+= length; | |
171 | + } | |
172 | +} | |
173 | + | |
174 | +/************************************************************************* | |
175 | +Initializes Innodb_scan_blocks_jumpy. */ | |
176 | +extern "C" | |
177 | +void | |
178 | +innobase_mysql_thd_init_innodb_scan_jump() | |
179 | +{ | |
180 | + THD *thd=current_thd; | |
181 | + if (likely(thd != 0)) { | |
182 | + thd->status_var.innodb_scan_jump = 0; | |
183 | + } | |
184 | +} | |
185 | + | |
186 | +/************************************************************************* | |
187 | +Increments Innodb_scan_blocks_jumpy. */ | |
188 | +extern "C" | |
189 | +void | |
190 | +innobase_mysql_thd_increment_innodb_scan_jump(ulong length) | |
191 | +{ | |
192 | + THD *thd=current_thd; | |
193 | + if (likely(thd != 0)) { | |
194 | + thd->status_var.innodb_scan_jump+= length; | |
195 | + } | |
196 | +} | |
197 | + | |
198 | +/************************************************************************* | |
199 | +Initializes Innodb_scan_data_in_pages. */ | |
200 | +extern "C" | |
201 | +void | |
202 | +innobase_mysql_thd_init_innodb_scan_data() | |
203 | +{ | |
204 | + THD *thd=current_thd; | |
205 | + if (likely(thd != 0)) { | |
206 | + thd->status_var.innodb_scan_data = 0; | |
207 | + } | |
208 | +} | |
209 | + | |
210 | +/************************************************************************* | |
211 | +Increments Innodb_scan_data_in_pages. */ | |
212 | +extern "C" | |
213 | +void | |
214 | +innobase_mysql_thd_increment_innodb_scan_data(ulong length) | |
215 | +{ | |
216 | + THD *thd=current_thd; | |
217 | + if (likely(thd != 0)) { | |
218 | + thd->status_var.innodb_scan_data+= length; | |
219 | + } | |
220 | +} | |
221 | + | |
222 | +/************************************************************************* | |
223 | +Initializes Innodb_scan_garbages_in_pages. */ | |
224 | +extern "C" | |
225 | +void | |
226 | +innobase_mysql_thd_init_innodb_scan_garbage() | |
227 | +{ | |
228 | + THD *thd=current_thd; | |
229 | + if (likely(thd != 0)) { | |
230 | + thd->status_var.innodb_scan_garbage = 0; | |
231 | + } | |
232 | +} | |
233 | + | |
234 | +/************************************************************************* | |
235 | +Increments Innodb_scan_garbages_in_pages. */ | |
236 | +extern "C" | |
237 | +void | |
238 | +innobase_mysql_thd_increment_innodb_scan_garbage(ulong length) | |
239 | +{ | |
240 | + THD *thd=current_thd; | |
241 | + if (likely(thd != 0)) { | |
242 | + thd->status_var.innodb_scan_garbage+= length; | |
243 | + } | |
244 | +} | |
245 | + | |
246 | +/************************************************************************* | |
247 | Gets the InnoDB transaction handle for a MySQL handler object, creates | |
248 | an InnoDB transaction struct if the corresponding MySQL thread struct still | |
249 | lacks one. */ | |
36400f81 | 250 | diff -ruN a/sql/mysqld.cc b/sql/mysqld.cc |
eccb488f ER |
251 | --- a/sql/mysqld.cc Mon Dec 22 00:33:03 2008 -0800 |
252 | +++ b/sql/mysqld.cc Mon Dec 22 00:33:11 2008 -0800 | |
36400f81 | 253 | @@ -6777,6 +6777,10 @@ |
eccb488f ER |
254 | {"Handler_write", (char*) offsetof(STATUS_VAR, ha_write_count), SHOW_LONG_STATUS}, |
255 | #ifdef HAVE_INNOBASE_DB | |
256 | {"Innodb_", (char*) &innodb_status_variables, SHOW_VARS}, | |
257 | + {"Innodb_scan_pages_contiguous",(char*) offsetof(STATUS_VAR, innodb_scan_cont), SHOW_LONGLONG_STATUS}, | |
258 | + {"Innodb_scan_pages_jumpy", (char*) offsetof(STATUS_VAR, innodb_scan_jump), SHOW_LONGLONG_STATUS}, | |
259 | + {"Innodb_scan_data_in_pages",(char*) offsetof(STATUS_VAR, innodb_scan_data), SHOW_LONGLONG_STATUS}, | |
260 | + {"Innodb_scan_garbages_in_pages",(char*) offsetof(STATUS_VAR, innodb_scan_garbage), SHOW_LONGLONG_STATUS}, | |
261 | #endif /*HAVE_INNOBASE_DB*/ | |
262 | {"Key_blocks_not_flushed", (char*) &dflt_key_cache_var.global_blocks_changed, SHOW_KEY_CACHE_LONG}, | |
263 | {"Key_blocks_unused", (char*) &dflt_key_cache_var.blocks_unused, SHOW_KEY_CACHE_CONST_LONG}, | |
36400f81 | 264 | diff -ruN a/sql/sql_class.h b/sql/sql_class.h |
eccb488f ER |
265 | --- a/sql/sql_class.h Mon Dec 22 00:33:03 2008 -0800 |
266 | +++ b/sql/sql_class.h Mon Dec 22 00:33:11 2008 -0800 | |
36400f81 | 267 | @@ -694,6 +694,10 @@ |
eccb488f ER |
268 | sense to add to the /global/ status variable counter. |
269 | */ | |
270 | double last_query_cost; | |
271 | + ulonglong innodb_scan_cont; | |
272 | + ulonglong innodb_scan_jump; | |
273 | + ulonglong innodb_scan_data; | |
274 | + ulonglong innodb_scan_garbage; | |
275 | } STATUS_VAR; | |
276 | ||
277 | /* |