]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: non-atomic min_alloc_size_order
authorxie xingguo <xie.xingguo@zte.com.cn>
Thu, 22 Jun 2017 02:30:55 +0000 (10:30 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Thu, 22 Jun 2017 06:37:30 +0000 (14:37 +0800)
This is not necessary because we now write min_alloc_size into disk
during mkfs.

There are two acaccompanying changes too:
(1) don't call _set_alloc_sizes() during mkfs() any more, which is
not necessary.
(2) don't update min_alloc_size during _set_alloc_sizes(), we instead
update min_alloc_size_order each time we successfully read min_alloc_size
from disk.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 81b64ea6f579a8baba8b150879ea39f1cc10e493..ad58ef7a668bce6012875117a7b07c6253556975 100644 (file)
@@ -3981,9 +3981,6 @@ int BlueStore::_check_or_set_bdev_label(
 
 void BlueStore::_set_alloc_sizes(void)
 {
-  min_alloc_size_order = ctz(min_alloc_size);
-  assert(min_alloc_size == 1u << min_alloc_size_order);
-
   max_alloc_size = cct->_conf->bluestore_max_alloc_size;
 
   if (cct->_conf->bluestore_prefer_deferred_size) {
@@ -5076,7 +5073,6 @@ int BlueStore::mkfs()
        min_alloc_size = cct->_conf->bluestore_min_alloc_size_ssd;
       }
     }
-    _set_alloc_sizes();
     {
       bufferlist bl;
       ::encode((uint64_t)min_alloc_size, bl);
@@ -7438,6 +7434,8 @@ int BlueStore::_open_super_meta()
       uint64_t val;
       ::decode(val, p);
       min_alloc_size = val;
+      min_alloc_size_order = ctz(val);
+      assert(min_alloc_size == 1u << min_alloc_size_order);
     } catch (buffer::error& e) {
       derr << __func__ << " unable to read min_alloc_size" << dendl;
       return -EIO;
@@ -10020,12 +10018,11 @@ void BlueStore::_choose_write_options(
 
     dout(20) << __func__ << " will prefer large blob and csum sizes" << dendl;
 
-    auto order = min_alloc_size_order.load();
     if (o->onode.expected_write_size) {
-      wctx->csum_order = std::max(order,
+      wctx->csum_order = std::max(min_alloc_size_order,
                                  (uint8_t)ctz(o->onode.expected_write_size));
     } else {
-      wctx->csum_order = order;
+      wctx->csum_order = min_alloc_size_order;
     }
 
     if (wctx->compress) {
index 7a567c4f1b490b880f986461e04d62c155e59506..6eb13b1f3a588ee79236cd6578fcd6f07c2b22a8 100644 (file)
@@ -1875,24 +1875,26 @@ private:
   size_t block_size_order = 0; ///< bits to shift to get block size
 
   uint64_t min_alloc_size = 0; ///< minimum allocation unit (power of 2)
-  std::atomic<int> deferred_batch_ops = {0}; ///< deferred batch size
-
   ///< bits for min_alloc_size
-  std::atomic<uint8_t> min_alloc_size_order = {0};
+  uint8_t min_alloc_size_order = 0;
   static_assert(std::numeric_limits<uint8_t>::max() >
                std::numeric_limits<decltype(min_alloc_size)>::digits,
                "not enough bits for min_alloc_size");
 
-  ///< size threshold for forced deferred writes
-  std::atomic<uint64_t> prefer_deferred_size = {0};
-
   ///< maximum allocation unit (power of 2)
   std::atomic<uint64_t> max_alloc_size = {0};
 
+  ///< number threshold for forced deferred writes
+  std::atomic<int> deferred_batch_ops = {0};
+
+  ///< size threshold for forced deferred writes
+  std::atomic<uint64_t> prefer_deferred_size = {0};
+
   ///< approx cost per io, in bytes
   std::atomic<uint64_t> throttle_cost_per_io = {0};
 
-  std::atomic<Compressor::CompressionMode> comp_mode = {Compressor::COMP_NONE}; ///< compression mode
+  std::atomic<Compressor::CompressionMode> comp_mode =
+    {Compressor::COMP_NONE}; ///< compression mode
   CompressorRef compressor;
   std::atomic<uint64_t> comp_min_blob_size = {0};
   std::atomic<uint64_t> comp_max_blob_size = {0};