From: Sage Weil Date: Thu, 11 Dec 2014 14:26:06 +0000 (-0800) Subject: osdc/Objecter: normalize watch error (ENOENT on delete) X-Git-Tag: v0.91~65 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c1dd92bda73b975fe2fcb6ac427ab456331c9ba0;p=ceph.git osdc/Objecter: normalize watch error (ENOENT on delete) Signed-off-by: Sage Weil --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 2ae8774c9025..f53783fe6136 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -504,6 +504,16 @@ struct C_DoWatchError : public Context { } }; +int Objecter::_normalize_watch_error(int r) +{ + // translate ENOENT -> ENOTCONN so that a delete->disconnection + // notification and a failure to reconnect becuase we raced with + // the delete appear the same to the user. + if (r == -ENOENT) + r = -ENOTCONN; + return r; +} + void Objecter::_linger_reconnect(LingerOp *info, int r) { ldout(cct, 10) << __func__ << " " << info->linger_id << " = " << r @@ -511,6 +521,7 @@ void Objecter::_linger_reconnect(LingerOp *info, int r) if (r < 0) { info->watch_lock.get_write(); if (!info->last_error) { + r = _normalize_watch_error(r); info->last_error = r; if (info->watch_context) finisher->queue(new C_DoWatchError(info, r)); @@ -572,6 +583,7 @@ void Objecter::_linger_ping(LingerOp *info, int r, utime_t sent, if (r == 0) { info->watch_valid_thru = sent; } else if (r < 0 && !info->last_error) { + r = _normalize_watch_error(r); info->last_error = r; if (info->watch_context) finisher->queue(new C_DoWatchError(info, r)); diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index ba23f1b588c8..c21cd87a1eb4 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1710,6 +1710,7 @@ public: void _linger_reconnect(LingerOp *info, int r); void _send_linger_ping(LingerOp *info); void _linger_ping(LingerOp *info, int r, utime_t sent, uint32_t register_gen); + int _normalize_watch_error(int r); void _check_op_pool_dne(Op *op, bool session_locked); void _send_op_map_check(Op *op);