From f9381c74931b80294e5df60f6d2e69c946b8fe88 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 23 Jan 2013 11:13:28 -0800 Subject: [PATCH] ObjectStore: add queue_transactions with oncomplete Signed-off-by: Samuel Just (cherry picked from commit 4d6ba06309b80fb21de7bb5d12d5482e71de5f16) --- src/os/ObjectStore.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/os/ObjectStore.h | 23 +++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/os/ObjectStore.cc b/src/os/ObjectStore.cc index 6087dee50f786..70e8b6ed19eac 100644 --- a/src/os/ObjectStore.cc +++ b/src/os/ObjectStore.cc @@ -12,6 +12,7 @@ * */ #include +#include #include "ObjectStore.h" #include "common/Formatter.h" @@ -40,6 +41,43 @@ unsigned ObjectStore::apply_transactions(Sequencer *osr, return r; } +template +struct Wrapper : public Context { + Context *to_run; + T val; + Wrapper(Context *to_run, T val) : to_run(to_run), val(val) {} + void finish(int r) { + if (to_run) + to_run->complete(r); + } +}; +struct RunOnDelete { + Context *to_run; + RunOnDelete(Context *to_run) : to_run(to_run) {} + ~RunOnDelete() { + if (to_run) + to_run->complete(0); + } +}; +typedef std::tr1::shared_ptr RunOnDeleteRef; +int ObjectStore::queue_transactions( + Sequencer *osr, + list& tls, + Context *onreadable, + Context *oncommit, + Context *onreadable_sync, + Context *oncomplete, + TrackedOpRef op = TrackedOpRef()) +{ + RunOnDeleteRef _complete(new RunOnDelete(oncomplete)); + Context *_onreadable = new Wrapper( + onreadable, _complete); + Context *_oncommit = new Wrapper( + oncommit, _complete); + return queue_transactions(osr, tls, _onreadable, _oncommit, + onreadable_sync, op); +} + void ObjectStore::Transaction::dump(ceph::Formatter *f) { f->open_array_section("ops"); diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index 5729490ac068d..504422981f48d 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -661,6 +661,29 @@ public: Context *onreadable_sync=0, TrackedOpRef op = TrackedOpRef()) = 0; + int queue_transactions( + Sequencer *osr, + list& tls, + Context *onreadable, + Context *oncommit, + Context *onreadable_sync, + Context *oncomplete, + TrackedOpRef op); + + int queue_transaction( + Sequencer *osr, + Transaction* t, + Context *onreadable, + Context *oncommit, + Context *onreadable_sync, + Context *oncomplete, + TrackedOpRef op) { + list tls; + tls.push_back(t); + return queue_transactions( + osr, tls, onreadable, oncommit, onreadable_sync, oncomplete, op); + } + public: ObjectStore() : logger(NULL) {} virtual ~ObjectStore() {} -- 2.39.5