public:
RGWDataSyncShardControlCR(RGWDataSyncEnv *_sync_env, rgw_bucket& _pool,
- uint32_t _shard_id, rgw_data_sync_marker& _marker) : RGWBackoffControlCR(_sync_env->cct),
+ uint32_t _shard_id, rgw_data_sync_marker& _marker) : RGWBackoffControlCR(_sync_env->cct, false),
sync_env(_sync_env),
pool(_pool),
shard_id(_shard_id),
reset_backoff(_reset_backoff) {
}
+ ~RGWDataSyncCR() {
+ for (auto iter : shard_crs) {
+ iter.second->put();
+ }
+ }
+
int operate() {
reenter(this) {
iter != sync_status.sync_markers.end(); ++iter) {
RGWDataSyncShardControlCR *cr = new RGWDataSyncShardControlCR(sync_env, sync_env->store->get_zone_params().log_pool,
iter->first, iter->second);
+ cr->get();
shard_crs_lock.Lock();
shard_crs[iter->first] = cr;
shard_crs_lock.Unlock();
uint32_t num_shards;
public:
- RGWDataSyncControlCR(RGWDataSyncEnv *_sync_env, uint32_t _num_shards) : RGWBackoffControlCR(_sync_env->cct),
+ RGWDataSyncControlCR(RGWDataSyncEnv *_sync_env, uint32_t _num_shards) : RGWBackoffControlCR(_sync_env->cct, true),
sync_env(_sync_env), num_shards(_num_shards) {
}
}
if (retcode < 0 && retcode != -EBUSY && retcode != -EAGAIN) {
ldout(cct, 0) << "ERROR: RGWBackoffControlCR called coroutine returned " << retcode << dendl;
- return set_cr_error(retcode);
+ if (exit_on_error) {
+ return set_cr_error(retcode);
+ }
}
if (reset_backoff) {
backoff.reset();
yield call(finisher_cr);
if (retcode < 0) {
ldout(cct, 0) << "ERROR: call to finisher_cr() failed: retcode=" << retcode << dendl;
- return set_cr_error(retcode);
+ if (exit_on_error) {
+ return set_cr_error(retcode);
+ }
}
}
}
const std::string& period, RGWMetadataLog* mdlog,
uint32_t _shard_id, const rgw_meta_sync_marker& _marker,
std::string&& period_marker)
- : RGWBackoffControlCR(_sync_env->cct), sync_env(_sync_env),
+ : RGWBackoffControlCR(_sync_env->cct, true), sync_env(_sync_env),
pool(_pool), period(period), mdlog(mdlog), shard_id(_shard_id),
sync_marker(_marker), period_marker(std::move(period_marker)),
obj_ctx(sync_env->store) {}
RGWSyncBackoff backoff;
bool reset_backoff;
+ bool exit_on_error;
+
protected:
bool *backoff_ptr() {
return &reset_backoff;
}
public:
- RGWBackoffControlCR(CephContext *_cct) : RGWCoroutine(_cct), cr(NULL), lock("RGWBackoffControlCR::lock"), reset_backoff(false) {
+ RGWBackoffControlCR(CephContext *_cct, bool _exit_on_error) : RGWCoroutine(_cct), cr(NULL), lock("RGWBackoffControlCR::lock"),
+ reset_backoff(false), exit_on_error(_exit_on_error) {
}
virtual ~RGWBackoffControlCR() {