]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: memorize layout of BlueFS on management.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 11 Sep 2019 14:42:37 +0000 (16:42 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 3 Oct 2019 09:28:13 +0000 (11:28 +0200)
Fixes: https://tracker.ceph.com/issues/41744
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueFS.h
src/os/bluestore/BlueStore.cc

index 2841e3daa246836682ca2ee9e64a4bbaac2b1184..fd31e4c28aaf657bc14a799888ca02a550e80f80 100644 (file)
@@ -651,7 +651,7 @@ void BlueFS::umount()
   _shutdown_logger();
 }
 
-int BlueFS::prepare_new_device(int id)
+int BlueFS::prepare_new_device(int id, const bluefs_layout_t& layout)
 {
   dout(1) << __func__ << dendl;
 
@@ -662,14 +662,20 @@ int BlueFS::prepare_new_device(int id)
       new_log_dev_cur = BDEV_NEWDB;
       new_log_dev_next = BDEV_DB;
     }
-    _rewrite_log_sync(false,
+    _rewrite_log_and_layout_sync(false,
       BDEV_NEWDB,
       new_log_dev_cur,
       new_log_dev_next,
-      RENAME_DB2SLOW);
+      RENAME_DB2SLOW,
+      layout);
     //}
   } else if(id == BDEV_NEWWAL) {
-    _rewrite_log_sync(false, BDEV_DB, BDEV_NEWWAL, BDEV_WAL, REMOVE_WAL);
+    _rewrite_log_and_layout_sync(false,
+      BDEV_DB,
+      BDEV_NEWWAL,
+      BDEV_WAL,
+      REMOVE_WAL,
+      layout);
   } else {
     assert(false);
   }
@@ -1179,7 +1185,8 @@ int BlueFS::log_dump()
 int BlueFS::device_migrate_to_existing(
   CephContext *cct,
   const set<int>& devs_source,
-  int dev_target)
+  int dev_target,
+  const bluefs_layout_t& layout)
 {
   vector<byte> buf;
   bool buffered = cct->_conf->bluefs_buffered_io;
@@ -1316,19 +1323,21 @@ int BlueFS::device_migrate_to_existing(
         new_log_dev_next;
   }
 
-  _rewrite_log_sync(
+  _rewrite_log_and_layout_sync(
     false,
     (flags & REMOVE_DB) ? BDEV_SLOW : BDEV_DB,
     new_log_dev_cur,
     new_log_dev_next,
-    flags);
+    flags,
+    layout);
   return 0;
 }
 
 int BlueFS::device_migrate_to_new(
   CephContext *cct,
   const set<int>& devs_source,
-  int dev_target)
+  int dev_target,
+  const bluefs_layout_t& layout)
 {
   vector<byte> buf;
   bool buffered = cct->_conf->bluefs_buffered_io;
@@ -1452,12 +1461,13 @@ int BlueFS::device_migrate_to_new(
         BDEV_DB :
        BDEV_SLOW;
 
-  _rewrite_log_sync(
+  _rewrite_log_and_layout_sync(
     false,
     super_dev,
     new_log_dev_cur,
     new_log_dev_next,
-    flags);
+    flags,
+    layout);
   return 0;
 }
 
@@ -1836,19 +1846,21 @@ void BlueFS::_compact_log_dump_metadata(bluefs_transaction_t *t,
 void BlueFS::_compact_log_sync()
 {
   dout(10) << __func__ << dendl;
-  _rewrite_log_sync(true,
+  _rewrite_log_and_layout_sync(true,
     BDEV_DB,
     log_writer->file->fnode.prefer_bdev,
     log_writer->file->fnode.prefer_bdev,
-    0);
+    0,
+    super.memorized_layout);
   logger->inc(l_bluefs_log_compactions);
 }
 
-void BlueFS::_rewrite_log_sync(bool allocate_with_fallback,
-                              int super_dev,
-                              int log_dev,
-                              int log_dev_new,
-                              int flags)
+void BlueFS::_rewrite_log_and_layout_sync(bool allocate_with_fallback,
+                                         int super_dev,
+                                         int log_dev,
+                                         int log_dev_new,
+                                         int flags,
+                                         std::optional<bluefs_layout_t> layout)
 {
   File *log_file = log_writer->file.get();
 
@@ -1908,6 +1920,7 @@ void BlueFS::_rewrite_log_sync(bool allocate_with_fallback,
 #endif
   flush_bdev();
 
+  super.memorized_layout = layout;
   super.log_fnode = log_file->fnode;
   // rename device if needed
   if (log_dev != log_dev_new) {
index 07e3334902e280bc746c638d52d8df2ddac644d9..04824cdae9e6badc9dc567f6bd8329d1e273baab 100644 (file)
@@ -362,11 +362,12 @@ private:
   void _compact_log_sync();
   void _compact_log_async(std::unique_lock<ceph::mutex>& l);
 
-  void _rewrite_log_sync(bool allocate_with_fallback,
-                        int super_dev,
-                        int log_dev,
-                        int new_log_dev,
-                        int flags);
+  void _rewrite_log_and_layout_sync(bool allocate_with_fallback,
+                                   int super_dev,
+                                   int log_dev,
+                                   int new_log_dev,
+                                   int flags,
+                                   std::optional<bluefs_layout_t> layout);
 
   //void _aio_finish(void *priv);
 
@@ -419,7 +420,7 @@ public:
   int mount();
   int maybe_verify_layout(const bluefs_layout_t& layout) const;
   void umount();
-  int prepare_new_device(int id);
+  int prepare_new_device(int id, const bluefs_layout_t& layout);
   
   int log_dump();
 
@@ -433,11 +434,13 @@ public:
   int device_migrate_to_new(
     CephContext *cct,
     const set<int>& devs_source,
-    int dev_target);
+    int dev_target,
+    const bluefs_layout_t& layout);
   int device_migrate_to_existing(
     CephContext *cct,
     const set<int>& devs_source,
-    int dev_target);
+    int dev_target,
+    const bluefs_layout_t& layout);
 
   uint64_t get_used();
   uint64_t get_total(unsigned id);
index 1b0d59e74e560181a6833124f481adb7a2f83f8d..611dca6e634a83e0cf198a0348f8b7a26fc85106 100644 (file)
@@ -6353,6 +6353,7 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path)
     }
 
     reserved = BDEV_LABEL_BLOCK_SIZE;
+    bluefs_layout.dedicated_wal = true;
   } else if (id == BlueFS::BDEV_NEWDB) {
     string p = path + "/block.db";
     r = _setup_block_symlink_or_file("block.db", dev_path,
@@ -6373,6 +6374,8 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path)
       ceph_assert(r == 0);
     }
     reserved = SUPER_RESERVED;
