summaryrefslogtreecommitdiff
path: root/extra/mariabackup/write_filt.cc
diff options
context:
space:
mode:
Diffstat (limited to 'extra/mariabackup/write_filt.cc')
-rw-r--r--extra/mariabackup/write_filt.cc26
1 files changed, 14 insertions, 12 deletions
diff --git a/extra/mariabackup/write_filt.cc b/extra/mariabackup/write_filt.cc
index 09470384684..c144a60e378 100644
--- a/extra/mariabackup/write_filt.cc
+++ b/extra/mariabackup/write_filt.cc
@@ -27,13 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "common.h"
#include "write_filt.h"
#include "fil_cur.h"
-#include "xtrabackup.h"
#include <os0proc.h>
/************************************************************************
Write-through page write filter. */
static my_bool wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
- xb_fil_cur_t *cursor);
+ xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages);
static my_bool wf_wt_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile);
xb_write_filt_t wf_write_through = {
@@ -46,7 +45,7 @@ xb_write_filt_t wf_write_through = {
/************************************************************************
Incremental page write filter. */
static my_bool wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
- xb_fil_cur_t *cursor);
+ xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages);
static my_bool wf_incremental_process(xb_write_filt_ctxt_t *ctxt,
ds_file_t *dstfile);
static my_bool wf_incremental_finalize(xb_write_filt_ctxt_t *ctxt,
@@ -66,11 +65,11 @@ Initialize incremental page write filter.
@return TRUE on success, FALSE on error. */
static my_bool
wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
- xb_fil_cur_t *cursor)
+ xb_fil_cur_t *cursor, CorruptedPages *corrupted_pages)
{
char meta_name[FN_REFLEN];
xb_wf_incremental_ctxt_t *cp =
- &(ctxt->u.wf_incremental_ctxt);
+ &(ctxt->wf_incremental_ctxt);
ctxt->cursor = cursor;
@@ -101,7 +100,9 @@ wf_incremental_init(xb_write_filt_ctxt_t *ctxt, char *dst_name,
strcat(dst_name, ".delta");
mach_write_to_4(cp->delta_buf, 0x78747261UL); /*"xtra"*/
+
cp->npages = 1;
+ cp->corrupted_pages = corrupted_pages;
return(TRUE);
}
@@ -117,15 +118,16 @@ wf_incremental_process(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile)
xb_fil_cur_t *cursor = ctxt->cursor;
byte *page;
const ulint page_size = cursor->page_size;
- xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt);
+ xb_wf_incremental_ctxt_t *cp = &(ctxt->wf_incremental_ctxt);
for (i = 0, page = cursor->buf; i < cursor->buf_npages;
i++, page += page_size) {
- if (incremental_lsn >= mach_read_from_8(page + FIL_PAGE_LSN)) {
-
+ if ((!cp->corrupted_pages ||
+ !cp->corrupted_pages->contains(cursor->node->space->id,
+ cursor->buf_page_no + i)) &&
+ incremental_lsn >= mach_read_from_8(page + FIL_PAGE_LSN))
continue;
- }
/* updated page */
if (cp->npages == page_size / 4) {
@@ -162,7 +164,7 @@ wf_incremental_finalize(xb_write_filt_ctxt_t *ctxt, ds_file_t *dstfile)
{
xb_fil_cur_t *cursor = ctxt->cursor;
const ulint page_size = cursor->page_size;
- xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt);
+ xb_wf_incremental_ctxt_t *cp = &(ctxt->wf_incremental_ctxt);
if (cp->npages != page_size / 4) {
mach_write_to_4(cp->delta_buf + cp->npages * 4, 0xFFFFFFFFUL);
@@ -184,7 +186,7 @@ Free the incremental page write filter's buffer. */
static void
wf_incremental_deinit(xb_write_filt_ctxt_t *ctxt)
{
- xb_wf_incremental_ctxt_t *cp = &(ctxt->u.wf_incremental_ctxt);
+ xb_wf_incremental_ctxt_t *cp = &(ctxt->wf_incremental_ctxt);
os_mem_free_large(cp->delta_buf, cp->delta_buf_size);
}
@@ -194,7 +196,7 @@ Initialize the write-through page write filter.
@return TRUE on success, FALSE on error. */
static my_bool
wf_wt_init(xb_write_filt_ctxt_t *ctxt, char *dst_name __attribute__((unused)),
- xb_fil_cur_t *cursor)
+ xb_fil_cur_t *cursor, CorruptedPages *)
{
ctxt->cursor = cursor;