summaryrefslogtreecommitdiff
path: root/storage/innobase/page
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@oracle.com>2011-10-26 12:23:57 +0300
committerMarko Mäkelä <marko.makela@oracle.com>2011-10-26 12:23:57 +0300
commit2c67d5066db7d6aada4d93297918a8ff3e57aa33 (patch)
tree0b4f76505019be0313750af509a14e04cc031e00 /storage/innobase/page
parent91b5e9352a82b096197aa9f24f149cf3bf892b8a (diff)
downloadmariadb-git-2c67d5066db7d6aada4d93297918a8ff3e57aa33.tar.gz
Revert revno:3452.71.32 (Bug#12612184 fix).
Bug#12612184 RACE CONDITION AFTER BTR_CUR_PESSIMISTIC_UPDATE() The fix introduced potentially more severe crash recovery problems than the bug causes. Revert the fix for now.
Diffstat (limited to 'storage/innobase/page')
-rw-r--r--storage/innobase/page/page0page.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/storage/innobase/page/page0page.c b/storage/innobase/page/page0page.c
index 6a89df7de22..543cf9e34eb 100644
--- a/storage/innobase/page/page0page.c
+++ b/storage/innobase/page/page0page.c
@@ -1194,42 +1194,49 @@ page_dir_balance_slot(
}
/****************************************************************
-Returns the nth record of the record list. */
+Returns the middle record of the record list. If there are an even number
+of records in the list, returns the first record of the upper half-list. */
rec_t*
-page_rec_get_nth(
-/*=============*/
- /* out: nth record */
- page_t* page, /* in: page */
- ulint nth) /* in: nth record */
+page_get_middle_rec(
+/*================*/
+ /* out: middle record */
+ page_t* page) /* in: page */
{
page_dir_slot_t* slot;
+ ulint middle;
ulint i;
ulint n_owned;
+ ulint count;
rec_t* rec;
- ut_ad(nth < UNIV_PAGE_SIZE / (REC_N_NEW_EXTRA_BYTES + 1));
+ /* This many records we must leave behind */
+ middle = (page_get_n_recs(page) + 2) / 2;
+
+ count = 0;
for (i = 0;; i++) {
slot = page_dir_get_nth_slot(page, i);
n_owned = page_dir_slot_get_n_owned(slot);
- if (n_owned > nth) {
+ if (count + n_owned > middle) {
break;
} else {
- nth -= n_owned;
+ count += n_owned;
}
}
ut_ad(i > 0);
slot = page_dir_get_nth_slot(page, i - 1);
rec = page_dir_slot_get_rec(slot);
+ rec = page_rec_get_next(rec);
+
+ /* There are now count records behind rec */
- do {
+ for (i = 0; i < middle - count; i++) {
rec = page_rec_get_next(rec);
- ut_ad(rec);
- } while (nth--);
+ }
return(rec);
}