From c0106fc0b3f3f9d8703c1fe126619084608ba6c4 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Sat, 23 May 2020 17:24:28 +0800 Subject: [PATCH] [thin_metadata_pack] Improve block scanning performance --- thin-provisioning/thin_metadata_pack.cc | 36 ++++++++++++++----------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/thin-provisioning/thin_metadata_pack.cc b/thin-provisioning/thin_metadata_pack.cc index 0f37ebd..8f2ce0b 100644 --- a/thin-provisioning/thin_metadata_pack.cc +++ b/thin-provisioning/thin_metadata_pack.cc @@ -26,7 +26,7 @@ #include "persistent-data/file_utils.h" #include "persistent-data/space-maps/disk.h" -#include "persistent-data/validators.h" +#include "persistent-data/checksum.h" #include "thin-provisioning/commands.h" #include "thin-provisioning/superblock.h" #include "version.h" @@ -42,6 +42,11 @@ namespace { using namespace std; constexpr uint64_t MAGIC = 0xa537a0aa6309ef77; + uint32_t const SUPERBLOCK_CSUM_SEED = 160774; + uint32_t const BITMAP_CSUM_XOR = 240779; + uint32_t const INDEX_CSUM_XOR = 160478; + uint32_t const BTREE_CSUM_XOR = 121107; + // Pack file format // ---------------- // @@ -56,25 +61,24 @@ namespace { class is_metadata_functor { public: - is_metadata_functor() - : superblock_v_(superblock_validator()), - btree_node_v_(create_btree_node_validator()), - bitmap_v_(bitmap_validator()), - index_v_(index_validator()) { + is_metadata_functor() { } bool operator() (void const *raw) const { - return superblock_v_->check_raw(raw) || - btree_node_v_->check_raw(raw) || - bitmap_v_->check_raw(raw) || - index_v_->check_raw(raw); - } + uint32_t const *cksum = reinterpret_cast(raw); + base::crc32c sum(*cksum); + sum.append(cksum + 1, MD_BLOCK_SIZE - sizeof(uint32_t)); - private: - bcache::validator::ptr superblock_v_; - bcache::validator::ptr btree_node_v_; - bcache::validator::ptr bitmap_v_; - bcache::validator::ptr index_v_; + switch (sum.get_sum()) { + case SUPERBLOCK_CSUM_SEED: + case INDEX_CSUM_XOR: + case BITMAP_CSUM_XOR: + case BTREE_CSUM_XOR: + return true; + default: + return false; + } + } }; void prealloc_file(string const &file, off_t len) {