bufferlist bl;
wc->linger_id = objecter->linger_mutate(oid, oloc, wr,
snapc, ceph_clock_now(NULL), bl,
- 0,
- NULL, onfinish, &objver);
+ *cookie, 0,
+ NULL, onfinish, &wc->on_error,
+ &objver);
lock->Unlock();
mylock.Lock();
notify_timeout = timeout;
}
+
///////////////////////////// C_aio_Ack ////////////////////////////////
librados::IoCtxImpl::C_aio_Ack::C_aio_Ack(AioCompletionImpl *_c) : c(_c)
{
ldout(cct, 10) << __func__ << " " << info->linger_id << " = " << r
<< " (last_error " << info->last_error << ")" << dendl;
+ if (r < 0) {
+ info->watch_lock.Lock();
+ info->last_error = r;
+ info->watch_cond.Signal();
+ if (info->on_error)
+ info->on_error->complete(r);
+ info->watch_lock.Unlock();
+ }
}
void Objecter::unregister_linger(uint64_t linger_id)
}
ceph_tid_t Objecter::linger_mutate(const object_t& oid, const object_locator_t& oloc,
- ObjectOperation& op,
- const SnapContext& snapc, utime_t mtime,
- bufferlist& inbl, int flags,
- Context *onack, Context *oncommit,
- version_t *objver)
+ ObjectOperation& op,
+ const SnapContext& snapc, utime_t mtime,
+ bufferlist& inbl, uint64_t cookie, int flags,
+ Context *onack, Context *oncommit,
+ Context *onerror,
+ version_t *objver)
{
LingerOp *info = new LingerOp;
info->target.base_oid = oid;
info->pobjver = objver;
info->on_reg_ack = onack;
info->on_reg_commit = oncommit;
+ info->on_error = onerror;
RWLock::WLocker wl(rwlock);
_linger_submit(info);
uint64_t cookie; ///< non-zero if this is a watch
int last_error; ///< error from last failed ping|reconnect, if any
+ Mutex watch_lock;
+ Cond watch_cond;
+
bool registered;
bool canceled;
- Context *on_reg_ack, *on_reg_commit;
+ Context *on_reg_ack, *on_reg_commit, *on_error;
OSDSession *session;
poutbl(NULL), pobjver(NULL),
cookie(0),
last_error(0),
+ watch_lock("Objecter::LingerOp::watch_lock"),
registered(false),
canceled(false),
on_reg_ack(NULL), on_reg_commit(NULL),
+ on_error(NULL),
session(NULL),
register_tid(0),
map_dne_bound(0) {}
return op_submit(o, ctx_budget);
}
ceph_tid_t linger_mutate(const object_t& oid, const object_locator_t& oloc,
- ObjectOperation& op,
- const SnapContext& snapc, utime_t mtime,
- bufferlist& inbl, int flags,
- Context *onack, Context *onfinish,
- version_t *objver);
+ ObjectOperation& op,
+ const SnapContext& snapc, utime_t mtime,
+ bufferlist& inbl, uint64_t cookie, int flags,
+ Context *onack, Context *onfinish, Context *onerror,
+ version_t *objver);
ceph_tid_t linger_read(const object_t& oid, const object_locator_t& oloc,
ObjectOperation& op,
snapid_t snap, bufferlist& inbl, bufferlist *poutbl, int flags,