<< " (last_error " << info->last_error << ")" << dendl;
if (r < 0) {
info->watch_lock.get_write();
- info->last_error = r;
- if (info->watch_context)
- finisher->queue(new C_DoWatchError(info, r));
+ if (!info->last_error) {
+ info->last_error = r;
+ if (info->watch_context)
+ finisher->queue(new C_DoWatchError(info, r));
+ }
info->watch_lock.put_write();
}
}
if (info->register_gen == register_gen) {
if (r == 0) {
info->watch_valid_thru = sent;
- } else if (r < 0) {
+ } else if (r < 0 && !info->last_error) {
info->last_error = r;
if (info->watch_context)
finisher->queue(new C_DoWatchError(info, r));
}
RWLock::WLocker wl(info->watch_lock);
if (m->opcode == CEPH_WATCH_EVENT_DISCONNECT) {
- info->last_error = -ENOTCONN;
+ if (!info->last_error) {
+ info->last_error = -ENOTCONN;
+ if (info->watch_context)
+ finisher->queue(new C_DoWatchError(info, -ENOTCONN));
+ }
+ } else {
+ finisher->queue(new C_DoWatchNotify(this, info, m));
}
- finisher->queue(new C_DoWatchNotify(this, info, m));
}
void Objecter::_do_watch_notify(LingerOp *info, MWatchNotify *m)
assert(info->is_watch);
assert(info->watch_context);
+ assert(m->opcode != CEPH_WATCH_EVENT_DISCONNECT);
+
rwlock.put_read();
switch (m->opcode) {
info->watch_context->handle_notify(m->notify_id, m->cookie,
m->notifier_gid, m->bl);
break;
-
- case CEPH_WATCH_EVENT_DISCONNECT:
- info->watch_context->handle_error(m->cookie, -ENOTCONN);
- break;
}
out: