// blobs
errors += _fsck_verify_blob_map(
"object " + stringify(oid),
- o->onode.blob_map,
+ o->blob_map,
local_blobs,
used_blocks,
expected_statfs);
++p) {
bufferlist bl;
::encode((*p)->onode, bl);
+ ::encode((*p)->blob_map, bl);
dout(20) << " onode " << (*p)->oid << " is " << bl.length() << dendl;
t->set(PREFIX_OBJ, (*p)->key, bl);
assert(p.first >= pos);
pos = p.first + p.second.length;
}
- for (auto& b : o->onode.blob_map) {
- dout(log_level) << __func__ << " " << b.first << ": " << b.second
- << dendl;
- if (b.second.has_csum_data()) {
- vector<uint64_t> v;
- unsigned n = b.second.get_csum_count();
- for (unsigned i = 0; i < n; ++i)
- v.push_back(b.second.get_csum_item(i));
- dout(log_level) << __func__ << " csum: " << std::hex << v << std::dec
- << dendl;
- }
- }
pos = 0;
for (auto& v : o->onode.overlay_map) {
dout(log_level) << __func__ << " overlay 0x" << std::hex << v.first
<< dendl;
}
}
+ for (auto& b : o->blob_map) {
+ dout(log_level) << __func__ << " " << b.first << ": " << b.second
+ << dendl;
+ if (b.second.has_csum_data()) {
+ vector<uint64_t> v;
+ unsigned n = b.second.get_csum_count();
+ for (unsigned i = 0; i < n; ++i)
+ v.push_back(b.second.get_csum_item(i));
+ dout(log_level) << __func__ << " csum: " << std::hex << v << std::dec
+ << dendl;
+ }
+ }
if (o->bnode) {
_dump_bnode(o->bnode, log_level);
}
// new blob.
int64_t blob;
- b = o->onode.add_blob(&blob);
+ b = o->add_blob(&blob);
b->length = min_alloc_size;
uint64_t b_off = offset % min_alloc_size;
uint64_t b_len = length;
<< std::dec << dendl;
while (length > 0) {
int64_t blob;
- bluestore_blob_t *b = o->onode.add_blob(&blob);
+ bluestore_blob_t *b = o->add_blob(&blob);
auto l = b->length = MIN(max_blob_len, length);
bufferlist t;
blp.copy(l, t);
}
dout(20) << __func__ << " rm blob " << *b << dendl;
if (l.blob >= 0) {
- o->onode.blob_map.erase(l.blob);
+ o->blob_map.erase(l.blob);
} else {
o->bnode->blob_map.erase(-l.blob);
}
dout(30) << __func__ << " moving old onode blob " << p.second.blob
<< " to bnode blob " << id << dendl;
bluestore_blob_t& b = e->blob_map[id] =
- oldo->onode.blob_map[p.second.blob];
+ oldo->blob_map[p.second.blob];
b.clear_flag(bluestore_blob_t::FLAG_MUTABLE);
- oldo->onode.blob_map.erase(p.second.blob);
+ oldo->blob_map.erase(p.second.blob);
}
}
// update lextents
bluestore_onode_t onode; ///< metadata stored as value in kv store
bool exists;
+ bluestore_blob_map_t blob_map; ///< local blobs (this onode onode)
+
std::mutex flush_lock; ///< protect flush_txns
std::condition_variable flush_cond; ///< wait here for unapplied txns
set<TransContext*> flush_txns; ///< committing or wal txns
bc(c) {
}
+ bluestore_blob_t *add_blob(int64_t *id) {
+ *id = blob_map.empty() ? 1 : blob_map.rbegin()->first + 1;
+ return &blob_map[*id];
+ }
+
bluestore_blob_t *get_blob_ptr(int64_t id) {
if (id < 0) {
assert(bnode);
return bnode->get_blob_ptr(-id);
- } else {
- return onode.get_blob_ptr(id);
}
+ bluestore_blob_map_t::iterator p = blob_map.find(id);
+ if (p == blob_map.end())
+ return nullptr;
+ return &p->second;
}
void flush();
::encode(nid, bl);
::encode(size, bl);
::encode(attrs, bl);
- ::encode(blob_map, bl);
::encode(extent_map, bl);
::encode(overlay_map, bl);
::encode(overlay_refs, bl);
::decode(nid, p);
::decode(size, p);
::decode(attrs, p);
- ::decode(blob_map, p);
::decode(extent_map, p);
::decode(overlay_map, p);
::decode(overlay_refs, p);
f->close_section();
}
f->close_section();
- f->open_object_section("blob_map");
- for (const auto& p : blob_map) {
- f->open_object_section("blob");
- f->dump_unsigned("id", p.first);
- p.second.dump(f);
- f->close_section();
- }
- f->close_section();
f->open_object_section("extent_map");
for (const auto& p : extent_map) {
f->open_object_section("extent");
map<uint64_t,bluestore_lextent_t> extent_map; ///< extent refs
map<uint64_t,bluestore_overlay_t> overlay_map; ///< overlay data (stored in db)
map<uint64_t,uint16_t> overlay_refs; ///< overlay keys ref counts (if >1)
- bluestore_blob_map_t blob_map; ///< local blobs (this onode onode)
uint32_t last_overlay_key; ///< key for next overlay
uint64_t omap_head; ///< id for omap root node
/// consolidate adjacent lextents in extent_map
int compress_extent_map();
- bluestore_blob_t *add_blob(int64_t *id) {
- *id = blob_map.empty() ? 1 : blob_map.rbegin()->first + 1;
- return &blob_map[*id];
- }
-
- bluestore_blob_t *get_blob_ptr(int64_t id) {
- bluestore_blob_map_t::iterator p = blob_map.find(id);
- if (p == blob_map.end())
- return nullptr;
- return &p->second;
- }
-
/// punch a logical hole. add lextents to deref to target list.
void punch_hole(uint64_t offset, uint64_t length,
vector<bluestore_lextent_t> *deref);