]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/test/objectstore/DeterministicOpSequence.cc
update sources to 12.2.7
[ceph.git] / ceph / src / test / objectstore / DeterministicOpSequence.cc
index 772715eb4ccbe2eab4a4ca68aa68906889df72b1..cbf695cead8330346a32b93e0ae4732045751443 100644 (file)
@@ -81,6 +81,7 @@ bool DeterministicOpSequence::run_one_op(int op, rngen_t& gen)
     break;
 
   default:
+    cout << "bad op " << op << std::endl;
     assert(0 == "bad op");
   }
   return ok;
@@ -164,9 +165,9 @@ bool DeterministicOpSequence::do_touch(rngen_t& gen)
   }
   hobject_t *obj = entry->touch_obj(obj_id);
 
-  dout(0) << "do_touch " << entry->m_coll.to_str() << "/" << obj->oid.name << dendl;
+  dout(0) << "do_touch " << entry->m_coll << "/" << obj << dendl;
 
-  _do_touch(entry->m_coll, *obj);
+  _do_touch(entry, *obj);
   return true;
 }
 
@@ -185,9 +186,9 @@ bool DeterministicOpSequence::do_remove(rngen_t& gen)
   hobject_t *obj = entry->touch_obj(obj_id);
   ceph_assert(obj);
 
-  dout(0) << "do_remove " << entry->m_coll.to_str() << "/" << obj->oid.name << dendl;
+  dout(0) << "do_remove " << entry->m_coll << "/" << obj << dendl;
 
-  _do_remove(entry->m_coll, *obj);
+  _do_remove(entry, *obj);
   hobject_t *rmobj = entry->remove_obj(obj_id);
   ceph_assert(rmobj);
   delete rmobj;
@@ -245,7 +246,7 @@ bool DeterministicOpSequence::do_set_attrs(rngen_t& gen)
   gen_attrs(gen, &out);
 
   dout(0) << "do_set_attrs " << out.size() << " entries" << dendl;
-  _do_set_attrs(entry->m_coll, *obj, out);
+  _do_set_attrs(entry, *obj, out);
   return true;
 }
 
@@ -269,65 +270,70 @@ bool DeterministicOpSequence::do_write(rngen_t& gen)
   bufferlist bl;
   _gen_random(gen, size, bl);
 
-  dout(0) << "do_write " << entry->m_coll.to_str() << "/" << obj->oid.name
+  dout(0) << "do_write " << entry->m_coll << "/" << obj
          << " 0~" << size << dendl;
 
-  _do_write(entry->m_coll, *obj, 0, bl.length(), bl);
+  _do_write(entry, *obj, 0, bl.length(), bl);
   return true;
 }
 
