From 1be8b867e5deb14bf3554e4736019a9841069d98 Mon Sep 17 00:00:00 2001 From: Vinayakswami Hariharmath Date: Mon, 20 Jan 2025 14:57:50 +0530 Subject: [PATCH] Clean md store objects Clean md store objects once the max deleted objects reach the limit. Fixes: https://issues.redhat.com/browse/DFBUGS-1339 Signed-off-by: Vinayakswami Hariharmath --- config.js | 1 + src/server/bg_services/db_cleaner.js | 27 +++++++++++++++++---- src/server/bg_services/objects_reclaimer.js | 4 +++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/config.js b/config.js index 6c3a2435a4..5e69d9865b 100644 --- a/config.js +++ b/config.js @@ -432,6 +432,7 @@ config.DB_CLEANER_BACK_TIME = 3 * 30 * 24 * 60 * 60 * 1000; // 3 months config.DB_CLEANER_DOCS_LIMIT = 1000; config.DB_CLEANER_MAX_TOTAL_DOCS = 10000; +config.MD_STORE_MAX_DELETED_OBJECTS_LIMIT = 100; ///////////////////// // CLOUD RESOURCES // ///////////////////// diff --git a/src/server/bg_services/db_cleaner.js b/src/server/bg_services/db_cleaner.js index 77c0968ab9..c748c72f17 100644 --- a/src/server/bg_services/db_cleaner.js +++ b/src/server/bg_services/db_cleaner.js @@ -58,23 +58,39 @@ async function clean_md_store(last_date_to_remove) { ${total_objects_count} objects - Skipping...`); return; } + const objects_to_remove = await clean_md_store_objects(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + const blocks_to_remove = await clean_md_store_blocks(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + const filtered_chunks = await clean_md_store_chunks(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + + dbg.log0(`DB_CLEANER: removed ${objects_to_remove.length + blocks_to_remove.length + filtered_chunks.length} documents from md-store`); +} + +async function clean_md_store_objects(last_date_to_remove, limit) { dbg.log0('DB_CLEANER: checking md-store for documents deleted before', new Date(last_date_to_remove)); - const objects_to_remove = await MDStore.instance().find_deleted_objects(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + const objects_to_remove = await MDStore.instance().find_deleted_objects(last_date_to_remove, limit); dbg.log2('DB_CLEANER: list objects:', objects_to_remove); - if (objects_to_remove.length) { + if (objects_to_remove.length > config.MD_STORE_MAX_DELETED_OBJECTS_LIMIT) { await P.map_with_concurrency(10, objects_to_remove, obj => db_delete_object_parts(obj)); await MDStore.instance().db_delete_objects(objects_to_remove); } - const blocks_to_remove = await MDStore.instance().find_deleted_blocks(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + return objects_to_remove; +} + +async function clean_md_store_blocks(last_date_to_remove, limit) { + const blocks_to_remove = await MDStore.instance().find_deleted_blocks(last_date_to_remove, limit); dbg.log2('DB_CLEANER: list blocks:', blocks_to_remove); if (blocks_to_remove.length) await MDStore.instance().db_delete_blocks(blocks_to_remove); - const chunks_to_remove = await MDStore.instance().find_deleted_chunks(last_date_to_remove, config.DB_CLEANER_DOCS_LIMIT); + return blocks_to_remove; +} + +async function clean_md_store_chunks(last_date_to_remove, limit) { + const chunks_to_remove = await MDStore.instance().find_deleted_chunks(last_date_to_remove, limit); const filtered_chunks = chunks_to_remove.filter(async chunk => !(await MDStore.instance().has_any_blocks_for_chunk(chunk)) && !(await MDStore.instance().has_any_parts_for_chunk(chunk))); dbg.log2('DB_CLEANER: list chunks with no blocks and no parts to be removed from DB', filtered_chunks); if (filtered_chunks.length) await MDStore.instance().db_delete_chunks(filtered_chunks); - dbg.log0(`DB_CLEANER: removed ${objects_to_remove.length + blocks_to_remove.length + filtered_chunks.length} documents from md-store`); + return filtered_chunks; } async function db_delete_object_parts(id) { @@ -145,3 +161,4 @@ async function clean_system_store(last_date_to_remove) { // EXPORTS exports.background_worker = background_worker; +exports.clean_md_store_objects = clean_md_store_objects; diff --git a/src/server/bg_services/objects_reclaimer.js b/src/server/bg_services/objects_reclaimer.js index ae1a8ac622..85388c3963 100644 --- a/src/server/bg_services/objects_reclaimer.js +++ b/src/server/bg_services/objects_reclaimer.js @@ -7,6 +7,7 @@ const MDStore = require('../object_services/md_store').MDStore; const system_store = require('../system_services/system_store').get_instance(); const system_utils = require('../utils/system_utils'); const map_deleter = require('../object_services/map_deleter'); +const {clean_md_store_objects} = require('./db_cleaner'); const P = require('../../util/promise'); class ObjectsReclaimer { @@ -42,6 +43,9 @@ class ObjectsReclaimer { if (has_errors) { return config.OBJECT_RECLAIMER_ERROR_DELAY; } + + await clean_md_store_objects(Date.now()); + return config.OBJECT_RECLAIMER_BATCH_DELAY; }