From 4095bcc558ba04baa532e5bbcbd6f38d4cc18356 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Thu, 25 Mar 2021 02:29:04 +0300 Subject: [PATCH] Do not ignore object deletion journal entries when they are preceded by a big write --- src/blockstore_init.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/blockstore_init.cpp b/src/blockstore_init.cpp index 6f30435d..ca3906f4 100644 --- a/src/blockstore_init.cpp +++ b/src/blockstore_init.cpp @@ -676,9 +676,16 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u #ifdef BLOCKSTORE_DEBUG printf("je_delete oid=%lx:%lx ver=%lu\n", je->del.oid.inode, je->del.oid.stripe, je->del.version); #endif + auto dirty_it = bs->dirty_db.upper_bound((obj_ver_id){ + .oid = je->del.oid, + .version = UINT64_MAX, + }); auto clean_it = bs->clean_db.find(je->del.oid); - if (clean_it == bs->clean_db.end() || - clean_it->second.version < je->del.version) + // Ignore delete if neither preceding dirty entries nor the clean one are present + if ((clean_it != bs->clean_db.end() && + clean_it->second.version < je->del.version) || + (dirty_it != bs->dirty_db.begin() && + std::prev(dirty_it)->first.oid == je->del.oid)) { // oid, version obj_ver_id ov = {