void FIFO::update_callback(lr::completion_t, void* arg)
{
- auto updater = static_cast<Updater*>(arg);
+ std::unique_ptr<Updater> updater(static_cast<Updater*>(arg));
auto cct = updater->fifo->cct;
auto tid = updater->tid;
ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " entering: tid=" << tid << dendl;
if (!updater->reread) {
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " handling async update_meta: tid="
+ << tid << dendl;
int r = updater->cur->get_return_value();
if (r < 0 && r != -ECANCELED) {
lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " update failed: r=" << r << " tid=" << tid << dendl;
complete(updater->super, r);
- delete updater;
return;
}
bool canceled = (r == -ECANCELED);
canceled = true;
}
}
- if (!canceled) {
- if (updater->pcanceled)
- *updater->pcanceled = false;
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " completing: tid=" << tid << dendl;
- complete(updater->super, 0);
- } else {
+ if (canceled) {
updater->cur->release();
updater->cur = lr::Rados::aio_create_completion(
arg, &FIFO::update_callback);
- assert(uintptr_t(updater->cur) >= 0x1000);
updater->reread = true;
auto r = updater->fifo->read_meta(tid, updater->cur);
if (r < 0) {
<< " failed dispatching read_meta: r=" << r << " tid="
<< tid << dendl;
complete(updater->super, r);
- delete updater;
+ } else {
+ updater.release();
}
+ return;
}
- } else {
- int r = updater->cur->get_return_value();
- if (r < 0 && updater->pcanceled) {
+ if (updater->pcanceled)
*updater->pcanceled = false;
- } else if (r >= 0 && updater->pcanceled) {
- *updater->pcanceled = true;
- }
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " failed dispatching read_meta: r=" << r << " tid="
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " completing: tid=" << tid << dendl;
+ complete(updater->super, 0);
+ return;
+ }
+
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " handling async read_meta: tid="
<< tid << dendl;
- } else {
- ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " completing: tid=" << tid << dendl;
- }
- complete(updater->super, r);
- delete updater;
+ int r = updater->cur->get_return_value();
+ if (r < 0 && updater->pcanceled) {
+ *updater->pcanceled = false;
+ } else if (r >= 0 && updater->pcanceled) {
+ *updater->pcanceled = true;
+ }
+ if (r < 0) {
+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " failed dispatching read_meta: r=" << r << " tid="
+ << tid << dendl;
+ } else {
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " completing: tid=" << tid << dendl;
}
+ complete(updater->super, r);
}
int FIFO::_update_meta(const fifo::update& update,
<< " entering: tid=" << tid << dendl;
lr::ObjectWriteOperation op;
update_meta(&op, info.version, update);
- auto updater = new Updater(this, c, update, version, pcanceled, tid);
- lr::AioCompletion* cur = lr::Rados::aio_create_completion(
- static_cast<void*>(updater), &FIFO::update_callback);
- updater->cur = cur;
- assert(uintptr_t(updater->cur) >= 0x1000);
- auto r = ioctx.aio_operate(oid, cur, &op);
+ auto updater = std::make_unique<Updater>(this, c, update, version, pcanceled,
+ tid);
+ auto r = ioctx.aio_operate(oid, updater->cur, &op);
if (r < 0) {
lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " failed dispatching update_meta: r=" << r << " tid="
<< tid << dendl;
- delete updater;
+ } else {
+ updater.release();
}
return r;
}
void FIFO::read_callback(lr::completion_t, void* arg)
{
- auto reader = static_cast<Reader*>(arg);
+ std::unique_ptr<Reader> reader(static_cast<Reader*>(arg));
auto cct = reader->fifo->cct;
auto tid = reader->tid;
ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " tid=" << tid << dendl;
}
complete(reader->super, r);
- delete reader;
}
int FIFO::read_meta(std::uint64_t tid, lr::AioCompletion* c)
fifo::op::get_meta gm;
cb::list in;
encode(gm, in);
- auto reader = new Reader(this, c, tid);
+ auto reader = std::make_unique<Reader>(this, c, tid);
auto r = ioctx.aio_exec(oid, reader->cur, fifo::op::CLASS,
fifo::op::GET_META, in, &reader->bl);
if (r < 0) {
lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " failed scheduling read_meta r=" << r
<< " tid=" << tid << dendl;
- delete reader;
+ } else {
+ reader.release();
}
return r;
}
void FIFO::trim_callback(lr::completion_t, void* arg)
{
- auto trimmer = static_cast<Trimmer*>(arg);
+ std::unique_ptr<Trimmer> trimmer(static_cast<Trimmer*>(arg));
auto cct = trimmer->fifo->cct;
auto tid = trimmer->tid;
ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " trim failed: r=" << r << " tid=" << tid << dendl;
complete(trimmer->super, r);
- delete trimmer;
- } else if (!trimmer->update) {
+ return;
+ }
+
+ if (!trimmer->update) {
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " handling preceding trim callback: tid=" << tid << dendl;
trimmer->retries = 0;
if (trimmer->pn < trimmer->part_num) {
std::unique_lock l(trimmer->fifo->m);
lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
<< " trim failed: r=" << r << " tid=" << tid << dendl;
complete(trimmer->super, r);
- delete trimmer;
- }
- } else {
- std::unique_lock l(trimmer->fifo->m);
- const auto tail_part_num = trimmer->fifo->info.tail_part_num;
- l.unlock();
- trimmer->cur->release();
- trimmer->cur = lr::Rados::aio_create_completion(arg, &FIFO::trim_callback);
- trimmer->update = true;
- trimmer->canceled = tail_part_num < trimmer->part_num;
- r = trimmer->fifo->trim_part(trimmer->part_num, trimmer->ofs,
- std::nullopt, trimmer->exclusive, tid, trimmer->cur);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " failed scheduling trim: r=" << r << " tid=" << tid << dendl;
- complete(trimmer->super, r);
- delete trimmer;
+ } else {
+ trimmer.release();
}
+ return;
}
- } else {
+
std::unique_lock l(trimmer->fifo->m);
- auto tail_part_num = trimmer->fifo->info.tail_part_num;
- auto objv = trimmer->fifo->info.version;
+ const auto tail_part_num = trimmer->fifo->info.tail_part_num;
l.unlock();
- if ((tail_part_num < trimmer->part_num) &&
- trimmer->canceled) {
- if (trimmer->retries > MAX_RACE_RETRIES) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " canceled too many times, giving up: tid=" << tid << dendl;
- complete(trimmer->super, -EIO);
- delete trimmer;
- } else {
- trimmer->cur->release();
- trimmer->cur = lr::Rados::aio_create_completion(arg,
- &FIFO::trim_callback);
- ++trimmer->retries;
- r = trimmer->fifo->_update_meta(fifo::update{}
- .tail_part_num(trimmer->part_num),
- objv, &trimmer->canceled,
- tid, trimmer->cur);
- if (r < 0) {
- lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
- << " failed scheduling _update_meta: r="
- << r << " tid=" << tid << dendl;
- complete(trimmer->super, r);
- delete trimmer;
- }
- }
+ trimmer->cur->release();
+ trimmer->cur = lr::Rados::aio_create_completion(arg, &FIFO::trim_callback);
+ trimmer->update = true;
+ trimmer->canceled = tail_part_num < trimmer->part_num;
+ r = trimmer->fifo->trim_part(trimmer->part_num, trimmer->ofs,
+ std::nullopt, trimmer->exclusive, tid, trimmer->cur);
+ if (r < 0) {
+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " failed scheduling trim: r=" << r << " tid=" << tid << dendl;
+ complete(trimmer->super, r);
+ } else {
+ trimmer.release();
+ }
+ return;
+ }
+
+ ldout(cct, 20) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " handling update-needed callback: tid=" << tid << dendl;
+ std::unique_lock l(trimmer->fifo->m);
+ auto tail_part_num = trimmer->fifo->info.tail_part_num;
+ auto objv = trimmer->fifo->info.version;
+ l.unlock();
+ if ((tail_part_num < trimmer->part_num) &&
+ trimmer->canceled) {
+ if (trimmer->retries > MAX_RACE_RETRIES) {
+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " canceled too many times, giving up: tid=" << tid << dendl;
+ complete(trimmer->super, -EIO);
+ return;
+ }
+ trimmer->cur->release();
+ trimmer->cur = lr::Rados::aio_create_completion(arg,
+ &FIFO::trim_callback);
+ ++trimmer->retries;
+ r = trimmer->fifo->_update_meta(fifo::update{}
+ .tail_part_num(trimmer->part_num),
+ objv, &trimmer->canceled,
+ tid, trimmer->cur);
+ if (r < 0) {
+ lderr(cct) << __PRETTY_FUNCTION__ << ":" << __LINE__
+ << " failed scheduling _update_meta: r="
+ << r << " tid=" << tid << dendl;
+ complete(trimmer->super, r);
} else {
- complete(trimmer->super, 0);
+ trimmer.release();
}
+ } else {
+ complete(trimmer->super, 0);
}
}
const auto part_oid = info.part_oid(pn);
auto tid = ++next_tid;
l.unlock();
- auto trimmer = new Trimmer(this, marker->num, marker->ofs, pn, exclusive, c,
- tid);
+ auto trimmer = std::make_unique<Trimmer>(this, marker->num, marker->ofs, pn, exclusive, c,
+ tid);
++trimmer->pn;
auto ofs = marker->ofs;
if (pn < marker->num) {
<< " failed scheduling trim_part: r="
<< r << " tid=" << tid << dendl;
complete(trimmer->super, r);
- delete trimmer;
+ } else {
+ trimmer.release();
}
return r;
}