From: Haomai Wang Date: Fri, 21 Feb 2014 04:23:10 +0000 (+0800) Subject: Fix incorrect read and truncate X-Git-Tag: v0.78~130^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a9fa341ee23f222edfd7115a06929a8ab743927c;p=ceph.git Fix incorrect read and truncate If the first chunk of object is not read entirely, the current implementation will contain it entirely which make wrong. Signed-off-by: Haomai Wang --- diff --git a/src/os/KeyValueStore.cc b/src/os/KeyValueStore.cc index b2705e6f6c2..abdfdbb5eeb 100644 --- a/src/os/KeyValueStore.cc +++ b/src/os/KeyValueStore.cc @@ -1671,27 +1671,19 @@ int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeader &header, return r; } - uint64_t readed = 0; - for (vector::iterator iter = extents.begin(); iter != extents.end(); ++iter) { string key = strip_object_key(iter->no); - if (readed + header.strip_size > header.max_size) { - if (header.bits[iter->no]) { - out[key].copy(0, iter->len, bl); - } else { - bl.append_zero(iter->len); - } - - break; - } if (header.bits[iter->no]) { - bl.append(out[key]); + if (iter->len == header.strip_size) { + bl.claim_append(out[key]); + } else { + out[key].copy(iter->offset, iter->len, bl); + } } else { - bl.append_zero(header.strip_size); + bl.append_zero(iter->len); } - readed += header.strip_size; } dout(10) << __func__ << " " << header.cid << "/" << header.oid << " " @@ -1801,12 +1793,12 @@ int KeyValueStore::_truncate(coll_t cid, const ghobject_t& oid, uint64_t size, if (header->max_size > size) { vector extents; - StripObjectMap::file_to_extents(size, header->max_size, + StripObjectMap::file_to_extents(size, header->max_size-size, header->strip_size, extents); assert(extents.size()); vector::iterator iter = extents.begin(); - if (iter->offset != 0) { + if (header->bits[iter->no] && iter->offset != 0) { bufferlist value; bufferlist old; map values; @@ -1821,10 +1813,10 @@ int KeyValueStore::_truncate(coll_t cid, const ghobject_t& oid, uint64_t size, old.copy(0, iter->offset, value); value.append_zero(header->strip_size-iter->offset); assert(value.length() == header->strip_size); - ++iter; - values[strip_object_key(iter->no)] = value; + values[strip_object_key(iter->no)].swap(value); t.set_buffer_keys(*header, OBJECT_STRIP_PREFIX, values); + ++iter; } set keys;