This is an ut_ad() crash, and we only build with UNIV_DEBUG for debug configurations as of last week or so, thus this might very well be some UNIV_DEBUG fallout too. The mlog_write_initial_log_record_fast() failing assertion already looks suspicious in the context of fake updates: ut_ad(mtr_memo_contains_page(mtr, ptr, MTR_MEMO_PAGE_X_FIX)); I haven't tested the release build yet.
The page_zip_compress_log code is the following. The crashing call is couple of lines below the #if FIL_PAGE_DATA > PAGE_DATA block.
Mark -
This is an ut_ad() crash, and we only build with UNIV_DEBUG for debug configurations as of last week or so, thus this might very well be some UNIV_DEBUG fallout too. The mlog_write_ initial_ log_record_ fast() failing assertion already looks suspicious in the context of fake updates: ut_ad(mtr_ memo_contains_ page(mtr, ptr, MTR_MEMO_ PAGE_X_ FIX)); I haven't tested the release build yet.
The page_zip_ compress_ log code is the following. The crashing call is couple of lines below the #if FIL_PAGE_DATA > PAGE_DATA block.
I will investigate this tomorrow.
static compress_ write_log( ======= ======= =====*/
void
page_zip_
/*=====
const page_zip_des_t* page_zip,/*!< in: compressed page */
const page_t* page, /*!< in: uncompressed page */
dict_index_t* index, /*!< in: index of the B-tree node */
mtr_t* mtr) /*!< in: mini-transaction */
{
byte* log_ptr;
ulint trailer_size;
ut_ad( !dict_index_ is_ibuf( index)) ;
log_ptr = mlog_open(mtr, 11 + 2 + 2);
if (!log_ptr) {
return;
}
/* Read the number of user records. */ get_n_heap( page_zip- >data) NO_USER_ LOW; is_leaf( page)) { DIR_SLOT_ SIZE + REC_NODE_PTR_SIZE; is_clust( index)) { DIR_SLOT_ SIZE DIR_SLOT_ SIZE; FIELD_REF_ SIZE; zip->m_ end > PAGE_DATA); zip->m_ end + trailer_size <= page_zip_ get_size( page_zip) );
trailer_size = page_dir_
- PAGE_HEAP_
/* Multiply by uncompressed of size stored per record */
if (!page_
trailer_size *= PAGE_ZIP_
} else if (dict_index_
trailer_size *= PAGE_ZIP_
+ DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN;
} else {
trailer_size *= PAGE_ZIP_
}
/* Add the space occupied by BLOB pointers. */
trailer_size += page_zip->n_blobs * BTR_EXTERN_
ut_a(page_
#if FIL_PAGE_DATA > PAGE_DATA
# error "FIL_PAGE_DATA > PAGE_DATA"
#endif
ut_a(page_
log_ptr = mlog_write_ initial_ log_record_ fast((page_ t*) page,
MLOG_ ZIP_PAGE_ COMPRESS, to_2(log_ ptr, page_zip->m_end - FIL_PAGE_TYPE); to_2(log_ ptr, trailer_size);
log_ptr, mtr);
mach_write_
log_ptr += 2;
mach_write_
log_ptr += 2;
mlog_close(mtr, log_ptr);
/* Write FIL_PAGE_PREV and FIL_PAGE_NEXT */ string( mtr, page_zip->data + FIL_PAGE_PREV, 4); string( mtr, page_zip->data + FIL_PAGE_NEXT, 4); string( mtr, page_zip->data + FIL_PAGE_TYPE,
page_zip- >m_end - FIL_PAGE_TYPE); string( mtr, page_zip->data + page_zip_ get_size( page_zip)
mlog_catenate_
mlog_catenate_
/* Write most of the page header, the compressed stream and
the modification log. */
mlog_catenate_
/* Write the uncompressed trailer of the compressed page. */
mlog_catenate_
- trailer_size, trailer_size);
}