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",
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);
}
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);
}
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(
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
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;