From 54ee8ee85155c23fa2827d233e836d377124b16b Mon Sep 17 00:00:00 2001 From: "Chendi.Xue" Date: Sun, 9 Nov 2014 15:43:14 +0800 Subject: [PATCH] KeyValueStore: move buffers from strip_header to BufferTransaction Signed-off-by: Chendi.Xue --- src/os/KeyValueStore.cc | 52 ++++++++++++++++++++++++++++------------- src/os/KeyValueStore.h | 3 ++- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/os/KeyValueStore.cc b/src/os/KeyValueStore.cc index 71b61d3efc71b..291bd19593bb3 100644 --- a/src/os/KeyValueStore.cc +++ b/src/os/KeyValueStore.cc @@ -339,13 +339,18 @@ int KeyValueStore::BufferTransaction::get_buffer_keys( { set need_lookup; + uniq_id uid = make_pair(strip_header->cid, strip_header->oid); for (set::iterator it = keys.begin(); it != keys.end(); ++it) { - map, bufferlist>::iterator i = - strip_header->buffers.find(make_pair(prefix, *it)); - - if (i != strip_header->buffers.end()) { - (*out)[*it].swap(i->second); - } else { + map< uniq_id, map, bufferlist> >::iterator obj_it = buffers.find(uid); + if ( obj_it != buffers.end() ) { + map, bufferlist>::iterator i = + obj_it->second.find(make_pair(prefix, *it)); + if (i != obj_it->second.end()) { + (*out)[*it].swap(i->second); + } else { + need_lookup.insert(*it); + } + }else { need_lookup.insert(*it); } } @@ -369,9 +374,10 @@ void KeyValueStore::BufferTransaction::set_buffer_keys( { store->backend->set_keys(strip_header->header, prefix, values, t); + uniq_id uid = make_pair(strip_header->cid, strip_header->oid); for (map::iterator iter = values.begin(); iter != values.end(); ++iter) { - strip_header->buffers[make_pair(prefix, iter->first)].swap(iter->second); + buffers[uid][make_pair(prefix, iter->first)].swap(iter->second); } } @@ -379,8 +385,12 @@ int KeyValueStore::BufferTransaction::remove_buffer_keys( StripObjectMap::StripObjectHeaderRef strip_header, const string &prefix, const set &keys) { - for (set::iterator iter = keys.begin(); iter != keys.end(); ++iter) { - strip_header->buffers[make_pair(prefix, *iter)] = bufferlist(); + uniq_id uid = make_pair(strip_header->cid, strip_header->oid); + map< uniq_id, map, bufferlist> >::iterator obj_it = buffers.find(uid); + if ( obj_it != buffers.end() ) { + for (set::iterator iter = keys.begin(); iter != keys.end(); ++iter) { + obj_it->second[make_pair(prefix, *iter)] = bufferlist(); + } } return store->backend->rm_keys(strip_header->header, prefix, keys, t); @@ -389,10 +399,14 @@ int KeyValueStore::BufferTransaction::remove_buffer_keys( void KeyValueStore::BufferTransaction::clear_buffer_keys( StripObjectMap::StripObjectHeaderRef strip_header, const string &prefix) { - for (map, bufferlist>::iterator iter = strip_header->buffers.begin(); - iter != strip_header->buffers.end(); ++iter) { - if (iter->first.first == prefix) - iter->second = bufferlist(); + uniq_id uid = make_pair(strip_header->cid, strip_header->oid); + map< uniq_id, map, bufferlist> >::iterator obj_it = buffers.find(uid); + if ( obj_it != buffers.end() ) { + for (map, bufferlist>::iterator iter = obj_it->second.begin(); + iter != obj_it->second.end(); ++iter) { + if (iter->first.first == prefix) + iter->second = bufferlist(); + } } } @@ -1631,21 +1645,27 @@ int KeyValueStore::_generic_read(StripObjectMap::StripObjectHeaderRef header, extents); map out; set keys; + pair uid = make_pair(header->cid, header->oid); for (vector::iterator iter = extents.begin(); iter != extents.end(); ++iter) { bufferlist old; string key = strip_object_key(iter->no); - if (bt && header->buffers.count(make_pair(OBJECT_STRIP_PREFIX, key))) { + map< pair, map, bufferlist> >::iterator obj_it; + if ( bt ){ + obj_it = bt->buffers.find(uid); + } + if ( bt && obj_it != bt->buffers.end() && obj_it->second.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]) { + out[key] = obj_it->second[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 << " " diff --git a/src/os/KeyValueStore.h b/src/os/KeyValueStore.h index 86cd7aec69d24..ed596c1521d5a 100644 --- a/src/os/KeyValueStore.h +++ b/src/os/KeyValueStore.h @@ -68,7 +68,6 @@ class StripObjectMap: public GenericObjectMap { ghobject_t oid; bool updated; bool deleted; - map, bufferlist> buffers; // pair(prefix, key) StripObjectHeader(): strip_size(default_strip_size), max_size(0), updated(false), deleted(false) {} @@ -249,6 +248,8 @@ class KeyValueStore : public ObjectStore, //Dirty records StripHeaderMap strip_headers; + map< uniq_id, map, bufferlist> > buffers; // pair(prefix, key),to buffer updated data in one transaction + list finishes; KeyValueStore *store; -- 2.39.5