From 978bdc128a6a9429f54a7abe93068522234547e9 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 11 Feb 2024 12:19:08 +0300 Subject: [PATCH] Apply recovery pause before writes, after commits, and do not apply it to syncs to not block EC pools from functioning --- src/osd.h | 1 + src/osd_flush.cpp | 2 +- src/osd_secondary.cpp | 24 ++++++++++++++++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/osd.h b/src/osd.h index c5079435..1718a8dd 100644 --- a/src/osd.h +++ b/src/osd.h @@ -283,6 +283,7 @@ class osd_t void exec_sync_stab_all(osd_op_t *cur_op); void exec_show_config(osd_op_t *cur_op); void exec_secondary(osd_op_t *cur_op); + void exec_secondary_real(osd_op_t *cur_op); void secondary_op_callback(osd_op_t *cur_op); // primary ops diff --git a/src/osd_flush.cpp b/src/osd_flush.cpp index c8a9f5ad..5f81240a 100644 --- a/src/osd_flush.cpp +++ b/src/osd_flush.cpp @@ -442,7 +442,7 @@ void osd_t::tune_recovery() if (recovery_target_sleep_count < recovery_tune_agg_interval) recovery_target_sleep_count++; recovery_target_sleep_us = recovery_target_sleep_total / recovery_target_sleep_count; - if (log_level > 4) + if (log_level > 1) { printf( "[OSD %lu] auto-tune: client util: %.2f, recovery util: %.2f, lat: %lu us -> target util %.2f, delay %lu us\n", diff --git a/src/osd_secondary.cpp b/src/osd_secondary.cpp index d8fe2627..61c26d87 100644 --- a/src/osd_secondary.cpp +++ b/src/osd_secondary.cpp @@ -42,8 +42,10 @@ void osd_t::secondary_op_callback(osd_op_t *op) int retval = op->bs_op->retval; delete op->bs_op; op->bs_op = NULL; - if (op->is_recovery_related() && recovery_target_sleep_us) + if (op->is_recovery_related() && recovery_target_sleep_us && + op->req.hdr.opcode == OSD_OP_SEC_STABILIZE) { + // Apply pause AFTER commit. Do not apply pause to SYNC at all if (!op->tv_end.tv_sec) { clock_gettime(CLOCK_REALTIME, &op->tv_end); @@ -59,7 +61,25 @@ void osd_t::secondary_op_callback(osd_op_t *op) } } -void osd_t::exec_secondary(osd_op_t *cur_op) +void osd_t::exec_secondary(osd_op_t *op) +{ + if (op->is_recovery_related() && recovery_target_sleep_us && + op->req.hdr.opcode != OSD_OP_SEC_STABILIZE && op->req.hdr.opcode != OSD_OP_SEC_SYNC) + { + // Apply pause BEFORE write/delete + tfd->set_timer_us(recovery_target_sleep_us, false, [this, op](int timer_id) + { + clock_gettime(CLOCK_REALTIME, &op->tv_begin); + exec_secondary_real(op); + }); + } + else + { + exec_secondary_real(op); + } +} + +void osd_t::exec_secondary_real(osd_op_t *cur_op) { if (cur_op->req.hdr.opcode == OSD_OP_SEC_READ_BMP) {