Bug#14399148 INNODB TABLES UNDER LOAD PRODUCE DUPLICATE COPIES OF ROWS
IN QUERIES This bug was caused by an incorrect fix of Bug#13807811 BTR_PCUR_RESTORE_POSITION() CAN SKIP A RECORD There was nothing wrong with btr_pcur_restore_position(), but with the use of it in the table scan during index creation. rb:1206 approved by Jimmy Yang
This commit is contained in:
parent
941924e831
commit
e0482cb0bc
@ -312,45 +312,40 @@ btr_pcur_restore_position(
|
|||||||
/* Restore the old search mode */
|
/* Restore the old search mode */
|
||||||
cursor->search_mode = old_mode;
|
cursor->search_mode = old_mode;
|
||||||
|
|
||||||
if (btr_pcur_is_on_user_rec(cursor, mtr)) {
|
switch (cursor->rel_pos) {
|
||||||
switch (cursor->rel_pos) {
|
case BTR_PCUR_ON:
|
||||||
case BTR_PCUR_ON:
|
if (btr_pcur_is_on_user_rec(cursor, mtr)
|
||||||
if (!cmp_dtuple_rec(
|
&& !cmp_dtuple_rec(
|
||||||
tuple, btr_pcur_get_rec(cursor),
|
tuple, btr_pcur_get_rec(cursor),
|
||||||
rec_get_offsets(btr_pcur_get_rec(cursor),
|
rec_get_offsets(btr_pcur_get_rec(cursor),
|
||||||
index, NULL,
|
index, NULL,
|
||||||
ULINT_UNDEFINED, &heap))) {
|
ULINT_UNDEFINED, &heap))) {
|
||||||
|
|
||||||
/* We have to store the NEW value for
|
/* We have to store the NEW value for
|
||||||
the modify clock, since the cursor can
|
the modify clock, since the cursor can
|
||||||
now be on a different page! But we can
|
now be on a different page! But we can
|
||||||
retain the value of old_rec */
|
retain the value of old_rec */
|
||||||
|
|
||||||
cursor->block_when_stored =
|
cursor->block_when_stored =
|
||||||
buf_block_align(
|
buf_block_align(
|
||||||
btr_pcur_get_page(cursor));
|
btr_pcur_get_page(cursor));
|
||||||
cursor->modify_clock =
|
cursor->modify_clock =
|
||||||
buf_block_get_modify_clock(
|
buf_block_get_modify_clock(
|
||||||
cursor->block_when_stored);
|
cursor->block_when_stored);
|
||||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case BTR_PCUR_BEFORE:
|
|
||||||
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
|
|
||||||
break;
|
|
||||||
case BTR_PCUR_AFTER:
|
|
||||||
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
|
||||||
break;
|
|
||||||
#ifdef UNIV_DEBUG
|
|
||||||
default:
|
|
||||||
ut_error;
|
|
||||||
#endif /* UNIV_DEBUG */
|
|
||||||
}
|
}
|
||||||
|
#ifdef UNIV_DEBUG
|
||||||
|
/* fall through */
|
||||||
|
case BTR_PCUR_BEFORE:
|
||||||
|
case BTR_PCUR_AFTER:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ut_error;
|
||||||
|
#endif /* UNIV_DEBUG */
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2012-08-07 The InnoDB Team
|
||||||
|
|
||||||
|
* btr/btr0pcur.c, row/row0merge.c:
|
||||||
|
Fix Bug#14399148 INNODB TABLES UNDER LOAD PRODUCE DUPLICATE COPIES
|
||||||
|
OF ROWS IN QUERIES
|
||||||
|
|
||||||
2012-03-15 The InnoDB Team
|
2012-03-15 The InnoDB Team
|
||||||
|
|
||||||
* fil/fil0fil.c, ibuf/ibuf0ibuf.c, include/fil0fil.h,
|
* fil/fil0fil.c, ibuf/ibuf0ibuf.c, include/fil0fil.h,
|
||||||
|
@ -336,44 +336,39 @@ btr_pcur_restore_position_func(
|
|||||||
/* Restore the old search mode */
|
/* Restore the old search mode */
|
||||||
cursor->search_mode = old_mode;
|
cursor->search_mode = old_mode;
|
||||||
|
|
||||||
if (btr_pcur_is_on_user_rec(cursor)) {
|
switch (cursor->rel_pos) {
|
||||||
switch (cursor->rel_pos) {
|
case BTR_PCUR_ON:
|
||||||
case BTR_PCUR_ON:
|
if (btr_pcur_is_on_user_rec(cursor)
|
||||||
if (!cmp_dtuple_rec(
|
&& !cmp_dtuple_rec(
|
||||||
tuple, btr_pcur_get_rec(cursor),
|
tuple, btr_pcur_get_rec(cursor),
|
||||||
rec_get_offsets(btr_pcur_get_rec(cursor),
|
rec_get_offsets(btr_pcur_get_rec(cursor),
|
||||||
index, NULL,
|
index, NULL,
|
||||||
ULINT_UNDEFINED, &heap))) {
|
ULINT_UNDEFINED, &heap))) {
|
||||||
|
|
||||||
/* We have to store the NEW value for
|
/* We have to store the NEW value for
|
||||||
the modify clock, since the cursor can
|
the modify clock, since the cursor can
|
||||||
now be on a different page! But we can
|
now be on a different page! But we can
|
||||||
retain the value of old_rec */
|
retain the value of old_rec */
|
||||||
|
|
||||||
cursor->block_when_stored =
|
cursor->block_when_stored =
|
||||||
btr_pcur_get_block(cursor);
|
btr_pcur_get_block(cursor);
|
||||||
cursor->modify_clock =
|
cursor->modify_clock =
|
||||||
buf_block_get_modify_clock(
|
buf_block_get_modify_clock(
|
||||||
cursor->block_when_stored);
|
cursor->block_when_stored);
|
||||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case BTR_PCUR_BEFORE:
|
|
||||||
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
|
|
||||||
break;
|
|
||||||
case BTR_PCUR_AFTER:
|
|
||||||
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
|
||||||
break;
|
|
||||||
#ifdef UNIV_DEBUG
|
|
||||||
default:
|
|
||||||
ut_error;
|
|
||||||
#endif /* UNIV_DEBUG */
|
|
||||||
}
|
}
|
||||||
|
#ifdef UNIV_DEBUG
|
||||||
|
/* fall through */
|
||||||
|
case BTR_PCUR_BEFORE:
|
||||||
|
case BTR_PCUR_AFTER:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ut_error;
|
||||||
|
#endif /* UNIV_DEBUG */
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
|
@ -1214,11 +1214,25 @@ row_merge_read_clustered_index(
|
|||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Store the cursor position on the last user
|
||||||
|
record on the page. */
|
||||||
|
btr_pcur_move_to_prev_on_page(&pcur);
|
||||||
|
/* Leaf pages must never be empty, unless
|
||||||
|
this is the only page in the index tree. */
|
||||||
|
ut_ad(btr_pcur_is_on_user_rec(&pcur)
|
||||||
|
|| buf_block_get_page_no(
|
||||||
|
btr_pcur_get_block(&pcur))
|
||||||
|
== clust_index->page);
|
||||||
|
|
||||||
btr_pcur_store_position(&pcur, &mtr);
|
btr_pcur_store_position(&pcur, &mtr);
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
|
/* Restore position on the record, or its
|
||||||
|
predecessor if the record was purged
|
||||||
|
meanwhile. */
|
||||||
btr_pcur_restore_position(BTR_SEARCH_LEAF,
|
btr_pcur_restore_position(BTR_SEARCH_LEAF,
|
||||||
&pcur, &mtr);
|
&pcur, &mtr);
|
||||||
|
/* Move to the successor of the original record. */
|
||||||
has_next = btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
has_next = btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user