Loading innobase/row/row0ins.c +26 −0 Original line number Diff line number Diff line Loading @@ -1415,8 +1415,34 @@ row_ins_check_foreign_constraints( row_mysql_freeze_data_dictionary(trx); } if (foreign->referenced_table) { mutex_enter(&(dict_sys->mutex)); (foreign->referenced_table ->n_foreign_key_checks_running)++; mutex_exit(&(dict_sys->mutex)); } /* NOTE that if the thread ends up waiting for a lock we will release dict_operation_lock temporarily! But the counter on the table protects the referenced table from being dropped while the check is running. */ err = row_ins_check_foreign_constraint(TRUE, foreign, table, entry, thr); if (foreign->referenced_table) { mutex_enter(&(dict_sys->mutex)); ut_a(foreign->referenced_table ->n_foreign_key_checks_running > 0); (foreign->referenced_table ->n_foreign_key_checks_running)--; mutex_exit(&(dict_sys->mutex)); } if (got_s_lock) { row_mysql_unfreeze_data_dictionary(trx); } Loading innobase/row/row0mysql.c +11 −5 Original line number Diff line number Diff line Loading @@ -1833,6 +1833,12 @@ row_drop_table_for_mysql_in_background( trx = trx_allocate_for_background(); /* If the original transaction was dropping a table referenced by foreign keys, we must set the following to be able to drop the table: */ trx->check_foreigns = FALSE; /* fputs("InnoDB: Error: Dropping table ", stderr); ut_print_name(stderr, name); fputs(" in background drop list\n", stderr); */ Loading Loading @@ -1907,16 +1913,16 @@ row_drop_tables_for_mysql_in_background(void) goto already_dropped; } if (table->n_mysql_handles_opened > 0 || table->n_foreign_key_checks_running > 0) { if (DB_SUCCESS != row_drop_table_for_mysql_in_background( drop->table_name)) { /* If the DROP fails for some table, we return, and let the main thread retry later */ return(n_tables + n_tables_dropped); } n_tables_dropped++; row_drop_table_for_mysql_in_background(drop->table_name); already_dropped: mutex_enter(&kernel_mutex); Loading Loading
innobase/row/row0ins.c +26 −0 Original line number Diff line number Diff line Loading @@ -1415,8 +1415,34 @@ row_ins_check_foreign_constraints( row_mysql_freeze_data_dictionary(trx); } if (foreign->referenced_table) { mutex_enter(&(dict_sys->mutex)); (foreign->referenced_table ->n_foreign_key_checks_running)++; mutex_exit(&(dict_sys->mutex)); } /* NOTE that if the thread ends up waiting for a lock we will release dict_operation_lock temporarily! But the counter on the table protects the referenced table from being dropped while the check is running. */ err = row_ins_check_foreign_constraint(TRUE, foreign, table, entry, thr); if (foreign->referenced_table) { mutex_enter(&(dict_sys->mutex)); ut_a(foreign->referenced_table ->n_foreign_key_checks_running > 0); (foreign->referenced_table ->n_foreign_key_checks_running)--; mutex_exit(&(dict_sys->mutex)); } if (got_s_lock) { row_mysql_unfreeze_data_dictionary(trx); } Loading
innobase/row/row0mysql.c +11 −5 Original line number Diff line number Diff line Loading @@ -1833,6 +1833,12 @@ row_drop_table_for_mysql_in_background( trx = trx_allocate_for_background(); /* If the original transaction was dropping a table referenced by foreign keys, we must set the following to be able to drop the table: */ trx->check_foreigns = FALSE; /* fputs("InnoDB: Error: Dropping table ", stderr); ut_print_name(stderr, name); fputs(" in background drop list\n", stderr); */ Loading Loading @@ -1907,16 +1913,16 @@ row_drop_tables_for_mysql_in_background(void) goto already_dropped; } if (table->n_mysql_handles_opened > 0 || table->n_foreign_key_checks_running > 0) { if (DB_SUCCESS != row_drop_table_for_mysql_in_background( drop->table_name)) { /* If the DROP fails for some table, we return, and let the main thread retry later */ return(n_tables + n_tables_dropped); } n_tables_dropped++; row_drop_table_for_mysql_in_background(drop->table_name); already_dropped: mutex_enter(&kernel_mutex); Loading