Commit d5c04aae authored by marko's avatar marko

branches/zip: ha_innobase::final_drop_index(): Allocate a separate transaction

for dropping the index trees, and set the dictionary operation flag, similar
to what ha_innobase::add_index() does.  This should ensure correct crash
recovery.
parent 27f78180
...@@ -651,6 +651,8 @@ ha_innobase::add_index( ...@@ -651,6 +651,8 @@ ha_innobase::add_index(
possible adaptive hash latch to avoid deadlocks of threads. */ possible adaptive hash latch to avoid deadlocks of threads. */
trx_search_latch_release_if_reserved(prebuilt->trx); trx_search_latch_release_if_reserved(prebuilt->trx);
/* Create a background transaction for the operations on
the data dictionary tables. */
trx = trx_allocate_for_mysql(); trx = trx_allocate_for_mysql();
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
...@@ -1084,12 +1086,25 @@ ha_innobase::final_drop_index( ...@@ -1084,12 +1086,25 @@ ha_innobase::final_drop_index(
update_thd(); update_thd();
trx_search_latch_release_if_reserved(prebuilt->trx); trx_search_latch_release_if_reserved(prebuilt->trx);
trx = prebuilt->trx;
/* Create a background transaction for the operations on
the data dictionary tables. */
trx = trx_allocate_for_mysql();
trx_start_if_not_started(trx);
trans_register_ha(user_thd, FALSE, ht);
trx->mysql_thd = user_thd;
trx->mysql_query_str = thd_query(user_thd);
/* Drop indexes marked to be dropped */ /* Drop indexes marked to be dropped */
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
/* Flag this transaction as a dictionary operation, so that
the data dictionary will be locked in crash recovery. */
trx_set_dict_operation(trx, TRX_DICT_OP_INDEX);
index = dict_table_get_first_index(prebuilt->table); index = dict_table_get_first_index(prebuilt->table);
while (index) { while (index) {
...@@ -1111,6 +1126,7 @@ ha_innobase::final_drop_index( ...@@ -1111,6 +1126,7 @@ ha_innobase::final_drop_index(
dict_table_check_for_dup_indexes(prebuilt->table); dict_table_check_for_dup_indexes(prebuilt->table);
#endif #endif
trx_commit_for_mysql(trx);
row_mysql_unlock_data_dictionary(trx); row_mysql_unlock_data_dictionary(trx);
/* Flush the log to reduce probability that the .frm files and /* Flush the log to reduce probability that the .frm files and
...@@ -1119,12 +1135,12 @@ ha_innobase::final_drop_index( ...@@ -1119,12 +1135,12 @@ ha_innobase::final_drop_index(
log_buffer_flush_to_disk(); log_buffer_flush_to_disk();
trx_free_for_mysql(trx);
/* Tell the InnoDB server that there might be work for /* Tell the InnoDB server that there might be work for
utility threads: */ utility threads: */
srv_active_wake_master_thread(); srv_active_wake_master_thread();
trx_commit_for_mysql(trx);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -366,14 +366,14 @@ enum trx_dict_op { ...@@ -366,14 +366,14 @@ enum trx_dict_op {
recovery. This and TRX_DICT_OP_NONE are the only possible recovery. This and TRX_DICT_OP_NONE are the only possible
operation modes in crash recovery. */ operation modes in crash recovery. */
TRX_DICT_OP_TABLE = 1, TRX_DICT_OP_TABLE = 1,
/** The transaction is creating an index in an existing table, /** The transaction is creating or dropping an index in an
In crash recovery, the the data dictionary must be locked, but existing table. In crash recovery, the the data dictionary
the table must not be dropped. */ must be locked, but the table must not be dropped. */
TRX_DICT_OP_INDEX = 2, TRX_DICT_OP_INDEX = 2,
/** The transaction is creating an index in an existing table, /** The transaction is creating or dropping an index in an
In crash recovery, the the data dictionary must be locked, but existing table. In crash recovery, the the data dictionary
the table must not be dropped. A lock wait timeout is allowed must be locked, but the table must not be dropped. A lock
to occur. */ wait timeout is allowed to occur. */
TRX_DICT_OP_INDEX_MAY_WAIT = 3 TRX_DICT_OP_INDEX_MAY_WAIT = 3
}; };
......
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