Commit 61f21148 authored by marko's avatar marko

branches/zip: Bug fixes and improvements.

page_header_reset_last_insert(): Add page_zip parameter.
rec_get_next_ptr(): Return a pointer to the same page, or NULL.
page_dir_delete_slot(): Fix off-by-one errors.
parent 18f8313a
...@@ -3192,7 +3192,11 @@ loop: ...@@ -3192,7 +3192,11 @@ loop:
if (ibuf_rec_get_page_no(ibuf_rec) != page_no if (ibuf_rec_get_page_no(ibuf_rec) != page_no
|| ibuf_rec_get_space(ibuf_rec) != space) { || ibuf_rec_get_space(ibuf_rec) != space) {
if (page) { if (page) {
page_header_reset_last_insert(page, &mtr); /* TODO: if the insert buffer is adapted for
use on compressed pages, pass the compressed
page as a parameter */
page_header_reset_last_insert(
page, NULL, &mtr);
} }
goto reset_bit; goto reset_bit;
} }
......
...@@ -191,7 +191,7 @@ void ...@@ -191,7 +191,7 @@ void
page_header_set_ptr( page_header_set_ptr(
/*================*/ /*================*/
page_t* page, /* in/out: page */ page_t* page, /* in/out: page */
page_zip_des_t* page_zip,/* in: compressed page whose page_zip_des_t* page_zip,/* in/out: compressed page whose
uncompressed part will be updated, or NULL */ uncompressed part will be updated, or NULL */
ulint field, /* in/out: PAGE_FREE, ... */ ulint field, /* in/out: PAGE_FREE, ... */
const byte* ptr); /* in: pointer or NULL*/ const byte* ptr); /* in: pointer or NULL*/
...@@ -202,8 +202,10 @@ UNIV_INLINE ...@@ -202,8 +202,10 @@ UNIV_INLINE
void void
page_header_reset_last_insert( page_header_reset_last_insert(
/*==========================*/ /*==========================*/
page_t* page, /* in: page */ page_t* page, /* in: page */
mtr_t* mtr); /* in: mtr */ page_zip_des_t* page_zip,/* in/out: compressed page whose
uncompressed part will be updated, or NULL */
mtr_t* mtr); /* in: mtr */
/**************************************************************** /****************************************************************
Gets the first record on the page. */ Gets the first record on the page. */
UNIV_INLINE UNIV_INLINE
......
...@@ -120,7 +120,7 @@ void ...@@ -120,7 +120,7 @@ void
page_header_set_ptr( page_header_set_ptr(
/*================*/ /*================*/
page_t* page, /* in: page */ page_t* page, /* in: page */
page_zip_des_t* page_zip,/* in: compressed page whose page_zip_des_t* page_zip,/* in/out: compressed page whose
uncompressed part will be updated, or NULL */ uncompressed part will be updated, or NULL */
ulint field, /* in: PAGE_FREE, ... */ ulint field, /* in: PAGE_FREE, ... */
const byte* ptr) /* in: pointer or NULL*/ const byte* ptr) /* in: pointer or NULL*/
...@@ -150,13 +150,19 @@ UNIV_INLINE ...@@ -150,13 +150,19 @@ UNIV_INLINE
void void
page_header_reset_last_insert( page_header_reset_last_insert(
/*==========================*/ /*==========================*/
page_t* page, /* in: page */ page_t* page, /* in/out: page */
mtr_t* mtr) /* in: mtr */ page_zip_des_t* page_zip,/* in/out: compressed page whose
uncompressed part will be updated, or NULL */
mtr_t* mtr) /* in: mtr */
{ {
ut_ad(page && mtr); ut_ad(page && mtr);
mlog_write_ulint(page + PAGE_HEADER + PAGE_LAST_INSERT, 0, mlog_write_ulint(page + (PAGE_HEADER + PAGE_LAST_INSERT), 0,
MLOG_2BYTES, mtr); MLOG_2BYTES, mtr);
if (UNIV_LIKELY_NULL(page_zip)) {
page_zip_write_header(page_zip,
page + (PAGE_HEADER + PAGE_LAST_INSERT), 2);
}
} }
/**************************************************************** /****************************************************************
......
...@@ -294,7 +294,8 @@ rec_get_next_ptr( ...@@ -294,7 +294,8 @@ rec_get_next_ptr(
+ ut_align_offset(rec, UNIV_PAGE_SIZE) + ut_align_offset(rec, UNIV_PAGE_SIZE)
< UNIV_PAGE_SIZE); < UNIV_PAGE_SIZE);
#endif #endif
return(rec + field_value); return(ut_align_down(rec, UNIV_PAGE_SIZE)
+ ut_align_offset(rec + field_value, UNIV_PAGE_SIZE));
} else { } else {
ut_ad(field_value < UNIV_PAGE_SIZE); ut_ad(field_value < UNIV_PAGE_SIZE);
......
...@@ -1100,7 +1100,7 @@ page_dir_delete_slot( ...@@ -1100,7 +1100,7 @@ page_dir_delete_slot(
ut_ad(!page_zip || page_zip_available(page_zip, 10)); ut_ad(!page_zip || page_zip_available(page_zip, 10));
ut_ad(!page_zip || page_is_comp(page)); ut_ad(!page_zip || page_is_comp(page));
ut_ad(slot_no > 0); ut_ad(slot_no > 0);
ut_ad(slot_no < page_dir_get_n_slots(page)); ut_ad(slot_no + 1 < page_dir_get_n_slots(page));
n_slots = page_dir_get_n_slots(page); n_slots = page_dir_get_n_slots(page);
...@@ -1113,14 +1113,14 @@ page_dir_delete_slot( ...@@ -1113,14 +1113,14 @@ page_dir_delete_slot(
/* 2. Update the n_owned value of the first non-deleted slot */ /* 2. Update the n_owned value of the first non-deleted slot */
slot = page_dir_get_nth_slot(page, slot_no + 1); slot = page_dir_get_nth_slot(page, slot_no + 1);
page_dir_slot_set_n_owned(slot, page_zip, n_owned page_dir_slot_set_n_owned(slot, page_zip,
+ page_dir_slot_get_n_owned(slot)); n_owned + page_dir_slot_get_n_owned(slot));
/* 3. Destroy the slot by copying slots */ /* 3. Destroy the slot by copying slots */
for (i = slot_no + 1; i < n_slots; i++) { for (i = slot_no + 1; i < n_slots; i++) {
rec_t* rec; rec_t* rec;
rec = page_dir_slot_get_rec(page_dir_get_nth_slot(page, i)); rec = page_dir_slot_get_rec(page_dir_get_nth_slot(page, i));
page_dir_slot_set_rec(page_dir_get_nth_slot(page, i), page_dir_slot_set_rec(page_dir_get_nth_slot(page, i - 1),
page_zip, rec); page_zip, rec);
} }
...@@ -1288,15 +1288,15 @@ page_dir_balance_slot( ...@@ -1288,15 +1288,15 @@ page_dir_balance_slot(
rec_set_n_owned_new(old_rec, page_zip, 0); rec_set_n_owned_new(old_rec, page_zip, 0);
rec_set_n_owned_new(new_rec, page_zip, n_owned + 1); rec_set_n_owned_new(new_rec, page_zip, n_owned + 1);
page_dir_slot_set_rec(slot, page_zip, new_rec);
} else { } else {
new_rec = rec_get_next_ptr(old_rec, FALSE); new_rec = rec_get_next_ptr(old_rec, FALSE);
rec_set_n_owned_old(old_rec, 0); rec_set_n_owned_old(old_rec, 0);
rec_set_n_owned_old(new_rec, n_owned + 1); rec_set_n_owned_old(new_rec, n_owned + 1);
page_dir_slot_set_rec(slot, page_zip, new_rec);
} }
page_dir_slot_set_rec(slot, page_zip, new_rec);
page_dir_slot_set_n_owned(up_slot, page_zip, up_n_owned -1); page_dir_slot_set_n_owned(up_slot, page_zip, up_n_owned -1);
} else { } else {
/* In this case we may merge the two slots */ /* In this case we may merge the two slots */
......
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