Commit 2606cb93 authored by unknown's avatar unknown

Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.

All but ss677 are against the mysql-5.1 tree only.

Fixes the following bugs:
- Bug #19834: Using cursors when running in READ-COMMITTED can cause InnoDB to crash
- Bug #20213: DBT2 testing cause mysqld to core using Innodb
- Bug #20493: on partition tables, select and show command casue server crash
- Bug #21113: Duplicate printout in SHOW INNODB STATUS
- Bug #21313: rsql_..._recover_innodb_tmp_table is redundant and broken
- Bug #21467: Manual URL wrong in InnoDB "page corrupted" error report


mysql-test/r/innodb.result:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  innodb.result: Adjust Innodb_rows_inserted and Innodb_rows_updated
  to reflect the deleted statements in r420, which somehow reappeared
  in the MySQL tree.
mysql-test/t/innodb.test:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
sql/ha_innodb.cc:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  ha_innobase::start_stmt(): patch from Heikki:
  Do not call read_view_close_for_mysql().  (Bug #19834)
  
  Fix Bug#20213 and its duplicates: stress test crashes of InnoDB-5.1
  
  Fix Bug #20493 : we must prepare prebuilt->trx to point to the trx of this thd before using it
  
  Add update_thd() to several places in ha_innodb.cc to make sure prebuilt->trx points to the right trx object; in other functions add assertions that prebuilt->trx is for this thd; when 5.1 stabilizes, we can change these assertions to ut_ad() debug version assertions
  
  Remove redundant check_trx_exists() and ut_a() from r701,
  as suggested by Marko
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/btr/btr0btr.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/buf/buf0buf.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/dict/dict0dict.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/fil/fil0fil.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Make the tablespace cache hash size 100 or 1000 times bigger. Fixes bug
  #21112.
  
  After ut_print_timestamp(), always display "  InnoDB:" (note two spaces).
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/fsp/fsp0fsp.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/ibuf/ibuf0ibuf.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  ibuf_print(): Don't print redundant information. Fixes bug #21113.
  
  Remove non-varying variable ibuf->meter and related constant IBUF_THRESHOLD.
storage/innobase/include/btr0cur.ic:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  btr_cur_get_page(): Remove buggy assertion.
storage/innobase/include/buf0buf.ic:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/include/ibuf0ibuf.ic:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Remove non-varying variable ibuf->meter and related constant IBUF_THRESHOLD.
storage/innobase/log/log0log.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/log/log0recv.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/os/os0file.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/row/row0mysql.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Remove the special treatment of tables
  rsql_IDENTIFIER_recover_innodb_tmp_table, which is redundant and
  was broken with the introduction of the "safe" file name encoding of
  identifiers.  (Bug #21313)
  
  ChangeSet@1.2181.173.1  2006-08-02 17:57:06+02:00  ingo@local
  Bug#18775 - Temporary table from alter table visible to other threads
  Continued implementation of WL#1324 (table name to filename encoding)
  Changed back the encoded temp file prefix to #sql.
  
  After ut_print_timestamp(), always display "  InnoDB:" (note two spaces).
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/row/row0sel.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/row/row0vers.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  row_vers_build_for_semi_consistent_read(): rec_trx_id was uninitialized
  in a comparison.  Initialize it.
storage/innobase/srv/srv0start.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/ut/ut0dbg.c:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
  
  ut_dbg_assertion_failed(): Print space between timestamp and start of error
  message.
  
  After ut_print_timestamp(), always display "  InnoDB:" (note two spaces).
  
  Correct all URLs pointing to the MySQL manual. (Bug #21467)
storage/innobase/Makefile.am:
  Applied innodb-5.1-ss677, -ss680, -ss713, and -ss720 snapshots.
  All but ss677 are against the mysql-5.1 tree only.
parent 2f48a591
...@@ -1295,24 +1295,16 @@ insert into t2 (a) select b from t1; ...@@ -1295,24 +1295,16 @@ insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2; insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1; insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2; insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
select count(*) from t1; select count(*) from t1;
count(*) count(*)
29267 623
explain select * from t1 where c between 1 and 2500; explain select * from t1 where c between 1 and 2500;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range c c 5 NULL # Using where 1 SIMPLE t1 range c c 5 NULL # Using where
update t1 set c=a; update t1 set c=a;
explain select * from t1 where c between 1 and 2500; explain select * from t1 where c between 1 and 2500;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range c c 5 NULL # Using where 1 SIMPLE t1 ALL c NULL NULL NULL # Using where
drop table t1,t2; drop table t1,t2;
create table t1 (id int primary key auto_increment, fk int, index index_fk (fk)) engine=innodb; create table t1 (id int primary key auto_increment, fk int, index index_fk (fk)) engine=innodb;
insert into t1 (id) values (null),(null),(null),(null),(null); insert into t1 (id) values (null),(null),(null),(null),(null);
...@@ -1786,10 +1778,10 @@ Variable_name Value ...@@ -1786,10 +1778,10 @@ Variable_name Value
Innodb_rows_deleted 2070 Innodb_rows_deleted 2070
show status like "Innodb_rows_inserted"; show status like "Innodb_rows_inserted";
Variable_name Value Variable_name Value
Innodb_rows_inserted 31727 Innodb_rows_inserted 3083
show status like "Innodb_rows_updated"; show status like "Innodb_rows_updated";
Variable_name Value Variable_name Value
Innodb_rows_updated 29530 Innodb_rows_updated 886
show status like "Innodb_row_lock_waits"; show status like "Innodb_row_lock_waits";
Variable_name Value Variable_name Value
Innodb_row_lock_waits 0 Innodb_row_lock_waits 0
......
...@@ -904,14 +904,6 @@ insert into t2 (a) select b from t1; ...@@ -904,14 +904,6 @@ insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2; insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1; insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2; insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
insert into t2 (a) select b from t1;
insert into t1 (a) select b from t2;
select count(*) from t1; select count(*) from t1;
--replace_column 9 # --replace_column 9 #
explain select * from t1 where c between 1 and 2500; explain select * from t1 where c between 1 and 2500;
......
...@@ -208,6 +208,7 @@ static handler *innobase_create_handler(TABLE_SHARE *table, ...@@ -208,6 +208,7 @@ static handler *innobase_create_handler(TABLE_SHARE *table,
MEM_ROOT *mem_root); MEM_ROOT *mem_root);
static const char innobase_hton_name[]= "InnoDB"; static const char innobase_hton_name[]= "InnoDB";
handlerton innobase_hton; handlerton innobase_hton;
static handler *innobase_create_handler(TABLE_SHARE *table, MEM_ROOT *mem_root) static handler *innobase_create_handler(TABLE_SHARE *table, MEM_ROOT *mem_root)
...@@ -2364,8 +2365,7 @@ ha_innobase::open( ...@@ -2364,8 +2365,7 @@ ha_innobase::open(
"have forgotten\nto delete the corresponding " "have forgotten\nto delete the corresponding "
".frm files of InnoDB tables, or you\n" ".frm files of InnoDB tables, or you\n"
"have moved .frm files to another database?\n" "have moved .frm files to another database?\n"
"Look from section 15.1 of " "See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"http://www.innodb.com/ibman.html\n"
"how you can resolve the problem.\n", "how you can resolve the problem.\n",
norm_name); norm_name);
free_share(share); free_share(share);
...@@ -2382,8 +2382,7 @@ ha_innobase::open( ...@@ -2382,8 +2382,7 @@ ha_innobase::open(
"Have you deleted the .ibd file from the " "Have you deleted the .ibd file from the "
"database directory under\nthe MySQL datadir, " "database directory under\nthe MySQL datadir, "
"or have you used DISCARD TABLESPACE?\n" "or have you used DISCARD TABLESPACE?\n"
"Look from section 15.1 of " "See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"http://www.innodb.com/ibman.html\n"
"how you can resolve the problem.\n", "how you can resolve the problem.\n",
norm_name); norm_name);
free_share(share); free_share(share);
...@@ -3664,7 +3663,7 @@ ha_innobase::update_row( ...@@ -3664,7 +3663,7 @@ ha_innobase::update_row(
DBUG_ENTER("ha_innobase::update_row"); DBUG_ENTER("ha_innobase::update_row");
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE)
...@@ -3725,7 +3724,7 @@ ha_innobase::delete_row( ...@@ -3725,7 +3724,7 @@ ha_innobase::delete_row(
DBUG_ENTER("ha_innobase::delete_row"); DBUG_ENTER("ha_innobase::delete_row");
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
if (last_query_id != user_thd->query_id) { if (last_query_id != user_thd->query_id) {
...@@ -3823,6 +3822,9 @@ ha_innobase::try_semi_consistent_read(bool yes) ...@@ -3823,6 +3822,9 @@ ha_innobase::try_semi_consistent_read(bool yes)
{ {
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]);
/* Row read type is set to semi consistent read if this was /* Row read type is set to semi consistent read if this was
requested by the MySQL and either innodb_locks_unsafe_for_binlog requested by the MySQL and either innodb_locks_unsafe_for_binlog
option is used or this session is using READ COMMITTED isolation option is used or this session is using READ COMMITTED isolation
...@@ -3987,7 +3989,7 @@ ha_innobase::index_read( ...@@ -3987,7 +3989,7 @@ ha_innobase::index_read(
DBUG_ENTER("index_read"); DBUG_ENTER("index_read");
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
statistic_increment(current_thd->status_var.ha_read_key_count, statistic_increment(current_thd->status_var.ha_read_key_count,
...@@ -4102,7 +4104,7 @@ ha_innobase::change_active_index( ...@@ -4102,7 +4104,7 @@ ha_innobase::change_active_index(
DBUG_ENTER("change_active_index"); DBUG_ENTER("change_active_index");
ut_ad(user_thd == current_thd); ut_ad(user_thd == current_thd);
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
active_index = keynr; active_index = keynr;
...@@ -4192,7 +4194,7 @@ ha_innobase::general_fetch( ...@@ -4192,7 +4194,7 @@ ha_innobase::general_fetch(
DBUG_ENTER("general_fetch"); DBUG_ENTER("general_fetch");
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
innodb_srv_conc_enter_innodb(prebuilt->trx); innodb_srv_conc_enter_innodb(prebuilt->trx);
...@@ -4428,7 +4430,7 @@ ha_innobase::rnd_pos( ...@@ -4428,7 +4430,7 @@ ha_innobase::rnd_pos(
statistic_increment(current_thd->status_var.ha_read_rnd_count, statistic_increment(current_thd->status_var.ha_read_rnd_count,
&LOCK_status); &LOCK_status);
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
if (prebuilt->clust_index_was_generated) { if (prebuilt->clust_index_was_generated) {
...@@ -4478,7 +4480,7 @@ ha_innobase::position( ...@@ -4478,7 +4480,7 @@ ha_innobase::position(
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
uint len; uint len;
ut_ad(prebuilt->trx == ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]); (trx_t*) current_thd->ha_data[innobase_hton.slot]);
if (prebuilt->clust_index_was_generated) { if (prebuilt->clust_index_was_generated) {
...@@ -5006,7 +5008,6 @@ ha_innobase::delete_all_rows(void) ...@@ -5006,7 +5008,6 @@ ha_innobase::delete_all_rows(void)
{ {
row_prebuilt_t* prebuilt = (row_prebuilt_t*)innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*)innobase_prebuilt;
int error; int error;
trx_t* trx;
THD* thd = current_thd; THD* thd = current_thd;
DBUG_ENTER("ha_innobase::delete_all_rows"); DBUG_ENTER("ha_innobase::delete_all_rows");
...@@ -5019,13 +5020,13 @@ ha_innobase::delete_all_rows(void) ...@@ -5019,13 +5020,13 @@ ha_innobase::delete_all_rows(void)
} }
/* Get the transaction associated with the current thd, or create one /* Get the transaction associated with the current thd, or create one
if not yet created */ if not yet created, and update prebuilt->trx */
trx = check_trx_exists(thd); update_thd(thd);
/* Truncate the table in InnoDB */ /* Truncate the table in InnoDB */
error = row_truncate_table_for_mysql(prebuilt->table, trx); error = row_truncate_table_for_mysql(prebuilt->table, prebuilt->trx);
if (error == DB_ERROR) { if (error == DB_ERROR) {
/* Cannot truncate; resort to ha_innobase::delete_row() */ /* Cannot truncate; resort to ha_innobase::delete_row() */
goto fallback; goto fallback;
...@@ -5308,6 +5309,9 @@ ha_innobase::records_in_range( ...@@ -5308,6 +5309,9 @@ ha_innobase::records_in_range(
DBUG_ENTER("records_in_range"); DBUG_ENTER("records_in_range");
ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]);
prebuilt->trx->op_info = (char*)"estimating records in index range"; prebuilt->trx->op_info = (char*)"estimating records in index range";
/* In case MySQL calls this in the middle of a SELECT query, release /* In case MySQL calls this in the middle of a SELECT query, release
...@@ -5604,13 +5608,14 @@ ha_innobase::info( ...@@ -5604,13 +5608,14 @@ ha_innobase::info(
for (i = 0; i < table->s->keys; i++) { for (i = 0; i < table->s->keys; i++) {
if (index == NULL) { if (index == NULL) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
sql_print_error("Table %s contains less " sql_print_error("Table %s contains fewer "
"indexes inside InnoDB than " "indexes inside InnoDB than "
"are defined in the MySQL " "are defined in the MySQL "
".frm file. Have you mixed up " ".frm file. Have you mixed up "
".frm files from different " ".frm files from different "
"installations? See section " "installations? See "
"15.1 at http://www.innodb.com/ibman.html", "http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
ib_table->name); ib_table->name);
break; break;
} }
...@@ -5619,17 +5624,11 @@ ha_innobase::info( ...@@ -5619,17 +5624,11 @@ ha_innobase::info(
if (j + 1 > index->n_uniq) { if (j + 1 > index->n_uniq) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
sql_print_error("Index %s of %s has " sql_print_error(
"%lu columns unique " "Index %s of %s has %lu columns unique inside InnoDB, but MySQL is asking "
"inside InnoDB, but " "statistics for %lu columns. Have you mixed up .frm files from different "
"MySQL is asking " "installations? "
"statistics for %lu " "See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"columns. Have you "
"mixed up .frm files "
"from different "
"installations? See "
"section 15.1 at "
"http://www.innodb.com/ibman.html",
index->name, index->name,
ib_table->name, ib_table->name,
(unsigned long) (unsigned long)
...@@ -6035,6 +6034,10 @@ ha_innobase::can_switch_engines(void) ...@@ -6035,6 +6034,10 @@ ha_innobase::can_switch_engines(void)
bool can_switch; bool can_switch;
DBUG_ENTER("ha_innobase::can_switch_engines"); DBUG_ENTER("ha_innobase::can_switch_engines");
ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]);
prebuilt->trx->op_info = prebuilt->trx->op_info =
"determining if there are foreign key constraints"; "determining if there are foreign key constraints";
row_mysql_lock_data_dictionary(prebuilt->trx); row_mysql_lock_data_dictionary(prebuilt->trx);
...@@ -6172,14 +6175,6 @@ ha_innobase::start_stmt( ...@@ -6172,14 +6175,6 @@ ha_innobase::start_stmt(
innobase_release_stat_resources(trx); innobase_release_stat_resources(trx);
if (trx->isolation_level <= TRX_ISO_READ_COMMITTED
&& trx->global_read_view) {
/* At low transaction isolation levels we let
each consistent read set its own snapshot */
read_view_close_for_mysql(trx);
}
prebuilt->sql_stat_start = TRUE; prebuilt->sql_stat_start = TRUE;
prebuilt->hint_need_to_fetch_extra_cols = 0; prebuilt->hint_need_to_fetch_extra_cols = 0;
prebuilt->read_just_key = 0; prebuilt->read_just_key = 0;
...@@ -6438,7 +6433,7 @@ ha_innobase::transactional_table_lock( ...@@ -6438,7 +6433,7 @@ ha_innobase::transactional_table_lock(
"table %s does not exist.\n" "table %s does not exist.\n"
"Have you deleted the .ibd file from the database directory under\n" "Have you deleted the .ibd file from the database directory under\n"
"the MySQL datadir?" "the MySQL datadir?"
"Look from section 15.1 of http://www.innodb.com/ibman.html\n" "See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"how you can resolve the problem.\n", "how you can resolve the problem.\n",
prebuilt->table->name); prebuilt->table->name);
DBUG_RETURN(HA_ERR_CRASHED); DBUG_RETURN(HA_ERR_CRASHED);
...@@ -6792,7 +6787,15 @@ ha_innobase::store_lock( ...@@ -6792,7 +6787,15 @@ ha_innobase::store_lock(
TL_IGNORE */ TL_IGNORE */
{ {
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
trx_t* trx = prebuilt->trx; trx_t* trx;
/* Call update_thd() to update prebuilt->trx to point to the trx
object of thd! Failure to do this caused a serious memory
corruption bug in 5.1.11. */
update_thd(thd);
trx = prebuilt->trx;
/* NOTE: MySQL can call this function with lock 'type' TL_IGNORE! /* NOTE: MySQL can call this function with lock 'type' TL_IGNORE!
Be careful to ignore TL_IGNORE if we are going to do something with Be careful to ignore TL_IGNORE if we are going to do something with
...@@ -6916,17 +6919,17 @@ ha_innobase::store_lock( ...@@ -6916,17 +6919,17 @@ ha_innobase::store_lock(
&& !thd->tablespace_op && !thd->tablespace_op
&& thd->lex->sql_command != SQLCOM_TRUNCATE && thd->lex->sql_command != SQLCOM_TRUNCATE
&& thd->lex->sql_command != SQLCOM_OPTIMIZE && thd->lex->sql_command != SQLCOM_OPTIMIZE
#ifdef __WIN__ #ifdef __WIN__
/* /* For alter table on win32 for succesful operation
for alter table on win32 for succesfull operation
completion it is used TL_WRITE(=10) lock instead of completion it is used TL_WRITE(=10) lock instead of
TL_WRITE_ALLOW_READ(=6), however here in innodb handler TL_WRITE_ALLOW_READ(=6), however here in innodb handler
TL_WRITE is lifted to TL_WRITE_ALLOW_WRITE, which causes TL_WRITE is lifted to TL_WRITE_ALLOW_WRITE, which causes
race condition when several clients do alter table race condition when several clients do alter table
simultaneously (bug #17264). This fix avoids the problem. simultaneously (bug #17264). This fix avoids the problem. */
*/
&& thd->lex->sql_command != SQLCOM_ALTER_TABLE && thd->lex->sql_command != SQLCOM_ALTER_TABLE
#endif #endif
&& thd->lex->sql_command != SQLCOM_CREATE_TABLE) { && thd->lex->sql_command != SQLCOM_CREATE_TABLE) {
lock_type = TL_WRITE_ALLOW_WRITE; lock_type = TL_WRITE_ALLOW_WRITE;
...@@ -6977,10 +6980,11 @@ ha_innobase::innobase_read_and_init_auto_inc( ...@@ -6977,10 +6980,11 @@ ha_innobase::innobase_read_and_init_auto_inc(
int error; int error;
ut_a(prebuilt); ut_a(prebuilt);
ut_a(prebuilt->trx ==
(trx_t*) current_thd->ha_data[innobase_hton.slot]);
ut_a(prebuilt->table); ut_a(prebuilt->table);
/* Prepare prebuilt->trx in the table handle */
update_thd(current_thd);
if (prebuilt->trx->conc_state == TRX_NOT_STARTED) { if (prebuilt->trx->conc_state == TRX_NOT_STARTED) {
trx_was_not_started = TRUE; trx_was_not_started = TRUE;
} }
...@@ -7115,6 +7119,9 @@ void ha_innobase::get_auto_increment( ...@@ -7115,6 +7119,9 @@ void ha_innobase::get_auto_increment(
longlong nr; longlong nr;
int error; int error;
/* Prepare prebuilt->trx in the table handle */
update_thd(current_thd);
error = innobase_read_and_init_auto_inc(&nr); error = innobase_read_and_init_auto_inc(&nr);
if (error) { if (error) {
...@@ -7143,6 +7150,8 @@ ha_innobase::reset_auto_increment(ulonglong value) ...@@ -7143,6 +7150,8 @@ ha_innobase::reset_auto_increment(ulonglong value)
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
int error; int error;
update_thd(current_thd);
error = row_lock_table_autoinc_for_mysql(prebuilt); error = row_lock_table_autoinc_for_mysql(prebuilt);
if (error != DB_SUCCESS) { if (error != DB_SUCCESS) {
......
...@@ -77,8 +77,7 @@ EXTRA_DIST = include/btr0btr.h include/btr0btr.ic include/btr0cur.h include/btr ...@@ -77,8 +77,7 @@ EXTRA_DIST = include/btr0btr.h include/btr0btr.ic include/btr0cur.h include/btr
include/ut0byte.h include/ut0byte.ic include/ut0dbg.h include/ut0lst.h \ include/ut0byte.h include/ut0byte.ic include/ut0dbg.h include/ut0lst.h \
include/ut0mem.h include/ut0mem.ic include/ut0rnd.h include/ut0rnd.ic \ include/ut0mem.h include/ut0mem.ic include/ut0rnd.h include/ut0rnd.ic \
include/ut0sort.h include/ut0ut.h include/ut0ut.ic include/ut0vec.h include/ut0vec.ic include/ha_prototypes.h \ include/ut0sort.h include/ut0ut.h include/ut0ut.ic include/ut0vec.h include/ut0vec.ic include/ha_prototypes.h \
include/ut0list.h include/ut0list.ic \ include/ut0list.h include/ut0list.ic include/ut0wqueue.h \
include/ut0wqueue.h \
CMakeLists.txt CMakeLists.txt
noinst_LIBRARIES = libinnobase.a noinst_LIBRARIES = libinnobase.a
......
...@@ -624,7 +624,7 @@ btr_page_get_father_for_rec( ...@@ -624,7 +624,7 @@ btr_page_get_father_for_rec(
fputs( fputs(
"InnoDB: You should dump + drop + reimport the table to fix the\n" "InnoDB: You should dump + drop + reimport the table to fix the\n"
"InnoDB: corruption. If the crash happens at the database startup, see\n" "InnoDB: corruption. If the crash happens at the database startup, see\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html about\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html about\n"
"InnoDB: forcing recovery. Then dump + drop + reimport.\n", stderr); "InnoDB: forcing recovery. Then dump + drop + reimport.\n", stderr);
} }
......
...@@ -323,7 +323,8 @@ buf_page_is_corrupted( ...@@ -323,7 +323,8 @@ buf_page_is_corrupted(
"InnoDB: is in the future! Current system log sequence number %lu %lu.\n" "InnoDB: is in the future! Current system log sequence number %lu %lu.\n"
"InnoDB: Your database may be corrupt or you may have copied the InnoDB\n" "InnoDB: Your database may be corrupt or you may have copied the InnoDB\n"
"InnoDB: tablespace but not the InnoDB log files. See\n" "InnoDB: tablespace but not the InnoDB log files. See\n"
"http://dev.mysql.com/doc/mysql/en/backing-up.html for more information.\n", "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: for more information.\n",
(ulong) mach_read_from_4(read_buf + FIL_PAGE_OFFSET), (ulong) mach_read_from_4(read_buf + FIL_PAGE_OFFSET),
(ulong) ut_dulint_get_high( (ulong) ut_dulint_get_high(
mach_read_from_8(read_buf + FIL_PAGE_LSN)), mach_read_from_8(read_buf + FIL_PAGE_LSN)),
...@@ -1923,7 +1924,7 @@ buf_page_io_complete( ...@@ -1923,7 +1924,7 @@ buf_page_io_complete(
"InnoDB: the corrupt table. You can use CHECK\n" "InnoDB: the corrupt table. You can use CHECK\n"
"InnoDB: TABLE to scan your table for corruption.\n" "InnoDB: TABLE to scan your table for corruption.\n"
"InnoDB: See also " "InnoDB: See also "
"http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: about forcing recovery.\n", stderr); "InnoDB: about forcing recovery.\n", stderr);
if (srv_force_recovery < SRV_FORCE_IGNORE_CORRUPT) { if (srv_force_recovery < SRV_FORCE_IGNORE_CORRUPT) {
......
...@@ -2215,8 +2215,8 @@ dict_foreign_error_report( ...@@ -2215,8 +2215,8 @@ dict_foreign_error_report(
if (fk->foreign_index) { if (fk->foreign_index) {
fputs("The index in the foreign key in table is ", file); fputs("The index in the foreign key in table is ", file);
ut_print_name(file, NULL, FALSE, fk->foreign_index->name); ut_print_name(file, NULL, FALSE, fk->foreign_index->name);
fputs( fputs("\n"
"\nSee http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" "See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html\n"
"for correct foreign key definition.\n", "for correct foreign key definition.\n",
file); file);
} }
...@@ -3119,7 +3119,7 @@ col_loop1: ...@@ -3119,7 +3119,7 @@ col_loop1:
ut_print_name(ef, NULL, TRUE, name); ut_print_name(ef, NULL, TRUE, name);
fprintf(ef, " where the columns appear\n" fprintf(ef, " where the columns appear\n"
"as the first columns. Constraint:\n%s\n" "as the first columns. Constraint:\n%s\n"
"See http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" "See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html\n"
"for correct foreign key definition.\n", "for correct foreign key definition.\n",
start_of_latest_foreign); start_of_latest_foreign);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
...@@ -3387,7 +3387,7 @@ try_find_index: ...@@ -3387,7 +3387,7 @@ try_find_index:
"Note that the internal storage type of ENUM and SET changed in\n" "Note that the internal storage type of ENUM and SET changed in\n"
"tables created with >= InnoDB-4.1.12, and such columns in old tables\n" "tables created with >= InnoDB-4.1.12, and such columns in old tables\n"
"cannot be referenced by such columns in new tables.\n" "cannot be referenced by such columns in new tables.\n"
"See http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" "See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html\n"
"for correct foreign key definition.\n", "for correct foreign key definition.\n",
start_of_latest_foreign); start_of_latest_foreign);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
...@@ -3941,8 +3941,7 @@ dict_update_statistics_low( ...@@ -3941,8 +3941,7 @@ dict_update_statistics_low(
fprintf(stderr, fprintf(stderr,
" InnoDB: cannot calculate statistics for table %s\n" " InnoDB: cannot calculate statistics for table %s\n"
"InnoDB: because the .ibd file is missing. For help, please refer to\n" "InnoDB: because the .ibd file is missing. For help, please refer to\n"
"InnoDB: " "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n",
table->name); table->name);
return; return;
......
...@@ -251,9 +251,6 @@ struct fil_system_struct { ...@@ -251,9 +251,6 @@ struct fil_system_struct {
initialized. */ initialized. */
fil_system_t* fil_system = NULL; fil_system_t* fil_system = NULL;
/* The tablespace memory cache hash table size */
#define FIL_SYSTEM_HASH_SIZE 50 /* TODO: make bigger! */
/************************************************************************ /************************************************************************
NOTE: you must call fil_mutex_enter_and_prepare_for_io() first! NOTE: you must call fil_mutex_enter_and_prepare_for_io() first!
...@@ -1323,11 +1320,17 @@ fil_init( ...@@ -1323,11 +1320,17 @@ fil_init(
/*=====*/ /*=====*/
ulint max_n_open) /* in: max number of open files */ ulint max_n_open) /* in: max number of open files */
{ {
ulint hash_size;
ut_a(fil_system == NULL); ut_a(fil_system == NULL);
/*printf("Initializing the tablespace cache with max %lu open files\n", if (srv_file_per_table) {
max_n_open); */ hash_size = 50000;
fil_system = fil_system_create(FIL_SYSTEM_HASH_SIZE, max_n_open); } else {
hash_size = 5000;
}
fil_system = fil_system_create(hash_size, max_n_open);
} }
/*********************************************************************** /***********************************************************************
...@@ -2685,8 +2688,7 @@ fil_open_single_table_tablespace( ...@@ -2685,8 +2688,7 @@ fil_open_single_table_tablespace(
"InnoDB: It is also possible that this is a temporary table #sql...,\n" "InnoDB: It is also possible that this is a temporary table #sql...,\n"
"InnoDB: and MySQL removed the .ibd file for this.\n" "InnoDB: and MySQL removed the .ibd file for this.\n"
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB:" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: for how to resolve the issue.\n", stderr); "InnoDB: for how to resolve the issue.\n", stderr);
mem_free(filepath); mem_free(filepath);
...@@ -2725,8 +2727,7 @@ fil_open_single_table_tablespace( ...@@ -2725,8 +2727,7 @@ fil_open_single_table_tablespace(
"InnoDB: Have you moved InnoDB .ibd files around without using the\n" "InnoDB: Have you moved InnoDB .ibd files around without using the\n"
"InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n" "InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n"
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB:" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: for how to resolve the issue.\n", (ulong) space_id, (ulong) id); "InnoDB: for how to resolve the issue.\n", (ulong) space_id, (ulong) id);
ret = FALSE; ret = FALSE;
...@@ -3373,8 +3374,7 @@ fil_space_for_table_exists_in_mem( ...@@ -3373,8 +3374,7 @@ fil_space_for_table_exists_in_mem(
error_exit: error_exit:
fputs( fputs(
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB:" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: for how to resolve the issue.\n", stderr); "InnoDB: for how to resolve the issue.\n", stderr);
mem_free(path); mem_free(path);
......
...@@ -2988,7 +2988,7 @@ fseg_free_page_low( ...@@ -2988,7 +2988,7 @@ fseg_free_page_low(
crash: crash:
fputs( fputs(
"InnoDB: Please refer to\n" "InnoDB: Please refer to\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: about forcing recovery.\n", stderr); "InnoDB: about forcing recovery.\n", stderr);
ut_error; ut_error;
} }
......
...@@ -373,7 +373,6 @@ ibuf_init_at_db_start(void) ...@@ -373,7 +373,6 @@ ibuf_init_at_db_start(void)
ibuf->max_size = buf_pool_get_curr_size() / UNIV_PAGE_SIZE ibuf->max_size = buf_pool_get_curr_size() / UNIV_PAGE_SIZE
/ IBUF_POOL_SIZE_PER_MAX_SIZE; / IBUF_POOL_SIZE_PER_MAX_SIZE;
ibuf->meter = IBUF_THRESHOLD + 1;
UT_LIST_INIT(ibuf->data_list); UT_LIST_INIT(ibuf->data_list);
...@@ -3518,20 +3517,8 @@ ibuf_print( ...@@ -3518,20 +3517,8 @@ ibuf_print(
while (data) { while (data) {
fprintf(file, fprintf(file,
"Ibuf for space %lu: size %lu, free list len %lu, seg size %lu,", "Ibuf: size %lu, free list len %lu, seg size %lu,\n"
(ulong) data->space, (ulong) data->size,
(ulong) data->free_list_len,
(ulong) data->seg_size);
if (data->empty) {
fputs(" is empty\n", file);
} else {
fputs(" is not empty\n", file);
}
fprintf(file,
"Ibuf for space %lu: size %lu, free list len %lu, seg size %lu,\n"
"%lu inserts, %lu merged recs, %lu merges\n", "%lu inserts, %lu merged recs, %lu merges\n",
(ulong) data->space,
(ulong) data->size, (ulong) data->size,
(ulong) data->free_list_len, (ulong) data->free_list_len,
(ulong) data->seg_size, (ulong) data->seg_size,
......
...@@ -52,10 +52,7 @@ btr_cur_get_page( ...@@ -52,10 +52,7 @@ btr_cur_get_page(
/* out: pointer to page */ /* out: pointer to page */
btr_cur_t* cursor) /* in: tree cursor */ btr_cur_t* cursor) /* in: tree cursor */
{ {
page_t* page = buf_frame_align(page_cur_get_rec(&(cursor->page_cur))); return(buf_frame_align(page_cur_get_rec(&(cursor->page_cur))));
ut_ad(!!page_is_comp(page)
== dict_table_is_comp(cursor->index->table));
return(page);
} }
/************************************************************* /*************************************************************
......
...@@ -216,8 +216,8 @@ buf_block_align( ...@@ -216,8 +216,8 @@ buf_block_align(
"InnoDB: Error: trying to access a stray pointer %p\n" "InnoDB: Error: trying to access a stray pointer %p\n"
"InnoDB: buf pool start is at %p, end at %p\n" "InnoDB: buf pool start is at %p, end at %p\n"
"InnoDB: Probable reason is database corruption or memory\n" "InnoDB: Probable reason is database corruption or memory\n"
"InnoDB: corruption. If this happens in an InnoDB database recovery,\n" "InnoDB: corruption. If this happens in an InnoDB database recovery, see\n"
"InnoDB: you can look from section 6.1 at http://www.innodb.com/ibman.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: how to force recovery.\n", "InnoDB: how to force recovery.\n",
ptr, frame_zero, ptr, frame_zero,
buf_pool->high_end); buf_pool->high_end);
...@@ -252,8 +252,8 @@ buf_frame_align( ...@@ -252,8 +252,8 @@ buf_frame_align(
"InnoDB: Error: trying to access a stray pointer %p\n" "InnoDB: Error: trying to access a stray pointer %p\n"
"InnoDB: buf pool start is at %p, end at %p\n" "InnoDB: buf pool start is at %p, end at %p\n"
"InnoDB: Probable reason is database corruption or memory\n" "InnoDB: Probable reason is database corruption or memory\n"
"InnoDB: corruption. If this happens in an InnoDB database recovery,\n" "InnoDB: corruption. If this happens in an InnoDB database recovery, see\n"
"InnoDB: you can look from section 6.1 at http://www.innodb.com/ibman.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: how to force recovery.\n", "InnoDB: how to force recovery.\n",
ptr, buf_pool->frame_zero, ptr, buf_pool->frame_zero,
buf_pool->high_end); buf_pool->high_end);
......
...@@ -39,19 +39,11 @@ struct ibuf_data_struct{ ...@@ -39,19 +39,11 @@ struct ibuf_data_struct{
ulint n_merged_recs;/* number of records merged */ ulint n_merged_recs;/* number of records merged */
}; };
/* If the ibuf meter exceeds this value, then the suitable inserts are made to
the insert buffer instead of directly to the disk page */
#define IBUF_THRESHOLD 50
struct ibuf_struct{ struct ibuf_struct{
ulint size; /* current size of the ibuf index ulint size; /* current size of the ibuf index
trees in pages */ trees in pages */
ulint max_size; /* recommended maximum size in pages ulint max_size; /* recommended maximum size in pages
for the ibuf index tree */ for the ibuf index tree */
ulint meter; /* heuristic meter which measures
desirability of doing inserts to the
insert buffer instead of directly to
the disk page */
UT_LIST_BASE_NODE_T(ibuf_data_t) data_list; UT_LIST_BASE_NODE_T(ibuf_data_t) data_list;
/* list of ibuf data structs for /* list of ibuf data structs for
each tablespace */ each tablespace */
...@@ -88,8 +80,7 @@ ibuf_should_try( ...@@ -88,8 +80,7 @@ ibuf_should_try(
decide */ decide */
{ {
if (!(index->type & DICT_CLUSTERED) if (!(index->type & DICT_CLUSTERED)
&& (ignore_sec_unique || !(index->type & DICT_UNIQUE)) && (ignore_sec_unique || !(index->type & DICT_UNIQUE))) {
&& ibuf->meter > IBUF_THRESHOLD) {
ibuf_flush_count++; ibuf_flush_count++;
......
...@@ -720,7 +720,7 @@ failure: ...@@ -720,7 +720,7 @@ failure:
"InnoDB: To get mysqld to start up, set innodb_thread_concurrency in my.cnf\n" "InnoDB: To get mysqld to start up, set innodb_thread_concurrency in my.cnf\n"
"InnoDB: to a lower value, for example, to 8. After an ERROR-FREE shutdown\n" "InnoDB: to a lower value, for example, to 8. After an ERROR-FREE shutdown\n"
"InnoDB: of mysqld you can adjust the size of ib_logfiles, as explained in\n" "InnoDB: of mysqld you can adjust the size of ib_logfiles, as explained in\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Adding_and_removing.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/adding-and-removing.html\n"
"InnoDB: Cannot continue operation. Calling exit(1).\n", "InnoDB: Cannot continue operation. Calling exit(1).\n",
(ulong)srv_thread_concurrency); (ulong)srv_thread_concurrency);
......
...@@ -542,7 +542,7 @@ recv_find_max_checkpoint( ...@@ -542,7 +542,7 @@ recv_find_max_checkpoint(
"InnoDB: the problem may be that during an earlier attempt you managed\n" "InnoDB: the problem may be that during an earlier attempt you managed\n"
"InnoDB: to create the InnoDB data files, but log file creation failed.\n" "InnoDB: to create the InnoDB data files, but log file creation failed.\n"
"InnoDB: If that is the case, please refer to\n" "InnoDB: If that is the case, please refer to\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Error_creating_InnoDB.html\n"); "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/error-creating-innodb.html\n");
return(DB_ERROR); return(DB_ERROR);
} }
...@@ -1962,7 +1962,7 @@ recv_report_corrupt_log( ...@@ -1962,7 +1962,7 @@ recv_report_corrupt_log(
"InnoDB: far enough in recovery! Please run CHECK TABLE\n" "InnoDB: far enough in recovery! Please run CHECK TABLE\n"
"InnoDB: on your InnoDB tables to check that they are ok!\n" "InnoDB: on your InnoDB tables to check that they are ok!\n"
"InnoDB: If mysqld crashes after this recovery, look at\n" "InnoDB: If mysqld crashes after this recovery, look at\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: about forcing recovery.\n", stderr); "InnoDB: about forcing recovery.\n", stderr);
fflush(stderr); fflush(stderr);
......
...@@ -248,7 +248,7 @@ os_file_get_last_error( ...@@ -248,7 +248,7 @@ os_file_get_last_error(
fprintf(stderr, fprintf(stderr,
"InnoDB: Some operating system error numbers are described at\n" "InnoDB: Some operating system error numbers are described at\n"
"InnoDB: " "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/Operating_System_error_codes.html\n"); "http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html\n");
} }
} }
...@@ -295,7 +295,7 @@ os_file_get_last_error( ...@@ -295,7 +295,7 @@ os_file_get_last_error(
fprintf(stderr, fprintf(stderr,
"InnoDB: Some operating system error numbers are described at\n" "InnoDB: Some operating system error numbers are described at\n"
"InnoDB: " "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/Operating_System_error_codes.html\n"); "http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html\n");
} }
} }
...@@ -688,7 +688,7 @@ next_file: ...@@ -688,7 +688,7 @@ next_file:
/* TODO: test Windows symlinks */ /* TODO: test Windows symlinks */
/* TODO: MySQL has apparently its own symlink implementation in Windows, /* TODO: MySQL has apparently its own symlink implementation in Windows,
dbname.sym can redirect a database directory: dbname.sym can redirect a database directory:
http://www.mysql.com/doc/en/Windows_symbolic_links.html */ http://dev.mysql.com/doc/refman/5.1/en/windows-symbolic-links.html */
info->type = OS_FILE_TYPE_LINK; info->type = OS_FILE_TYPE_LINK;
} else if (lpFindFileData->dwFileAttributes } else if (lpFindFileData->dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY) { & FILE_ATTRIBUTE_DIRECTORY) {
...@@ -2343,7 +2343,7 @@ retry: ...@@ -2343,7 +2343,7 @@ retry:
"InnoDB: offset %lu %lu. Operating system error number %lu.\n" "InnoDB: offset %lu %lu. Operating system error number %lu.\n"
"InnoDB: Some operating system error numbers are described at\n" "InnoDB: Some operating system error numbers are described at\n"
"InnoDB: " "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/Operating_System_error_codes.html\n", "http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html\n",
name, (ulong) offset_high, (ulong) offset, name, (ulong) offset_high, (ulong) offset,
(ulong) GetLastError()); (ulong) GetLastError());
...@@ -2408,7 +2408,7 @@ retry: ...@@ -2408,7 +2408,7 @@ retry:
fprintf(stderr, fprintf(stderr,
"InnoDB: Some operating system error numbers are described at\n" "InnoDB: Some operating system error numbers are described at\n"
"InnoDB: " "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/Operating_System_error_codes.html\n"); "http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html\n");
os_has_said_disk_full = TRUE; os_has_said_disk_full = TRUE;
} }
...@@ -2444,7 +2444,7 @@ retry: ...@@ -2444,7 +2444,7 @@ retry:
fprintf(stderr, fprintf(stderr,
"InnoDB: Some operating system error numbers are described at\n" "InnoDB: Some operating system error numbers are described at\n"
"InnoDB: " "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/Operating_System_error_codes.html\n"); "http://dev.mysql.com/doc/refman/5.1/en/operating-system-error-codes.html\n");
os_has_said_disk_full = TRUE; os_has_said_disk_full = TRUE;
} }
......
...@@ -54,27 +54,6 @@ static const char S_innodb_tablespace_monitor[] = "innodb_tablespace_monitor"; ...@@ -54,27 +54,6 @@ static const char S_innodb_tablespace_monitor[] = "innodb_tablespace_monitor";
static const char S_innodb_table_monitor[] = "innodb_table_monitor"; static const char S_innodb_table_monitor[] = "innodb_table_monitor";
static const char S_innodb_mem_validate[] = "innodb_mem_validate"; static const char S_innodb_mem_validate[] = "innodb_mem_validate";
/* Name suffix for recovered orphaned temporary tables */
static const char S_recover_innodb_tmp_table[] = "_recover_innodb_tmp_table";
/***********************************************************************
Determine if the given name ends in the suffix reserved for recovered
orphaned temporary tables. */
static
ibool
row_mysql_is_recovered_tmp_table(
/*=============================*/
/* out: TRUE if table name ends in
the reserved suffix */
const char* name)
{
ulint namelen = strlen(name) + 1;
return(namelen >= sizeof S_recover_innodb_tmp_table
&& !memcmp(name + namelen -
sizeof S_recover_innodb_tmp_table,
S_recover_innodb_tmp_table,
sizeof S_recover_innodb_tmp_table));
}
/*********************************************************************** /***********************************************************************
Determine if the given name is a name reserved for MySQL system tables. */ Determine if the given name is a name reserved for MySQL system tables. */
static static
...@@ -550,7 +529,7 @@ handle_new_error: ...@@ -550,7 +529,7 @@ handle_new_error:
"InnoDB: tables and recreate the whole InnoDB tablespace.\n" "InnoDB: tables and recreate the whole InnoDB tablespace.\n"
"InnoDB: If the mysqld server crashes after the startup or when\n" "InnoDB: If the mysqld server crashes after the startup or when\n"
"InnoDB: you dump the tables, look at\n" "InnoDB: you dump the tables, look at\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html"
" for help.\n", stderr); " for help.\n", stderr);
} else { } else {
...@@ -1083,7 +1062,7 @@ row_insert_for_mysql( ...@@ -1083,7 +1062,7 @@ row_insert_for_mysql(
"InnoDB: Have you deleted the .ibd file from the database directory under\n" "InnoDB: Have you deleted the .ibd file from the database directory under\n"
"InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n" "InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n"
"InnoDB: Look from\n" "InnoDB: Look from\n"
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"InnoDB: how you can resolve the problem.\n", "InnoDB: how you can resolve the problem.\n",
prebuilt->table->name); prebuilt->table->name);
return(DB_ERROR); return(DB_ERROR);
...@@ -1319,7 +1298,7 @@ row_update_for_mysql( ...@@ -1319,7 +1298,7 @@ row_update_for_mysql(
"InnoDB: Have you deleted the .ibd file from the database directory under\n" "InnoDB: Have you deleted the .ibd file from the database directory under\n"
"InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n" "InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n"
"InnoDB: Look from\n" "InnoDB: Look from\n"
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"InnoDB: how you can resolve the problem.\n", "InnoDB: how you can resolve the problem.\n",
prebuilt->table->name); prebuilt->table->name);
return(DB_ERROR); return(DB_ERROR);
...@@ -1659,48 +1638,6 @@ row_get_mysql_key_number_for_index( ...@@ -1659,48 +1638,6 @@ row_get_mysql_key_number_for_index(
return(i); return(i);
} }
/*************************************************************************
Recovers an orphaned tmp table inside InnoDB by renaming it. In the table
name #sql becomes rsql, and "_recover_innodb_tmp_table" is catenated to
the end of name. table->name should be of the form
"dbname/rsql..._recover_innodb_tmp_table". This renames a table whose
name is "#sql..." */
static
int
row_mysql_recover_tmp_table(
/*========================*/
/* out: error code or DB_SUCCESS */
dict_table_t* table, /* in: table definition */
trx_t* trx) /* in: transaction handle */
{
const char* ptr = strstr(table->name, "/rsql");
if (!ptr) {
/* table name does not begin with "/rsql" */
dict_mem_table_free(table);
trx_commit_for_mysql(trx);
return(DB_ERROR);
}
else {
int status;
int namelen = (int) strlen(table->name);
char* old_name = mem_strdupl(table->name, namelen);
/* replace "rsql" with "#sql" */
old_name[ptr - table->name + 1] = '#';
/* remove "_recover_innodb_tmp_table" suffix */
ut_ad(namelen > (int) sizeof S_recover_innodb_tmp_table);
ut_ad(!strcmp(old_name + namelen + 1 -
sizeof S_recover_innodb_tmp_table,
S_recover_innodb_tmp_table));
old_name[namelen + 1 - sizeof S_recover_innodb_tmp_table] = 0;
status = row_rename_table_for_mysql(old_name,
table->name, trx);
mem_free(old_name);
return(status);
}
}
/************************************************************************* /*************************************************************************
Locks the data dictionary in shared mode from modifications, for performing Locks the data dictionary in shared mode from modifications, for performing
foreign key check, rollback, or other operation invisible to MySQL. */ foreign key check, rollback, or other operation invisible to MySQL. */
...@@ -1845,18 +1782,6 @@ row_create_table_for_mysql( ...@@ -1845,18 +1782,6 @@ row_create_table_for_mysql(
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
if (row_mysql_is_recovered_tmp_table(table->name)) {
/* MySQL prevents accessing of tables whose name begins
with #sql, that is temporary tables. If mysqld crashes in
the middle of an ALTER TABLE, we may get an orphaned
#sql-table in the tablespace. We have here a special
mechanism to recover such tables by renaming them to
rsql... */
return(row_mysql_recover_tmp_table(table, trx));
}
/* The table name is prefixed with the database name and a '/'. /* The table name is prefixed with the database name and a '/'.
Certain table names starting with 'innodb_' have their special Certain table names starting with 'innodb_' have their special
meaning regardless of the database name. Thus, we need to meaning regardless of the database name. Thus, we need to
...@@ -1968,8 +1893,8 @@ row_create_table_for_mysql( ...@@ -1968,8 +1893,8 @@ row_create_table_for_mysql(
"InnoDB: Then MySQL thinks the table exists, and DROP TABLE will\n" "InnoDB: Then MySQL thinks the table exists, and DROP TABLE will\n"
"InnoDB: succeed.\n" "InnoDB: succeed.\n"
"InnoDB: You can look for further help from\n" "InnoDB: You can look for further help from\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"InnoDB_troubleshooting_datadict.html\n", stderr); stderr);
} }
/* We may also get err == DB_ERROR if the .ibd file for the /* We may also get err == DB_ERROR if the .ibd file for the
...@@ -2063,11 +1988,6 @@ row_create_index_for_mysql( ...@@ -2063,11 +1988,6 @@ row_create_index_for_mysql(
} }
} }
if (row_mysql_is_recovered_tmp_table(index->table_name)) {
return(DB_SUCCESS);
}
heap = mem_heap_create(512); heap = mem_heap_create(512);
trx->dict_operation = TRUE; trx->dict_operation = TRUE;
...@@ -2142,11 +2062,6 @@ row_table_add_foreign_constraints( ...@@ -2142,11 +2062,6 @@ row_table_add_foreign_constraints(
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
if (row_mysql_is_recovered_tmp_table(name)) {
return(DB_SUCCESS);
}
trx->dict_operation = TRUE; trx->dict_operation = TRUE;
err = dict_create_foreign_constraints(trx, sql_string, name, err = dict_create_foreign_constraints(trx, sql_string, name,
...@@ -3054,8 +2969,8 @@ row_drop_table_for_mysql( ...@@ -3054,8 +2969,8 @@ row_drop_table_for_mysql(
"InnoDB: Have you copied the .frm file of the table to the\n" "InnoDB: Have you copied the .frm file of the table to the\n"
"InnoDB: MySQL database directory from another database?\n" "InnoDB: MySQL database directory from another database?\n"
"InnoDB: You can look for further help from\n" "InnoDB: You can look for further help from\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"InnoDB_troubleshooting_datadict.html\n", stderr); stderr);
goto funct_exit; goto funct_exit;
} }
...@@ -3495,7 +3410,6 @@ row_rename_table_for_mysql( ...@@ -3495,7 +3410,6 @@ row_rename_table_for_mysql(
mem_heap_t* heap = NULL; mem_heap_t* heap = NULL;
const char** constraints_to_drop = NULL; const char** constraints_to_drop = NULL;
ulint n_constraints_to_drop = 0; ulint n_constraints_to_drop = 0;
ibool recovering_temp_table = FALSE;
ibool old_is_tmp, new_is_tmp; ibool old_is_tmp, new_is_tmp;
pars_info_t* info = NULL; pars_info_t* info = NULL;
...@@ -3533,15 +3447,10 @@ row_rename_table_for_mysql( ...@@ -3533,15 +3447,10 @@ row_rename_table_for_mysql(
old_is_tmp = row_is_mysql_tmp_table_name(old_name); old_is_tmp = row_is_mysql_tmp_table_name(old_name);
new_is_tmp = row_is_mysql_tmp_table_name(new_name); new_is_tmp = row_is_mysql_tmp_table_name(new_name);
if (row_mysql_is_recovered_tmp_table(new_name)) {
recovering_temp_table = TRUE;
} else {
/* Serialize data dictionary operations with dictionary mutex: /* Serialize data dictionary operations with dictionary mutex:
no deadlocks can occur then in these operations */ no deadlocks can occur then in these operations */
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
}
table = dict_table_get_low(old_name); table = dict_table_get_low(old_name);
...@@ -3556,8 +3465,8 @@ row_rename_table_for_mysql( ...@@ -3556,8 +3465,8 @@ row_rename_table_for_mysql(
"InnoDB: Have you copied the .frm file of the table to the\n" "InnoDB: Have you copied the .frm file of the table to the\n"
"InnoDB: MySQL database directory from another database?\n" "InnoDB: MySQL database directory from another database?\n"
"InnoDB: You can look for further help from\n" "InnoDB: You can look for further help from\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"InnoDB_troubleshooting_datadict.html\n", stderr); stderr);
goto funct_exit; goto funct_exit;
} }
...@@ -3570,8 +3479,8 @@ row_rename_table_for_mysql( ...@@ -3570,8 +3479,8 @@ row_rename_table_for_mysql(
fputs( fputs(
" does not have an .ibd file in the database directory.\n" " does not have an .ibd file in the database directory.\n"
"InnoDB: You can look for further help from\n" "InnoDB: You can look for further help from\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n",
"InnoDB_troubleshooting_datadict.html\n", stderr); stderr);
goto funct_exit; goto funct_exit;
} }
...@@ -3719,8 +3628,7 @@ end: ...@@ -3719,8 +3628,7 @@ end:
fputs(" to it.\n" fputs(" to it.\n"
"InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n" "InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n"
"InnoDB: You can look for further help from\n" "InnoDB: You can look for further help from\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"InnoDB_troubleshooting_datadict.html\n"
"InnoDB: If table ", stderr); "InnoDB: If table ", stderr);
ut_print_name(stderr, trx, TRUE, new_name); ut_print_name(stderr, trx, TRUE, new_name);
fputs( fputs(
...@@ -3748,8 +3656,8 @@ end: ...@@ -3748,8 +3656,8 @@ end:
trx_general_rollback_for_mysql(trx, FALSE, NULL); trx_general_rollback_for_mysql(trx, FALSE, NULL);
trx->error_state = DB_SUCCESS; trx->error_state = DB_SUCCESS;
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error in table rename, cannot rename ", fputs(
stderr); " InnoDB: Error in table rename, cannot rename ", stderr);
ut_print_name(stderr, trx, TRUE, old_name); ut_print_name(stderr, trx, TRUE, old_name);
fputs(" to ", stderr); fputs(" to ", stderr);
ut_print_name(stderr, trx, TRUE, new_name); ut_print_name(stderr, trx, TRUE, new_name);
...@@ -3797,10 +3705,7 @@ end: ...@@ -3797,10 +3705,7 @@ end:
funct_exit: funct_exit:
trx_commit_for_mysql(trx); trx_commit_for_mysql(trx);
if (!recovering_temp_table) {
row_mysql_unlock_data_dictionary(trx); row_mysql_unlock_data_dictionary(trx);
}
if (UNIV_LIKELY_NULL(heap)) { if (UNIV_LIKELY_NULL(heap)) {
mem_heap_free(heap); mem_heap_free(heap);
...@@ -3968,7 +3873,7 @@ row_check_table_for_mysql( ...@@ -3968,7 +3873,7 @@ row_check_table_for_mysql(
"InnoDB: Have you deleted the .ibd file from the database directory under\n" "InnoDB: Have you deleted the .ibd file from the database directory under\n"
"InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n" "InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n"
"InnoDB: Look from\n" "InnoDB: Look from\n"
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"InnoDB: how you can resolve the problem.\n", "InnoDB: how you can resolve the problem.\n",
prebuilt->table->name); prebuilt->table->name);
return(DB_ERROR); return(DB_ERROR);
......
...@@ -3245,7 +3245,7 @@ row_search_for_mysql( ...@@ -3245,7 +3245,7 @@ row_search_for_mysql(
"InnoDB: Have you deleted the .ibd file from the database directory under\n" "InnoDB: Have you deleted the .ibd file from the database directory under\n"
"InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n" "InnoDB: the MySQL datadir, or have you used DISCARD TABLESPACE?\n"
"InnoDB: Look from\n" "InnoDB: Look from\n"
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html\n"
"InnoDB: how you can resolve the problem.\n", "InnoDB: how you can resolve the problem.\n",
prebuilt->table->name); prebuilt->table->name);
......
...@@ -553,7 +553,7 @@ row_vers_build_for_semi_consistent_read( ...@@ -553,7 +553,7 @@ row_vers_build_for_semi_consistent_read(
mem_heap_t* heap = NULL; mem_heap_t* heap = NULL;
byte* buf; byte* buf;
ulint err; ulint err;
dulint rec_trx_id; dulint rec_trx_id = ut_dulint_create(0, 0);
ut_ad(index->type & DICT_CLUSTERED); ut_ad(index->type & DICT_CLUSTERED);
ut_ad(mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_X_FIX) ut_ad(mtr_memo_contains(mtr, buf_block_align(rec), MTR_MEMO_PAGE_X_FIX)
......
...@@ -1691,7 +1691,7 @@ NetWare. */ ...@@ -1691,7 +1691,7 @@ NetWare. */
"InnoDB: You have now successfully upgraded to the multiple tablespaces\n" "InnoDB: You have now successfully upgraded to the multiple tablespaces\n"
"InnoDB: format. You should NOT DOWNGRADE to an earlier version of\n" "InnoDB: format. You should NOT DOWNGRADE to an earlier version of\n"
"InnoDB: InnoDB! But if you absolutely need to downgrade, see\n" "InnoDB: InnoDB! But if you absolutely need to downgrade, see\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Multiple_tablespaces.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/multiple-tablespaces.html\n"
"InnoDB: for instructions.\n"); "InnoDB: for instructions.\n");
} }
......
...@@ -42,7 +42,7 @@ ut_dbg_assertion_failed( ...@@ -42,7 +42,7 @@ ut_dbg_assertion_failed(
{ {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
"InnoDB: Assertion failure in thread %lu" " InnoDB: Assertion failure in thread %lu"
" in file %s line %lu\n", " in file %s line %lu\n",
os_thread_pf(os_thread_get_curr_id()), file, line); os_thread_pf(os_thread_get_curr_id()), file, line);
if (expr) { if (expr) {
...@@ -56,7 +56,7 @@ ut_dbg_assertion_failed( ...@@ -56,7 +56,7 @@ ut_dbg_assertion_failed(
"InnoDB: If you get repeated assertion failures or crashes, even\n" "InnoDB: If you get repeated assertion failures or crashes, even\n"
"InnoDB: immediately after the mysqld startup, there may be\n" "InnoDB: immediately after the mysqld startup, there may be\n"
"InnoDB: corruption in the InnoDB tablespace. Please refer to\n" "InnoDB: corruption in the InnoDB tablespace. Please refer to\n"
"InnoDB: http://dev.mysql.com/doc/mysql/en/Forcing_recovery.html\n" "InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html\n"
"InnoDB: about forcing recovery.\n", stderr); "InnoDB: about forcing recovery.\n", stderr);
#if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT) #if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT)
ut_dbg_stop_threads = TRUE; ut_dbg_stop_threads = TRUE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment