mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 19:41:47 +01:00
branches/zip: Minor cleanup after r690. One test case still fails.
page_zip_compress_write_log(): Do not invoke page_zip_validate(), since this is a static function and the callers already invoke page_zip_validate(). page_zip_decompress_low(): Clear the page #ifdef UNIV_ZIP_DEBUG. Optimizations: Remove local variable "last". Do not clear the BLOB pointer until the modification log has been applied. (Since r690, it will be cleared after applying the modification log.) Avoid calling rec_get_offsets() a second time if there are no uncompressed columns to be restored.
This commit is contained in:
parent
766fb4d1c7
commit
f5458ef6dc
1 changed files with 24 additions and 19 deletions
|
@ -195,10 +195,6 @@ page_zip_compress_write_log(
|
||||||
byte* log_ptr;
|
byte* log_ptr;
|
||||||
ulint trailer_size;
|
ulint trailer_size;
|
||||||
|
|
||||||
#ifdef UNIV_ZIP_DEBUG
|
|
||||||
ut_a(page_zip_validate(page_zip, page));
|
|
||||||
#endif /* UNIV_ZIP_DEBUG */
|
|
||||||
|
|
||||||
log_ptr = mlog_open(mtr, 11 + 2 + 2);
|
log_ptr = mlog_open(mtr, 11 + 2 + 2);
|
||||||
|
|
||||||
if (!log_ptr) {
|
if (!log_ptr) {
|
||||||
|
@ -1550,6 +1546,10 @@ page_zip_decompress_low(
|
||||||
heap = mem_heap_create(n_dense * (3 * sizeof *recs));
|
heap = mem_heap_create(n_dense * (3 * sizeof *recs));
|
||||||
recs = mem_heap_alloc(heap, n_dense * (2 * sizeof *recs));
|
recs = mem_heap_alloc(heap, n_dense * (2 * sizeof *recs));
|
||||||
|
|
||||||
|
#ifdef UNIV_ZIP_DEBUG
|
||||||
|
/* Clear the page. */
|
||||||
|
memset(page, 0x55, UNIV_PAGE_SIZE);
|
||||||
|
#endif /* UNIV_ZIP_DEBUG */
|
||||||
/* Copy the page header. */
|
/* Copy the page header. */
|
||||||
memcpy(page, page_zip->data, PAGE_DATA);
|
memcpy(page, page_zip->data, PAGE_DATA);
|
||||||
|
|
||||||
|
@ -1653,20 +1653,17 @@ page_zip_decompress_low(
|
||||||
|
|
||||||
/* Decompress the records in heap_no order. */
|
/* Decompress the records in heap_no order. */
|
||||||
for (slot = 0; slot < n_dense; slot++) {
|
for (slot = 0; slot < n_dense; slot++) {
|
||||||
byte* const last = d_stream.next_out;
|
|
||||||
rec_t* rec = recs[slot];
|
rec_t* rec = recs[slot];
|
||||||
|
|
||||||
d_stream.avail_out = rec - REC_N_NEW_EXTRA_BYTES - last;
|
d_stream.avail_out = rec - REC_N_NEW_EXTRA_BYTES
|
||||||
|
- d_stream.next_out;
|
||||||
|
|
||||||
ut_ad(d_stream.avail_out < UNIV_PAGE_SIZE
|
ut_ad(d_stream.avail_out < UNIV_PAGE_SIZE
|
||||||
- PAGE_ZIP_START - PAGE_DIR);
|
- PAGE_ZIP_START - PAGE_DIR);
|
||||||
switch (inflate(&d_stream, Z_SYNC_FLUSH)) {
|
switch (inflate(&d_stream, Z_SYNC_FLUSH)) {
|
||||||
case Z_STREAM_END:
|
case Z_STREAM_END:
|
||||||
/* Apparently, n_dense has grown
|
/* Apparently, n_dense has grown
|
||||||
since the time the page was last compressed.
|
since the time the page was last compressed. */
|
||||||
(d_stream.next_out == last) will not hold,
|
|
||||||
in case the last record was allocated from
|
|
||||||
an originally longer space on the free list. */
|
|
||||||
goto zlib_done;
|
goto zlib_done;
|
||||||
case Z_OK:
|
case Z_OK:
|
||||||
case Z_BUF_ERROR:
|
case Z_BUF_ERROR:
|
||||||
|
@ -1765,13 +1762,12 @@ page_zip_decompress_low(
|
||||||
goto zlib_error;
|
goto zlib_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the BLOB pointer in case
|
/* Skip the BLOB pointer in case
|
||||||
the record was deleted. The BLOB
|
the record was deleted. The BLOB
|
||||||
pointers of existing records will
|
pointers will be initialized
|
||||||
be copied later from "externs" in
|
(copied from "externs" or cleared)
|
||||||
this function. */
|
only after the page modification log
|
||||||
memset(d_stream.next_out, 0,
|
has been applied. */
|
||||||
BTR_EXTERN_FIELD_REF_SIZE);
|
|
||||||
d_stream.next_out
|
d_stream.next_out
|
||||||
+= BTR_EXTERN_FIELD_REF_SIZE;
|
+= BTR_EXTERN_FIELD_REF_SIZE;
|
||||||
}
|
}
|
||||||
|
@ -1909,10 +1905,10 @@ err_exit:
|
||||||
ibool exists = !page_zip_dir_find_free(
|
ibool exists = !page_zip_dir_find_free(
|
||||||
page_zip, ut_align_offset(
|
page_zip, ut_align_offset(
|
||||||
rec, UNIV_PAGE_SIZE));
|
rec, UNIV_PAGE_SIZE));
|
||||||
offsets = rec_get_offsets(rec, index, offsets,
|
|
||||||
ULINT_UNDEFINED, &heap);
|
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(trx_id_col != ULINT_UNDEFINED)) {
|
if (UNIV_UNLIKELY(trx_id_col != ULINT_UNDEFINED)) {
|
||||||
|
offsets = rec_get_offsets(rec, index, offsets,
|
||||||
|
ULINT_UNDEFINED, &heap);
|
||||||
|
|
||||||
dst = rec_get_nth_field(rec, offsets,
|
dst = rec_get_nth_field(rec, offsets,
|
||||||
trx_id_col, &len);
|
trx_id_col, &len);
|
||||||
ut_ad(len >= DATA_TRX_ID_LEN
|
ut_ad(len >= DATA_TRX_ID_LEN
|
||||||
|
@ -1920,6 +1916,15 @@ err_exit:
|
||||||
storage -= DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN;
|
storage -= DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN;
|
||||||
memcpy(dst, storage,
|
memcpy(dst, storage,
|
||||||
DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN);
|
DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!exists)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (UNIV_LIKELY(exists)) {
|
||||||
|
offsets = rec_get_offsets(rec, index, offsets,
|
||||||
|
ULINT_UNDEFINED, &heap);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if there are any externally stored
|
/* Check if there are any externally stored
|
||||||
|
|
Loading…
Add table
Reference in a new issue