summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/SyntheticClient.cc3
-rw-r--r--src/common/Cond.h32
-rw-r--r--src/common/Finisher.cc6
-rw-r--r--src/include/Context.h4
-rw-r--r--src/librbd/LibrbdWriteback.cc3
-rw-r--r--src/mds/AnchorClient.cc3
-rw-r--r--src/mds/CInode.cc8
-rw-r--r--src/mds/MDCache.cc30
-rw-r--r--src/mds/MDLog.cc9
-rw-r--r--src/mds/MDS.cc3
-rw-r--r--src/mds/MDSTable.cc3
-rw-r--r--src/mds/MDSTableClient.cc3
-rw-r--r--src/mds/Mutation.h3
-rw-r--r--src/os/FileStore.cc6
-rw-r--r--src/osd/OSD.cc21
-rw-r--r--src/osd/OSD.h40
-rw-r--r--src/osdc/Filer.cc9
-rw-r--r--src/osdc/Journaler.cc24
-rw-r--r--src/osdc/Objecter.cc42
-rw-r--r--src/osdc/Objecter.h9
-rw-r--r--src/test/ObjectMap/KeyValueDBMemory.h3
-rw-r--r--src/test/filestore/workload_generator.h2
-rw-r--r--src/test/gather.cc15
23 files changed, 139 insertions, 142 deletions
diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc
index 79171da46f1..cb211f5461b 100644
--- a/src/client/SyntheticClient.cc
+++ b/src/client/SyntheticClient.cc
@@ -1470,8 +1470,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
dout(10) << "trace finished on line " << t.get_line() << dendl;
// wait for safe after an object trace
- safegref->finish(0);
- delete safegref;
+ safegref->complete(0);
lock.Lock();
while (!safe) {
dout(10) << "waiting for safe" << dendl;
diff --git a/src/common/Cond.h b/src/common/Cond.h
index ee95a65b5b6..e6a13ae48bb 100644
--- a/src/common/Cond.h
+++ b/src/common/Cond.h
@@ -156,4 +156,36 @@ public:
}
};
+/**
+ * Context providing a simple wait() mechanism to wait for completion
+ *
+ * The context will not be deleted as part of complete and must live
+ * until wait() returns.
+ */
+class C_SaferCond : public Context {
+ Mutex lock; ///< Mutex to take
+ Cond cond; ///< Cond to signal
+ bool done; ///< true after finish() has been called
+ int rval; ///< return value
+public:
+ C_SaferCond() : lock("C_SaferCond"), done(false), rval(0) {}
+ void finish(int r) { complete(r); }
+
+ /// We overload complete in order to not delete the context
+ void complete(int r) {
+ Mutex::Locker l(lock);
+ done = true;
+ rval = r;
+ cond.Signal();
+ }
+
+ /// Returns rval once the Context is called
+ int wait() {
+ Mutex::Locker l(lock);
+ while (!done)
+ cond.Wait(lock);
+ return rval;
+ }
+};
+
#endif
diff --git a/src/common/Finisher.cc b/src/common/Finisher.cc
index 72bfb6f9aa7..a1462a184d9 100644
--- a/src/common/Finisher.cc
+++ b/src/common/Finisher.cc
@@ -53,13 +53,11 @@ void *Finisher::finisher_thread_entry()
p != ls.end();
++p) {
if (*p) {
- (*p)->finish(0);
- delete *p;
+ (*p)->complete(0);
} else {
assert(!ls_rval.empty());
Context *c = ls_rval.front().first;
- c->finish(ls_rval.front().second);
- delete c;
+ c->complete(ls_rval.front().second);
ls_rval.pop_front();
}
if (logger)
diff --git a/src/include/Context.h b/src/include/Context.h
index e31fca6a426..9ec4414a047 100644
--- a/src/include/Context.h
+++ b/src/include/Context.h
@@ -34,10 +34,12 @@ class Context {
Context(const Context& other);
const Context& operator=(const Context& other);
+ protected:
+ virtual void finish(int r) = 0;
+
public:
Context() {}
virtual ~Context() {} // we want a virtual destructor!!!
- virtual void finish(int r) = 0;
virtual void complete(int r) {
finish(r);
delete this;
diff --git a/src/librbd/LibrbdWriteback.cc b/src/librbd/LibrbdWriteback.cc
index a7ab0488dc6..da02a34ed32 100644
--- a/src/librbd/LibrbdWriteback.cc
+++ b/src/librbd/LibrbdWriteback.cc
@@ -32,8 +32,7 @@ namespace librbd {
void context_cb(rados_completion_t c, void *arg)
{
Context *con = reinterpret_cast<Context *>(arg);
- con->finish(rados_aio_get_return_value(c));
- delete con;
+ con->complete(rados_aio_get_return_value(c));
}
/**
diff --git a/src/mds/AnchorClient.cc b/src/mds/AnchorClient.cc
index bcc8710e43f..30cbfd34f74 100644
--- a/src/mds/AnchorClient.cc
+++ b/src/mds/AnchorClient.cc
@@ -51,8 +51,7 @@ void AnchorClient::handle_query_result(class MMDSTableRequest *m)
for (list<_pending_lookup>::iterator q = ls.begin(); q != ls.end(); ++q) {
*q->trace = trace;
if (q->onfinish) {
- q->onfinish->finish(0);
- delete q->onfinish;
+ q->onfinish->complete(0);
}
}
}
diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc
index 48529948955..d215d18690f 100644
--- a/src/mds/CInode.cc
+++ b/src/mds/CInode.cc
@@ -914,8 +914,7 @@ void CInode::_stored(version_t v, Context *fin)
if (v == get_projected_version())
mark_clean();
- fin->finish(0);
- delete fin;
+ fin->complete(0);
}
struct C_Inode_Fetched : public Context {
@@ -964,13 +963,12 @@ void CInode::_fetched(bufferlist& bl, bufferlist& bl2, Context *fin)
if (magic != CEPH_FS_ONDISK_MAGIC) {
dout(0) << "on disk magic '" << magic << "' != my magic '" << CEPH_FS_ONDISK_MAGIC
<< "'" << dendl;
- fin->finish(-EINVAL);
+ fin->complete(-EINVAL);
} else {
decode_store(p);
dout(10) << "_fetched " << *this << dendl;
- fin->finish(0);
+ fin->complete(0);
}
- delete fin;
}
void CInode::build_backtrace(int64_t pool, inode_backtrace_t& bt)
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
index e592dde96ca..77d3d8b97b8 100644
--- a/src/mds/MDCache.cc
+++ b/src/mds/MDCache.cc
@@ -510,8 +510,7 @@ void MDCache::_create_system_file_finish(Mutation *mut, CDentry *dn, version_t d
mut->cleanup();
delete mut;
- fin->finish(0);
- delete fin;
+ fin->complete(0);
//if (dir && MDS_INO_IS_MDSDIR(in->ino()))
//migrator->export_dir(dir, (int)in->ino() - MDS_INO_MDSDIR_OFFSET);
@@ -3093,8 +3092,7 @@ void MDCache::handle_resolve_ack(MMDSResolveAck *ack)
if (mdr->more()->slave_commit) {
Context *fin = mdr->more()->slave_commit;
mdr->more()->slave_commit = 0;
- fin->finish(-1);
- delete fin;
+ fin->complete(-1);
} else {
if (mdr->slave_request)
mdr->aborted = true;
@@ -7675,8 +7673,7 @@ public:
mdcache(mdc), ino(i), want_xlocked(wx), onfinish(c) {}
void finish(int r) {
if (mdcache->get_inode(ino)) {
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
} else
mdcache->open_remote_ino(ino, onfinish, want_xlocked);
}
@@ -7703,8 +7700,7 @@ public:
if (r == 0)
mdcache->open_remote_ino_2(ino, anchortrace, want_xlocked, hadino, hadv, onfinish);
else {
- onfinish->finish(r);
- delete onfinish;
+ onfinish->complete(r);
}
}
};
@@ -7753,8 +7749,7 @@ void MDCache::open_remote_ino_2(inodeno_t ino, vector<Anchor>& anchortrace, bool
if (in->ino() == ino) {
// success
dout(10) << "open_remote_ino_2 have " << *in << dendl;
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
return;
}
@@ -7795,8 +7790,7 @@ void MDCache::open_remote_ino_2(inodeno_t ino, vector<Anchor>& anchortrace, bool
dout(10) << "expected ino " << anchortrace[i].ino
<< " in complete dir " << *dir
<< ", got same anchor " << anchortrace[i] << " 2x in a row" << dendl;
- onfinish->finish(-ENOENT);
- delete onfinish;
+ onfinish->complete(-ENOENT);
} else {
// hrm. requery anchor table.
dout(10) << "expected ino " << anchortrace[i].ino
@@ -8408,8 +8402,7 @@ void MDCache::_do_find_ino_peer(find_ino_peer_info_t& fip)
dout(10) << "_do_find_ino_peer waiting for more peers to be active" << dendl;
} else {
dout(10) << "_do_find_ino_peer failed on " << fip.ino << dendl;
- fip.fin->finish(-ESTALE);
- delete fip.fin;
+ fip.fin->complete(-ESTALE);
find_ino_peer.erase(fip.tid);
}
} else {
@@ -8521,8 +8514,7 @@ void MDCache::_find_ino_dir(inodeno_t ino, Context *fin, bufferlist& bl, int r)
{
dout(10) << "_find_ino_dir " << ino << " got " << r << " " << bl.length() << " bytes" << dendl;
if (r < 0) {
- fin->finish(r);
- delete fin;
+ fin->complete(r);
return;
}
@@ -8539,8 +8531,7 @@ void MDCache::_find_ino_dir(inodeno_t ino, Context *fin, bufferlist& bl, int r)
return;
delete c; // path_traverse doesn't clean it up for us for r <= 0
- fin->finish(r);
- delete fin;
+ fin->complete(r);
}
@@ -8619,8 +8610,7 @@ void MDCache::request_finish(MDRequest *mdr)
if (mdr->more()->slave_commit) {
Context *fin = mdr->more()->slave_commit;
mdr->more()->slave_commit = 0;
- fin->finish(0); // this must re-call request_finish.
- delete fin;
+ fin->complete(0); // this must re-call request_finish.
return;
}
diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc
index b293c4cc10a..3dfc00fc221 100644
--- a/src/mds/MDLog.cc
+++ b/src/mds/MDLog.cc
@@ -173,8 +173,7 @@ void MDLog::submit_entry(LogEvent *le, Context *c)
if (!g_conf->mds_log) {
// hack: log is disabled.
if (c) {
- c->finish(0);
- delete c;
+ c->complete(0);
}
return;
}
@@ -245,8 +244,7 @@ void MDLog::wait_for_safe(Context *c)
journaler->wait_for_flush(c);
} else {
// hack: bypass.
- c->finish(0);
- delete c;
+ c->complete(0);
}
}
@@ -442,8 +440,7 @@ void MDLog::replay(Context *c)
if (journaler->get_read_pos() == journaler->get_write_pos()) {
dout(10) << "replay - journal empty, done." << dendl;
if (c) {
- c->finish(0);
- delete c;
+ c->complete(0);
}
return;
}
diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc
index a867961ccf3..439f33cfc8c 100644
--- a/src/mds/MDS.cc
+++ b/src/mds/MDS.cc
@@ -1890,8 +1890,7 @@ bool MDS::_dispatch(Message *m)
ls.swap(finished_queue);
while (!ls.empty()) {
dout(10) << " finish " << ls.front() << dendl;
- ls.front()->finish(0);
- delete ls.front();
+ ls.front()->complete(0);
ls.pop_front();
// give other threads (beacon!) a chance
diff --git a/src/mds/MDSTable.cc b/src/mds/MDSTable.cc
index 4b21f4feaa5..ef0326dfbd3 100644
--- a/src/mds/MDSTable.cc
+++ b/src/mds/MDSTable.cc
@@ -160,7 +160,6 @@ void MDSTable::load_2(int r, bufferlist& bl, Context *onfinish)
decode_state(p);
if (onfinish) {
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
}
}
diff --git a/src/mds/MDSTableClient.cc b/src/mds/MDSTableClient.cc
index b4781497068..cc3152f1d67 100644
--- a/src/mds/MDSTableClient.cc
+++ b/src/mds/MDSTableClient.cc
@@ -61,8 +61,7 @@ void MDSTableClient::handle_request(class MMDSTableRequest *m)
pending_prepare.erase(reqid);
prepared_update[tid] = reqid;
if (onfinish) {
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
}
}
else if (prepared_update.count(tid)) {
diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h
index c0bea19d16e..b50a03cefa4 100644
--- a/src/mds/Mutation.h
+++ b/src/mds/Mutation.h
@@ -330,8 +330,7 @@ struct MDSlaveUpdate {
~MDSlaveUpdate() {
item.remove_myself();
if (waiter)
- waiter->finish(0);
- delete waiter;
+ waiter->complete(0);
}
};
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index 1363eff27d1..10f2b1f2aad 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -2028,8 +2028,7 @@ void FileStore::_finish_op(OpSequencer *osr)
logger->tinc(l_os_apply_lat, lat);
if (o->onreadable_sync) {
- o->onreadable_sync->finish(0);
- delete o->onreadable_sync;
+ o->onreadable_sync->complete(0);
}
op_finisher.queue(o->onreadable);
delete o;
@@ -2126,8 +2125,7 @@ int FileStore::queue_transactions(Sequencer *posr, list<Transaction*> &tls,
// start on_readable finisher after we queue journal item, as on_readable callback
// is allowed to delete the Transaction
if (onreadable_sync) {
- onreadable_sync->finish(r);
- delete onreadable_sync;
+ onreadable_sync->complete(r);
}
op_finisher.queue(onreadable, r);
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 1ee4c09a63e..8cc9e31459d 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -3267,21 +3267,30 @@ bool remove_dir(
}
t->remove(coll, *i);
if (num >= g_conf->osd_target_transaction_size) {
- store->apply_transaction(osr, *t);
+ C_SaferCond waiter;
+ store->queue_transaction(osr, t, &waiter);
+ bool cont = dstate->pause_clearing();
+ waiter.wait();
+ if (cont)
+ cont = dstate->resume_clearing();
delete t;
- if (!dstate->check_canceled()) {
- // canceled!
+ if (!cont)
return false;
- }
t = new ObjectStore::Transaction;
num = 0;
}
}
olist.clear();
}
- store->apply_transaction(osr, *t);
+
+ C_SaferCond waiter;
+ store->queue_transaction(osr, t, &waiter);
+ bool cont = dstate->pause_clearing();
+ waiter.wait();
+ if (cont)
+ cont = dstate->resume_clearing();
delete t;
- return true;
+ return cont;
}
void OSD::RemoveWQ::_process(pair<PGRef, DeletingStateRef> item)
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index 238c5b43594..04ad4dcd7d7 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -148,6 +148,7 @@ class DeletingState {
enum {
QUEUED,
CLEARING_DIR,
+ CLEARING_WAITING,
DELETING_DIR,
DELETED_DIR,
CANCELED,
@@ -160,8 +161,23 @@ public:
lock("DeletingState::lock"), status(QUEUED), stop_deleting(false),
pgid(in.first), old_pg_state(in.second) {}
- /// check whether removal was canceled
- bool check_canceled() {
+ /// transition status to clearing
+ bool start_clearing() {
+ Mutex::Locker l(lock);
+ assert(
+ status == QUEUED ||
+ status == DELETED_DIR);
+ if (stop_deleting) {
+ status = CANCELED;
+ cond.Signal();
+ return false;
+ }
+ status = CLEARING_DIR;
+ return true;
+ } ///< @return false if we should cancel deletion
+
+ /// transition status to CLEARING_WAITING
+ bool pause_clearing() {
Mutex::Locker l(lock);
assert(status == CLEARING_DIR);
if (stop_deleting) {
@@ -169,15 +185,14 @@ public:
cond.Signal();
return false;
}
+ status = CLEARING_WAITING;
return true;
- } ///< @return false if canceled, true if we should continue
+ } ///< @return false if we should cancel deletion
- /// transition status to clearing
- bool start_clearing() {
+ /// transition status to CLEARING_DIR
+ bool resume_clearing() {
Mutex::Locker l(lock);
- assert(
- status == QUEUED ||
- status == DELETED_DIR);
+ assert(status == CLEARING_WAITING);
if (stop_deleting) {
status = CANCELED;
cond.Signal();
@@ -215,11 +230,10 @@ public:
/**
* If we are in DELETING_DIR or CLEARING_DIR, there are in progress
* operations we have to wait for before continuing on. States
- * DELETED_DIR, QUEUED, and CANCELED either check for stop_deleting
- * prior to performing any operations or signify the end of the
- * deleting process. We don't want to wait to leave the QUEUED
- * state, because this might block the caller behind an entire pg
- * removal.
+ * CLEARING_WAITING and QUEUED indicate that the remover will check
+ * stop_deleting before queueing any further operations. CANCELED
+ * indicates that the remover has already halted. DELETED_DIR
+ * indicates that the deletion has been fully queueud.
*/
while (status == DELETING_DIR || status == CLEARING_DIR)
cond.Wait(lock);
diff --git a/src/osdc/Filer.cc b/src/osdc/Filer.cc
index 7eb4ad616db..8f94a97d292 100644
--- a/src/osdc/Filer.cc
+++ b/src/osdc/Filer.cc
@@ -131,8 +131,7 @@ void Filer::_probed(Probe *probe, const object_t& oid, uint64_t size, utime_t mt
return; // waiting for more!
if (probe->err) { // we hit an error, propagate back up
- probe->onfinish->finish(probe->err);
- delete probe->onfinish;
+ probe->onfinish->complete(probe->err);
delete probe;
return;
}
@@ -216,8 +215,7 @@ void Filer::_probed(Probe *probe, const object_t& oid, uint64_t size, utime_t mt
}
// done! finish and clean up.
- probe->onfinish->finish(probe->err);
- delete probe->onfinish;
+ probe->onfinish->complete(probe->err);
delete probe;
}
@@ -285,8 +283,7 @@ void Filer::_do_purge_range(PurgeRange *pr, int fin)
<< " uncommitted " << pr->uncommitted << dendl;
if (pr->num == 0 && pr->uncommitted == 0) {
- pr->oncommit->finish(0);
- delete pr->oncommit;
+ pr->oncommit->complete(0);
delete pr;
return;
}
diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc
index cd9b9edc4c7..ba4ca8dc4b9 100644
--- a/src/osdc/Journaler.cc
+++ b/src/osdc/Journaler.cc
@@ -181,8 +181,7 @@ void Journaler::_finish_reread_head(int r, bufferlist& bl, Context *finish)
trimmed_pos = trimming_pos = h.trimmed_pos;
init_headers(h);
state = STATE_ACTIVE;
- finish->finish(r);
- delete finish;
+ finish->complete(r);
}
void Journaler::_finish_read_head(int r, bufferlist& bl)
@@ -261,8 +260,7 @@ void Journaler::_finish_reprobe(int r, uint64_t new_end, Context *onfinish) {
<< dendl;
prezeroing_pos = prezero_pos = write_pos = flush_pos = safe_pos = new_end;
state = STATE_ACTIVE;
- onfinish->finish(r);
- delete onfinish;
+ onfinish->complete(r);
}
void Journaler::_finish_probe_end(int r, uint64_t end)
@@ -367,8 +365,7 @@ void Journaler::_finish_write_head(int r, Header &wrote, Context *oncommit)
ldout(cct, 10) << "_finish_write_head " << wrote << dendl;
last_committed = wrote;
if (oncommit) {
- oncommit->finish(r);
- delete oncommit;
+ oncommit->complete(r);
}
trim(); // trim?
@@ -563,8 +560,7 @@ void Journaler::wait_for_flush(Context *onsafe)
ldout(cct, 10) << "flush nothing to flush, (prezeroing/prezero)/write/flush/safe pointers at "
<< "(" << prezeroing_pos << "/" << prezero_pos << ")/" << write_pos << "/" << flush_pos << "/" << safe_pos << dendl;
if (onsafe) {
- onsafe->finish(0);
- delete onsafe;
+ onsafe->complete(0);
onsafe = 0;
}
return;
@@ -584,8 +580,7 @@ void Journaler::flush(Context *onsafe)
ldout(cct, 10) << "flush nothing to flush, (prezeroing/prezero)/write/flush/safe pointers at "
<< "(" << prezeroing_pos << "/" << prezero_pos << ")/" << write_pos << "/" << flush_pos << "/" << safe_pos << dendl;
if (onsafe) {
- onsafe->finish(0);
- delete onsafe;
+ onsafe->complete(0);
}
} else {
if (1) {
@@ -731,8 +726,7 @@ void Journaler::_finish_read(int r, uint64_t offset, bufferlist& bl)
if (on_readable) {
Context *f = on_readable;
on_readable = 0;
- f->finish(r);
- delete f;
+ f->complete(r);
}
return;
}
@@ -779,8 +773,7 @@ void Journaler::_assimilate_prefetch()
if (on_readable) {
Context *f = on_readable;
on_readable = 0;
- f->finish(0);
- delete f;
+ f->complete(0);
}
}
}
@@ -1060,8 +1053,7 @@ void Journaler::handle_write_error(int r)
{
lderr(cct) << "handle_write_error " << cpp_strerror(r) << dendl;
if (on_write_error) {
- on_write_error->finish(r);
- delete on_write_error;
+ on_write_error->complete(r);
on_write_error = NULL;
} else {
assert(0 == "unhandled write error");
diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc
index a5a023cb33e..9933f853f8f 100644
--- a/src/osdc/Objecter.cc
+++ b/src/osdc/Objecter.cc
@@ -321,8 +321,7 @@ void Objecter::_linger_ack(LingerOp *info, int r)
{
ldout(cct, 10) << "_linger_ack " << info->linger_id << dendl;
if (info->on_reg_ack) {
- info->on_reg_ack->finish(r);
- delete info->on_reg_ack;
+ info->on_reg_ack->complete(r);
info->on_reg_ack = NULL;
}
}
@@ -331,8 +330,7 @@ void Objecter::_linger_commit(LingerOp *info, int r)
{
ldout(cct, 10) << "_linger_commit " << info->linger_id << dendl;
if (info->on_reg_commit) {
- info->on_reg_commit->finish(r);
- delete info->on_reg_commit;
+ info->on_reg_commit->complete(r);
info->on_reg_commit = NULL;
}
@@ -676,8 +674,7 @@ void Objecter::handle_osd_map(MOSDMap *m)
//go through the list and call the onfinish methods
for (list<pair<Context*, int> >::iterator i = p->second.begin();
i != p->second.end(); ++i) {
- i->first->finish(i->second);
- delete i->first;
+ i->first->complete(i->second);
}
waiting_for_map.erase(p++);
}
@@ -1622,12 +1619,10 @@ void Objecter::handle_osd_op_reply(MOSDOpReply *m)
// do callbacks
if (onack) {
- onack->finish(rc);
- delete onack;
+ onack->complete(rc);
}
if (oncommit) {
- oncommit->finish(rc);
- delete oncommit;
+ oncommit->complete(rc);
}
m->put();
@@ -1646,8 +1641,7 @@ void Objecter::list_objects(ListContext *list_context, Context *onfinish) {
<< "\nlist_context->cookie" << list_context->cookie << dendl;
if (list_context->at_end) {
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
return;
}
@@ -1667,8 +1661,7 @@ void Objecter::list_objects(ListContext *list_context, Context *onfinish) {
list_context->starting_pg_num = pg_num;
}
if (list_context->current_pg == pg_num){ //this context got all the way through
- onfinish->finish(0);
- delete onfinish;
+ onfinish->complete(0);
return;
}
@@ -1722,9 +1715,8 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
ldout(cct, 20) << "got a response with objects, proceeding" << dendl;
list_context->list.merge(response.entries);
if (response_size >= list_context->max_entries) {
- final_finish->finish(0);
+ final_finish->complete(0);
delete bl;
- delete final_finish;
return;
}
@@ -1756,8 +1748,7 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
ldout(cct, 20) << "out of pgs, returning to" << final_finish << dendl;
list_context->at_end = true;
delete bl;
- final_finish->finish(0);
- delete final_finish;
+ final_finish->complete(0);
return;
}
@@ -1799,8 +1790,7 @@ struct C_SelfmanagedSnap : public Context {
bufferlist::iterator p = bl.begin();
::decode(*psnapid, p);
}
- fin->finish(r);
- delete fin;
+ fin->complete(r);
}
};
@@ -1975,8 +1965,7 @@ void Objecter::handle_pool_op_reply(MPoolOpReply *m)
wait_for_new_map(op->onfinish, m->epoch, m->replyCode);
}
else {
- op->onfinish->finish(m->replyCode);
- delete op->onfinish;
+ op->onfinish->complete(m->replyCode);
}
op->onfinish = NULL;
delete op;
@@ -2033,8 +2022,7 @@ void Objecter::handle_get_pool_stats_reply(MGetPoolStatsReply *m)
*op->pool_stats = m->pool_stats;
if (m->version > last_seen_pgmap_version)
last_seen_pgmap_version = m->version;
- op->onfinish->finish(0);
- delete op->onfinish;
+ op->onfinish->complete(0);
poolstat_ops.erase(tid);
delete op;
@@ -2085,8 +2073,7 @@ void Objecter::handle_fs_stats_reply(MStatfsReply *m)
*(op->stats) = m->h.st;
if (m->h.version > last_seen_pgmap_version)
last_seen_pgmap_version = m->h.version;
- op->onfinish->finish(0);
- delete op->onfinish;
+ op->onfinish->complete(0);
statfs_ops.erase(tid);
delete op;
@@ -2128,8 +2115,7 @@ void Objecter::_sg_read_finish(vector<ObjectExtent>& extents, vector<bufferlist>
ldout(cct, 7) << "_sg_read_finish " << bytes_read << " bytes" << dendl;
if (onfinish) {
- onfinish->finish(bytes_read);// > 0 ? bytes_read:m->get_result());
- delete onfinish;
+ onfinish->complete(bytes_read);// > 0 ? bytes_read:m->get_result());
}
}
diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h
index c1cac88b60e..b593bef69d9 100644
--- a/src/osdc/Objecter.h
+++ b/src/osdc/Objecter.h
@@ -860,8 +860,7 @@ public:
if (pmtime)
*pmtime = m;
}
- fin->finish(r);
- delete fin;
+ fin->complete(r);
}
};
@@ -875,8 +874,7 @@ public:
bufferlist::iterator p = bl.begin();
::decode(attrset, p);
}
- fin->finish(r);
- delete fin;
+ fin->complete(r);
}
};
@@ -916,8 +914,7 @@ public:
if (r >= 0) {
objecter->_list_reply(list_context, r, bl, final_finish, epoch);
} else {
- final_finish->finish(r);
- delete final_finish;
+ final_finish->complete(r);
}
}
};
diff --git a/src/test/ObjectMap/KeyValueDBMemory.h b/src/test/ObjectMap/KeyValueDBMemory.h
index baed9de28e0..93d0809d491 100644
--- a/src/test/ObjectMap/KeyValueDBMemory.h
+++ b/src/test/ObjectMap/KeyValueDBMemory.h
@@ -104,8 +104,7 @@ public:
for (list<Context *>::iterator i = on_commit.begin();
i != on_commit.end();
on_commit.erase(i++)) {
- (*i)->finish(0);
- delete *i;
+ (*i)->complete(0);
}
return 0;
}
diff --git a/src/test/filestore/workload_generator.h b/src/test/filestore/workload_generator.h
index 6a63b353c61..80e95dae6ec 100644
--- a/src/test/filestore/workload_generator.h
+++ b/src/test/filestore/workload_generator.h
@@ -163,7 +163,7 @@ public:
: stat_state(state), ctx(context) { }
void finish(int r) {
- ctx->finish(r);
+ ctx->complete(r);
stat_state->wrkldgen->m_stats_lock.Lock();
diff --git a/src/test/gather.cc b/src/test/gather.cc
index 92bec7650c6..e067ceed8f9 100644
--- a/src/test/gather.cc
+++ b/src/test/gather.cc
@@ -40,8 +40,7 @@ TEST(ContextGather, OneSub) {
C_Checker *checker = new C_Checker(&finish_called, &result);
gather.set_finisher(checker);
gather.activate();
- sub->finish(0);
- delete sub;
+ sub->complete(0);
EXPECT_TRUE(finish_called);
EXPECT_EQ(0, result);
}
@@ -63,14 +62,12 @@ TEST(ContextGather, ManySubs) {
//finish all except one sub
for (int j = 0; j < sub_count - 1; ++j) {
- subs[j]->finish(0);
- delete subs[j];
+ subs[j]->complete(0);
EXPECT_FALSE(finish_called);
}
//finish last one and check asserts
- subs[sub_count-1]->finish(0);
- delete subs[sub_count-1];
+ subs[sub_count-1]->complete(0);
EXPECT_TRUE(finish_called);
}
@@ -92,16 +89,14 @@ TEST(ContextGather, AlternatingSubCreateFinish) {
//alternate finishing first half of subs and creating last half of subs
for (int j = 0; j < sub_count / 2; ++j) {
- subs[j]->finish(0);
- delete subs[j];
+ subs[j]->complete(0);
subs[sub_count / 2 + j] = gather.new_sub();
}
gather.activate();
//finish last half of subs
for (int k = sub_count / 2; k < sub_count; ++k) {
- subs[k]->finish(0);
- delete subs[k];
+ subs[k]->complete(0);
}
EXPECT_TRUE(finish_called);