From 33b8e8e86f6bdbee120729561c6cf433d286e2f8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 11 Oct 2017 15:53:56 -0500 Subject: [PATCH] os/bluestore: store meta values in main device label Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.cc | 30 +++++++++++++++++++++++++++++ src/os/bluestore/BlueStore.h | 4 ++++ src/os/bluestore/bluestore_types.cc | 20 ++++++++++++++----- src/os/bluestore/bluestore_types.h | 2 ++ 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 97179348b5b6e..2d50103412a07 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -3805,6 +3805,36 @@ int BlueStore::_set_cache_sizes() return 0; } +int BlueStore::write_meta(const std::string& key, const std::string& value) +{ + bluestore_bdev_label_t label; + string p = path + "/block"; + int r = _read_bdev_label(cct, p, &label); + if (r < 0) { + return ObjectStore::write_meta(key, value); + } + label.meta[key] = value; + r = _write_bdev_label(p, label); + assert(r == 0); + return ObjectStore::write_meta(key, value); +} + +int BlueStore::read_meta(const std::string& key, std::string *value) +{ + bluestore_bdev_label_t label; + string p = path + "/block"; + int r = _read_bdev_label(cct, p, &label); + if (r < 0) { + return ObjectStore::read_meta(key, value); + } + auto i = label.meta.find(key); + if (i == label.meta.end()) { + return ObjectStore::read_meta(key, value); + } + *value = i->second; + return 0; +} + void BlueStore::_init_logger() { PerfCountersBuilder b(cct, "bluestore", diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 03bf8115c4900..afbd6b0c34658 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -2152,6 +2152,10 @@ public: return 0; } + int write_meta(const std::string& key, const std::string& value) override; + int read_meta(const std::string& key, std::string *value) override; + + int fsck(bool deep) override { return _fsck(deep, false); } diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index 9fb7ce84b626f..06f64d21d4b34 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -47,22 +47,26 @@ void bluestore_bdev_label_t::encode(bufferlist& bl) const bl.append("bluestore block device\n"); bl.append(stringify(osd_uuid)); bl.append("\n"); - ENCODE_START(1, 1, bl); + ENCODE_START(2, 1, bl); ::encode(osd_uuid, bl); ::encode(size, bl); ::encode(btime, bl); ::encode(description, bl); + ::encode(meta, bl); ENCODE_FINISH(bl); } void bluestore_bdev_label_t::decode(bufferlist::iterator& p) { p.advance(60); // see above - DECODE_START(1, p); + DECODE_START(2, p); ::decode(osd_uuid, p); ::decode(size, p); ::decode(btime, p); ::decode(description, p); + if (struct_v >= 2) { + ::decode(meta, p); + } DECODE_FINISH(p); } @@ -72,6 +76,9 @@ void bluestore_bdev_label_t::dump(Formatter *f) const f->dump_unsigned("size", size); f->dump_stream("btime") << btime; f->dump_string("description", description); + for (auto& i : meta) { + f->dump_string(i.first.c_str(), i.second); + } } void bluestore_bdev_label_t::generate_test_instances( @@ -82,14 +89,17 @@ void bluestore_bdev_label_t::generate_test_instances( o.back()->size = 123; o.back()->btime = utime_t(4, 5); o.back()->description = "fakey"; + o.back()->meta["foo"] = "bar"; } ostream& operator<<(ostream& out, const bluestore_bdev_label_t& l) { return out << "bdev(osd_uuid " << l.osd_uuid - << " size 0x" << std::hex << l.size << std::dec - << " btime " << l.btime - << " desc " << l.description << ")"; + << ", size 0x" << std::hex << l.size << std::dec + << ", btime " << l.btime + << ", desc " << l.description + << ", " << l.meta.size() << " meta" + << ")"; } // cnode_t diff --git a/src/os/bluestore/bluestore_types.h b/src/os/bluestore/bluestore_types.h index 75dbdd309ef90..f5e95ad9a3eb7 100644 --- a/src/os/bluestore/bluestore_types.h +++ b/src/os/bluestore/bluestore_types.h @@ -36,6 +36,8 @@ struct bluestore_bdev_label_t { utime_t btime; ///< birth time string description; ///< device description + map meta; ///< {read,write}_meta() content from ObjectStore + void encode(bufferlist& bl) const; void decode(bufferlist::iterator& p); void dump(Formatter *f) const; -- 2.39.5