+    bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW;
+    bluefs_layout.dedicated_db = true;
   }
 
   bluefs->umount();
@@ -6383,7 +6386,7 @@ int BlueStore::add_new_bluefs_device(int id, const string& dev_path)
     reserved,
     bluefs->get_block_device_size(id) - reserved);
 
-  r = bluefs->prepare_new_device(id);
+  r = bluefs->prepare_new_device(id, bluefs_layout);
   ceph_assert(r == 0);
 
   if (r < 0) {
@@ -6449,7 +6452,14 @@ int BlueStore::migrate_to_existing_bluefs_device(const set<int>& devs_source,
         << dendl;
     return -ENOSPC;
   }
-  r = bluefs->device_migrate_to_existing(cct, devs_source, id);
+  if (devs_source.count(BlueFS::BDEV_DB)) {
+    bluefs_layout.shared_bdev = BlueFS::BDEV_DB;
+    bluefs_layout.dedicated_db = false;
+  }
+  if (devs_source.count(BlueFS::BDEV_WAL)) {
+    bluefs_layout.dedicated_wal = false;
+  }
+  r = bluefs->device_migrate_to_existing(cct, devs_source, id, bluefs_layout);
   if (r < 0) {
     derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl;
     goto shutdown;
@@ -6492,9 +6502,12 @@ int BlueStore::migrate_to_new_bluefs_device(const set<int>& devs_source,
   if (devs_source.count(BlueFS::BDEV_DB) &&
       bluefs_layout.shared_bdev != BlueFS::BDEV_DB) {
     link_db = path + "/block.db";
+    bluefs_layout.shared_bdev = BlueFS::BDEV_DB;
+    bluefs_layout.dedicated_db = false;
   }
   if (devs_source.count(BlueFS::BDEV_WAL)) {
     link_wal = path + "/block.wal";
+    bluefs_layout.dedicated_wal = false;
   }
 
   size_t target_size;
@@ -6502,6 +6515,7 @@ int BlueStore::migrate_to_new_bluefs_device(const set<int>& devs_source,
   if (id == BlueFS::BDEV_NEWWAL) {
     target_name = "block.wal";
     target_size = cct->_conf->bluestore_block_wal_size;
+    bluefs_layout.dedicated_wal = true;
 
     r = bluefs->add_block_device(BlueFS::BDEV_NEWWAL, dev_path,
                                 cct->_conf->bdev_enable_discard);
@@ -6519,6 +6533,8 @@ int BlueStore::migrate_to_new_bluefs_device(const set<int>& devs_source,
   } else if (id == BlueFS::BDEV_NEWDB) {
     target_name = "block.db";
     target_size = cct->_conf->bluestore_block_db_size;
+    bluefs_layout.shared_bdev = BlueFS::BDEV_SLOW;
+    bluefs_layout.dedicated_db = true;
 
     r = bluefs->add_block_device(BlueFS::BDEV_NEWDB, dev_path,
                                 cct->_conf->bdev_enable_discard);
@@ -6541,7 +6557,7 @@ int BlueStore::migrate_to_new_bluefs_device(const set<int>& devs_source,
   bluefs->add_block_extent(
     id, reserved, bluefs->get_block_device_size(id) - reserved);
 
-  r = bluefs->device_migrate_to_new(cct, devs_source, id);
+  r = bluefs->device_migrate_to_new(cct, devs_source, id, bluefs_layout);
 
   if (r < 0) {
     derr << __func__ << " failed during BlueFS migration, " << cpp_strerror(r) << dendl;