]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: keep pg ver on obj state, and send it in HEAD request
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 23 Dec 2015 19:43:22 +0000 (11:43 -0800)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 12 Feb 2016 00:13:48 +0000 (16:13 -0800)
send it in HEAD request if it was done by the system user

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_s3.cc

index 4da29aa148dc428fb857a427ff399fb749eb5132..145bbd588c808d97681eadfcb778164ba412cb9c 100644 (file)
@@ -7429,7 +7429,7 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState *
       s->has_manifest = true;
       s->size = s->manifest.get_obj_size();
     } catch (buffer::error& err) {
-      ldout(cct, 20) << "ERROR: couldn't decode manifest" << dendl;
+      ldout(cct, 0) << "ERROR: couldn't decode manifest" << dendl;
       return -EIO;
     }
     ldout(cct, 10) << "manifest: total_size = " << s->manifest.get_obj_size() << dendl;
@@ -7449,6 +7449,15 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState *
       s->fake_tag = true;
     }
   }
+  bufferlist pg_ver_bl = s->attrset[RGW_ATTR_PG_VER];
+  if (pg_ver_bl.length()) {
+    bufferlist::iterator pgbl = pg_ver_bl.begin();
+    try {
+      ::decode(s->pg_ver, pgbl);
+    } catch (buffer::error& err) {
+      ldout(cct, 0) << "ERROR: couldn't decode pg ver attr for object " << s->obj << ", non-critical error, ignoring" << dendl;
+    }
+  }
   if (s->obj_tag.length())
     ldout(cct, 20) << "get_obj_state: setting s->obj_tag to " << string(s->obj_tag.c_str(), s->obj_tag.length()) << dendl;
   else
index db9100b0696a938af87c2a52a0fe7fa15eebbf76..2d38066b32065bc315f05cc4e3e08e9848c11c6a 100644 (file)
@@ -627,6 +627,7 @@ struct RGWObjState {
   bool keep_tail;
   bool is_olh;
   bufferlist olh_tag;
+  uint64_t pg_ver;
 
   /* important! don't forget to update copy constructor */
 
@@ -635,7 +636,8 @@ struct RGWObjState {
   map<string, bufferlist> attrset;
   RGWObjState() : is_atomic(false), has_attrs(0), exists(false),
                   size(0), mtime(0), epoch(0), fake_tag(false), has_manifest(false),
-                  has_data(false), prefetch_data(false), keep_tail(false), is_olh(false) {}
+                  has_data(false), prefetch_data(false), keep_tail(false), is_olh(false),
+                  pg_ver(0) {}
   RGWObjState(const RGWObjState& rhs) : obj (rhs.obj) {
     is_atomic = rhs.is_atomic;
     has_attrs = rhs.has_attrs;
@@ -661,6 +663,7 @@ struct RGWObjState {
     keep_tail = rhs.keep_tail;
     is_olh = rhs.is_olh;
     objv_tracker = rhs.objv_tracker;
+    pg_ver = rhs.pg_ver;
   }
 
   bool get_attr(string name, bufferlist& dest) {
@@ -671,19 +674,6 @@ struct RGWObjState {
     }
     return false;
   }
-
-  void clear() {
-    has_attrs = false;
-    exists = false;
-    fake_tag = false;
-    epoch = 0;
-    size = 0;
-    mtime = 0;
-    obj_tag.clear();
-    shadow_obj.clear();
-    attrset.clear();
-    data.clear();
-  }
 };
 
 struct RGWPoolIterCtx {
index aa4a1702f46ab2e3dc269029bda00ed2a0242dd6..b0c6d24d45a6c446d50133acd11823c84de96215 100644 (file)
@@ -141,6 +141,18 @@ int RGWGetObj_ObjStore_S3::send_response_data(bufferlist& bl, off_t bl_ofs, off_
   if (s->system_request && lastmod) {
     /* we end up dumping mtime in two different methods, a bit redundant */
     dump_epoch_header(s, "Rgwx-Mtime", lastmod);
+    uint64_t pg_ver = 0;
+    map<string, bufferlist>::iterator iter = attrs.find(RGW_ATTR_PG_VER);
+    bufferlist& bl = iter->second;
+    if (bl.length() > 0) {
+      bufferlist::iterator bliter = bl.begin();
+      try {
+        ::decode(pg_ver, bliter);
+      } catch (buffer::error& err) {
+        ldout(s->cct, 0) << "ERROR: failed to decode pg ver attr" << dendl;
+      }
+    }
+    s->cio->print("Rgwx-Obj-PG-Ver: %lld\r\n", (long long)pg_ver);
   }
 
   dump_content_length(s, total_len);