From: xinxin shu Date: Sun, 14 Jun 2015 17:43:15 +0000 (+0800) Subject: generic check return code of get operation X-Git-Tag: v9.0.3~80^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F4837%2Fhead;p=ceph.git generic check return code of get operation Signed-off-by: xinxin shu --- diff --git a/src/os/KeyValueStore.cc b/src/os/KeyValueStore.cc index b0fe4ea928a2..690ecc86ffe7 100644 --- a/src/os/KeyValueStore.cc +++ b/src/os/KeyValueStore.cc @@ -1671,16 +1671,9 @@ int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeaderRef header, 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::iterator iter = extents.begin(); iter != extents.end(); ++iter) { @@ -1815,16 +1808,9 @@ int KeyValueStore::_truncate(coll_t cid, const ghobject_t& oid, uint64_t size, 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); @@ -1907,18 +1893,9 @@ int KeyValueStore::_generic_write(StripObjectMap::StripObjectHeaderRef header, } 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 values; @@ -2009,10 +1986,11 @@ int KeyValueStore::_zero(coll_t cid, const ghobject_t& oid, uint64_t offset, StripObjectMap::file_to_extents(offset, len, header->strip_size, extents); set rm_keys; + set lookup_keys; map values; + map > off_len; for (vector::iterator iter = extents.begin(); iter != extents.end(); ++iter) { - set lookup_keys; string key = strip_object_key(iter->no); if (header->bits[iter->no]) { if (iter->offset == 0 && iter->len == header->strip_size) { @@ -2021,22 +1999,20 @@ int KeyValueStore::_zero(coll_t cid, const ghobject_t& oid, uint64_t offset, 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::iterator it = lookup_keys.begin(); it != lookup_keys.end(); it++) + { + pair 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 << "~" @@ -3149,6 +3125,19 @@ void KeyValueStore::handle_conf_change(const struct md_config_t *conf, } } +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; diff --git a/src/os/KeyValueStore.h b/src/os/KeyValueStore.h index ffd4648b9cb5..66e5631aed44 100644 --- a/src/os/KeyValueStore.h +++ b/src/os/KeyValueStore.h @@ -647,6 +647,7 @@ class KeyValueStore : public ObjectStore, ObjectMap::ObjectMapIterator get_omap_iterator(coll_t c, const ghobject_t &oid); + int check_get_rc(const coll_t cid, const ghobject_t& oid, int r, bool is_equal_size); void dump_start(const std::string file); void dump_stop(); void dump_transactions(list& ls, uint64_t seq,