return r;
}
- num_shards = sync_status.sync_info.num_shards;
+ int num_shards = master_log.get_sync_status().sync_info.num_shards;
for (int i = 0; i < num_shards; i++) {
shard_objs[i] = rgw_obj(store->get_zone_params().log_pool, sync_env.shard_obj_name(i));
env->error_logger = error_logger;
}
-int RGWRemoteMetaLog::read_sync_status(rgw_meta_sync_status *sync_status)
+int RGWRemoteMetaLog::read_sync_status()
{
if (store->is_meta_master()) {
return 0;
}
RGWObjectCtx obj_ctx(store, NULL);
- return run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, sync_status));
+ return run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_status));
}
-int RGWRemoteMetaLog::init_sync_status(int num_shards)
+int RGWRemoteMetaLog::init_sync_status()
{
if (store->is_meta_master()) {
return 0;
}
+ auto num_shards = sync_status.sync_info.num_shards;
if (!num_shards) {
rgw_mdlog_info mdlog_info;
int r = read_log_info(&mdlog_info);
}
RGWObjectCtx obj_ctx(store, NULL);
- return run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx, num_shards));
+ return run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx,
+ sync_status.sync_info.num_shards));
}
-int RGWRemoteMetaLog::set_sync_info(const rgw_meta_sync_info& sync_info)
+int RGWRemoteMetaLog::store_sync_info()
{
return run(new RGWSimpleRadosWriteCR<rgw_meta_sync_info>(async_rados, store, store->get_zone_params().log_pool,
- sync_env.status_oid(), sync_info));
+ sync_env.status_oid(), sync_status.sync_info));
}
-int RGWRemoteMetaLog::run_sync(int num_shards, rgw_meta_sync_status& sync_status)
+int RGWRemoteMetaLog::run_sync()
{
if (store->is_meta_master()) {
return 0;
return r;
}
- if (!num_shards) {
- num_shards = mdlog_info.num_shards;
- } else if ((uint32_t)num_shards != mdlog_info.num_shards) {
- lderr(store->ctx()) << "ERROR: can't sync, mismatch between num shards, master num_shards=" << mdlog_info.num_shards << " local num_shards=" << num_shards << dendl;
- return r;
- }
-
do {
r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_status));
if (r < 0 && r != -ENOENT) {
if (sync_status.sync_info.state == rgw_meta_sync_info::StateInit) {
ldout(store->ctx(), 20) << __func__ << "(): init" << dendl;
- r = run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx, num_shards));
+ r = run(new RGWInitSyncStatusCoroutine(&sync_env, obj_ctx,
+ sync_status.sync_info.num_shards));
if (r == -EBUSY) {
backoff.backoff_sleep();
continue;
}
} while (sync_status.sync_info.state == rgw_meta_sync_info::StateInit);
+ auto num_shards = sync_status.sync_info.num_shards;
+ if (num_shards != mdlog_info.num_shards) {
+ lderr(store->ctx()) << "ERROR: can't sync, mismatch between num shards, master num_shards=" << mdlog_info.num_shards << " local num_shards=" << num_shards << dendl;
+ return r;
+ }
+
do {
r = run(new RGWReadSyncStatusCoroutine(&sync_env, obj_ctx, &sync_status));
if (r < 0 && r != -ENOENT) {
}
sync_status.sync_info.state = rgw_meta_sync_info::StateSync;
- r = set_sync_info(sync_status.sync_info);
+ r = store_sync_info();
if (r < 0) {
ldout(store->ctx(), 0) << "ERROR: failed to update sync status" << dendl;
return r;
RGWSyncBackoff backoff;
RGWMetaSyncEnv sync_env;
+ rgw_meta_sync_status sync_status;
void init_sync_env(RGWMetaSyncEnv *env);
+ int store_sync_info();
atomic_t going_down;
void finish();
int read_log_info(rgw_mdlog_info *log_info);
- int read_sync_status(rgw_meta_sync_status *sync_status);
- int init_sync_status(int num_shards);
- int set_sync_info(const rgw_meta_sync_info& sync_info);
- int run_sync(int num_shards, rgw_meta_sync_status& sync_status);
+ int read_sync_status();
+ int init_sync_status();
+ int run_sync();
void wakeup(int shard_id);
RGWMetaSyncEnv& get_sync_env() {
return sync_env;
}
+ const rgw_meta_sync_status& get_sync_status() const { return sync_status; }
};
class RGWMetaSyncStatusManager {
RGWRemoteMetaLog master_log;
- rgw_meta_sync_status sync_status;
map<int, rgw_obj> shard_objs;
- int num_shards;
-
struct utime_shard {
utime_t ts;
int shard_id;
public:
RGWMetaSyncStatusManager(RGWRados *_store, RGWAsyncRadosProcessor *async_rados)
: store(_store), master_log(store, async_rados, this),
- num_shards(0), ts_to_shard_lock("ts_to_shard_lock") {}
+ ts_to_shard_lock("ts_to_shard_lock") {}
int init();
void finish();
- rgw_meta_sync_status& get_sync_status() { return sync_status; }
+ const rgw_meta_sync_status& get_sync_status() const {
+ return master_log.get_sync_status();
+ }
- int read_sync_status() { return master_log.read_sync_status(&sync_status); }
- int init_sync_status() { return master_log.init_sync_status(num_shards); }
+ int read_sync_status() { return master_log.read_sync_status(); }
+ int init_sync_status() { return master_log.init_sync_status(); }
- int run() { return master_log.run_sync(num_shards, sync_status); }
+ int run() { return master_log.run_sync(); }
void wakeup(int shard_id) { return master_log.wakeup(shard_id); }
void stop() {