c->io->client->finisher.queue(new C_aio_linger_cancel(c->io->objecter,
linger_op));
- c->lock.Lock();
+ c->lock.lock();
c->rval = r;
c->complete = true;
- c->cond.Signal();
+ c->cond.notify_all();
if (c->callback_complete ||
c->callback_safe) {
};
struct C_aio_notify_Complete : public C_aio_linger_Complete {
- Mutex lock;
+ ceph::mutex lock = ceph::make_mutex("C_aio_notify_Complete::lock");
bool acked = false;
bool finished = false;
int ret_val = 0;
C_aio_notify_Complete(AioCompletionImpl *_c, Objecter::LingerOp *_linger_op)
- : C_aio_linger_Complete(_c, _linger_op, false),
- lock("C_aio_notify_Complete::lock") {
+ : C_aio_linger_Complete(_c, _linger_op, false) {
}
void handle_ack(int r) {
// invoked by C_aio_notify_Ack
- lock.Lock();
+ lock.lock();
acked = true;
complete_unlock(r);
}
void complete(int r) override {
// invoked by C_notify_Finish
- lock.Lock();
+ lock.lock();
finished = true;
complete_unlock(r);
}
}
if (acked && finished) {
- lock.Unlock();
+ lock.unlock();
cancel = true;
C_aio_linger_Complete::complete(ret_val);
} else {
- lock.Unlock();
+ lock.unlock();
}
}
};
}
void finish(int r) override {
- c->lock.Lock();
+ c->lock.lock();
c->rval = r;
c->complete = true;
- c->cond.Signal();
+ c->cond.notify_all();
if (c->callback_complete || c->callback_safe) {
client->finisher.queue(new librados::C_AioComplete(c));
} // anonymous namespace
} // namespace librados
-librados::IoCtxImpl::IoCtxImpl() :
- ref_cnt(0), client(NULL), poolid(0), assert_ver(0), last_objver(0),
- notify_timeout(30), aio_write_list_lock("librados::IoCtxImpl::aio_write_list_lock"),
- aio_write_seq(0), objecter(NULL)
-{
-}
+librados::IoCtxImpl::IoCtxImpl() = default;
librados::IoCtxImpl::IoCtxImpl(RadosClient *c, Objecter *objecter,
int64_t poolid, snapid_t s)
- : ref_cnt(0), client(c), poolid(poolid), snap_seq(s),
- assert_ver(0), last_objver(0),
+ : client(c), poolid(poolid), snap_seq(s),
notify_timeout(c->cct->_conf->client_notify_timeout),
- oloc(poolid), aio_write_list_lock("librados::IoCtxImpl::aio_write_list_lock"),
+ oloc(poolid),
aio_write_seq(0), objecter(objecter)
{
}
void librados::IoCtxImpl::queue_aio_write(AioCompletionImpl *c)
{
get();
- aio_write_list_lock.Lock();
+ std::scoped_lock l{aio_write_list_lock};
ceph_assert(c->io == this);
c->aio_write_seq = ++aio_write_seq;
ldout(client->cct, 20) << "queue_aio_write " << this << " completion " << c
<< " write_seq " << aio_write_seq << dendl;
aio_write_list.push_back(&c->aio_write_list_item);
- aio_write_list_lock.Unlock();
}
void librados::IoCtxImpl::complete_aio_write(AioCompletionImpl *c)
{
ldout(client->cct, 20) << "complete_aio_write " << c << dendl;
- aio_write_list_lock.Lock();
+ aio_write_list_lock.lock();
ceph_assert(c->io == this);
c->aio_write_list_item.remove_myself();
aio_write_waiters.erase(waiters++);
}
- aio_write_cond.Signal();
- aio_write_list_lock.Unlock();
+ aio_write_cond.notify_all();
+ aio_write_list_lock.unlock();
put();
}
void librados::IoCtxImpl::flush_aio_writes()
{
ldout(client->cct, 20) << "flush_aio_writes" << dendl;
- aio_write_list_lock.Lock();
- ceph_tid_t seq = aio_write_seq;
- while (!aio_write_list.empty() &&
- aio_write_list.front()->aio_write_seq <= seq)
- aio_write_cond.Wait(aio_write_list_lock);
- aio_write_list_lock.Unlock();
+ std::unique_lock l{aio_write_list_lock};
+ aio_write_cond.wait(l, [seq=aio_write_seq, this] {
+ return (aio_write_list.empty() ||
+ aio_write_list.front()->aio_write_seq > seq);
+ });
}
string librados::IoCtxImpl::get_cached_pool_name()
int reply;
string sName(snapName);
- Mutex mylock ("IoCtxImpl::snap_create::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::snap_create::mylock");
+ ceph::condition_variable cond;
bool done;
- Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
+ Context *onfinish = new C_SafeCond(mylock, cond, &done, &reply);
reply = objecter->create_pool_snap(poolid, sName, onfinish);
if (reply < 0) {
delete onfinish;
} else {
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
}
return reply;
}
{
int reply;
- Mutex mylock("IoCtxImpl::selfmanaged_snap_create::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::selfmanaged_snap_create::mylock");
+ ceph::condition_variable cond;
bool done;
- Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
+ Context *onfinish = new C_SafeCond(mylock, cond, &done, &reply);
snapid_t snapid;
reply = objecter->allocate_selfmanaged_snap(poolid, &snapid, onfinish);
if (reply < 0) {
delete onfinish;
} else {
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ {
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
+ }
if (reply == 0)
*psnapid = snapid;
}
int reply;
string sName(snapName);
- Mutex mylock ("IoCtxImpl::snap_remove::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::snap_remove::mylock");
+ ceph::condition_variable cond;
bool done;
- Context *onfinish = new C_SafeCond(&mylock, &cond, &done, &reply);
+ Context *onfinish = new C_SafeCond(mylock, cond, &done, &reply);
reply = objecter->delete_pool_snap(poolid, sName, onfinish);
if (reply < 0) {
delete onfinish;
} else {
- mylock.Lock();
- while(!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
}
return reply;
}
{
int reply;
- Mutex mylock("IoCtxImpl::snap_rollback::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::snap_rollback::mylock");
+ ceph::condition_variable cond;
bool done;
- Context *onack = new C_SafeCond(&mylock, &cond, &done, &reply);
+ Context *onack = new C_SafeCond(mylock, cond, &done, &reply);
::ObjectOperation op;
prepare_assert_ops(&op);
op, snapc, ceph::real_clock::now(), 0,
onack, NULL);
- mylock.Lock();
- while (!done) cond.Wait(mylock);
- mylock.Unlock();
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
return reply;
}
{
int reply;
- Mutex mylock("IoCtxImpl::selfmanaged_snap_remove::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::selfmanaged_snap_remove::mylock");
+ ceph::condition_variable cond;
bool done;
objecter->delete_selfmanaged_snap(poolid, snapid_t(snapid),
- new C_SafeCond(&mylock, &cond, &done, &reply));
+ new C_SafeCond(mylock, cond, &done, &reply));
- mylock.Lock();
- while (!done) cond.Wait(mylock);
- mylock.Unlock();
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
return (int)reply;
}
int librados::IoCtxImpl::nlist(Objecter::NListContext *context, int max_entries)
{
- Cond cond;
bool done;
int r = 0;
- Mutex mylock("IoCtxImpl::nlist::mylock");
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::nlist::mylock");
+ ceph::condition_variable cond;
if (context->at_end())
return 0;
context->max_entries = max_entries;
context->nspace = oloc.nspace;
- objecter->list_nobjects(context, new C_SafeCond(&mylock, &cond, &done, &r));
-
- mylock.Lock();
- while(!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ objecter->list_nobjects(context, new C_SafeCond(mylock, cond, &done, &r));
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
return r;
}
if (!o->size())
return 0;
- Mutex mylock("IoCtxImpl::operate::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::operate::mylock");
+ ceph::condition_variable cond;
bool done;
int r;
version_t ver;
- Context *oncommit = new C_SafeCond(&mylock, &cond, &done, &r);
+ Context *oncommit = new C_SafeCond(mylock, cond, &done, &r);
int op = o->ops[0].op.op;
ldout(client->cct, 10) << ceph_osd_op_name(op) << " oid=" << oid
oncommit, &ver);
objecter->op_submit(objecter_op);
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ {
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done;});
+ }
ldout(client->cct, 10) << "Objecter returned from "
<< ceph_osd_op_name(op) << " r=" << r << dendl;
if (!o->size())
return 0;
- Mutex mylock("IoCtxImpl::operate_read::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::operate_read::mylock");
+ ceph::condition_variable cond;
bool done;
int r;
version_t ver;
- Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
+ Context *onack = new C_SafeCond(mylock, cond, &done, &r);
int op = o->ops[0].op.op;
ldout(client->cct, 10) << ceph_osd_op_name(op) << " oid=" << oid << " nspace=" << oloc.nspace << dendl;
onack, &ver);
objecter->op_submit(objecter_op);
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ {
+ std::unique_lock l{mylock};
+ cond.wait(l, [&done] { return done; });
+ }
ldout(client->cct, 10) << "Objecter returned from "
<< ceph_osd_op_name(op) << " r=" << r << dendl;
FUNCTRACE(client->cct);
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->is_read = true;
return -EROFS;
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
OID_EVENT_TRACE(oid.name.c_str(), "RADOS_READ_OP_BEGIN");
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->is_read = true;
OID_EVENT_TRACE(oid.name.c_str(), "RADOS_READ_OP_BEGIN");
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->is_read = true;
Context *nested = new C_aio_Complete(c);
C_ObjectOperation *onack = new C_ObjectOperation(nested);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) nested)->oid = oid;
#endif
c->is_read = true;
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
ZTracer::Trace trace;
return -EROFS;
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
return -EROFS;
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->io = this;
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->io = this;
FUNCTRACE(client->cct);
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->is_read = true;
FUNCTRACE(client->cct);
Context *oncomplete = new C_aio_Complete(c);
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
((C_aio_Complete *) oncomplete)->oid = oid;
#endif
c->is_read = true;
{
bufferlist bl;
- Mutex mylock("IoCtxImpl::read::mylock");
- Cond cond;
+ ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::read::mylock");
+ ceph::condition_variable cond;
bool done;
int r;
- Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
+ Context *onack = new C_SafeCond(mylock, cond, &done, &r);
objecter->mapext(oid, oloc,
off, len, snap_seq, &bl, 0,
onack);
- mylock.Lock();
- while (!done)
- cond.Wait(mylock);
- mylock.Unlock();
+ {
+ unique_lock l{mylock};
+ cond.wait(l, [&done] { return done;});
+ }
ldout(client->cct, 10) << "Objecter returned from read r=" << r << dendl;
if (r < 0)
void librados::IoCtxImpl::C_aio_stat_Ack::finish(int r)
{
- c->lock.Lock();
+ c->lock.lock();
c->rval = r;
c->complete = true;
- c->cond.Signal();
+ c->cond.notify_all();
if (r >= 0 && pmtime) {
*pmtime = real_clock::to_time_t(mtime);
void librados::IoCtxImpl::C_aio_stat2_Ack::finish(int r)
{
- c->lock.Lock();
+ c->lock.lock();
c->rval = r;
c->complete = true;
- c->cond.Signal();
+ c->cond.notify_all();
if (r >= 0 && pts) {
*pts = real_clock::to_timespec(mtime);
void librados::IoCtxImpl::C_aio_Complete::finish(int r)
{
- c->lock.Lock();
+ c->lock.lock();
// Leave an existing rval unless r != 0
if (r)
c->rval = r; // This clears the error set in C_ObjectOperation_scrub_ls::finish()
c->complete = true;
- c->cond.Signal();
+ c->cond.notify_all();
if (r == 0 && c->blp && c->blp->length() > 0) {
if (c->out_buf && !c->blp->is_contiguous()) {
c->rval = -ERANGE;
} else {
if (c->out_buf && !c->blp->is_provided_buffer(c->out_buf))
- c->blp->copy(0, c->blp->length(), c->out_buf);
+ c->blp->begin().copy(c->blp->length(), c->out_buf);
c->rval = c->blp->length();
}
c->io->complete_aio_write(c);
}
-#if defined(WITH_LTTNG) && defined(WITH_EVENTTRACE)
+#if defined(WITH_EVENTTRACE)
OID_EVENT_TRACE(oid.name.c_str(), "RADOS_OP_COMPLETE");
#endif
c->put_unlock();