-bool DeterministicOpSequence::_prepare_clone(rngen_t& gen,
-                                            coll_t& coll_ret, hobject_t& orig_obj_ret, hobject_t& new_obj_ret)
+bool DeterministicOpSequence::_prepare_clone(
+  rngen_t& gen,
+  coll_entry_t **entry_ret,
+  int *orig_obj_id,
+  hobject_t *orig_obj_ret,
+  int *new_obj_id,
+  hobject_t *new_obj_ret)
 {
   int coll_id = _gen_coll_id(gen);
 
   coll_entry_t *entry = get_coll_at(coll_id);
   ceph_assert(entry != NULL);
 
-  if (entry->m_objects.size() >= 2) {
-    dout(0) << "_prepare_clone coll " << entry->m_coll.to_str()
+  if (entry->m_objects.size() < 2) {
+    dout(0) << "_prepare_clone coll " << entry->m_coll
            << " doesn't have 2 or more objects" << dendl;
     return false;
   }
 
-  int orig_obj_id = entry->get_random_obj_id(gen);
-  hobject_t *orig_obj = entry->touch_obj(orig_obj_id);
+  *orig_obj_id = entry->get_random_obj_id(gen);
+  hobject_t *orig_obj = entry->touch_obj(*orig_obj_id);
   ceph_assert(orig_obj);
 
-  int id;
   do {
-    id = entry->get_random_obj_id(gen);
-  } while (id == orig_obj_id);
-  hobject_t *new_obj = entry->touch_obj(id);
+    *new_obj_id = entry->get_random_obj_id(gen);
+  } while (*new_obj_id == *orig_obj_id);
+  hobject_t *new_obj = entry->touch_obj(*new_obj_id);
   ceph_assert(new_obj);
 
-  coll_ret = entry->m_coll;
-  orig_obj_ret = *orig_obj;
-  new_obj_ret = *new_obj;
-
+  *entry_ret = entry;
+  *orig_obj_ret = *orig_obj;
+  *new_obj_ret = *new_obj;
   return true;
 }
 
 bool DeterministicOpSequence::do_clone(rngen_t& gen)
 {
-  coll_t coll;
+  coll_entry_t *entry;
+  int orig_id, new_id;
   hobject_t orig_obj, new_obj;
-  if (!_prepare_clone(gen, coll, orig_obj, new_obj)) {
+  if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) {
     return false;
   }
 
-  dout(0) << "do_clone " << coll.to_str() << "/" << orig_obj.oid.name
-      << " => " << coll.to_str() << "/" << new_obj.oid.name << dendl;
+  dout(0) << "do_clone " << entry->m_coll << "/" << orig_obj
+      << " => " << entry->m_coll << "/" << new_obj << dendl;
 
-  _do_clone(coll, orig_obj, new_obj);
+  _do_clone(entry, orig_obj, new_obj);
   return true;
 }
 
 bool DeterministicOpSequence::do_clone_range(rngen_t& gen)
 {
-  coll_t coll;
+  coll_entry_t *entry;
+  int orig_id, new_id;
   hobject_t orig_obj, new_obj;
-  if (!_prepare_clone(gen, coll, orig_obj, new_obj)) {
+  if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) {
     return false;
   }
 
@@ -346,173 +352,116 @@ bool DeterministicOpSequence::do_clone_range(rngen_t& gen)
   boost::uniform_int<> clone_len(1, bl.length());
   size = (size_t) clone_len(gen);
 
-  dout(0) << "do_clone_range " << coll.to_str() << "/" << orig_obj.oid.name
+  dout(0) << "do_clone_range " << entry->m_coll << "/" << orig_obj
       << " (0~" << size << ")"
-      << " => " << coll.to_str() << "/" << new_obj.oid.name
+      << " => " << entry->m_coll << "/" << new_obj
       << " (0)" << dendl;
-  _do_write_and_clone_range(coll, orig_obj, new_obj, 0, size, 0, bl);
+  _do_write_and_clone_range(entry, orig_obj, new_obj, 0, size, 0, bl);
   return true;
 }
 
