1 diff -r 85e7025cf2d1 innobase/include/srv0srv.h
2 --- a/innobase/include/srv0srv.h Fri Jul 03 15:41:41 2009 -0700
3 +++ b/innobase/include/srv0srv.h Fri Jul 03 15:41:47 2009 -0700
5 extern ulint srv_enable_unsafe_group_commit;
6 extern uint srv_read_ahead;
7 extern uint srv_adaptive_checkpoint;
9 +extern ulint srv_extra_rsegments;
11 extern ulint srv_dict_size_limit;
13 diff -r 85e7025cf2d1 innobase/include/trx0sys.h
14 --- a/innobase/include/trx0sys.h Fri Jul 03 15:41:41 2009 -0700
15 +++ b/innobase/include/trx0sys.h Fri Jul 03 15:41:47 2009 -0700
20 +/*********************************************************************
21 +Create extra rollback segments when create_new_db */
24 +trx_sys_create_extra_rseg(
25 +/*======================*/
26 + ulint num); /* in: number of extra user rollback segments */
27 /********************************************************************
28 Looks for a free slot for a rollback segment in the trx system file copy. */
30 diff -r 85e7025cf2d1 innobase/srv/srv0srv.c
31 --- a/innobase/srv/srv0srv.c Fri Jul 03 15:41:41 2009 -0700
32 +++ b/innobase/srv/srv0srv.c Fri Jul 03 15:41:47 2009 -0700
35 uint srv_read_ahead = 3; /* 1: random 2: linear 3: Both */
36 uint srv_adaptive_checkpoint = 0; /* 0: none 1: reflex 2: estimate */
38 +ulint srv_extra_rsegments = 0; /* extra rseg for users */
40 ulint srv_dict_size_limit = 0;
42 diff -r 85e7025cf2d1 innobase/srv/srv0start.c
43 --- a/innobase/srv/srv0start.c Fri Jul 03 15:41:41 2009 -0700
44 +++ b/innobase/srv/srv0start.c Fri Jul 03 15:41:47 2009 -0700
47 srv_startup_is_before_trx_rollback_phase = FALSE;
49 + if (srv_extra_rsegments)
50 + trx_sys_create_extra_rseg(srv_extra_rsegments);
51 #ifdef UNIV_LOG_ARCHIVE
52 } else if (srv_archive_recovery) {
54 diff -r 85e7025cf2d1 innobase/trx/trx0sys.c
55 --- a/innobase/trx/trx0sys.c Fri Jul 03 15:41:41 2009 -0700
56 +++ b/innobase/trx/trx0sys.c Fri Jul 03 15:41:47 2009 -0700
59 trx_sys_init_at_db_start();
62 +/*********************************************************************
63 +Create extra rollback segments when create_new_db */
66 +trx_sys_create_extra_rseg(
67 +/*======================*/
68 + ulint num) /* in: number of extra user rollback segments */
74 + /* Craete extra rollback segments */
76 + for (i = 1; i < num + 1; i++) {
77 + if(!trx_rseg_create(TRX_SYS_SPACE, ULINT_MAX, &slot_no, &mtr)) {
79 +"InnoDB: Warning: Failed to create extra rollback segments.\n");
86 diff -r 85e7025cf2d1 patch_info/innodb_extra_rseg.info
87 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
88 +++ b/patch_info/innodb_extra_rseg.info Fri Jul 03 15:41:47 2009 -0700
90 +File=innodb_extra_rseg.patch
91 +Name=allow to create extra rollback segments
93 +Author=Percona <info@percona.com>
96 diff -r 85e7025cf2d1 sql/ha_innodb.cc
97 --- a/sql/ha_innodb.cc Fri Jul 03 15:41:41 2009 -0700
98 +++ b/sql/ha_innodb.cc Fri Jul 03 15:41:47 2009 -0700
102 long innobase_read_io_threads, innobase_write_io_threads;
103 +long innobase_extra_rsegments;
104 longlong innobase_buffer_pool_size, innobase_log_file_size;
106 /* The default values for the following char* start-up parameters
107 @@ -1521,6 +1522,8 @@
108 srv_n_read_io_threads = (ulint) innobase_read_io_threads;
109 srv_n_write_io_threads = (ulint) innobase_write_io_threads;
111 + srv_extra_rsegments = (ulint) innobase_extra_rsegments;
113 srv_lock_wait_timeout = (ulint) innobase_lock_wait_timeout;
114 srv_force_recovery = (ulint) innobase_force_recovery;
116 diff -r 85e7025cf2d1 sql/ha_innodb.h
117 --- a/sql/ha_innodb.h Fri Jul 03 15:41:41 2009 -0700
118 +++ b/sql/ha_innodb.h Fri Jul 03 15:41:47 2009 -0700
120 extern long innobase_buffer_pool_awe_mem_mb;
121 extern long innobase_file_io_threads, innobase_lock_wait_timeout;
122 extern long innobase_read_io_threads, innobase_write_io_threads;
123 +extern long innobase_extra_rsegments;
124 extern long innobase_force_recovery;
125 extern long innobase_open_files;
126 extern char *innobase_data_home_dir, *innobase_data_file_path;
127 diff -r 85e7025cf2d1 sql/mysqld.cc
128 --- a/sql/mysqld.cc Fri Jul 03 15:41:41 2009 -0700
129 +++ b/sql/mysqld.cc Fri Jul 03 15:41:47 2009 -0700
130 @@ -5101,6 +5101,7 @@
131 OPT_INNODB_ADAPTIVE_CHECKPOINT,
132 OPT_INNODB_READ_IO_THREADS,
133 OPT_INNODB_WRITE_IO_THREADS,
134 + OPT_INNODB_EXTRA_RSEGMENTS,
135 OPT_INNODB_DICT_SIZE_LIMIT,
136 OPT_INNODB_ADAPTIVE_HASH_INDEX,
138 @@ -5465,6 +5466,10 @@
139 "Number of background write I/O threads in InnoDB.",
140 (gptr*) &innobase_write_io_threads, (gptr*) &innobase_write_io_threads,
141 0, GET_LONG, REQUIRED_ARG, 8, 1, 64, 0, 0, 0},
142 + {"innodb_extra_rsegments", OPT_INNODB_EXTRA_RSEGMENTS,
143 + "Number of extra user rollback segments when create new database.",
144 + (gptr*) &innobase_extra_rsegments, (gptr*) &innobase_extra_rsegments,
145 + 0, GET_LONG, REQUIRED_ARG, 0, 0, 127, 0, 0, 0},
146 {"innodb_dict_size_limit", OPT_INNODB_DICT_SIZE_LIMIT,
147 "Limit the allocated memory for dictionary cache. (0: unlimited)",
148 (gptr*) &srv_dict_size_limit, (gptr*) &srv_dict_size_limit, 0,
149 diff -r 85e7025cf2d1 sql/set_var.cc
150 --- a/sql/set_var.cc Fri Jul 03 15:41:41 2009 -0700
151 +++ b/sql/set_var.cc Fri Jul 03 15:41:47 2009 -0700
152 @@ -1087,6 +1087,7 @@
153 {sys_innodb_adaptive_checkpoint.name, (char*) &sys_innodb_adaptive_checkpoint, SHOW_SYS},
154 {"innodb_read_io_threads", (char*) &innobase_read_io_threads, SHOW_LONG},
155 {"innodb_write_io_threads", (char*) &innobase_write_io_threads, SHOW_LONG},
156 + {"innodb_extra_rsegments", (char*) &innobase_extra_rsegments, SHOW_LONG},
157 {sys_innodb_dict_size_limit.name, (char*) &sys_innodb_dict_size_limit, SHOW_SYS},
158 {sys_innodb_io_pattern_trace.name, (char*) &sys_innodb_io_pattern_trace, SHOW_SYS},
159 {sys_innodb_io_pattern_trace_running.name, (char*) &sys_innodb_io_pattern_trace_running, SHOW_SYS},
160 diff -r 85e7025cf2d1 sql/sql_show.cc
161 --- a/sql/sql_show.cc Fri Jul 03 15:41:41 2009 -0700
162 +++ b/sql/sql_show.cc Fri Jul 03 15:41:47 2009 -0700
166 #include "dict0dict.h"
167 +#include "trx0rseg.h" /* for trx_rseg_struct */
168 +#include "trx0sys.h" /* for trx_sys */
170 /* We need to undef it in InnoDB */
172 @@ -4180,6 +4182,45 @@
173 DBUG_RETURN(returnable);
178 +/*=================*/
179 + THD* thd, /* in: thread */
180 + TABLE_LIST* tables, /* in/out: tables to fill */
181 + COND* cond) /* in: condition (ignored) */
183 + TABLE* table = (TABLE *) tables->table;
187 + DBUG_ENTER("innodb_rseg_fill");
189 + /* deny access to non-superusers */
190 + if (check_global_access(thd, PROCESS_ACL)) {
195 + rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list);
198 + table->field[0]->store(rseg->id);
199 + table->field[1]->store(rseg->space);
200 + table->field[2]->store(rseg->page_no);
201 + table->field[3]->store(rseg->max_size);
202 + table->field[4]->store(rseg->curr_size);
204 + if (schema_table_store_record(thd, table)) {
209 + rseg = UT_LIST_GET_NEXT(rseg_list, rseg);
212 + DBUG_RETURN(status);
216 Find schema_tables elment by name
218 @@ -4996,6 +5037,16 @@
219 {"INDEX_NAME", 32, MYSQL_TYPE_STRING, 0, 0, "index name"},
220 {"N_READ", 11, MYSQL_TYPE_LONG, 0, 0, "read ios"},
221 {"N_WRITE", 11, MYSQL_TYPE_LONG, 0, 0, "write ios"},
222 + {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
225 +ST_FIELD_INFO innodb_rseg_fields_info[]=
227 + {"RSEG_ID", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, ""},
228 + {"SPACE_ID", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, ""},
229 + {"PAGE_NO", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, ""},
230 + {"MAX_SIZE", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, ""},
231 + {"CURR_SIZE", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_LONG, 0, 0, ""},
232 {0, 0, MYSQL_TYPE_STRING, 0, 0, 0}
235 @@ -5177,6 +5228,8 @@
236 #ifdef HAVE_INNOBASE_DB
237 {"INNODB_IO_PATTERN", innodb_io_pattern_field_info, create_schema_table,
238 innodb_io_pattern_fill_table, 0, 0, -1, -1, 0},
239 + {"INNODB_RSEG", innodb_rseg_fields_info, create_schema_table,
240 + innodb_rseg_fill, 0, 0, -1, -1, 0},
242 {0, 0, 0, 0, 0, 0, 0, 0, 0}