summaryrefslogtreecommitdiff
path: root/storage/innodb_plugin
diff options
context:
space:
mode:
authorMarko Makela <mmakela@bk-internal.mysql.com>2010-10-11 21:28:51 +0200
committerMarko Makela <mmakela@bk-internal.mysql.com>2010-10-11 21:28:51 +0200
commitbda9e4570b4edf13949560484bd2b994241cfd48 (patch)
tree0e1a2cec61b9d8f67c48b8b994952d82d84c10ff /storage/innodb_plugin
parenta8da1a3a581a3572edf165ffe1076b0194195a18 (diff)
parent820e1bc6f400517e72ae4f142dbe5da54d5ef03c (diff)
downloadmariadb-git-bda9e4570b4edf13949560484bd2b994241cfd48.tar.gz
Merge Bug #57345, Bug #56982, Bug#53307 test from mysql-5.1-innodb
Diffstat (limited to 'storage/innodb_plugin')
-rw-r--r--storage/innodb_plugin/ChangeLog6
-rw-r--r--storage/innodb_plugin/handler/ha_innodb.cc6
-rw-r--r--storage/innodb_plugin/row/row0sel.c14
3 files changed, 24 insertions, 2 deletions
diff --git a/storage/innodb_plugin/ChangeLog b/storage/innodb_plugin/ChangeLog
index ca7900549c2..f0dfe1ff6cc 100644
--- a/storage/innodb_plugin/ChangeLog
+++ b/storage/innodb_plugin/ChangeLog
@@ -1,5 +1,11 @@
2010-10-11 The InnoDB Team
+ * row/row0sel.c
+ Fix Bug #57345 btr_pcur_store_position abort for load with
+ concurrent lock/unlock tables
+
+2010-10-11 The InnoDB Team
+
* row/row0mysql.c, innodb_bug56947.result, innodb_bug56947.test:
Fix Bug #56947 InnoDB leaks memory when failing to create a table
diff --git a/storage/innodb_plugin/handler/ha_innodb.cc b/storage/innodb_plugin/handler/ha_innodb.cc
index 990d99b9cf4..350eb8ae026 100644
--- a/storage/innodb_plugin/handler/ha_innodb.cc
+++ b/storage/innodb_plugin/handler/ha_innodb.cc
@@ -9409,7 +9409,11 @@ ha_innobase::innobase_peek_autoinc(void)
auto_inc = dict_table_autoinc_read(innodb_table);
- ut_a(auto_inc > 0);
+ if (auto_inc == 0) {
+ ut_print_timestamp(stderr);
+ fprintf(stderr, " InnoDB: AUTOINC next value generation "
+ "is disabled for '%s'\n", innodb_table->name);
+ }
dict_table_autoinc_unlock(innodb_table);
diff --git a/storage/innodb_plugin/row/row0sel.c b/storage/innodb_plugin/row/row0sel.c
index 8b17bdc6ad3..cc7a7a6fe9b 100644
--- a/storage/innodb_plugin/row/row0sel.c
+++ b/storage/innodb_plugin/row/row0sel.c
@@ -3356,6 +3356,7 @@ row_search_for_mysql(
mem_heap_t* heap = NULL;
ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets = offsets_;
+ ibool table_lock_waited = FALSE;
rec_offs_init(offsets_);
@@ -3742,13 +3743,15 @@ release_search_latch_if_needed:
trx_assign_read_view(trx);
prebuilt->sql_stat_start = FALSE;
} else {
+wait_table_again:
err = lock_table(0, index->table,
prebuilt->select_lock_type == LOCK_S
? LOCK_IS : LOCK_IX, thr);
if (err != DB_SUCCESS) {
- goto lock_wait_or_error;
+ table_lock_waited = TRUE;
+ goto lock_table_wait;
}
prebuilt->sql_stat_start = FALSE;
}
@@ -4559,6 +4562,7 @@ lock_wait_or_error:
btr_pcur_store_position(pcur, &mtr);
+lock_table_wait:
mtr_commit(&mtr);
mtr_has_extra_clust_latch = FALSE;
@@ -4576,6 +4580,14 @@ lock_wait_or_error:
thr->lock_state = QUE_THR_LOCK_NOLOCK;
mtr_start(&mtr);
+ /* Table lock waited, go try to obtain table lock
+ again */
+ if (table_lock_waited) {
+ table_lock_waited = FALSE;
+
+ goto wait_table_again;
+ }
+
sel_restore_position_for_mysql(&same_user_rec,
BTR_SEARCH_LEAF, pcur,
moves_up, &mtr);