From f3be11091ad2869c6dc6e205801523d9cb31abed Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Wed, 14 Mar 2018 15:42:34 +0300 Subject: [PATCH] os/bluestore: trim SSD devices on mkfs Signed-off-by: Igor Fedotov --- src/os/bluestore/BlueFS.cc | 6 +++++- src/os/bluestore/BlueFS.h | 2 +- src/os/bluestore/BlueStore.cc | 19 ++++++++++++++----- src/os/bluestore/KernelDevice.cc | 7 ++++++- src/os/bluestore/bluestore_tool.cc | 4 ++-- src/test/objectstore/test_bluefs.cc | 24 ++++++++++++------------ 6 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 35b4be35b85..c2e96a31140 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -148,7 +148,7 @@ void BlueFS::_update_logger_stats() } } -int BlueFS::add_block_device(unsigned id, const string& path) +int BlueFS::add_block_device(unsigned id, const string& path, bool trim) { dout(10) << __func__ << " bdev " << id << " path " << path << dendl; assert(id < bdev.size()); @@ -159,6 +159,10 @@ int BlueFS::add_block_device(unsigned id, const string& path) delete b; return r; } + if (trim) { + b->discard(0, b->get_size()); + } + dout(1) << __func__ << " bdev " << id << " path " << path << " size " << pretty_si_t(b->get_size()) << "B" << dendl; bdev[id] = b; diff --git a/src/os/bluestore/BlueFS.h b/src/os/bluestore/BlueFS.h index a176a5bb689..98714a8b8e1 100644 --- a/src/os/bluestore/BlueFS.h +++ b/src/os/bluestore/BlueFS.h @@ -396,7 +396,7 @@ public: /// sync any uncommitted state to disk void sync_metadata(); - int add_block_device(unsigned bdev, const string& path); + int add_block_device(unsigned bdev, const string& path, bool trim); bool bdev_support_label(unsigned id); uint64_t get_block_device_size(unsigned bdev); diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 71ad7267e64..7fdc2483a86 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4315,11 +4315,17 @@ int BlueStore::_open_bdev(bool create) { assert(bdev == NULL); string p = path + "/block"; + uint64_t dev_size; bdev = BlockDevice::create(cct, p, aio_cb, static_cast(this), discard_cb, static_cast(this)); int r = bdev->open(p); if (r < 0) goto fail; + dev_size = bdev->get_size(); + if (create && cct->_conf->bdev_enable_discard) { + bdev->discard(0, dev_size); + } + if (bdev->supported_bdev_label()) { r = _check_or_set_bdev_label(p, bdev->get_size(), "main", create); if (r < 0) @@ -4336,8 +4342,8 @@ int BlueStore::_open_bdev(bool create) if (r < 0) { goto fail_close; } - if (bdev->get_size() < cct->_conf->bluestore_bluefs_min) { - dout(1) << __func__ << " main device size " << si_t(bdev->get_size()) + if (dev_size < cct->_conf->bluestore_bluefs_min) { + dout(1) << __func__ << " main device size " << si_t(dev_size) << " is too small, disable bluestore_bluefs_min for now" << dendl; int r = cct->_conf->set_val("bluestore_bluefs_min", "0"); @@ -4721,7 +4727,8 @@ int BlueStore::_open_db(bool create, bool to_repair_db) bfn = path + "/block.db"; } if (::stat(bfn.c_str(), &st) == 0) { - r = bluefs->add_block_device(BlueFS::BDEV_DB, bfn); + r = bluefs->add_block_device(BlueFS::BDEV_DB, bfn, + create && cct->_conf->bdev_enable_discard); if (r < 0) { derr << __func__ << " add block device(" << bfn << ") returned: " << cpp_strerror(r) << dendl; @@ -4761,7 +4768,8 @@ int BlueStore::_open_db(bool create, bool to_repair_db) if (read_meta("path_block", &bfn) < 0) { bfn = path + "/block"; } - r = bluefs->add_block_device(bluefs_shared_bdev, bfn); + // never trim here + r = bluefs->add_block_device(bluefs_shared_bdev, bfn, false); if (r < 0) { derr << __func__ << " add block device(" << bfn << ") returned: " << cpp_strerror(r) << dendl; @@ -4793,7 +4801,8 @@ int BlueStore::_open_db(bool create, bool to_repair_db) bfn = path + "/block.wal"; } if (::stat(bfn.c_str(), &st) == 0) { - r = bluefs->add_block_device(BlueFS::BDEV_WAL, bfn); + r = bluefs->add_block_device(BlueFS::BDEV_WAL, bfn, + create && cct->_conf->bdev_enable_discard); if (r < 0) { derr << __func__ << " add block device(" << bfn << ") returned: " << cpp_strerror(r) << dendl; diff --git a/src/os/bluestore/KernelDevice.cc b/src/os/bluestore/KernelDevice.cc index 30cea5c6f06..4f5bf148197 100644 --- a/src/os/bluestore/KernelDevice.cc +++ b/src/os/bluestore/KernelDevice.cc @@ -751,8 +751,13 @@ int KernelDevice::aio_write( int KernelDevice::discard(uint64_t offset, uint64_t len) { int r = 0; - if (!rotational) + if (!rotational) { + dout(10) << __func__ + << " 0x" << std::hex << offset << "~" << len << std::dec + << dendl; + r = block_device_discard(fd_direct, (int64_t)offset, (int64_t)len); + } return r; } diff --git a/src/os/bluestore/bluestore_tool.cc b/src/os/bluestore/bluestore_tool.cc index f5c02bc1c6e..4b4994cc308 100644 --- a/src/os/bluestore/bluestore_tool.cc +++ b/src/os/bluestore/bluestore_tool.cc @@ -91,7 +91,7 @@ void add_devices( if (id >= 0) { got.insert(id); cout << " slot " << id << " " << i << std::endl; - int r = fs->add_block_device(id, i); + int r = fs->add_block_device(id, i, false); if (r < 0) { cerr << "unable to open " << i << ": " << cpp_strerror(r) << std::endl; exit(EXIT_FAILURE); @@ -103,7 +103,7 @@ void add_devices( if (got.count(BlueFS::BDEV_DB)) id = BlueFS::BDEV_SLOW; cout << " slot " << id << " " << main << std::endl; - int r = fs->add_block_device(id, main); + int r = fs->add_block_device(id, main, false); if (r < 0) { cerr << "unable to open " << main << ": " << cpp_strerror(r) << std::endl; diff --git a/src/test/objectstore/test_bluefs.cc b/src/test/objectstore/test_bluefs.cc index 0b2f2df7019..6a9c22dcad3 100644 --- a/src/test/objectstore/test_bluefs.cc +++ b/src/test/objectstore/test_bluefs.cc @@ -49,7 +49,7 @@ TEST(BlueFS, mkfs) { string fn = get_temp_bdev(size); uuid_d fsid; BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); ASSERT_EQ(0, fs.mkfs(fsid)); rm_temp_bdev(fn); @@ -59,7 +59,7 @@ TEST(BlueFS, mkfs_mount) { uint64_t size = 1048576 * 128; string fn = get_temp_bdev(size); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -74,7 +74,7 @@ TEST(BlueFS, write_read) { uint64_t size = 1048576 * 128; string fn = get_temp_bdev(size); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -106,7 +106,7 @@ TEST(BlueFS, small_appends) { uint64_t size = 1048576 * 128; string fn = get_temp_bdev(size); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -255,7 +255,7 @@ TEST(BlueFS, test_flush_1) { g_ceph_context->_conf->apply_changes(NULL); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -290,7 +290,7 @@ TEST(BlueFS, test_flush_2) { g_ceph_context->_conf->apply_changes(NULL); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -318,7 +318,7 @@ TEST(BlueFS, test_flush_3) { g_ceph_context->_conf->apply_changes(NULL); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -352,7 +352,7 @@ TEST(BlueFS, test_simple_compaction_sync) { string fn = get_temp_bdev(size); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -405,7 +405,7 @@ TEST(BlueFS, test_simple_compaction_async) { string fn = get_temp_bdev(size); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -461,7 +461,7 @@ TEST(BlueFS, test_compaction_sync) { "true"); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -499,7 +499,7 @@ TEST(BlueFS, test_compaction_async) { "false"); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); @@ -537,7 +537,7 @@ TEST(BlueFS, test_replay) { "false"); BlueFS fs(g_ceph_context); - ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn)); + ASSERT_EQ(0, fs.add_block_device(BlueFS::BDEV_DB, fn, false)); fs.add_block_extent(BlueFS::BDEV_DB, 1048576, size - 1048576); uuid_d fsid; ASSERT_EQ(0, fs.mkfs(fsid)); -- 2.47.3