init can be called more than once, ended up with leaking some resources
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
r = source_log.init(source_zone, conn, error_logger);
if (r < 0) {
lderr(store->ctx()) << "ERROR: failed to init remote log, r=" << r << dendl;
+ finalize();
return r;
}
r = source_log.read_log_info(&datalog_info);
if (r < 0) {
ldout(store->ctx(), 5) << "ERROR: master.read_log_info() returned r=" << r << dendl;
+ finalize();
return r;
}
return 0;
}
+void RGWDataSyncStatusManager::finalize()
+{
+ delete error_logger;
+ error_logger = nullptr;
+ ioctx.close();
+}
+
string RGWDataSyncStatusManager::sync_status_oid(const string& source_zone)
{
char buf[datalog_sync_status_oid_prefix.size() + source_zone.size() + 16];
: store(_store), source_zone(_source_zone), conn(NULL), error_logger(NULL),
source_log(store, async_rados), num_shards(0) {}
~RGWDataSyncStatusManager() {
- delete error_logger;
+ finalize();
}
int init();
+ void finalize();
rgw_data_sync_status& get_sync_status() { return sync_status; }
}
int process() {
- while (!going_down()) {
+ while (!initialized) {
+ if (going_down()) {
+ return 0;
+ }
int ret = sync.init();
if (ret >= 0) {
initialized = true;