From 8087cfa8e964bced29e70e3a10942343affd2b6d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Mon, 11 Apr 2016 20:58:50 -0400 Subject: [PATCH] librbd: do not return a failure if a peer cannot be notified of update Maintenance ops that fail to notify a peer of the update should not report a failure to the original user. Fixes: http://tracker.ceph.com/issues/15351 Signed-off-by: Jason Dillaman --- src/librbd/Operations.cc | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc index f8151c9d3a028..81219d4a745a2 100644 --- a/src/librbd/Operations.cc +++ b/src/librbd/Operations.cc @@ -41,12 +41,28 @@ struct C_NotifyUpdate : public Context { } virtual void complete(int r) override { - if (r < 0 || notified) { + CephContext *cct = image_ctx.cct; + if (notified) { + if (r == -ETIMEDOUT) { + // don't fail the op if a peer fails to get the update notification + lderr(cct) << "update notification timed-out" << dendl; + r = 0; + } else if (r < 0) { + lderr(cct) << "update notification failed: " << cpp_strerror(r) + << dendl; + } Context::complete(r); - } else { - notified = true; - image_ctx.notify_update(this); + return; } + + if (r < 0) { + // op failed -- no need to send update notification + Context::complete(r); + return; + } + + notified = true; + image_ctx.notify_update(this); } virtual void finish(int r) override { on_finish->complete(r); -- 2.39.5