return GenericObjectMapIterator(new GenericObjectMapIteratorImpl(this, header, prefix));
}
+ Header generate_new_header(const coll_t &cid, const ghobject_t &oid,
+ Header parent, KeyValueDB::Transaction t) {
+ Mutex::Locker l(header_lock);
+ return _generate_new_header(cid, oid, parent, t);
+ }
+
// Scan keys in header into out_keys and out_values (if nonnull)
int scan(Header header, const string &prefix, const set<string> &in_keys,
set<string> *out_keys, map<string, bufferlist> *out_values);
*/
Header _generate_new_header(const coll_t &cid, const ghobject_t &oid,
Header parent, KeyValueDB::Transaction t);
- Header generate_new_header(const coll_t &cid, const ghobject_t &oid,
- Header parent, KeyValueDB::Transaction t) {
- Mutex::Locker l(header_lock);
- return _generate_new_header(cid, oid, parent, t);
- }
// Lookup leaf header for c oid
Header _lookup_header(const coll_t &cid, const ghobject_t &oid);
StripObjectHeader &strip_header,
KeyValueDB::Transaction t)
{
- Header header = lookup_create_header(cid, oid, t);
+ Header header = generate_new_header(cid, oid, Header(), t);
if (!header)
return -EINVAL;
StripHeaderMap::iterator it = strip_headers.find(make_pair(cid, oid));
if (it != strip_headers.end()) {
- if (it->second.deleted)
+
+ if (!it->second.deleted) {
+ if (strip_header)
+ *strip_header = &it->second;
+ return 0;
+ } else if (!create_if_missing) {
return -ENOENT;
+ }
- if (strip_header)
- *strip_header = &it->second;
- return 0;
+ // If (it->second.deleted && create_if_missing) go down
+ r = -ENOENT;
+ } else {
+ r = store->backend->lookup_strip_header(cid, oid, header);
}
- r = store->backend->lookup_strip_header(cid, oid, header);
- if (r < 0 && create_if_missing) {
+ if (r == -ENOENT && create_if_missing) {
r = store->backend->create_strip_header(cid, oid, header, t);
}
continue;
r = store->backend->save_strip_header(header, t);
+
if (r < 0) {
dout(10) << __func__ << " save strip header failed " << dendl;
goto out;
return r;
}
+ header->max_size = 0;
+ header->bits.clear();
r = t.clear_buffer(*header);
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;