-bool DeterministicOpSequence::_prepare_colls(rngen_t& gen,
-                                            coll_entry_t* &orig_coll, coll_entry_t* &new_coll)
-{
-  ceph_assert(m_collections_ids.size() > 1);
-  int orig_coll_id = _gen_coll_id(gen);
-  int new_coll_id;
-  do {
-    new_coll_id = _gen_coll_id(gen);
-  } while (new_coll_id == orig_coll_id);
-
-  dout(0) << "_prepare_colls from coll id " << orig_coll_id
-      << " to coll id " << new_coll_id << dendl;
-
-  orig_coll = get_coll_at(orig_coll_id);
-  ceph_assert(orig_coll != NULL);
-  new_coll = get_coll_at(new_coll_id);
-  ceph_assert(new_coll != NULL);
-
-  if (!orig_coll->m_objects.size()) {
-    dout(0) << "_prepare_colls coll " << orig_coll->m_coll.to_str()
-        << " has no objects to use" << dendl;
-    return false;
-  }
-
-  return true;
-}
-
-
 bool DeterministicOpSequence::do_coll_move(rngen_t& gen)
 {
-  coll_entry_t *orig_coll = NULL, *new_coll = NULL;
-  if (!_prepare_colls(gen, orig_coll, new_coll))
-    return false;
-
-  ceph_assert(orig_coll && new_coll);
-
-  boost::uniform_int<> obj_rng(0, orig_coll->m_objects.size()-1);
-  int obj_pos = obj_rng(gen);
-  int obj_key = -1;
-  hobject_t *obj = orig_coll->get_obj_at(obj_pos, &obj_key);
-  if (!obj) {
-    dout(0) << "do_coll_move coll " << orig_coll->m_coll.to_str()
-        << " has no object as pos #" << obj_pos << " (key " << obj_key << ")"
-        << dendl;
-    return false;
-  }
-  if (new_coll->check_for_obj(obj_key)) {
-    dout(0) << "do_coll_move coll " << orig_coll->m_coll.to_str()
-        << " already has object as pos #" << obj_pos << " (key " << obj_key << ")"
-        << dendl;
+  coll_entry_t *entry;
+  int orig_id, new_id;
+  hobject_t orig_obj, new_obj;
+  if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) {
     return false;
   }
-  dout(0) << "do_coll_move " << orig_coll->m_coll.to_str() << "/" << obj->oid.name
-        << " => " << new_coll->m_coll.to_str() << "/" << obj->oid.name << dendl;
-  new_coll->touch_obj(obj_key);
 
-  orig_coll->remove_obj(obj_key);
+  dout(0) << "do_coll_move " << entry->m_coll << "/" << orig_obj
+        << " => " << entry->m_coll << "/" << new_obj << dendl;
+  entry->remove_obj(orig_id);
 
-  _do_coll_move(orig_coll->m_coll, new_coll->m_coll, *obj);
+  _do_coll_move(entry, orig_obj, new_obj);
 
   return true;
 }
 
 bool DeterministicOpSequence::do_coll_create(rngen_t& gen)
 {
-  boost::uniform_int<> pg_num_range(0, 512);
-  int pg_num = pg_num_range(gen);
-
-  // Assume there is 7 OSDs in total, the PGs are evenly distributed across those OSDs
-  int pgs = pg_num / 7;
-
-  boost::uniform_int<> num_objs_range(1, 1024);
-  int num_objs = num_objs_range(gen);
-
-  int pool_id = get_next_pool_id();
-  std::set<int> pg_created;
-  for (int i = 0; i < pgs; i++) {
-    boost::uniform_int<> pg_range(0, pg_num - 1);
-    int pg_id = pg_range(gen);
-    if (pg_created.count(pg_id) > 0)
-      continue;
-    _do_coll_create(coll_t(spg_t(pg_t(pg_id,pool_id),shard_id_t::NO_SHARD)),
-                   (uint32_t) pg_num, (uint64_t) num_objs);
-    pg_created.insert(pg_id);
-  }
+  int i = m_collections.size();
+  coll_entry_t *entry = coll_create(i);
+  m_collections.insert(make_pair(i, entry));
+  m_collections_ids.push_back(i);
+
+  _do_coll_create(entry, 10, 10);
+  
   return true;
 }
 
-void DeterministicOpSequence::_do_coll_create(coll_t cid, uint32_t pg_num, uint64_t num_objs)
+void DeterministicOpSequence::_do_coll_create(coll_entry_t *entry, uint32_t pg_num, uint64_t num_objs)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.create_collection(cid, 32);
+  t.create_collection(entry->m_coll, 32);
   bufferlist hint;
