#undef dout_prefix
#define dout_prefix *_dout << "bluestore.OnodeSpace(" << this << " in " << cache << ") "
-BlueStore::OnodeRef BlueStore::OnodeSpace::add(const ghobject_t& oid,
+BlueStore::OnodeRef BlueStore::OnodeSpace::add_onode(const ghobject_t& oid,
OnodeRef& o)
{
std::lock_guard l(cache->lock);
std::lock_guard l(cache->lock);
ceph::unordered_map<ghobject_t,OnodeRef>::iterator p = onode_map.find(oid);
if (p == onode_map.end()) {
- cache->logger->inc(l_bluestore_onode_misses);
ldout(cache->cct, 30) << __func__ << " " << oid << " miss" << dendl;
+ cache->logger->inc(l_bluestore_onode_misses);
} else {
ldout(cache->cct, 30) << __func__ << " " << oid << " hit " << p->second
<< " " << p->second->nref
const bufferlist& v,
BlueStore::ExtentMap::ExtentDecoder& edecoder)
{
+ on->exists = true;
auto p = v.front().begin_deep();
on->onode.decode(p);
}
}
-BlueStore::Onode* BlueStore::Onode::decode(
+BlueStore::Onode* BlueStore::Onode::create_decode(
CollectionRef c,
const ghobject_t& oid,
const string& key,
- const bufferlist& v)
+ const bufferlist& v,
+ bool allow_empty)
{
+ ceph_assert(v.length() || allow_empty);
Onode* on = new Onode(c.get(), oid, key);
- on->exists = true;
- ExtentMap::ExtentDecoderFull edecoder(on->extent_map);
- decode_raw(on, v, edecoder);
+ if (v.length()) {
+ ExtentMap::ExtentDecoderFull edecoder(on->extent_map);
+ decode_raw(on, v, edecoder);
- for (auto& i : on->onode.attrs) {
- i.second.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
- }
+ for (auto& i : on->onode.attrs) {
+ i.second.reassign_to_mempool(mempool::mempool_bluestore_cache_meta);
+ }
- // initialize extent_map
- if (on->onode.extent_map_shards.empty()) {
- on->extent_map.inline_bl.reassign_to_mempool(
- mempool::mempool_bluestore_cache_data);
- } else {
- on->extent_map.init_shards(false, false);
+ // initialize extent_map
+ if (on->onode.extent_map_shards.empty()) {
+ on->extent_map.inline_bl.reassign_to_mempool(
+ mempool::mempool_bluestore_cache_data);
+ } else {
+ on->extent_map.init_shards(false, false);
+ }
}
return on;
}
ceph_assert(r == -ENOENT);
if (!create)
return OnodeRef();
-
- // new object, new onode
- on = new Onode(this, oid, key);
} else {
- // loaded
ceph_assert(r >= 0);
- on = Onode::decode(this, oid, key, v);
}
+
+ // new object, load onode if available
+ on = Onode::create_decode(this, oid, key, v, true);
o.reset(on);
- return onode_space.add(oid, o);
+ return onode_space.add_onode(oid, o);
}
void BlueStore::Collection::split_cache(
<< dendl;
OnodeRef o;
- o.reset(Onode::decode(c, oid, it->key(), it->value()));
+ o.reset(Onode::create_decode(c, oid, it->key(), it->value()));
o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
_dump_onode<30>(cct, *o);
dout(10) << __func__ << " " << oid << dendl;
OnodeRef o;
- o.reset(Onode::decode(c, oid, key, value));
+ o.reset(Onode::create_decode(c, oid, key, value));
++num_objects;
num_spanning_blobs += o->extent_map.spanning_blob_map.size();
<< " obj:" << oid << dendl;
OnodeRef o;
- o.reset(Onode::decode(c, oid, it->key(), it->value()));
+ o.reset(Onode::create_decode(c, oid, it->key(), it->value()));
o->extent_map.fault_range(db, 0, OBJECT_MAX_SIZE);
mempool::bluestore_fsck::set<BlobRef> blobs;
BlueStore::Onode* on,
const bufferlist& v,
ExtentMap::ExtentDecoder& dencoder);
- static Onode* decode(
+
+ static Onode* create_decode(
CollectionRef c,
const ghobject_t& oid,
const std::string& key,
- const ceph::buffer::list& v);
+ const ceph::buffer::list& v,
+ bool allow_empty = false);
void dump(ceph::Formatter* f) const;
get_blob().calc_offset(0, nullptr);
}
#endif
-
+private:
+ void _decode(const ceph::buffer::list& v);
};
typedef boost::intrusive_ptr<Onode> OnodeRef;
clear();
}
- OnodeRef add(const ghobject_t& oid, OnodeRef& o);
+ OnodeRef add_onode(const ghobject_t& oid, OnodeRef& o);
OnodeRef lookup(const ghobject_t& o);
void rename(OnodeRef& o, const ghobject_t& old_oid,
const ghobject_t& new_oid,