]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: store meta values in main device label
authorSage Weil <sage@redhat.com>
Wed, 11 Oct 2017 20:53:56 +0000 (15:53 -0500)
committerSage Weil <sage@redhat.com>
Mon, 16 Oct 2017 15:56:24 +0000 (10:56 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h
src/os/bluestore/bluestore_types.cc
src/os/bluestore/bluestore_types.h

index 97179348b5b6e02e8a4565f18b61622b54ed4f05..2d50103412a07b1d547309d11556fa46afbce5fe 100644 (file)
@@ -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",
index 03bf8115c490024f8e4cceb69ff6db1a081e0a91..afbd6b0c34658cf5dd1b8b20424cc81c9906eb5d 100644 (file)
@@ -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);
   }
index 9fb7ce84b626f00bcc28fc5e9074600eddebf8f2..06f64d21d4b34b318525f464af2fa29ddec1ef48 100644 (file)
@@ -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
index 75dbdd309ef90a22c3a2d85b445279f631651eba..f5e95ad9a3eb7c4b27f3a06ca8b3b954142a21c5 100644 (file)
@@ -36,6 +36,8 @@ struct bluestore_bdev_label_t {
   utime_t btime;       ///< birth time
   string description;  ///< device description
 
+  map<string,string> meta; ///< {read,write}_meta() content from ObjectStore
+
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& p);
   void dump(Formatter *f) const;