]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
generic check return code of get operation 4837/head
authorxinxin shu <xinxin.shu@intel.com>
Sun, 14 Jun 2015 17:43:15 +0000 (01:43 +0800)
committerxinxin shu <xinxin.shu@intel.com>
Tue, 7 Jul 2015 05:46:28 +0000 (13:46 +0800)
Signed-off-by: xinxin shu <xinxin.shu@intel.com>
src/os/KeyValueStore.cc
src/os/KeyValueStore.h

index b0fe4ea928a2de1c274913c337050f26e3f6ebe8..690ecc86ffe7167552dfdc87b681b1ce35fd555a 100644 (file)
@@ -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<StripObjectMap::StripExtent>::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<string, bufferlist> 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<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) {
@@ -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<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 << "~"
@@ -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;
index ffd4648b9cb5cb8454c43dded3e5f966bc854ddd..66e5631aed44ba671da5e707e9628eab9cf8c3ab 100644 (file)
@@ -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<ObjectStore::Transaction*>& ls, uint64_t seq,