// ============== StripObjectMap Implementation =================
-int StripObjectMap::save_strip_header(StripObjectHeader &strip_header,
+int StripObjectMap::save_strip_header(StripObjectHeaderRef strip_header,
KeyValueDB::Transaction t)
{
- strip_header.header->data.clear();
- ::encode(strip_header, strip_header.header->data);
+ strip_header->header->data.clear();
+ ::encode(*strip_header, strip_header->header->data);
- set_header(strip_header.cid, strip_header.oid, *(strip_header.header), t);
+ set_header(strip_header->cid, strip_header->oid, *(strip_header->header), t);
return 0;
}
int StripObjectMap::create_strip_header(const coll_t &cid,
const ghobject_t &oid,
- StripObjectHeader &strip_header,
+ StripObjectHeaderRef *strip_header,
KeyValueDB::Transaction t)
{
Header header = generate_new_header(cid, oid, Header(), t);
if (!header)
return -EINVAL;
- strip_header.oid = oid;
- strip_header.cid = cid;
- strip_header.header = header;
+ _StripObjectHeader *tmp = new _StripObjectHeader();
+ tmp->oid = oid;
+ tmp->cid = cid;
+ tmp->header = header;
+ {
+ Mutex::Locker l(lock);
+ *strip_header = caches.add(oid, tmp);
+ }
return 0;
}
int StripObjectMap::lookup_strip_header(const coll_t &cid,
const ghobject_t &oid,
- StripObjectHeader &strip_header)
+ StripObjectHeaderRef *strip_header)
{
+ if (cid != coll_t()) {
+ Mutex::Locker l(lock);
+ *strip_header = caches.lookup(oid);
+ if (*strip_header) {
+ return 0;
+ }
+ }
Header header = lookup_header(cid, oid);
if (!header) {
return -ENOENT;
}
+
+ _StripObjectHeader *tmp = new _StripObjectHeader();
if (header->data.length()) {
bufferlist::iterator bliter = header->data.begin();
- ::decode(strip_header, bliter);
+ ::decode(*tmp, bliter);
}
- if (strip_header.strip_size == 0)
- strip_header.strip_size = default_strip_size;
+ if (tmp->strip_size == 0)
+ tmp->strip_size = default_strip_size;
- strip_header.oid = oid;
- strip_header.cid = cid;
- strip_header.header = header;
+ tmp->oid = oid;
+ tmp->cid = cid;
+ tmp->header = header;
+ {
+ Mutex::Locker l(lock);
+ *strip_header = caches.add(oid, tmp);
+ }
dout(10) << "lookup_strip_header done " << " cid " << cid << " oid "
<< oid << dendl;
return 0;
return 0;
}
-void StripObjectMap::clone_wrap(StripObjectHeader &old_header,
+void StripObjectMap::clone_wrap(StripObjectHeaderRef old_header,
const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- StripObjectHeader *origin_header,
- StripObjectHeader *target_header)
+ StripObjectHeaderRef *target_header)
{
Header new_origin_header;
+ StripObjectHeaderRef tmp = StripObjectHeaderRef(new _StripObjectHeader());
- if (target_header)
- *target_header = old_header;
- if (origin_header)
- *origin_header = old_header;
-
- clone(old_header.header, cid, oid, t, &new_origin_header,
- &target_header->header);
+ clone(old_header->header, cid, oid, t, &new_origin_header,
+ &tmp->header);
- if(origin_header)
- origin_header->header = new_origin_header;
+ tmp->oid = oid;
+ tmp->cid = cid;
+ old_header->header = new_origin_header;
- if (target_header) {
- target_header->oid = oid;
- target_header->cid = cid;
- }
+ if (target_header)
+ *target_header = tmp;
}
void StripObjectMap::rename_wrap(const coll_t &cid, const ghobject_t &oid,
KeyValueDB::Transaction t,
- StripObjectHeader *header)
+ StripObjectHeaderRef header)
{
assert(header);
assert(header->header);
header->cid = cid;
}
-int StripObjectMap::get_values_with_header(const StripObjectHeader &header,
+int StripObjectMap::get_values_with_header(const StripObjectHeaderRef header,
const string &prefix,
const set<string> &keys,
map<string, bufferlist> *out)
{
- return scan(header.header, prefix, keys, 0, out);
+ return scan(header->header, prefix, keys, 0, out);
}
-int StripObjectMap::get_keys_with_header(const StripObjectHeader &header,
+int StripObjectMap::get_keys_with_header(const StripObjectHeaderRef header,
const string &prefix,
set<string> *keys)
{
- ObjectMap::ObjectMapIterator iter = _get_iterator(header.header, prefix);
+ ObjectMap::ObjectMapIterator iter = _get_iterator(header->header, prefix);
for (; iter->valid(); iter->next()) {
if (iter->status())
return iter->status();
return 0;
}
-int StripObjectMap::get_with_header(const StripObjectHeader &header,
+int StripObjectMap::get_with_header(const StripObjectHeaderRef header,
const string &prefix, map<string, bufferlist> *out)
{
- ObjectMap::ObjectMapIterator iter = _get_iterator(header.header, prefix);
+ ObjectMap::ObjectMapIterator iter = _get_iterator(header->header, prefix);
for (iter->seek_to_first(); iter->valid(); iter->next()) {
if (iter->status())
return iter->status();
int KeyValueStore::BufferTransaction::lookup_cached_header(
const coll_t &cid, const ghobject_t &oid,
- StripObjectMap::StripObjectHeader **strip_header,
+ StripObjectMap::StripObjectHeaderRef *strip_header,
bool create_if_missing)
{
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = 0;
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;
+ *strip_header = it->second;
return 0;
} else if (!create_if_missing) {
return -ENOENT;
// 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 == -ENOENT && create_if_missing) {
- r = store->backend->create_strip_header(cid, oid, header, t);
+ r = store->backend->create_strip_header(cid, oid, &header, t);
}
if (r < 0) {
strip_headers[make_pair(cid, oid)] = header;
if (strip_header)
- *strip_header = &strip_headers[make_pair(cid, oid)];
+ *strip_header = strip_headers[make_pair(cid, oid)];
return r;
}
int KeyValueStore::BufferTransaction::get_buffer_keys(
- StripObjectMap::StripObjectHeader &strip_header, const string &prefix,
+ StripObjectMap::StripObjectHeaderRef strip_header, const string &prefix,
const set<string> &keys, map<string, bufferlist> *out)
{
set<string> need_lookup;
for (set<string>::iterator it = keys.begin(); it != keys.end(); ++it) {
map<pair<string, string>, bufferlist>::iterator i =
- strip_header.buffers.find(make_pair(prefix, *it));
+ strip_header->buffers.find(make_pair(prefix, *it));
- if (i != strip_header.buffers.end()) {
+ if (i != strip_header->buffers.end()) {
(*out)[*it].swap(i->second);
} else {
need_lookup.insert(*it);
int r = store->backend->get_values_with_header(strip_header, prefix,
need_lookup, out);
if (r < 0) {
- dout(10) << __func__ << " " << strip_header.cid << "/"
- << strip_header.oid << " " << " r = " << r << dendl;
+ dout(10) << __func__ << " " << strip_header->cid << "/"
+ << strip_header->oid << " " << " r = " << r << dendl;
return r;
}
}
}
void KeyValueStore::BufferTransaction::set_buffer_keys(
- StripObjectMap::StripObjectHeader &strip_header,
+ StripObjectMap::StripObjectHeaderRef strip_header,
const string &prefix, map<string, bufferlist> &values)
{
- store->backend->set_keys(strip_header.header, prefix, values, t);
+ store->backend->set_keys(strip_header->header, prefix, values, t);
for (map<string, bufferlist>::iterator iter = values.begin();
iter != values.end(); ++iter) {
- strip_header.buffers[make_pair(prefix, iter->first)].swap(iter->second);
+ strip_header->buffers[make_pair(prefix, iter->first)].swap(iter->second);
}
}
int KeyValueStore::BufferTransaction::remove_buffer_keys(
- StripObjectMap::StripObjectHeader &strip_header, const string &prefix,
+ StripObjectMap::StripObjectHeaderRef strip_header, const string &prefix,
const set<string> &keys)
{
for (set<string>::iterator iter = keys.begin(); iter != keys.end(); ++iter) {
- strip_header.buffers[make_pair(prefix, *iter)] = bufferlist();
+ strip_header->buffers[make_pair(prefix, *iter)] = bufferlist();
}
- return store->backend->rm_keys(strip_header.header, prefix, keys, t);
+ return store->backend->rm_keys(strip_header->header, prefix, keys, t);
}
void KeyValueStore::BufferTransaction::clear_buffer_keys(
- StripObjectMap::StripObjectHeader &strip_header, const string &prefix)
+ StripObjectMap::StripObjectHeaderRef strip_header, const string &prefix)
{
- for (map<pair<string, string>, bufferlist>::iterator iter = strip_header.buffers.begin();
- iter != strip_header.buffers.end(); ++iter) {
+ for (map<pair<string, string>, bufferlist>::iterator iter = strip_header->buffers.begin();
+ iter != strip_header->buffers.end(); ++iter) {
if (iter->first.first == prefix)
iter->second = bufferlist();
}
}
int KeyValueStore::BufferTransaction::clear_buffer(
- StripObjectMap::StripObjectHeader &strip_header)
+ StripObjectMap::StripObjectHeaderRef strip_header)
{
- strip_header.deleted = true;
+ strip_header->deleted = true;
+
+ InvalidCacheContext *c = new InvalidCacheContext(store, strip_header->oid);
+ finishes.push_back(c);
- return store->backend->clear(strip_header.header, t);
+ return store->backend->clear(strip_header->header, t);
}
void KeyValueStore::BufferTransaction::clone_buffer(
- StripObjectMap::StripObjectHeader &old_header,
+ StripObjectMap::StripObjectHeaderRef old_header,
const coll_t &cid, const ghobject_t &oid)
{
// Remove target ahead to avoid dead lock
strip_headers.erase(make_pair(cid, oid));
- StripObjectMap::StripObjectHeader new_origin_header, new_target_header;
+ StripObjectMap::StripObjectHeaderRef new_target_header;
- store->backend->clone_wrap(old_header, cid, oid, t,
- &new_origin_header, &new_target_header);
+ store->backend->clone_wrap(old_header, cid, oid, t, &new_target_header);
// FIXME: Lacking of lock for origin header(now become parent), it will
// cause other operation can get the origin header while submitting
// transactions
- strip_headers[make_pair(cid, old_header.oid)] = new_origin_header;
strip_headers[make_pair(cid, oid)] = new_target_header;
}
void KeyValueStore::BufferTransaction::rename_buffer(
- StripObjectMap::StripObjectHeader &old_header,
+ StripObjectMap::StripObjectHeaderRef old_header,
const coll_t &cid, const ghobject_t &oid)
{
// FIXME: Lacking of lock for origin header, it will cause other operation
// can get the origin header while submitting transactions
- store->backend->rename_wrap(cid, oid, t, &old_header);
+ store->backend->rename_wrap(cid, oid, t, old_header);
- strip_headers.erase(make_pair(old_header.cid, old_header.oid));
+ InvalidCacheContext *c = new InvalidCacheContext(store, oid);
+ finishes.push_back(c);
+
+ strip_headers.erase(make_pair(old_header->cid, old_header->oid));
strip_headers[make_pair(cid, oid)] = old_header;
}
for (StripHeaderMap::iterator header_iter = strip_headers.begin();
header_iter != strip_headers.end(); ++header_iter) {
- StripObjectMap::StripObjectHeader header = header_iter->second;
+ StripObjectMap::StripObjectHeaderRef header = header_iter->second;
- if (header.deleted)
+ if (header->deleted)
continue;
r = store->backend->save_strip_header(header, t);
}
out:
+ for (list<Context*>::iterator it = finishes.begin();
+ it != finishes.end(); ++it) {
+ (*it)->complete(r);
+ }
dout(5) << __func__ << " r = " << r << dendl;
return store->backend->submit_transaction(t);
dout(10) << __func__ << "collection: " << cid << " object: " << oid
<< dendl;
int r;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
- r = backend->lookup_strip_header(cid, oid, header);
+ r = backend->lookup_strip_header(cid, oid, &header);
if (r < 0) {
return false;
}
{
dout(10) << "stat " << cid << "/" << oid << dendl;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
- int r = backend->lookup_strip_header(cid, oid, header);
+ int r = backend->lookup_strip_header(cid, oid, &header);
if (r < 0) {
dout(10) << "stat " << cid << "/" << oid << "=" << r << dendl;
return -ENOENT;
}
- st->st_blocks = header.max_size / header.strip_size;
- if (header.max_size % header.strip_size)
+ st->st_blocks = header->max_size / header->strip_size;
+ if (header->max_size % header->strip_size)
st->st_blocks++;
st->st_nlink = 1;
- st->st_size = header.max_size;
- st->st_blksize = header.strip_size;
+ st->st_size = header->max_size;
+ st->st_blksize = header->strip_size;
return r;
}
-int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeader &header,
+int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeaderRef header,
uint64_t offset, size_t len, bufferlist& bl,
bool allow_eio, BufferTransaction *bt)
{
- if (header.max_size < offset) {
- dout(10) << __func__ << " " << header.cid << "/" << header.oid << ")"
+ if (header->max_size < offset) {
+ dout(10) << __func__ << " " << header->cid << "/" << header->oid << ")"
<< " offset exceed the length of bl"<< dendl;
return 0;
}
if (len == 0)
- len = header.max_size - offset;
+ len = header->max_size - offset;
- if (offset + len > header.max_size)
- len = header.max_size - offset;
+ if (offset + len > header->max_size)
+ len = header->max_size - offset;
vector<StripObjectMap::StripExtent> extents;
- StripObjectMap::file_to_extents(offset, len, header.strip_size,
+ StripObjectMap::file_to_extents(offset, len, header->strip_size,
extents);
map<string, bufferlist> out;
set<string> keys;
bufferlist old;
string key = strip_object_key(iter->no);
- if (bt && header.buffers.count(make_pair(OBJECT_STRIP_PREFIX, key))) {
+ if (bt && header->buffers.count(make_pair(OBJECT_STRIP_PREFIX, key))) {
// use strip_header buffer
- assert(header.bits[iter->no]);
- out[key] = header.buffers[make_pair(OBJECT_STRIP_PREFIX, key)];
- } else if (header.bits[iter->no]) {
+ assert(header->bits[iter->no]);
+ out[key] = header->buffers[make_pair(OBJECT_STRIP_PREFIX, key)];
+ } else if (header->bits[iter->no]) {
keys.insert(key);
}
}
int r = backend->get_values_with_header(header, OBJECT_STRIP_PREFIX, keys, &out);
if (r < 0) {
- dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ dout(10) << __func__ << " " << header->cid << "/" << header->oid << " "
<< offset << "~" << len << " = " << r << dendl;
return r;
} else if (out.size() != keys.size()) {
dout(0) << __func__ << " broken header or missing data in backend "
- << header.cid << "/" << header.oid << " " << offset << "~"
+ << header->cid << "/" << header->oid << " " << offset << "~"
<< len << " = " << r << dendl;
return -EBADF;
}
iter != extents.end(); ++iter) {
string key = strip_object_key(iter->no);
- if (header.bits[iter->no]) {
- if (iter->len == header.strip_size) {
+ if (header->bits[iter->no]) {
+ if (iter->len == header->strip_size) {
bl.claim_append(out[key]);
} else {
out[key].copy(iter->offset, iter->len, bl);
}
}
- dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ dout(10) << __func__ << " " << header->cid << "/" << header->oid << " "
<< offset << "~" << bl.length() << "/" << len << " r = " << r
<< dendl;
dout(15) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
<< len << dendl;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
- int r = backend->lookup_strip_header(cid, oid, header);
+ int r = backend->lookup_strip_header(cid, oid, &header);
if (r < 0) {
dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
dout(10) << __func__ << " " << cid << " " << oid << " " << offset << "~"
<< len << dendl;
int r;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
- r = backend->lookup_strip_header(cid, oid, header);
+ r = backend->lookup_strip_header(cid, oid, &header);
if (r < 0) {
dout(10) << "fiemap " << cid << "/" << oid << " " << offset << "~" << len
<< " failed to get header: r = " << r << dendl;
}
vector<StripObjectMap::StripExtent> extents;
- StripObjectMap::file_to_extents(offset, len, header.strip_size,
+ StripObjectMap::file_to_extents(offset, len, header->strip_size,
extents);
map<uint64_t, uint64_t> m;
dout(15) << __func__ << " " << cid << "/" << oid << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, false);
if (r < 0) {
header->max_size = 0;
header->bits.clear();
- r = t.clear_buffer(*header);
+ r = t.clear_buffer(header);
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
return r;
<< dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, false);
if (r < 0) {
string key = strip_object_key(iter->no);
lookup_keys.insert(key);
- r = t.get_buffer_keys(*header, OBJECT_STRIP_PREFIX,
+ r = t.get_buffer_keys(header, OBJECT_STRIP_PREFIX,
lookup_keys, &values);
if (r < 0) {
dout(10) << __func__ << " " << cid << "/" << oid << " "
assert(value.length() == header->strip_size);
value.swap(values[key]);
- t.set_buffer_keys(*header, OBJECT_STRIP_PREFIX, values);
+ t.set_buffer_keys(header, OBJECT_STRIP_PREFIX, values);
++iter;
}
header->bits[iter->no] = 0;
}
}
- r = t.remove_buffer_keys(*header, OBJECT_STRIP_PREFIX, keys);
+ r = t.remove_buffer_keys(header, OBJECT_STRIP_PREFIX, keys);
if (r < 0) {
dout(10) << __func__ << " " << cid << "/" << oid << " "
<< size << " = " << r << dendl;
dout(15) << __func__ << " " << cid << "/" << oid << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, true);
if (r < 0) {
return r;
}
-int KeyValueStore::_generic_write(StripObjectMap::StripObjectHeader &header,
+int KeyValueStore::_generic_write(StripObjectMap::StripObjectHeaderRef header,
uint64_t offset, size_t len,
const bufferlist& bl, BufferTransaction &t,
bool replica)
if (len > bl.length())
len = bl.length();
- if (len + offset > header.max_size) {
- header.max_size = len + offset;
- header.bits.resize(header.max_size/header.strip_size+1);
+ if (len + offset > header->max_size) {
+ header->max_size = len + offset;
+ header->bits.resize(header->max_size/header->strip_size+1);
}
vector<StripObjectMap::StripExtent> extents;
- StripObjectMap::file_to_extents(offset, len, header.strip_size,
+ StripObjectMap::file_to_extents(offset, len, header->strip_size,
extents);
map<string, bufferlist> out;
set<string> keys;
for (vector<StripObjectMap::StripExtent>::iterator iter = extents.begin();
iter != extents.end(); ++iter) {
- if (header.bits[iter->no] && !(iter->offset == 0 &&
- iter->len == header.strip_size))
+ if (header->bits[iter->no] && !(iter->offset == 0 &&
+ iter->len == header->strip_size))
keys.insert(strip_object_key(iter->no));
}
int r = t.get_buffer_keys(header, OBJECT_STRIP_PREFIX, keys, &out);
if (r < 0) {
- dout(10) << __func__ << " failed to get value " << header.cid << "/"
- << header.oid << " " << offset << "~" << len << " = " << r
+ dout(10) << __func__ << " failed to get value " << header->cid << "/"
+ << header->oid << " " << offset << "~" << len << " = " << r
<< dendl;
return r;
} else if (keys.size() != out.size()) {
// Error on header.bits or the corresponding key/value pair is missing
dout(0) << __func__ << " broken header or missing data in backend "
- << header.cid << "/" << header.oid << " " << offset << "~"
+ << header->cid << "/" << header->oid << " " << offset << "~"
<< len << " = " << r << dendl;
return -EBADF;
}
iter != extents.end(); ++iter) {
bufferlist value;
string key = strip_object_key(iter->no);
- if (header.bits[iter->no]) {
- if (iter->offset == 0 && iter->len == header.strip_size) {
+ if (header->bits[iter->no]) {
+ if (iter->offset == 0 && iter->len == header->strip_size) {
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
} else {
- assert(out[key].length() == header.strip_size);
+ assert(out[key].length() == header->strip_size);
out[key].copy(0, iter->offset, value);
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
- if (value.length() != header.strip_size)
- out[key].copy(value.length(), header.strip_size-value.length(),
+ if (value.length() != header->strip_size)
+ out[key].copy(value.length(), header->strip_size-value.length(),
value);
}
} else {
bl.copy(bl_offset, iter->len, value);
bl_offset += iter->len;
- if (value.length() < header.strip_size)
- value.append_zero(header.strip_size-value.length());
+ if (value.length() < header->strip_size)
+ value.append_zero(header->strip_size-value.length());
- header.bits[iter->no] = 1;
+ header->bits[iter->no] = 1;
}
- assert(value.length() == header.strip_size);
+ assert(value.length() == header->strip_size);
values[key].swap(value);
}
assert(bl_offset == len);
t.set_buffer_keys(header, OBJECT_STRIP_PREFIX, values);
- dout(10) << __func__ << " " << header.cid << "/" << header.oid << " "
+ dout(10) << __func__ << " " << header->cid << "/" << header->oid << " "
<< offset << "~" << len << " = " << r << dendl;
return r;
<< len << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, true);
if (r < 0) {
return r;
}
- return _generic_write(*header, offset, len, bl, t, replica);
+ return _generic_write(header, offset, len, bl, t, replica);
}
int KeyValueStore::_zero(coll_t cid, const ghobject_t& oid, uint64_t offset,
return 0;
int r;
- StripObjectMap::StripObjectHeader *old_header;
+ StripObjectMap::StripObjectHeaderRef old_header;
r = t.lookup_cached_header(cid, oldoid, &old_header, false);
if (r < 0) {
return r;
}
- t.clone_buffer(*old_header, cid, newoid);
+ t.clone_buffer(old_header, cid, newoid);
dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
<< newoid << " = " << r << dendl;
int r;
bufferlist bl;
- StripObjectMap::StripObjectHeader *old_header, *new_header;
+ StripObjectMap::StripObjectHeaderRef old_header, new_header;
r = t.lookup_cached_header(cid, oldoid, &old_header, false);
if (r < 0) {
return r;
}
- r = _generic_read(*old_header, srcoff, len, bl, &t);
+ r = _generic_read(old_header, srcoff, len, bl, &t);
if (r < 0)
goto out;
- r = _generic_write(*new_header, dstoff, len, bl, t);
+ r = _generic_write(new_header, dstoff, len, bl, t);
out:
dout(10) << __func__ << " " << cid << "/" << oldoid << " -> " << cid << "/"
int r;
map<string, bufferlist> got;
set<string> to_get;
+ StripObjectMap::StripObjectHeaderRef header;
to_get.insert(string(name));
- r = backend->get_values(cid, oid, OBJECT_XATTR, to_get, &got);
+
+ r = backend->lookup_strip_header(cid, oid, &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
+
+ r = backend->get_values_with_header(header, OBJECT_XATTR, to_get, &got);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " get_xattrs err r =" << r << dendl;
goto out;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
map<string, bufferlist> attrs;
r = t.lookup_cached_header(cid, oid, &header, false);
attrs[it->first].push_back(it->second);
}
- t.set_buffer_keys(*header, OBJECT_XATTR, attrs);
+ t.set_buffer_keys(header, OBJECT_XATTR, attrs);
out:
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
int r;
set<string> to_remove;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, false);
if (r < 0) {
}
to_remove.insert(string(name));
- r = t.remove_buffer_keys(*header, OBJECT_XATTR, to_remove);
+ r = t.remove_buffer_keys(header, OBJECT_XATTR, to_remove);
dout(10) << __func__ << " " << cid << "/" << oid << " '" << name << "' = "
<< r << dendl;
int r;
set<string> attrs;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(cid, oid, &header, false);
if (r < 0) {
return r;
}
- r = backend->get_keys_with_header(*header, OBJECT_XATTR, &attrs);
+ r = backend->get_keys_with_header(header, OBJECT_XATTR, &attrs);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not get attrs r = " << r << dendl;
return r;
}
- r = t.remove_buffer_keys(*header, OBJECT_XATTR, attrs);
- t.clear_buffer_keys(*header, OBJECT_XATTR);
+ r = t.remove_buffer_keys(header, OBJECT_XATTR, attrs);
+ t.clear_buffer_keys(header, OBJECT_XATTR);
dout(10) << __func__ << " " << cid << "/" << oid << " = " << r << dendl;
return r;
set<string> keys;
map<string, bufferlist> out;
+ StripObjectMap::StripObjectHeaderRef header;
+
keys.insert(string(name));
- int r = backend->get_values(get_coll_for_coll(), make_ghobject_for_coll(c),
- COLLECTION_ATTR, keys, &out);
+ int r = backend->lookup_strip_header(get_coll_for_coll(),
+ make_ghobject_for_coll(c), &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
+
+ r = backend->get_values_with_header(header, COLLECTION_ATTR, keys, &out);
if (r < 0) {
dout(10) << __func__ << " could not get key" << string(name) << dendl;
r = -EINVAL;
map<string, bufferlist> out;
set<string> keys;
+ StripObjectMap::StripObjectHeaderRef header;
for (map<string, bufferptr>::iterator it = aset.begin();
it != aset.end(); ++it) {
keys.insert(it->first);
}
- int r = backend->get_values(get_coll_for_coll(), make_ghobject_for_coll(cid),
- COLLECTION_ATTR, keys, &out);
+ int r = backend->lookup_strip_header(get_coll_for_coll(),
+ make_ghobject_for_coll(cid), &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
+
+ r = backend->get_values_with_header(header, COLLECTION_ATTR, keys, &out);
if (r < 0) {
dout(10) << __func__ << " could not get keys" << dendl;
r = -EINVAL;
int r;
bufferlist bl;
map<string, bufferlist> out;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(c),
bl.append(reinterpret_cast<const char*>(value), size);
out.insert(make_pair(string(name), bl));
- t.set_buffer_keys(*header, COLLECTION_ATTR, out);
+ t.set_buffer_keys(header, COLLECTION_ATTR, out);
dout(10) << __func__ << " " << c << " '"
<< name << "' len " << size << " = " << r << dendl;
bufferlist bl;
set<string> out;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(c), &header, false);
}
out.insert(string(name));
- r = t.remove_buffer_keys(*header, COLLECTION_ATTR, out);
+ r = t.remove_buffer_keys(header, COLLECTION_ATTR, out);
dout(10) << __func__ << " " << c << " = " << r << dendl;
return r;
dout(15) << __func__ << " " << cid << dendl;
map<string, bufferlist> attrs;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(cid),
&header, false);
attrs[it->first].push_back(it->second);
}
- t.set_buffer_keys(*header, COLLECTION_ATTR, attrs);
+ t.set_buffer_keys(header, COLLECTION_ATTR, attrs);
dout(10) << __func__ << " " << cid << " = " << r << dendl;
return r;
dout(15) << __func__ << " " << c << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
bufferlist bl;
r = t.lookup_cached_header(get_coll_for_coll(),
int r;
uint64_t modified_object = 0;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
vector<ghobject_t> oids;
r = t.lookup_cached_header(get_coll_for_coll(), make_ghobject_for_coll(c),
continue;
modified_object++;
- if (!iter->second.deleted) {
+ if (!iter->second->deleted) {
r = -ENOTEMPTY;
goto out;
}
}
}
- r = t.clear_buffer(*header);
+ r = t.clear_buffer(header);
out:
dout(10) << __func__ << " " << c << " = " << r << dendl;
<< o << dendl;
bufferlist bl;
- StripObjectMap::StripObjectHeader *header, *old_header;
+ StripObjectMap::StripObjectHeaderRef header, old_header;
int r = t.lookup_cached_header(oldcid, o, &old_header, false);
if (r < 0) {
goto out;
}
- r = _generic_read(*old_header, 0, old_header->max_size, bl, &t);
+ r = _generic_read(old_header, 0, old_header->max_size, bl, &t);
if (r < 0) {
r = -EINVAL;
goto out;
}
- r = _generic_write(*header, 0, bl.length(), bl, t);
+ r = _generic_write(header, 0, bl.length(), bl, t);
if (r < 0) {
r = -EINVAL;
}
dout(15) << __func__ << " " << c << "/" << o << " from " << oldcid << "/"
<< oldoid << dendl;
int r;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
r = t.lookup_cached_header(c, o, &header, false);
if (r == 0) {
return r;
}
- t.rename_buffer(*header, c, o);
+ t.rename_buffer(header, c, o);
dout(10) << __func__ << " " << c << "/" << o << " from " << oldcid << "/"
<< oldoid << " = " << r << dendl;
{
dout(15) << __func__ << " " << cid << dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(cid),
}
}
- r = t.clear_buffer(*header);
+ r = t.clear_buffer(header);
dout(10) << __func__ << " " << cid << " r = " << r << dendl;
return 0;
dout(10) << __func__ << " origin cid " << cid << " new cid " << ncid
<< dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(ncid),
current = next;
}
- t.rename_buffer(*header, get_coll_for_coll(), make_ghobject_for_coll(ncid));
+ t.rename_buffer(header, get_coll_for_coll(), make_ghobject_for_coll(ncid));
dout(10) << __func__ << " origin cid " << cid << " new cid " << ncid
<< dendl;
{
dout(10) << __func__ << " " << dendl;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = backend->lookup_strip_header(get_coll_for_coll(),
- make_ghobject_for_coll(c), header);
+ make_ghobject_for_coll(c), &header);
if (r < 0) {
return false;
}
{
dout(15) << __func__ << " " << c << "/" << hoid << dendl;
- StripObjectMap::StripObjectHeader header;
+ StripObjectMap::StripObjectHeaderRef header;
- int r = backend->lookup_strip_header(c, hoid, header);
+ int r = backend->lookup_strip_header(c, hoid, &header);
if (r < 0) {
dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
return r;
}
-
r = backend->get_with_header(header, OBJECT_OMAP, out);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " err r =" << r << dendl;
set<string> keys;
map<string, bufferlist> got;
+ StripObjectMap::StripObjectHeaderRef header;
+
+ int r = backend->lookup_strip_header(c, hoid, &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
keys.insert(OBJECT_OMAP_HEADER_KEY);
- int r = backend->get_values(c, hoid, OBJECT_OMAP_HEADER, keys, &got);
+ r = backend->get_values_with_header(header, OBJECT_OMAP_HEADER, keys, &got);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " err r =" << r << dendl;
return r;
{
dout(15) << __func__ << " " << c << "/" << hoid << dendl;
- int r = backend->get_keys(c, hoid, OBJECT_OMAP, keys);
+ StripObjectMap::StripObjectHeaderRef header;
+ int r = backend->lookup_strip_header(c, hoid, &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
+
+ r = backend->get_keys_with_header(header, OBJECT_OMAP, keys);
if (r < 0 && r != -ENOENT) {
return r;
}
{
dout(15) << __func__ << " " << c << "/" << hoid << dendl;
- int r = backend->get_values(c, hoid, OBJECT_OMAP, keys, out);
+ StripObjectMap::StripObjectHeaderRef header;
+ int r = backend->lookup_strip_header(c, hoid, &header);
+ if (r < 0) {
+ dout(10) << __func__ << " lookup_strip_header failed: r =" << r << dendl;
+ return r;
+ }
+
+ r = backend->get_values_with_header(header, OBJECT_OMAP, keys, out);
if (r < 0 && r != -ENOENT) {
return r;
}
{
dout(15) << __func__ << " " << cid << "/" << hoid << dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(cid, hoid, &header, false);
if (r < 0) {
}
set<string> keys;
- r = backend->get_keys_with_header(*header, OBJECT_OMAP, &keys);
+ r = backend->get_keys_with_header(header, OBJECT_OMAP, &keys);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not get omap_keys r = " << r << dendl;
return r;
}
- r = t.remove_buffer_keys(*header, OBJECT_OMAP, keys);
+ r = t.remove_buffer_keys(header, OBJECT_OMAP, keys);
if (r < 0) {
dout(10) << __func__ << " could not remove keys r = " << r << dendl;
return r;
keys.clear();
keys.insert(OBJECT_OMAP_HEADER_KEY);
- r = t.remove_buffer_keys(*header, OBJECT_OMAP_HEADER, keys);
+ r = t.remove_buffer_keys(header, OBJECT_OMAP_HEADER, keys);
if (r < 0) {
dout(10) << __func__ << " could not remove keys r = " << r << dendl;
return r;
}
- t.clear_buffer_keys(*header, OBJECT_OMAP_HEADER);
+ t.clear_buffer_keys(header, OBJECT_OMAP_HEADER);
dout(10) << __func__ << " " << cid << "/" << hoid << " r = " << r << dendl;
return 0;
{
dout(15) << __func__ << " " << cid << "/" << hoid << dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(cid, hoid, &header, false);
if (r < 0) {
return r;
}
- t.set_buffer_keys(*header, OBJECT_OMAP, aset);
+ t.set_buffer_keys(header, OBJECT_OMAP, aset);
return 0;
}
{
dout(15) << __func__ << " " << cid << "/" << hoid << dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(cid, hoid, &header, false);
if (r < 0) {
return r;
}
- r = t.remove_buffer_keys(*header, OBJECT_OMAP, keys);
+ r = t.remove_buffer_keys(header, OBJECT_OMAP, keys);
dout(10) << __func__ << " " << cid << "/" << hoid << " r = " << r << dendl;
return r;
dout(15) << __func__ << " " << cid << "/" << hoid << dendl;
map<string, bufferlist> sets;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(cid, hoid, &header, false);
if (r < 0) {
}
sets[OBJECT_OMAP_HEADER_KEY] = bl;
- t.set_buffer_keys(*header, OBJECT_OMAP_HEADER, sets);
+ t.set_buffer_keys(header, OBJECT_OMAP_HEADER, sets);
return 0;
}
{
dout(15) << __func__ << " " << cid << " bits: " << bits << dendl;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef header;
int r = t.lookup_cached_header(get_coll_for_coll(),
make_ghobject_for_coll(cid),
<< expected_write_size << dendl;
int r = 0;
- StripObjectMap::StripObjectHeader *header;
+ StripObjectMap::StripObjectHeaderRef *header;
r = t.lookup_cached_header(cid, oid, &header, false);
if (r < 0) {