int r = backend->get_values_with_header(header, OBJECT_STRIP_PREFIX, keys, &out);
- if (r < 0) {
- dout(10) << __func__ << " " << header->cid << "/" << header->oid << " "
- << offset << "~" << len << " = " << r << dendl;
+ r = check_get_rc(header->cid, header->oid, r, out.size() == keys.size());
+ if (r < 0)
return r;
- } else if (out.size() != keys.size()) {
- dout(0) << __func__ << " broken header or missing data in backend "
- << header->cid << "/" << header->oid << " " << offset << "~"
- << len << " = " << r << dendl;
- return -EBADF;
- }
for (vector<StripObjectMap::StripExtent>::iterator iter = extents.begin();
iter != extents.end(); ++iter) {
lookup_keys.insert(key);
r = t.get_buffer_keys(header, OBJECT_STRIP_PREFIX,
lookup_keys, &values);
- if (r < 0) {
- dout(10) << __func__ << " " << cid << "/" << oid << " "
- << size << " = " << r << dendl;
+ r = check_get_rc(cid, oid, r, lookup_keys.size() == values.size());
+ if (r < 0)
return r;
- } else if (values.size() != lookup_keys.size()) {
- dout(0) << __func__ << " broken header or missing data in backend "
- << header->cid << "/" << header->oid << " size " << size
- << " r = " << r << dendl;
- return -EBADF;
- }
values[key].copy(0, iter->offset, value);
value.append_zero(header->strip_size-iter->offset);
}
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
- << dendl;
+ r = check_get_rc(header->cid, header->oid, r, keys.size() == out.size());
+ if (r < 0)
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 << "~"
- << len << " = " << r << dendl;
- return -EBADF;
- }
uint64_t bl_offset = 0;
map<string, bufferlist> values;
StripObjectMap::file_to_extents(offset, len, header->strip_size,
extents);
set<string> rm_keys;
+ set<string> lookup_keys;
map<string, bufferlist> values;
+ map<string, pair<uint64_t, uint64_t> > off_len;
for (vector<StripObjectMap::StripExtent>::iterator iter = extents.begin();
iter != extents.end(); ++iter) {
- set<string> lookup_keys;
string key = strip_object_key(iter->no);
if (header->bits[iter->no]) {
if (iter->offset == 0 && iter->len == header->strip_size) {
header->updated = true;
} else {
lookup_keys.insert(key);
- r = t.get_buffer_keys(header, OBJECT_STRIP_PREFIX,
- lookup_keys, &values);
- if (r < 0) {
- dout(10) << __func__ << " " << cid << "/" << oid
- << " r = " << r << dendl;
- return r;
- } else if (values.size() != lookup_keys.size()) {
- dout(0) << __func__ << " broken header or missing data in backend "
- << header->cid << "/" << header->oid
- << " r = " << r << dendl;
- return -EBADF;
- }
- values[key].zero(iter->offset, iter->len);
+ off_len[key] = make_pair(iter->offset, iter->len);
}
}
}
+ r = t.get_buffer_keys(header, OBJECT_STRIP_PREFIX,
+ lookup_keys, &values);
+ r = check_get_rc(header->cid, header->oid, r, lookup_keys.size() == values.size());
+ if (r < 0)
+ return r;
+ for(set<string>::iterator it = lookup_keys.begin(); it != lookup_keys.end(); it++)
+ {
+ pair<uint64_t, uint64_t> p = off_len[*it];
+ values[*it].zero(p.first, p.second);
+ }
t.set_buffer_keys(header, OBJECT_STRIP_PREFIX, values);
t.remove_buffer_keys(header, OBJECT_STRIP_PREFIX, rm_keys);
dout(10) << __func__ << " " << cid << "/" << oid << " " << offset << "~"
}
}
+int KeyValueStore::check_get_rc(const coll_t cid, const ghobject_t& oid, int r, bool is_equal_size)
+{
+ if (r < 0) {
+ dout(10) << __func__ << " " << cid << "/" << oid << " "
+ << " get rc = " << r << dendl;
+ } else if (!is_equal_size) {
+ dout(0) << __func__ << " broken header or missing data in backend "
+ << cid << "/" << oid << " get rc = " << r << dendl;
+ r = -EBADF;
+ }
+ return r;
+}
+
void KeyValueStore::dump_start(const std::string file)
{
dout(10) << "dump_start " << file << dendl;