]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: follow olh if needed
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 17 Sep 2014 16:52:44 +0000 (09:52 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 16 Jan 2015 22:36:24 +0000 (14:36 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index e6bf8eb7c64c90cee64305c1314fe5e7fd9d4453..53c42083c7e416f823444bd1078931fd83735e2f 100644 (file)
@@ -4028,13 +4028,35 @@ static bool is_olh(map<string, bufferlist>& attrs)
   return (iter != attrs.end());
 }
 
+int RGWRados::get_olh_target_state(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState *olh_state,
+                                   RGWObjState **target_state, RGWObjVersionTracker *objv_tracker)
+{
+  assert(olh_state->is_olh);
+
+  rgw_obj target;
+  int r = RGWRados::follow_olh((void *)rctx, olh_state, obj, &target); /* might return -EAGAIN */
+  if (r < 0) {
+    return r;
+  }
+  r = get_obj_state(rctx, target, target_state, objv_tracker, false);
+  if (r < 0) {
+    return r;
+  }
+
+  return 0;
+}
+
 int RGWRados::get_obj_state_impl(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState **state, RGWObjVersionTracker *objv_tracker, bool follow_olh)
 {
   RGWObjState *s = rctx->get_state(obj);
   ldout(cct, 20) << "get_obj_state: rctx=" << (void *)rctx << " obj=" << obj << " state=" << (void *)s << " s->prefetch_data=" << s->prefetch_data << dendl;
   *state = s;
-  if (s->has_attrs)
+  if (s->has_attrs) {
+    if (s->is_olh && follow_olh) {
+      return get_olh_target_state(rctx, obj, s, state, objv_tracker);
+    }
     return 0;
+  }
 
   int r = raw_obj_stat(obj, &s->size, &s->mtime, &s->epoch, &s->attrset, (s->prefetch_data ? &s->data : NULL), objv_tracker);
   if (r == -ENOENT) {
@@ -4095,15 +4117,7 @@ int RGWRados::get_obj_state_impl(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState **
     s->is_olh = true;
 
     if (follow_olh) {
-      rgw_obj target;
-      r = RGWRados::follow_olh((void *)rctx, s, obj, &target); /* might return -EAGAIN */
-      if (r < 0) {
-        return r;
-      }
-      r = get_obj_state(rctx, target, state, objv_tracker, false);
-      if (r < 0) {
-        return r;
-      }
+      return get_olh_target_state(rctx, obj, s, state, objv_tracker);
     }
   }
 
index 535b827795c6d901ee7a1d5c9f582ab3d80a8992..fa12e1e402aae9c13ebd8a9a3569e32ca477604f 100644 (file)
@@ -741,6 +741,9 @@ struct RGWObjState {
   bool prefetch_data;
   bool keep_tail;
   bool is_olh;
+
+  /* important! don't forget to update copy constructor */
+
   RGWObjVersionTracker objv_tracker;
 
   map<string, bufferlist> attrset;
@@ -770,6 +773,7 @@ struct RGWObjState {
     }
     prefetch_data = rhs.prefetch_data;
     keep_tail = rhs.keep_tail;
+    is_olh = rhs.is_olh;
     objv_tracker = rhs.objv_tracker;
   }
 
@@ -1331,6 +1335,8 @@ class RGWRados
   int get_obj_ref(const rgw_obj& obj, rgw_rados_ref *ref, rgw_bucket *bucket, bool ref_system_obj = false);
   uint64_t max_bucket_id;
 
+  int get_olh_target_state(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState *olh_state,
+                           RGWObjState **target_state, RGWObjVersionTracker *objv_tracker);
   int get_obj_state_impl(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState **state, RGWObjVersionTracker *objv_tracker, bool follow_olh);
   int get_obj_state(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState **state, RGWObjVersionTracker *objv_tracker, bool follow_olh);
   int get_obj_state(RGWRadosCtx *rctx, rgw_obj& obj, RGWObjState **state, RGWObjVersionTracker *objv_tracker) {