]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: pool_iterate[_begin] catches NObjectIterator exceptions
authorCasey Bodley <cbodley@redhat.com>
Tue, 13 Nov 2018 21:50:34 +0000 (16:50 -0500)
committerCasey Bodley <cbodley@redhat.com>
Tue, 27 Nov 2018 18:01:05 +0000 (13:01 -0500)
Fixes: http://tracker.ceph.com/issues/37091
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 99cbdf522a8d13e2bbe37ee72d1c576833e2cd0b)

src/rgw/rgw_rados.cc

index f123514e470e29f3677cf63d4f394202cabfad7c..7c1fbb17e2c704ac37f3d02ac58242004b7cdd49 100644 (file)
@@ -12591,9 +12591,19 @@ int RGWRados::pool_iterate_begin(const rgw_pool& pool, const string& cursor, RGW
     return -EINVAL;
   }
 
-  iter = io_ctx.nobjects_begin(oc);
-
-  return 0;
+  try {
+    iter = io_ctx.nobjects_begin(oc);
+    return 0;
+  } catch (const std::system_error& e) {
+    r = -e.code().value();
+    ldout(cct, 10) << "nobjects_begin threw " << e.what()
+       << ", returning " << r << dendl;
+    return r;
+  } catch (const std::exception& e) {
+    ldout(cct, 10) << "nobjects_begin threw " << e.what()
+       << ", returning -5" << dendl;
+    return -EIO;
+  }
 }
 
 string RGWRados::pool_iterate_get_cursor(RGWPoolIterCtx& ctx)
@@ -12601,7 +12611,8 @@ string RGWRados::pool_iterate_get_cursor(RGWPoolIterCtx& ctx)
   return ctx.iter.get_cursor().to_str();
 }
 
-int RGWRados::pool_iterate(RGWPoolIterCtx& ctx, uint32_t num, vector<rgw_bucket_dir_entry>& objs,
+static int do_pool_iterate(CephContext* cct, RGWPoolIterCtx& ctx, uint32_t num,
+                           vector<rgw_bucket_dir_entry>& objs,
                            bool *is_truncated, RGWAccessListFilter *filter)
 {
   librados::IoCtx& io_ctx = ctx.io_ctx;
@@ -12640,6 +12651,24 @@ struct RGWAccessListFilterPrefix : public RGWAccessListFilter {
   }
 };
 
+int RGWRados::pool_iterate(RGWPoolIterCtx& ctx, uint32_t num, vector<rgw_bucket_dir_entry>& objs,
+                           bool *is_truncated, RGWAccessListFilter *filter)
+{
+  // catch exceptions from NObjectIterator::operator++()
+  try {
+    return do_pool_iterate(cct, ctx, num, objs, is_truncated, filter);
+  } catch (const std::system_error& e) {
+    int r = -e.code().value();
+    ldout(cct, 10) << "NObjectIterator threw exception " << e.what()
+       << ", returning " << r << dendl;
+    return r;
+  } catch (const std::exception& e) {
+    ldout(cct, 10) << "NObjectIterator threw exception " << e.what()
+       << ", returning -5" << dendl;
+    return -EIO;
+  }
+}
+
 int RGWRados::list_raw_objects_init(const rgw_pool& pool, const string& marker, RGWListRawObjsCtx *ctx)
 {
   if (!ctx->initialized) {