From 0b5cea3bd8310351e5b9154295ec06a8aa72372a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 4 Jan 2019 11:33:27 -0600 Subject: [PATCH] os/bluestore: allow get_devices() to run without bluestore started Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 67 ++++++++++++++++++++++++++++++----- src/os/bluestore/BlueStore.h | 9 +++++ 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 220d1c07f95..cdb922d16c6 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -4907,7 +4907,7 @@ bool BlueStore::test_mount_in_use() return ret; } -int BlueStore::_open_bluefs(bool create) +int BlueStore::_minimal_open_bluefs(bool create) { int r; bluefs = new BlueFS(cct); @@ -5030,30 +5030,43 @@ int BlueStore::_open_bluefs(bool create) goto free_bluefs; } } + return 0; +free_bluefs: + ceph_assert(bluefs); + delete bluefs; + bluefs = NULL; + return r; +} + +int BlueStore::_open_bluefs(bool create) +{ + int r = _minimal_open_bluefs(create); + if (r < 0) { + return r; + } if (create) { bluefs->mkfs(fsid); } r = bluefs->mount(); if (r < 0) { derr << __func__ << " failed bluefs mount: " << cpp_strerror(r) << dendl; - goto free_bluefs; } - - return 0; -free_bluefs: - ceph_assert(bluefs); - delete bluefs; - bluefs = NULL; return r; } void BlueStore::_close_bluefs() { bluefs->umount(); + _minimal_close_bluefs(); +} + +void BlueStore::_minimal_close_bluefs() +{ delete bluefs; bluefs = NULL; } + int BlueStore::_open_db(bool create, bool to_repair_db) { int r; @@ -7763,11 +7776,47 @@ void BlueStore::collect_metadata(map *pm) int BlueStore::get_devices(set *ls) { + if (bdev) { + bdev->get_devices(ls); + if (bluefs) { + bluefs->get_devices(ls); + } + return 0; + } + + // grumble, we haven't started up yet. + int r = _open_path(); + if (r < 0) + goto out; + r = _open_fsid(false); + if (r < 0) + goto out_path; + r = _read_fsid(&fsid); + if (r < 0) + goto out_fsid; + r = _lock_fsid(); + if (r < 0) + goto out_fsid; + r = _open_bdev(false); + if (r < 0) + goto out_fsid; + r = _minimal_open_bluefs(false); + if (r < 0) + goto out_bdev; bdev->get_devices(ls); if (bluefs) { bluefs->get_devices(ls); } - return 0; + r = 0; + _minimal_close_bluefs(); + out_bdev: + _close_bdev(); + out_fsid: + _close_fsid(); + out_path: + _close_path(); + out: + return r; } void BlueStore::_get_statfs_overall(struct store_statfs_t *buf) diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index a263257785d..42f5cbb051f 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2165,6 +2165,8 @@ private: void _validate_bdev(); void _close_bdev(); + int _minimal_open_bluefs(bool create); + void _minimal_close_bluefs(); int _open_bluefs(bool create); void _close_bluefs(); @@ -2358,6 +2360,13 @@ public: return device_class; } + int get_numa_node( + int *numa_node, + size_t *cpu_set_size, + cpu_set_t *cpu_set, + set *nodes, + set *failed) override; + static int get_block_device_fsid(CephContext* cct, const string& path, uuid_d *fsid); -- 2.39.5