From dee7505d4697e92c72adccd9c78de00787f76d99 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 5 Aug 2015 14:58:17 -0700 Subject: [PATCH] rgw: add a generic op to pull data off metadata obj Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_sync.cc | 66 +++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/src/rgw/rgw_sync.cc b/src/rgw/rgw_sync.cc index c67b2fdaaac1f..13df181ef1c9b 100644 --- a/src/rgw/rgw_sync.cc +++ b/src/rgw/rgw_sync.cc @@ -527,54 +527,53 @@ int RGWSimpleAsyncOp::state_all_complete() return set_state(Done); } -class RGWReadSyncStatusOp : public RGWSimpleAsyncOp { +template +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 +int RGWSimpleRadosAsyncOp::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 +int RGWSimpleRadosAsyncOp::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 { + 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; -- 2.39.5