1 # name : innodb_extra_rseg.patch
2 # introduced : 11 or before
3 # maintainer : Yasufumi
6 # Any small change to this file in the main branch
7 # should be done or reviewed by the maintainer!
8 diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
9 --- a/storage/innobase/handler/ha_innodb.cc 2010-12-03 15:18:48.879955903 +0900
10 +++ b/storage/innobase/handler/ha_innodb.cc 2010-12-03 15:22:53.779955671 +0900
11 @@ -11403,6 +11403,11 @@
12 "Choose method of innodb_adaptive_flushing. (native, [estimate], keep_average)",
13 NULL, innodb_adaptive_flushing_method_update, 1, &adaptive_flushing_method_typelib);
15 +static MYSQL_SYSVAR_ULONG(extra_rsegments, srv_extra_rsegments,
16 + PLUGIN_VAR_RQCMDARG,
17 + "Number of extra user rollback segments which are used in a round-robin fashion.",
18 + NULL, NULL, 127, 0, 127, 0);
20 static struct st_mysql_sys_var* innobase_system_variables[]= {
21 MYSQL_SYSVAR(additional_mem_pool_size),
22 MYSQL_SYSVAR(autoextend_increment),
23 @@ -11468,6 +11473,7 @@
24 MYSQL_SYSVAR(flush_neighbor_pages),
25 MYSQL_SYSVAR(read_ahead),
26 MYSQL_SYSVAR(adaptive_flushing_method),
27 + MYSQL_SYSVAR(extra_rsegments),
28 MYSQL_SYSVAR(use_sys_malloc),
29 MYSQL_SYSVAR(use_native_aio),
30 MYSQL_SYSVAR(change_buffering),
31 @@ -11496,6 +11502,7 @@
32 innobase_system_variables, /* system variables */
38 i_s_innodb_lock_waits,
39 diff -ruN a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc
40 --- a/storage/innobase/handler/i_s.cc 2010-12-03 15:06:58.742986460 +0900
41 +++ b/storage/innobase/handler/i_s.cc 2010-12-03 15:33:08.790070078 +0900
43 #include "srv0start.h" /* for srv_was_started */
45 #include "trx0trx.h" /* for TRX_QUE_STATE_STR_MAX_LEN */
46 +#include "trx0rseg.h" /* for trx_rseg_struct */
47 +#include "trx0sys.h" /* for trx_sys */
50 static const char plugin_author[] = "Innobase Oy";
51 @@ -1781,3 +1783,166 @@
56 +/***********************************************************************
58 +static ST_FIELD_INFO i_s_innodb_rseg_fields_info[] =
60 + {STRUCT_FLD(field_name, "rseg_id"),
61 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
62 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
63 + STRUCT_FLD(value, 0),
64 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
65 + STRUCT_FLD(old_name, ""),
66 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
68 + {STRUCT_FLD(field_name, "space_id"),
69 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
70 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
71 + STRUCT_FLD(value, 0),
72 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
73 + STRUCT_FLD(old_name, ""),
74 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
76 + {STRUCT_FLD(field_name, "zip_size"),
77 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
78 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
79 + STRUCT_FLD(value, 0),
80 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
81 + STRUCT_FLD(old_name, ""),
82 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
84 + {STRUCT_FLD(field_name, "page_no"),
85 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
86 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
87 + STRUCT_FLD(value, 0),
88 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
89 + STRUCT_FLD(old_name, ""),
90 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
92 + {STRUCT_FLD(field_name, "max_size"),
93 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
94 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
95 + STRUCT_FLD(value, 0),
96 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
97 + STRUCT_FLD(old_name, ""),
98 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
100 + {STRUCT_FLD(field_name, "curr_size"),
101 + STRUCT_FLD(field_length, MY_INT64_NUM_DECIMAL_DIGITS),
102 + STRUCT_FLD(field_type, MYSQL_TYPE_LONGLONG),
103 + STRUCT_FLD(value, 0),
104 + STRUCT_FLD(field_flags, MY_I_S_UNSIGNED),
105 + STRUCT_FLD(old_name, ""),
106 + STRUCT_FLD(open_method, SKIP_OPEN_TABLE)},
108 + END_OF_ST_FIELD_INFO
113 +i_s_innodb_rseg_fill(
114 +/*=================*/
115 + THD* thd, /* in: thread */
116 + TABLE_LIST* tables, /* in/out: tables to fill */
117 + COND* cond) /* in: condition (ignored) */
119 + TABLE* table = (TABLE *) tables->table;
123 + DBUG_ENTER("i_s_innodb_rseg_fill");
125 + /* deny access to non-superusers */
126 + if (check_global_access(thd, PROCESS_ACL)) {
131 + RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name);
133 + rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);
136 + table->field[0]->store(rseg->id);
137 + table->field[1]->store(rseg->space);
138 + table->field[2]->store(rseg->zip_size);
139 + table->field[3]->store(rseg->page_no);
140 + table->field[4]->store(rseg->max_size);
141 + table->field[5]->store(rseg->curr_size);
143 + if (schema_table_store_record(thd, table)) {
148 + rseg = UT_LIST_GET_NEXT(rseg_list, rseg);
151 + DBUG_RETURN(status);
156 +i_s_innodb_rseg_init(
157 +/*=================*/
158 + /* out: 0 on success */
159 + void* p) /* in/out: table schema object */
161 + DBUG_ENTER("i_s_innodb_rseg_init");
162 + ST_SCHEMA_TABLE* schema = (ST_SCHEMA_TABLE*) p;
164 + schema->fields_info = i_s_innodb_rseg_fields_info;
165 + schema->fill_table = i_s_innodb_rseg_fill;
170 +UNIV_INTERN struct st_mysql_plugin i_s_innodb_rseg =
172 + /* the plugin type (a MYSQL_XXX_PLUGIN value) */
174 + STRUCT_FLD(type, MYSQL_INFORMATION_SCHEMA_PLUGIN),
176 + /* pointer to type-specific plugin descriptor */
178 + STRUCT_FLD(info, &i_s_info),
182 + STRUCT_FLD(name, "INNODB_RSEG"),
184 + /* plugin author (for SHOW PLUGINS) */
186 + STRUCT_FLD(author, plugin_author),
188 + /* general descriptive text (for SHOW PLUGINS) */
190 + STRUCT_FLD(descr, "InnoDB rollback segment information"),
192 + /* the plugin license (PLUGIN_LICENSE_XXX) */
194 + STRUCT_FLD(license, PLUGIN_LICENSE_GPL),
196 + /* the function to invoke when plugin is loaded */
197 + /* int (*)(void*); */
198 + STRUCT_FLD(init, i_s_innodb_rseg_init),
200 + /* the function to invoke when plugin is unloaded */
201 + /* int (*)(void*); */
202 + STRUCT_FLD(deinit, i_s_common_deinit),
204 + /* plugin version (for SHOW PLUGINS) */
206 + STRUCT_FLD(version, 0x0100 /* 1.0 */),
208 + /* struct st_mysql_show_var* */
209 + STRUCT_FLD(status_vars, NULL),
211 + /* struct st_mysql_sys_var** */
212 + STRUCT_FLD(system_vars, NULL),
214 + /* reserved for dependency checking */
216 + STRUCT_FLD(__reserved1, NULL)
218 diff -ruN a/storage/innobase/handler/i_s.h b/storage/innobase/handler/i_s.h
219 --- a/storage/innobase/handler/i_s.h 2010-12-03 15:06:58.744953398 +0900
220 +++ b/storage/innobase/handler/i_s.h 2010-12-03 15:22:53.783953418 +0900
222 extern struct st_mysql_plugin i_s_innodb_cmp_reset;
223 extern struct st_mysql_plugin i_s_innodb_cmpmem;
224 extern struct st_mysql_plugin i_s_innodb_cmpmem_reset;
225 +extern struct st_mysql_plugin i_s_innodb_rseg;
228 diff -ruN a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h
229 --- a/storage/innobase/include/srv0srv.h 2010-12-03 15:18:48.894029379 +0900
230 +++ b/storage/innobase/include/srv0srv.h 2010-12-03 15:22:53.786986025 +0900
232 extern ulint srv_read_ahead;
233 extern ulint srv_adaptive_flushing_method;
235 +extern ulint srv_extra_rsegments;
237 /*-------------------------------------------*/
239 extern ulint srv_n_rows_inserted;
240 diff -ruN a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c
241 --- a/storage/innobase/srv/srv0srv.c 2010-12-03 15:18:48.913956140 +0900
242 +++ b/storage/innobase/srv/srv0srv.c 2010-12-03 15:22:53.789987037 +0900
244 UNIV_INTERN ulint srv_enable_unsafe_group_commit = 0; /* 0:disable 1:enable */
245 UNIV_INTERN ulint srv_read_ahead = 3; /* 1: random 2: linear 3: Both */
246 UNIV_INTERN ulint srv_adaptive_flushing_method = 0; /* 0: native 1: estimate 2: keep_average */
248 +UNIV_INTERN ulint srv_extra_rsegments = 127; /* extra rseg for users */
249 /*-------------------------------------------*/
250 UNIV_INTERN ulong srv_n_spin_wait_rounds = 30;
251 UNIV_INTERN ulong srv_n_free_tickets_to_enter = 500;
252 diff -ruN a/storage/innobase/trx/trx0trx.c b/storage/innobase/trx/trx0trx.c
253 --- a/storage/innobase/trx/trx0trx.c 2010-12-03 15:18:48.918982105 +0900
254 +++ b/storage/innobase/trx/trx0trx.c 2010-12-03 15:22:53.792983193 +0900
257 rseg = UT_LIST_GET_NEXT(rseg_list, rseg);
259 - if (rseg == NULL) {
260 + if (rseg == NULL || rseg->id > srv_extra_rsegments) {
261 rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);
267 if ((rseg->id == TRX_SYS_SYSTEM_RSEG_ID)
268 - && (UT_LIST_GET_LEN(trx_sys->rseg_list) > 1)) {
269 + && (UT_LIST_GET_LEN(trx_sys->rseg_list) > 1)
270 + && srv_extra_rsegments > 0) {