From: Sage Weil Date: Sun, 4 Mar 2012 05:07:05 +0000 (-0800) Subject: objectstore: name Sequencers X-Git-Tag: v0.45~20^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=df5860fe8f118d32c364088a4324e2af3fb4093c;p=ceph.git objectstore: name Sequencers Assign a (unique) name to each Sequencer. This will aid in debugging, and can be useful when dumping traces of FileStore workloads. Signed-off-by: Sage Weil --- diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 6a93107efccd..d6d83eba1d50 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -660,6 +660,7 @@ FileStore::FileStore(const std::string &base, const std::string &jdev) : sync_entry_timeo_lock("sync_entry_timeo_lock"), timer(g_ceph_context, sync_entry_timeo_lock), stop(false), sync_thread(this), + default_osr("default"), op_queue_len(0), op_queue_bytes(0), op_finisher(g_ceph_context), next_finish(0), op_tp(g_ceph_context, "FileStore::op_tp", g_conf->filestore_op_threads), op_wq(this, g_conf->filestore_op_thread_timeout, diff --git a/src/os/FileStore.h b/src/os/FileStore.h index 28f0366cd987..5bcd37b01307 100644 --- a/src/os/FileStore.h +++ b/src/os/FileStore.h @@ -173,8 +173,9 @@ class FileStore : public JournalingObjectStore, } } - OpSequencer() : qlock("FileStore::OpSequencer::qlock", false, false), - apply_lock("FileStore::OpSequencer::apply_lock", false, false) {} + OpSequencer() + : qlock("FileStore::OpSequencer::qlock", false, false), + apply_lock("FileStore::OpSequencer::apply_lock", false, false) {} ~OpSequencer() { assert(q.empty()); } diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index e6f46f3d4f4f..43c6d08c64ae 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -80,16 +80,32 @@ public: Logger *logger; + /** + * a sequencer orders transactions + * + * Any transactions queued under a given sequencer will be applied in + * sequence. Transactions queued under different sequencers may run + * in parallel. + */ struct Sequencer_impl { virtual void flush() = 0; virtual ~Sequencer_impl() {} }; struct Sequencer { + string name; Sequencer_impl *p; - Sequencer() : p(NULL) {} + + Sequencer(string n) + : name(n), p(NULL) {} ~Sequencer() { delete p; } + + /// return a unique string identifier for this sequencer + const string& get_name() { + return name; + } + /// wait for any queued transactions on this sequencer to apply void flush() { if (p) p->flush(); diff --git a/src/osd/PG.h b/src/osd/PG.h index c1d6d3df5637..521d44dbc899 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -26,6 +26,7 @@ #include "include/assert.h" #include "include/types.h" +#include "include/stringify.h" #include "osd_types.h" #include "include/buffer.h" #include "include/xlist.h" @@ -1285,6 +1286,7 @@ public: backfill_target(-1), pg_stats_lock("PG::pg_stats_lock"), pg_stats_valid(false), + osr(stringify(p)), finish_sync_event(NULL), finalizing_scrub(false), scrub_reserved(false), scrub_reserve_failed(false), diff --git a/src/test/store_test.cc b/src/test/store_test.cc index d884e4c944ce..3bf93f315712 100644 --- a/src/test/store_test.cc +++ b/src/test/store_test.cc @@ -436,7 +436,7 @@ public: }; TEST_F(StoreTest, Synthetic) { - ObjectStore::Sequencer osr; + ObjectStore::Sequencer osr("test"); MixedGenerator gen; gen_type rng(time(NULL)); coll_t cid("synthetic_1"); diff --git a/src/test/xattr_bench.cc b/src/test/xattr_bench.cc index 0cad8ae9af8a..3a4b4236dad7 100644 --- a/src/test/xattr_bench.cc +++ b/src/test/xattr_bench.cc @@ -92,7 +92,7 @@ uint64_t do_run(ObjectStore *store, int attrsize, int numattrs, Cond cond; int in_flight = 0; ObjectStore::Transaction t; - map, ObjectStore::Sequencer> > collections; + map, ObjectStore::Sequencer*> > collections; for (int i = 0; i < 3*THREADS; ++i) { stringstream coll_str; coll_str << "coll_" << i << "_" << run; @@ -105,7 +105,7 @@ uint64_t do_run(ObjectStore *store, int attrsize, int numattrs, hobject_t(sobject_t(obj_str.str(), CEPH_NOSNAP))); objects.insert(obj_str.str()); } - collections[coll_str.str()] = make_pair(objects, ObjectStore::Sequencer()); + collections[coll_str.str()] = make_pair(objects, new ObjectStore::Sequencer(coll_str.str())); } store->apply_transaction(t); @@ -122,7 +122,7 @@ uint64_t do_run(ObjectStore *store, int attrsize, int numattrs, cond.Wait(lock); } ObjectStore::Transaction *t = new ObjectStore::Transaction; - map, ObjectStore::Sequencer> >::iterator iter = + map, ObjectStore::Sequencer*> >::iterator iter = rand_choose(collections); for (set::iterator obj = iter->second.first.begin(); obj != iter->second.first.end(); @@ -136,7 +136,7 @@ uint64_t do_run(ObjectStore *store, int attrsize, int numattrs, bl); } } - store->queue_transaction(&(iter->second.second), t, + store->queue_transaction(iter->second.second, t, new OnApplied(&lock, &cond, &in_flight, t)); }