Commit 498ee6bd authored by unknown's avatar unknown Committed by Karen Langford

Fix bug #57345

parent cf2c8701
...@@ -3259,6 +3259,7 @@ row_search_for_mysql( ...@@ -3259,6 +3259,7 @@ row_search_for_mysql(
mem_heap_t* heap = NULL; mem_heap_t* heap = NULL;
ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets = offsets_; ulint* offsets = offsets_;
ibool table_lock_waited = FALSE;
*offsets_ = (sizeof offsets_) / sizeof *offsets_; *offsets_ = (sizeof offsets_) / sizeof *offsets_;
...@@ -3622,13 +3623,15 @@ shortcut_fails_too_big_rec: ...@@ -3622,13 +3623,15 @@ shortcut_fails_too_big_rec:
trx_assign_read_view(trx); trx_assign_read_view(trx);
prebuilt->sql_stat_start = FALSE; prebuilt->sql_stat_start = FALSE;
} else { } else {
wait_table_again:
err = lock_table(0, index->table, err = lock_table(0, index->table,
prebuilt->select_lock_type == LOCK_S prebuilt->select_lock_type == LOCK_S
? LOCK_IS : LOCK_IX, thr); ? LOCK_IS : LOCK_IX, thr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto lock_wait_or_error; table_lock_waited = TRUE;
goto lock_table_wait;
} }
prebuilt->sql_stat_start = FALSE; prebuilt->sql_stat_start = FALSE;
} }
...@@ -4408,6 +4411,7 @@ lock_wait_or_error: ...@@ -4408,6 +4411,7 @@ lock_wait_or_error:
btr_pcur_store_position(pcur, &mtr); btr_pcur_store_position(pcur, &mtr);
lock_table_wait:
mtr_commit(&mtr); mtr_commit(&mtr);
mtr_has_extra_clust_latch = FALSE; mtr_has_extra_clust_latch = FALSE;
...@@ -4425,6 +4429,14 @@ lock_wait_or_error: ...@@ -4425,6 +4429,14 @@ lock_wait_or_error:
thr->lock_state = QUE_THR_LOCK_NOLOCK; thr->lock_state = QUE_THR_LOCK_NOLOCK;
mtr_start(&mtr); 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, sel_restore_position_for_mysql(&same_user_rec,
BTR_SEARCH_LEAF, pcur, BTR_SEARCH_LEAF, pcur,
moves_up, &mtr); moves_up, &mtr);
......
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-06 The InnoDB Team 2010-10-06 The InnoDB Team
* row/row0mysql.c, innodb_bug57255.result, innodb_bug57255.test * row/row0mysql.c, innodb_bug57255.result, innodb_bug57255.test
Fix Bug #Cascade Delete results in "Got error -1 from storage engine" Fix Bug #Cascade Delete results in "Got error -1 from storage engine"
...@@ -40,7 +45,6 @@ ...@@ -40,7 +45,6 @@
* handler/ha_innodb.cc * handler/ha_innodb.cc
Fix Bug #55382 Assignment with SELECT expressions takes unexpected Fix Bug #55382 Assignment with SELECT expressions takes unexpected
S locks in READ COMMITTED S locks in READ COMMITTED
>>>>>>> MERGE-SOURCE
2010-07-27 The InnoDB Team 2010-07-27 The InnoDB Team
......
...@@ -3356,6 +3356,7 @@ row_search_for_mysql( ...@@ -3356,6 +3356,7 @@ row_search_for_mysql(
mem_heap_t* heap = NULL; mem_heap_t* heap = NULL;
ulint offsets_[REC_OFFS_NORMAL_SIZE]; ulint offsets_[REC_OFFS_NORMAL_SIZE];
ulint* offsets = offsets_; ulint* offsets = offsets_;
ibool table_lock_waited = FALSE;
rec_offs_init(offsets_); rec_offs_init(offsets_);
...@@ -3742,13 +3743,15 @@ release_search_latch_if_needed: ...@@ -3742,13 +3743,15 @@ release_search_latch_if_needed:
trx_assign_read_view(trx); trx_assign_read_view(trx);
prebuilt->sql_stat_start = FALSE; prebuilt->sql_stat_start = FALSE;
} else { } else {
wait_table_again:
err = lock_table(0, index->table, err = lock_table(0, index->table,
prebuilt->select_lock_type == LOCK_S prebuilt->select_lock_type == LOCK_S
? LOCK_IS : LOCK_IX, thr); ? LOCK_IS : LOCK_IX, thr);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
goto lock_wait_or_error; table_lock_waited = TRUE;
goto lock_table_wait;
} }
prebuilt->sql_stat_start = FALSE; prebuilt->sql_stat_start = FALSE;
} }
...@@ -4559,6 +4562,7 @@ lock_wait_or_error: ...@@ -4559,6 +4562,7 @@ lock_wait_or_error:
btr_pcur_store_position(pcur, &mtr); btr_pcur_store_position(pcur, &mtr);
lock_table_wait:
mtr_commit(&mtr); mtr_commit(&mtr);
mtr_has_extra_clust_latch = FALSE; mtr_has_extra_clust_latch = FALSE;
...@@ -4576,6 +4580,14 @@ lock_wait_or_error: ...@@ -4576,6 +4580,14 @@ lock_wait_or_error:
thr->lock_state = QUE_THR_LOCK_NOLOCK; thr->lock_state = QUE_THR_LOCK_NOLOCK;
mtr_start(&mtr); 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, sel_restore_position_for_mysql(&same_user_rec,
BTR_SEARCH_LEAF, pcur, BTR_SEARCH_LEAF, pcur,
moves_up, &mtr); moves_up, &mtr);
......
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