]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: add a generic op to pull data off metadata obj
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 5 Aug 2015 21:58:17 +0000 (14:58 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 9 Feb 2016 20:59:41 +0000 (12:59 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_sync.cc

index c67b2fdaaac1f01c9042e1d24c438f3248dbf55f..13df181ef1c9b20ca98188274ab6a23e2b62fedc 100644 (file)
@@ -527,54 +527,53 @@ int RGWSimpleAsyncOp::state_all_complete()
   return set_state(Done);
 }
 
-class RGWReadSyncStatusOp : public RGWSimpleAsyncOp {
+template <class T>
+class RGWSimpleRadosAsyncOp : public RGWSimpleAsyncOp {
   RGWAsyncRadosProcessor *async_rados;
   RGWRados *store;
   RGWObjectCtx& obj_ctx;
   bufferlist bl;
 
-  RGWMetaSyncGlobalStatus *global_status;
-  rgw_obj global_status_obj;
+  rgw_bucket pool;
+  string oid;
+
+  T *result;
 
-  RGWMetaSyncStatusManager sync_store;
   RGWAsyncGetSystemObj *req;
 
 public:
-  RGWReadSyncStatusOp(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
+  RGWSimpleRadosAsyncOp(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
                      RGWObjectCtx& _obj_ctx,
-                     RGWMetaSyncGlobalStatus *_gs) : RGWSimpleAsyncOp(_store->ctx()),
+                     rgw_bucket& _pool, const string& _oid,
+                     T *_result) : RGWSimpleAsyncOp(_store->ctx()),
                                                 async_rados(_async_rados), store(_store),
-                                                obj_ctx(_obj_ctx), global_status(_gs),
-                                                sync_store(_store), req(NULL) {}
+                                                obj_ctx(_obj_ctx),
+                                               pool(_pool), oid(_oid),
+                                               result(_result),
+                                                req(NULL) { }
                                                          
-  ~RGWReadSyncStatusOp() {
+  ~RGWSimpleRadosAsyncOp() {
     delete req;
   }
 
-  int init();
   int send_request();
   int request_complete();
 };
 
-int RGWReadSyncStatusOp::init()
-{
-  string global_status_oid = "mdlog.state.global";
-  global_status_obj = rgw_obj(store->get_zone_params().log_pool, global_status_oid);
-
-  return 0;
-}
-
-int RGWReadSyncStatusOp::send_request()
+template <class T>
+int RGWSimpleRadosAsyncOp<T>::send_request()
 {
+  rgw_obj obj = rgw_obj(pool, oid);
   req = new RGWAsyncGetSystemObj(env->stack->create_completion_notifier(),
                                 store, &obj_ctx, NULL,
-                                global_status_obj,
+                                obj,
                                 &bl, 0, -1);
   async_rados->queue(req);
   return 0;
 }
 
-int RGWReadSyncStatusOp::request_complete()
+template <class T>
+int RGWSimpleRadosAsyncOp<T>::request_complete()
 {
   int ret = req->get_ret_status();
   if (ret != -ENOENT) {
@@ -583,17 +582,38 @@ int RGWReadSyncStatusOp::request_complete()
     }
     bufferlist::iterator iter = bl.begin();
     try {
-      ::decode(*global_status, iter);
+      ::decode(*result, iter);
     } catch (buffer::error& err) {
       ldout(store->ctx(), 0) << "ERROR: failed to decode global mdlog status" << dendl;
     }
   } else {
-    *global_status = RGWMetaSyncGlobalStatus();
+    *result = T();
   }
 
   return 0;
 }
 
+class RGWReadSyncStatusOp : public RGWSimpleRadosAsyncOp<RGWMetaSyncGlobalStatus> {
+  RGWAsyncRadosProcessor *async_rados;
+  RGWRados *store;
+  RGWObjectCtx& obj_ctx;
+
+  RGWMetaSyncGlobalStatus *global_status;
+
+public:
+  RGWReadSyncStatusOp(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
+                     RGWObjectCtx& _obj_ctx,
+                     RGWMetaSyncGlobalStatus *_gs) : RGWSimpleRadosAsyncOp(_async_rados, _store, _obj_ctx,
+                                                                           _store->get_zone_params().log_pool,
+                                                                           "mdlog.state.global",
+                                                                           _gs),
+                                                      async_rados(_async_rados), store(_store),
+                                                      obj_ctx(_obj_ctx), global_status(_gs) {}
+
+  ~RGWReadSyncStatusOp() {
+  }
+};
+
 class RGWMetaSyncOp : public RGWAsyncOp {
   RGWRados *store;
   RGWMetadataLog *mdlog;