]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: hide the completion manager
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 22 Jul 2015 22:57:26 +0000 (15:57 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 9 Feb 2016 20:58:59 +0000 (12:58 -0800)
some more layer separation

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

index c05c53cd2188401bfa614933aa4b48aa8f6c9f64..455adaee6585b7aec7d0b7271c27a6cea648e4d9 100644 (file)
@@ -205,8 +205,8 @@ class RGWCloneMetaLogOp : public RGWAsyncOp {
     Error = 5,
   } state;
 public:
-  RGWCloneMetaLogOp(RGWRados *_store, RGWHTTPManager *_mgr, RGWCompletionManager *_completion_mgr,
-                   int _id, const string& _marker) : RGWAsyncOp(_completion_mgr), store(_store),
+  RGWCloneMetaLogOp(RGWRados *_store, RGWHTTPManager *_mgr, RGWAsyncOpsManager *_ops_mgr,
+                   int _id, const string& _marker) : RGWAsyncOp(_ops_mgr), store(_store),
                                                       http_manager(_mgr), shard_id(_id),
                                                       marker(_marker), truncated(false), max_entries(CLONE_MAX_ENTRIES),
                                                      http_op(NULL), md_op_notifier(NULL),
@@ -276,11 +276,16 @@ int RGWAsyncOpsManager::run(list<RGWAsyncOp *>& ops)
   return 0;
 }
 
+AioCompletionNotifier *RGWAsyncOpsManager::create_completion_notifier(RGWAsyncOp *op)
+{
+  return new AioCompletionNotifier(&completion_mgr, (void *)op);
+}
+
 int RGWRemoteMetaLog::clone_shards()
 {
   list<RGWAsyncOp *> ops;
   for (int i = 0; i < (int)log_info.num_shards; i++) {
-    RGWCloneMetaLogOp *op = new RGWCloneMetaLogOp(store, &http_manager, &completion_mgr, i, clone_markers[i]);
+    RGWCloneMetaLogOp *op = new RGWCloneMetaLogOp(store, &http_manager, this, i, clone_markers[i]);
     ops.push_back(op);
   }
 
@@ -396,10 +401,11 @@ int RGWCloneMetaLogOp::state_sent_rest_request()
 
   state = StoringMDLogEntries;
 
-  md_op_notifier = new AioCompletionNotifier(completion_mgr, (void *)this);
+  AioCompletionNotifier *cn = ops_mgr->create_completion_notifier(this);
 
-  ret = store->meta_mgr->store_md_log_entries(dest_entries, shard_id, md_op_notifier->completion());
+  ret = store->meta_mgr->store_md_log_entries(dest_entries, shard_id, cn->completion());
   if (ret < 0) {
+    cn->put();
     state = Error;
     ldout(store->ctx(), 10) << "failed to store md log entries shard_id=" << shard_id << " ret=" << ret << dendl;
     return ret;
index ad98b1ded45641779999a2417ce122117f28ca83..65680c99abb480eaf2b9724a62b6ccc71b996334 100644 (file)
@@ -22,9 +22,12 @@ struct rgw_mdlog_info {
 
 #define RGW_ASYNC_OPS_MGR_WINDOW 16
 
+class RGWAsyncOpsManager;
+class AioCompletionNotifier;
+
 class RGWAsyncOp {
 protected:
-  RGWCompletionManager *completion_mgr;
+  RGWAsyncOpsManager *ops_mgr;
 
   bool blocked;
 
@@ -33,7 +36,7 @@ protected:
   void set_blocked(int flag) { blocked = flag; }
 
 public:
-  RGWAsyncOp(RGWCompletionManager *_completion_mgr) : completion_mgr(_completion_mgr), blocked(false) {}
+  RGWAsyncOp(RGWAsyncOpsManager *_ops_mgr) : ops_mgr(_ops_mgr), blocked(false) {}
   virtual ~RGWAsyncOp() {}
 
   virtual int operate() = 0;
@@ -57,12 +60,15 @@ protected:
 
   int ops_window;
 
+  void put_completion_notifier(AioCompletionNotifier *cn);
 public:
   RGWAsyncOpsManager(CephContext *_cct) : cct(_cct), ops_window(RGW_ASYNC_OPS_MGR_WINDOW) {}
   virtual ~RGWAsyncOpsManager() {}
 
   int run(list<RGWAsyncOp *>& ops);
   virtual void report_error(RGWAsyncOp *op);
+
+  AioCompletionNotifier *create_completion_notifier(RGWAsyncOp *op);
 };
 
 class RGWRemoteMetaLog : public RGWAsyncOpsManager {