]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
seastore: add blocks_per_segment to use paddr_t in RBM
authormyoungwon oh <myoungwon.oh@samsung.com>
Tue, 5 Oct 2021 01:37:59 +0000 (10:37 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Fri, 22 Oct 2021 05:36:48 +0000 (14:36 +0900)
Seastore exploits paddr_t to represent its address.
However. the term of "segment" in paddr_t generally be used in LFS,
not random block design---"block" is more general term of RBM.

The problem is that seasore already has been tighly coupled with padd_t,
also it does not make sense that there are two differnt address
such as paddr_t and block_paddr_t.

Therefore, to solve this problem, this commit adds blocks_per_segment, which
describes how many blocks a single segment contains to make RBM be compotible
with paddr_t

Signed-off-by: Myoungwon Oh <myoungwon.oh@samsung.com>
src/crimson/os/seastore/random_block_manager.h
src/crimson/os/seastore/random_block_manager/nvme_manager.cc
src/crimson/os/seastore/random_block_manager/nvme_manager.h
src/crimson/os/seastore/seastore_types.cc
src/crimson/os/seastore/seastore_types.h

index a25ec5ba99c252529dfed7ae68c263f8364db7dc..d184bb205f8c1338a0ca6963c82d5c2335089e64 100644 (file)
@@ -32,6 +32,7 @@ public:
     blk_paddr_t end;
     size_t block_size = 0;
     size_t total_size = 0;
+    uint32_t blocks_per_segment = 1 << 18;
     seastore_meta_t meta;
   };
   using mkfs_ertr = crimson::errorator<
@@ -98,6 +99,7 @@ public:
   virtual size_t get_size() const = 0;
   virtual size_t get_block_size() const = 0;
   virtual uint64_t get_free_blocks() const = 0;
+  virtual uint32_t get_blocks_per_segment() const = 0;
   virtual ~RandomBlockManager() {}
 };
 using RandomBlockManagerRef = std::unique_ptr<RandomBlockManager>;
index b0fe1bc709c9196511a5513123ea9b6b54cdc17f..07ccbbce7c4c83b41224c12fd4e72edd628185d6 100644 (file)
@@ -137,6 +137,7 @@ NVMeManager::mkfs_ertr::future<> NVMeManager::mkfs(mkfs_config_t config)
          super.start_alloc_area + super.alloc_area_size;
        super.crc = 0;
        super.feature |= RBM_BITMAP_BLOCK_CRC;
+       super.blocks_per_segment = config.blocks_per_segment;
 
        logger().debug(" super {} ", super);
        // write super block
index ca45eedd49c862e76813cf0e40cfaacae4268bc0..5ae66030d90347ede507928da8e790b64e5951b2 100644 (file)
@@ -54,6 +54,7 @@ struct rbm_metadata_header_t {
   uint32_t start_data_area;
   uint64_t flag; // reserved
   uint64_t feature;
+  uint32_t blocks_per_segment; // the number of blocks in segment
   checksum_t crc;
 
   DENC(rbm_metadata_header_t, v, p) {
@@ -70,6 +71,7 @@ struct rbm_metadata_header_t {
     denc(v.start_data_area, p);
     denc(v.flag, p);
     denc(v.feature, p);
+    denc(v.blocks_per_segment, p);
 
     denc(v.crc, p);
     DENC_FINISH(p);
@@ -360,6 +362,10 @@ public:
   free_block_ertr::future<> add_free_extent(
       std::vector<rbm_alloc_delta_t>& v, blk_paddr_t from, size_t len);
 
+  uint32_t get_blocks_per_segment() const final {
+    return super.blocks_per_segment;
+  }
+
 private:
   /*
    * this contains the number of bitmap blocks, free blocks and
index e6dbbcb979d753fe048390e100b7acec6a6ed2a8..63fa9759f3e9d18941d2f56dbd956c9e8a6faf36 100644 (file)
@@ -236,5 +236,23 @@ std::string device_type_to_string(device_type_t dtype) {
     ceph_assert(0 == "impossible");
   }
 }
+paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size,
+    uint32_t blocks_per_segment, device_id_t d_id)
+{
+  paddr_t paddr;
+  paddr.segment = segment_id_t {
+    d_id,
+    (uint32_t)(addr / (block_size * blocks_per_segment))
+  };
+  paddr.offset = addr % (block_size * blocks_per_segment);
+  return paddr;
+}
+
+blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size,
+    uint32_t blocks_per_segment)
+{
+  return (blk_paddr_t)(addr.segment.device_segment_id() *
+         (block_size * blocks_per_segment) + addr.offset);
+}
 
 }
index 1efe7912e9fe51fa4f29059bf2b1b11b573ff763..b7b521eb9b8b2dce13ad293a6c273b5f74af5a19 100644 (file)
@@ -1077,6 +1077,11 @@ struct rbm_alloc_delta_t {
   op_types_t op;
 };
 
+paddr_t convert_blk_paddr_to_paddr(blk_paddr_t addr, size_t block_size,
+    uint32_t blocks_per_segment, device_id_t d_id);
+blk_paddr_t convert_paddr_to_blk_paddr(paddr_t addr, size_t block_size,
+       uint32_t blocks_per_segment);
+
 struct extent_info_t {
   extent_types_t type = extent_types_t::NONE;
   laddr_t addr = L_ADDR_NULL;