-  ::encode(pg_num, hint);
-  ::encode(num_objs, hint);
-  t.collection_hint(cid, ObjectStore::Transaction::COLL_HINT_EXPECTED_NUM_OBJECTS, hint);
-  dout(0) << "Give collection: " << cid << " a hint, pg_num is: " << pg_num << ", num_objs is: "
-    << num_objs << dendl;
+  encode(pg_num, hint);
+  encode(num_objs, hint);
+  t.collection_hint(entry->m_coll, ObjectStore::Transaction::COLL_HINT_EXPECTED_NUM_OBJECTS, hint);
+  dout(0) << "Give collection: " << entry->m_coll
+         << " a hint, pg_num is: " << pg_num << ", num_objs is: "
+         << num_objs << dendl;
 
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_touch(coll_t coll, hobject_t& obj)
+void DeterministicOpSequence::_do_touch(coll_entry_t *entry, hobject_t& obj)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.touch(coll, ghobject_t(obj));
+  t.touch(entry->m_coll, ghobject_t(obj));
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_remove(coll_t coll, hobject_t& obj)
+void DeterministicOpSequence::_do_remove(coll_entry_t *entry, hobject_t& obj)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.remove(coll, ghobject_t(obj));
+  t.remove(entry->m_coll, ghobject_t(obj));
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_set_attrs(coll_t coll,
+void DeterministicOpSequence::_do_set_attrs(coll_entry_t *entry,
                                            hobject_t &obj,
                                            const map<string, bufferlist> &attrs)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.omap_setkeys(coll, ghobject_t(obj), attrs);
+  t.omap_setkeys(entry->m_coll, ghobject_t(obj), attrs);
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_write(coll_t coll, hobject_t& obj,
+void DeterministicOpSequence::_do_write(coll_entry_t *entry, hobject_t& obj,
                                        uint64_t off, uint64_t len, const bufferlist& data)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.write(coll, ghobject_t(obj), off, len, data);
+  t.write(entry->m_coll, ghobject_t(obj), off, len, data);
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_clone(coll_t coll, hobject_t& orig_obj,
+void DeterministicOpSequence::_do_clone(coll_entry_t *entry, hobject_t& orig_obj,
                                        hobject_t& new_obj)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.clone(coll, ghobject_t(orig_obj), ghobject_t(new_obj));
+  t.clone(entry->m_coll, ghobject_t(orig_obj), ghobject_t(new_obj));
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_clone_range(coll_t coll,
+void DeterministicOpSequence::_do_clone_range(coll_entry_t *entry,
                                              hobject_t& orig_obj, hobject_t& new_obj, uint64_t srcoff,
                                              uint64_t srclen, uint64_t dstoff)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.clone_range(coll, ghobject_t(orig_obj), ghobject_t(new_obj),
+  t.clone_range(entry->m_coll, ghobject_t(orig_obj), ghobject_t(new_obj),
                srcoff, srclen, dstoff);
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_write_and_clone_range(coll_t coll,
+void DeterministicOpSequence::_do_write_and_clone_range(coll_entry_t *entry,
                                                         hobject_t& orig_obj,
                                                         hobject_t& new_obj,
                                                         uint64_t srcoff,
@@ -522,19 +471,21 @@ void DeterministicOpSequence::_do_write_and_clone_range(coll_t coll,
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.write(coll, ghobject_t(orig_obj), srcoff, bl.length(), bl);
-  t.clone_range(coll, ghobject_t(orig_obj), ghobject_t(new_obj),
+  t.write(entry->m_coll, ghobject_t(orig_obj), srcoff, bl.length(), bl);
+  t.clone_range(entry->m_coll, ghobject_t(orig_obj), ghobject_t(new_obj),
                srcoff, srclen, dstoff);
   m_store->apply_transaction(&m_osr, std::move(t));
 }
 
-void DeterministicOpSequence::_do_coll_move(coll_t orig_coll, coll_t new_coll,
-                                           hobject_t& obj)
+void DeterministicOpSequence::_do_coll_move(coll_entry_t *entry,
+                                           hobject_t& orig_obj,
+                                           hobject_t& new_obj)
 {
   ObjectStore::Transaction t;
   note_txn(&t);
-  t.remove(new_coll, ghobject_t(obj));
-  t.collection_move_rename(orig_coll, ghobject_t(obj), new_coll, ghobject_t(obj));
+  t.remove(entry->m_coll, ghobject_t(new_obj));
+  t.collection_move_rename(entry->m_coll, ghobject_t(orig_obj),
+                          entry->m_coll, ghobject_t(new_obj));
   m_store->apply_transaction(&m_osr, std::move(t));
 }