From bfebd245915394873107305cdd515436a0e9062c Mon Sep 17 00:00:00 2001 From: Shilpa Jagannath Date: Fri, 11 Nov 2022 15:34:49 -0500 Subject: [PATCH] rgw/multisite: take the bucket lease before checking if bucket sync is enabled/disabled Signed-off-by: Shilpa Jagannath --- src/rgw/driver/rados/rgw_data_sync.cc | 35 +++++++++++++++------------ 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/rgw/driver/rados/rgw_data_sync.cc b/src/rgw/driver/rados/rgw_data_sync.cc index e51690974eb..758327f95ad 100644 --- a/src/rgw/driver/rados/rgw_data_sync.cc +++ b/src/rgw/driver/rados/rgw_data_sync.cc @@ -5652,30 +5652,33 @@ int RGWSyncBucketCR::operate(const DoutPrefixProvider *dpp) ". lease is: " << (bucket_lease_cr ? "taken" : "not taken") << ". stop indications is: " << bucket_stopped)); if (bucket_status.state != BucketSyncState::Incremental || - bucket_stopped) { + bucket_stopped) { + + if (!bucket_lease_cr) { + bucket_lease_cr.reset(new RGWContinuousLeaseCR(env->async_rados, env->driver, status_obj, + lock_name, lock_duration, this, &sc->lcc)); + yield spawn(bucket_lease_cr.get(), false); + while (!bucket_lease_cr->is_locked()) { + if (bucket_lease_cr->is_done()) { + tn->log(5, "failed to take lease"); + set_status("lease lock failed, early abort"); + drain_all(); + return set_cr_error(bucket_lease_cr->get_ret_status()); + } + tn->log(5, "waiting on bucket lease"); + yield set_sleeping(true); + } + } + // if state is Init or Stopped, we query the remote RGW for ther state yield call(new RGWReadRemoteBucketIndexLogInfoCR(sc, sync_pair.source_bs.bucket, &info)); if (retcode < 0) { + RELEASE_LOCK(bucket_lease_cr); return set_cr_error(retcode); } if (info.syncstopped) { // remote indicates stopped state tn->log(20, "remote bilog indicates that sync was stopped"); - if (!bucket_lease_cr) { - bucket_lease_cr.reset(new RGWContinuousLeaseCR(env->async_rados, env->driver, status_obj, - lock_name, lock_duration, this, &sc->lcc)); - yield spawn(bucket_lease_cr.get(), false); - while (!bucket_lease_cr->is_locked()) { - if (bucket_lease_cr->is_done()) { - tn->log(5, "failed to take lease"); - set_status("lease lock failed, early abort"); - drain_all(); - return set_cr_error(bucket_lease_cr->get_ret_status()); - } - tn->log(5, "waiting on bucket lease"); - yield set_sleeping(true); - } - } // if state was incremental, remove all per-shard status objects if (bucket_status.state == BucketSyncState::Incremental) { -- 2.39.5