summaryrefslogtreecommitdiff
path: root/storage/innobase/mtr/mtr0log.cc
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-01-22 20:12:08 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2020-02-13 18:19:15 +0200
commit8a039ee107de6deec6377a6e0686629a3080abae (patch)
tree93aa68382454da270250caefefe8ede478db2c50 /storage/innobase/mtr/mtr0log.cc
parent2e7a0842831bc4e9b7f3f2699e9c0ca049afa928 (diff)
downloadmariadb-git-8a039ee107de6deec6377a6e0686629a3080abae.tar.gz
MDEV-12353: Introduce mtr_t::zmemcpy()
Exclusively write MLOG_ZIP_WRITE_STRING records by mtr_t::zmemcpy().
Diffstat (limited to 'storage/innobase/mtr/mtr0log.cc')
-rw-r--r--storage/innobase/mtr/mtr0log.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/storage/innobase/mtr/mtr0log.cc b/storage/innobase/mtr/mtr0log.cc
index cf9d33a5574..076fed2ea21 100644
--- a/storage/innobase/mtr/mtr0log.cc
+++ b/storage/innobase/mtr/mtr0log.cc
@@ -297,6 +297,35 @@ void mtr_t::memcpy(const buf_block_t &b, ulint ofs, ulint len)
mlog_catenate_string(this, b.frame + ofs, len);
}
+/** Write a byte string to a ROW_FORMAT=COMPRESSED page.
+@param[in] b ROW_FORMAT=COMPRESSED index page
+@param[in] ofs byte offset from b.zip.data
+@param[in] len length of the data to write */
+void mtr_t::zmemcpy(const buf_page_t &b, ulint offset, ulint len)
+{
+ ut_ad(page_zip_simple_validate(&b.zip));
+ ut_ad(len);
+ ut_ad(offset + len <= page_zip_get_size(&b.zip));
+ ut_ad(mach_read_from_2(b.zip.data + FIL_PAGE_TYPE) == FIL_PAGE_INDEX ||
+ mach_read_from_2(b.zip.data + FIL_PAGE_TYPE) == FIL_PAGE_RTREE);
+
+ set_modified();
+ if (get_log_mode() != MTR_LOG_ALL)
+ {
+ ut_ad(get_log_mode() == MTR_LOG_NONE ||
+ get_log_mode() == MTR_LOG_NO_REDO);
+ return;
+ }
+
+ byte *l= get_log()->open(11 + 2 + 2);
+ l= mlog_write_initial_log_record_low(MLOG_ZIP_WRITE_STRING, b.id.space(),
+ b.id.page_no(), l, this);
+ mach_write_to_2(l, offset);
+ mach_write_to_2(l + 2, len);
+ mlog_close(this, l + 4);
+ mlog_catenate_string(this, b.zip.data + offset, len);
+}
+
/********************************************************//**
Parses a log record written by mtr_t::memcpy().
@return parsed record end, NULL if not a complete record */