]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add pg_ver to tombstone_cache 10293/head
authorCasey Bodley <cbodley@redhat.com>
Tue, 21 Jun 2016 19:09:53 +0000 (15:09 -0400)
committerAbhishek Lekshmanan <abhishek@suse.com>
Thu, 14 Jul 2016 08:07:24 +0000 (10:07 +0200)
a tombstone cache was added to remember the mtime of deleted objects for
use with the HTTP_IF_MODIFIED_SINCE header, but the comparison was still
failing because of a missing pg_ver. added pg_ver to the tombstone cache
so it can be passed with HTTP_DEST_PG_VER

Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit adb529f2fb983df671a1db58a0b17862a29762f0)

src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 64b3f92c5e1532e18c0a06dff550b075bd0da97c..a76c276bb2cf6ed6a007894bd0301d0a8d78fda9 100644 (file)
@@ -7568,9 +7568,9 @@ int RGWRados::Object::Delete::delete_obj()
   int64_t poolid = ref.ioctx.get_id();
   if (r >= 0) {
     tombstone_cache_t *obj_tombstone_cache = store->get_tombstone_cache();
-    pair<ceph::real_time, uint32_t> tombstone_entry = make_pair<>(state->mtime, state->zone_short_id);
     if (obj_tombstone_cache) {
-      obj_tombstone_cache->add(obj, tombstone_entry);
+      tombstone_entry entry{*state};
+      obj_tombstone_cache->add(obj, entry);
     }
     r = index_op.complete_del(poolid, ref.ioctx.get_last_version(), state->mtime, params.remove_objs);
   } else {
@@ -7792,11 +7792,13 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState *
   if (r == -ENOENT) {
     s->exists = false;
     s->has_attrs = true;
-    pair<ceph::real_time, uint32_t> tombstone_entry;
-    if (obj_tombstone_cache && obj_tombstone_cache->find(obj, tombstone_entry)) {
-      s->mtime = tombstone_entry.first;
-      s->zone_short_id = tombstone_entry.second;
-      ldout(cct, 20) << __func__ << "(): found obj in tombstone cache: obj=" << obj << " mtime=" << s->mtime << dendl;
+    tombstone_entry entry;
+    if (obj_tombstone_cache && obj_tombstone_cache->find(obj, entry)) {
+      s->mtime = entry.mtime;
+      s->zone_short_id = entry.zone_short_id;
+      s->pg_ver = entry.pg_ver;
+      ldout(cct, 20) << __func__ << "(): found obj in tombstone cache: obj=" << obj
+          << " mtime=" << s->mtime << " pgv=" << s->pg_ver << dendl;
     } else {
       s->mtime = real_time();
     }
index 3543b33742d61a9b3e97888d7de582cddefac2bb..9704fb6d1d61ba7dd48d404715f782fdc8a21c7e 100644 (file)
@@ -1700,6 +1700,17 @@ struct bucket_info_entry {
   map<string, bufferlist> attrs;
 };
 
+struct tombstone_entry {
+  ceph::real_time mtime;
+  uint32_t zone_short_id;
+  uint64_t pg_ver;
+
+  tombstone_entry() = default;
+  tombstone_entry(const RGWObjState& state)
+    : mtime(state.mtime), zone_short_id(state.zone_short_id),
+      pg_ver(state.pg_ver) {}
+};
+
 class RGWRados
 {
   friend class RGWGC;
@@ -1809,7 +1820,7 @@ protected:
   using RGWChainedCacheImpl_bucket_info_entry = RGWChainedCacheImpl<bucket_info_entry>;
   RGWChainedCacheImpl_bucket_info_entry *binfo_cache;
 
-  using tombstone_cache_t = lru_map<rgw_obj, pair<ceph::real_time, uint32_t> >;
+  using tombstone_cache_t = lru_map<rgw_obj, tombstone_entry>;
   tombstone_cache_t *obj_tombstone_cache;
 
   librados::IoCtx gc_pool_ctx;        // .rgw.gc