summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorunknown <heikki@hundin.mysql.fi>2004-10-22 00:25:57 +0300
committerunknown <heikki@hundin.mysql.fi>2004-10-22 00:25:57 +0300
commit4f84f90f96b037a5afee1011c8d4c1fd42df74a3 (patch)
treecdebd62a041a8e415e6404e85f86e9b33e42e4f9 /innobase
parentec8779e95a46b3dfff492196ad004cb2716df3c3 (diff)
downloadmariadb-git-4f84f90f96b037a5afee1011c8d4c1fd42df74a3.tar.gz
row0mysql.c, row0ins.c:
Fix bug #5961: release the dictionary latch during a long cascaded FOREIGN KEY operation, so that we do not starve other users innobase/row/row0ins.c: Fix bug #5961: release the dictionary latch during a long cascaded FOREIGN KEY operation, so that we do not starve other users innobase/row/row0mysql.c: Fix bug #5961: release the dictionary latch during a long cascaded FOREIGN KEY operation, so that we do not starve other users
Diffstat (limited to 'innobase')
-rw-r--r--innobase/row/row0ins.c17
-rw-r--r--innobase/row/row0mysql.c4
2 files changed, 19 insertions, 2 deletions
diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c
index 458970da4e2..b9f860903cb 100644
--- a/innobase/row/row0ins.c
+++ b/innobase/row/row0ins.c
@@ -966,6 +966,23 @@ row_ins_foreign_check_on_constraint(
err = row_update_cascade_for_mysql(thr, cascade,
foreign->foreign_table);
+
+ if (foreign->foreign_table->n_foreign_key_checks_running == 0) {
+ fprintf(stderr,
+"InnoDB: error: table %s has the counter 0 though there is\n"
+"InnoDB: a FOREIGN KEY check running on it.\n",
+ foreign->foreign_table->name);
+ }
+
+ /* Release the data dictionary latch for a while, so that we do not
+ starve other threads from doing CREATE TABLE etc. if we have a huge
+ cascaded operation running. The counter n_foreign_key_checks_running
+ will prevent other users from dropping or ALTERing the table when we
+ release the latch. */
+
+ row_mysql_unfreeze_data_dictionary(thr_get_trx(thr));
+ row_mysql_freeze_data_dictionary(thr_get_trx(thr));
+
mtr_start(mtr);
/* Restore pcur position */
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index a884dc8d9ef..3eb4f0de60e 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -2156,8 +2156,8 @@ row_drop_table_for_mysql(
fputs(" InnoDB: You are trying to drop table ", stderr);
ut_print_name(stderr, table->name);
fputs("\n"
- "InnoDB: though there are foreign key check running on it.\n"
- "InnoDB: Adding the table to the background drop queue.\n",
+ "InnoDB: though there is a foreign key check running on it.\n"
+ "InnoDB: Adding the table to the background drop queue.\n",
stderr);
row_add_table_to_background_drop_list(table);