when linger ping failed with error, like ENOTCONN
last_error set to error.
after that, last_error will never recovery to succecss(0),
even reconnecting successfully, which stops from sending linger ping to osd.
as a result, this normal client ** can't receive notify message **
after osd_client_watch_timeout goes away.
Fixes: https://tracker.ceph.com/issues/47004
Signed-off-by: Song Shun <song.shun3@zte.com.cn>
{
ldout(cct, 10) << __func__ << " " << info->linger_id << " = " << ec
<< " (last_error " << info->last_error << ")" << dendl;
+ std::unique_lock wl(info->watch_lock);
if (ec) {
- std::unique_lock wl(info->watch_lock);
if (!info->last_error) {
ec = _normalize_watch_error(ec);
- info->last_error = ec;
if (info->handle) {
boost::asio::defer(finish_strand, CB_DoWatchError(this, info, ec));
}
}
- wl.unlock();
}
+
+ info->last_error = ec;
}
void Objecter::_send_linger_ping(LingerOp *info)