]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
workload_generator: get rid of our lock.
authorJoao Eduardo Luis <jecluis@gmail.com>
Thu, 26 Apr 2012 19:19:59 +0000 (20:19 +0100)
committerJoao Eduardo Luis <jecluis@gmail.com>
Thu, 26 Apr 2012 19:19:59 +0000 (20:19 +0100)
We don't need the lock in the WorkloadGenerator class. Everything that does
need a lock is handled by TestFileStoreState, and all that remains can be
handled by an atomic_t.

Signed-off-by: Joao Eduardo Luis <jecluis@gmail.com>
src/test/filestore/workload_generator.cc
src/test/filestore/workload_generator.h

index c6d04e13c1d7f24f743b6b0e172e751f6031537c..4734305d5d8bf330c9a32d5bf69fc3a0efb04450 100644 (file)
@@ -38,12 +38,12 @@ WorkloadGenerator::WorkloadGenerator(vector<const char*> args)
   : TestFileStoreState(NULL),
     m_num_ops(-1),
     m_destroy_coll_every_nr_runs(def_destroy_coll_every_nr_runs),
-    m_nr_runs(0),
-    m_num_colls(def_num_colls),
-    m_lock("State Lock")
+    m_num_colls(def_num_colls)
 {
   int err = 0;
 
+  m_nr_runs.set(0);
+
   init_args(args);
   dout(0) << "data            = " << g_conf->osd_data << dendl;
   dout(0) << "journal         = " << g_conf->osd_journal << dendl;
@@ -150,6 +150,9 @@ void WorkloadGenerator::do_write_object(ObjectStore::Transaction *t,
   size_t bytes = get_random_byte_amount(min_write_bytes, max_write_bytes);
   bufferlist bl;
   get_filled_byte_array(bl, bytes);
+
+  dout(0) << __func__ << " " << coll << "/" << obj
+      << " size " << bl.length() << dendl;
   t->write(coll, obj, 0, bl.length(), bl);
 }
 
@@ -161,6 +164,8 @@ void WorkloadGenerator::do_setattr_object(ObjectStore::Transaction *t,
 
   bufferlist bl;
   get_filled_byte_array(bl, size);
+
+  dout(0) << __func__ << " " << coll << "/" << obj << " size " << size << dendl;
   t->setattr(coll, obj, "objxattr", bl);
 }
 
@@ -172,6 +177,7 @@ void WorkloadGenerator::do_setattr_collection(ObjectStore::Transaction *t,
 
   bufferlist bl;
   get_filled_byte_array(bl, size);
+  dout(0) << __func__ << " coll " << coll << " size " << size << dendl;
   t->collection_setattr(coll, "collxattr", bl);
 }
 
@@ -182,8 +188,11 @@ void WorkloadGenerator::do_append_log(ObjectStore::Transaction *t,
 {
   bufferlist bl;
   get_filled_byte_array(bl, log_append_bytes);
-//  hobject_t log_obj = get_coll_meta_object(coll);
   hobject_t log_obj = entry->m_meta_obj;
+
+  dout(0) << __func__ << " coll " << entry->m_coll << " "
+      << META_COLL << " /" << log_obj << " (" << bl.length() << ")" << dendl;
+
   uint64_t s = pg_log_size[entry->m_coll];
   t->write(META_COLL, log_obj, s, bl.length(), bl);
   pg_log_size[entry->m_coll] += bl.length();
@@ -192,12 +201,12 @@ void WorkloadGenerator::do_append_log(ObjectStore::Transaction *t,
 void WorkloadGenerator::do_destroy_collection(ObjectStore::Transaction *t,
                                              coll_entry_t *entry)
 {  
-  m_nr_runs = 0;
+  m_nr_runs.set(0);
   entry->m_osr.flush();
   vector<hobject_t> ls;
   m_store->collection_list(entry->m_coll, ls);
-  dout(0) << "Destroying collection '" << entry->m_coll.to_str()
-      << "' (" << ls.size() << " objects)" << dendl;
+  dout(0) << __func__ << " coll " << entry->m_coll
+      << " (" << ls.size() << " objects)" << dendl;
 
   vector<hobject_t>::iterator it;
   for (it = ls.begin(); it < ls.end(); it++) {
@@ -239,7 +248,11 @@ void WorkloadGenerator::run()
       break;
     }
 
-    m_lock.Lock();
+    dout(5) << __func__
+        << " m_finished_lock is-locked: " << m_finished_lock.is_locked()
+        << " in-flight: " << m_in_flight.read()
+        << dendl;
+
     wait_for_ready();
 
     ObjectStore::Transaction *t = new ObjectStore::Transaction;
@@ -281,14 +294,19 @@ void WorkloadGenerator::run()
 
 queue_tx:
     m_store->queue_transaction(&(entry->m_osr), t, c);
-    m_in_flight++;
-    m_lock.Unlock();
+
+    inc_in_flight();
 
     ops_run ++;
 
   } while (true);
 
+  dout(0) << __func__ << " waiting for "
+      << m_in_flight.read() << " in-flight transactions" << dendl;
+
   wait_for_done();
+
+  dout(0) << __func__ << " finishing" << dendl;
 }
 
 void WorkloadGenerator::print_results()
@@ -329,7 +347,7 @@ int main(int argc, const char *argv[])
   def_args.push_back("--osd-data");
   def_args.push_back("workload_gen_dir");
   def_args.push_back("--osd-journal");
-  def_args.push_back("workload_gen_journal");
+  def_args.push_back("workload_gen_dir/journal");
   argv_to_vec(argc, argv, args);
 
   global_init(&def_args, args,
index 1bbf8fb9836a1827275ba924ba6c2d7e500147b9..544bba3a35d52ca75039795fbc0af0b36af721bd 100644 (file)
@@ -45,7 +45,7 @@ public:
 private:
   int m_num_ops;
   int m_destroy_coll_every_nr_runs;
-  int m_nr_runs;
+  atomic_t m_nr_runs;
 
   int m_num_colls;
 
@@ -53,9 +53,6 @@ private:
 
   map<coll_t, uint64_t> pg_log_size;
 
-  Mutex m_lock;
-  Cond m_cond;
-
   void init_args(vector<const char*> args);
 
   int get_uniform_random_value(int min, int max);
@@ -76,7 +73,7 @@ private:
   void do_append_log(ObjectStore::Transaction *t, coll_entry_t *entry);
 
   bool should_destroy_collection() {
-    return (m_nr_runs >= m_destroy_coll_every_nr_runs);
+    return ((int)m_nr_runs.read() >= m_destroy_coll_every_nr_runs);
   }
   void do_destroy_collection(ObjectStore::Transaction *t, coll_entry_t *entry);
   coll_entry_t *do_create_collection(ObjectStore::Transaction *t);
@@ -98,8 +95,7 @@ public:
     void finish(int r)
     {
       TestFileStoreState::C_OnFinished::finish(r);
-      Mutex::Locker locker(wrkldgen_state->m_lock);
-      wrkldgen_state->m_nr_runs++;
+      wrkldgen_state->m_nr_runs.inc();
     }
   };