]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RGWDataSyncStatusManager, cleanup if failing init
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 3 May 2016 01:13:17 +0000 (18:13 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Mon, 9 May 2016 21:36:40 +0000 (14:36 -0700)
init can be called more than once, ended up with leaking some resources

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_data_sync.cc
src/rgw/rgw_data_sync.h
src/rgw/rgw_rados.cc

index 74e2498f24a89a5c4c389b9eb976f40808d2f3d4..8a483ff77c4f3c88e25998486703fadac91d3b00 100644 (file)
@@ -1354,6 +1354,7 @@ int RGWDataSyncStatusManager::init()
   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;
   }
 
@@ -1361,6 +1362,7 @@ int RGWDataSyncStatusManager::init()
   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;
   }
 
@@ -1373,6 +1375,13 @@ int RGWDataSyncStatusManager::init()
   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];
index a2b2451db0a013171becf715a920c8b7c4115633..33b723ac37834f9068ede52098c04fef4632d410 100644 (file)
@@ -242,9 +242,10 @@ public:
     : 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; }
 
index 977a70a552ca95f0848dd205f641ba8f9c3f98e0..6803ebfc228fd93307f89c8b64496524852528e6 100644 (file)
@@ -2947,7 +2947,10 @@ public:
   }
 
   int process() {
-    while (!going_down()) {
+    while (!initialized) {
+      if (going_down()) {
+        return 0;
+      }
       int ret = sync.init();
       if (ret >= 0) {
         initialized = true;