]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/objectstore: add new op OP_CREATE for create a new object.
authorJianpeng Ma <jianpeng.ma@intel.com>
Tue, 11 Jun 2019 08:41:44 +0000 (16:41 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Tue, 11 Jun 2019 08:41:44 +0000 (16:41 +0800)
For OP_CREATE in bluestore mean node didn't exist, so skip search form kvdb.

This function merged  in 22f73ba. But because compatible problem,
it revert in 491c254.
This commit fix the compatible problem

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/os/Transaction.cc
src/os/Transaction.h
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h
src/os/filestore/FileStore.cc
src/os/kstore/KStore.cc
src/os/memstore/MemStore.cc
src/osd/ECBackend.cc
src/osd/ECTransaction.cc
src/osd/ECTransaction.h
src/osd/ReplicatedBackend.cc

index 5a5ae0cb6a2995d15779c816e288433f4ce2e2ee..d3a04579ddac287d149a6b96fc7699d5dcfb3b23 100644 (file)
@@ -56,6 +56,16 @@ void Transaction::dump(ceph::Formatter *f)
     case Transaction::OP_NOP:
       f->dump_string("op_name", "nop");
       break;
+    case Transaction::OP_CREATE:
+      {
+       coll_t cid = i.get_cid(op->cid);
+       ghobject_t oid = i.get_oid(op->oid);
+       f->dump_string("op_name", "create");
+       f->dump_stream("collection") << cid;
+       f->dump_stream("oid") << oid;
+      }
+      break;
+
     case Transaction::OP_TOUCH:
       {
         coll_t cid = i.get_cid(op->cid);
index 5c8111779a7e268f670a2f5703ef8fda6d6e1a3d..20d554819c296f054af47620879d8ce94936f7b8 100644 (file)
@@ -106,6 +106,7 @@ class Transaction {
 public:
   enum {
     OP_NOP =          0,
+    OP_CREATE =       7,   // cid, oid
     OP_TOUCH =        9,   // cid, oid
     OP_WRITE =        10,  // cid, oid, offset, len, bl
     OP_ZERO =         11,  // cid, oid, offset, len
@@ -400,6 +401,7 @@ public:
     case OP_NOP:
       break;
 
+    case OP_CREATE:
     case OP_TOUCH:
     case OP_REMOVE:
     case OP_SETATTR:
@@ -791,6 +793,19 @@ public:
     _op->op = OP_NOP;
     data.ops++;
   }
+  /**
+   * create
+   *
+   * create an object that does not yet exist
+   * (behavior is undefined if the object already exists)
+   */
+  void create(const coll_t& cid, const ghobject_t& oid) {
+    Op* _op = _get_next_op();
+    _op->op = OP_CREATE;
+    _op->cid = _get_coll_id(cid);
+    _op->oid = _get_object_id(oid);
+    data.ops++;
+  }
   /**
    * touch
    *
index 5db054135e167ed80f56ba949d9d184da2dc2ba8..f96caa7e6b0b9bbde56fb39b8b06b99f6e9ecdc8 100644 (file)
@@ -3504,7 +3504,8 @@ uint64_t BlueStore::Collection::make_blob_unshared(SharedBlob *sb)
 
 BlueStore::OnodeRef BlueStore::Collection::get_onode(
   const ghobject_t& oid,
-  bool create)
+  bool create,
+  bool is_createop)
 {
   ceph_assert(create ? lock.is_wlocked() : lock.is_locked());
 
@@ -3528,9 +3529,12 @@ BlueStore::OnodeRef BlueStore::Collection::get_onode(
                        << pretty_binary_string(key) << dendl;
 
   bufferlist v;
-  int r = store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);
-  ldout(store->cct, 20) << " r " << r << " v.len " << v.length() << dendl;
+  int r = -ENOENT;
   Onode *on;
+  if (!is_createop) {
+    r = store->db->get(PREFIX_OBJ, key.c_str(), key.size(), &v);
+    ldout(store->cct, 20) << " r " << r << " v.len " << v.length() << dendl;
+  }
   if (v.length() == 0) {
     ceph_assert(r == -ENOENT);
     if (!store->cct->_conf->bluestore_debug_misc &&
@@ -11186,6 +11190,7 @@ void BlueStore::_txc_add_transaction(TransContext *txc, Transaction *t)
     // these operations implicity create the object
     bool create = false;
     if (op->op == Transaction::OP_TOUCH ||
+       op->op == Transaction::OP_CREATE ||
        op->op == Transaction::OP_WRITE ||
        op->op == Transaction::OP_ZERO) {
       create = true;
@@ -11196,7 +11201,7 @@ void BlueStore::_txc_add_transaction(TransContext *txc, Transaction *t)
     OnodeRef &o = ovec[op->oid];
     if (!o) {
       ghobject_t oid = i.get_oid(op->oid);
-      o = c->get_onode(oid, create);
+      o = c->get_onode(oid, create, op->op == Transaction::OP_CREATE);
     }
     if (!create && (!o || !o->exists)) {
       dout(10) << __func__ << " op " << op->op << " got ENOENT on "
@@ -11206,6 +11211,7 @@ void BlueStore::_txc_add_transaction(TransContext *txc, Transaction *t)
     }
 
     switch (op->op) {
+    case Transaction::OP_CREATE:
     case Transaction::OP_TOUCH:
       r = _touch(txc, c, o);
       break;
index 227716dfe3cd0a8f890f371dcb29827cf3af7d4e..4f33010da278307e7b1138315afa1b8d89a484b1 100644 (file)
@@ -1396,7 +1396,7 @@ public:
     pool_opts_t pool_opts;
     ContextQueue *commit_queue;
 
-    OnodeRef get_onode(const ghobject_t& oid, bool create);
+    OnodeRef get_onode(const ghobject_t& oid, bool create, bool is_createop=false);
 
     // the terminology is confusing here, sorry!
     //
index e72f0cc3095e4733918847c4936440ddc6581467..ac7c6157075b2afeaf3833ec27086445f66d3901 100644 (file)
@@ -2788,6 +2788,7 @@ void FileStore::_do_transaction(
     case Transaction::OP_NOP:
       break;
     case Transaction::OP_TOUCH:
+    case Transaction::OP_CREATE:
       {
         const coll_t &_cid = i.get_cid(op->cid);
         const ghobject_t &oid = i.get_oid(op->oid);
index 2cf82e5efd0fabafa9beafb32cdd8664c7f04040..eab11add1a27adda89c011bbf663c487646b0cdd 100644 (file)
@@ -2315,6 +2315,7 @@ void KStore::_txc_add_transaction(TransContext *txc, Transaction *t)
       // these operations implicity create the object
       bool create = false;
       if (op->op == Transaction::OP_TOUCH ||
+         op->op == Transaction::OP_CREATE ||
          op->op == Transaction::OP_WRITE ||
          op->op == Transaction::OP_ZERO) {
        create = true;
@@ -2333,6 +2334,7 @@ void KStore::_txc_add_transaction(TransContext *txc, Transaction *t)
 
     switch (op->op) {
     case Transaction::OP_TOUCH:
+    case Transaction::OP_CREATE:
        r = _touch(txc, c, o);
       break;
 
index dc1d5ff55abb567912b8caba3bf86a1194659fc0..02bbf62395f4a40b44bed4ee69c2abc2b1087303 100644 (file)
@@ -670,6 +670,7 @@ void MemStore::_do_transaction(Transaction& t)
     case Transaction::OP_NOP:
       break;
     case Transaction::OP_TOUCH:
+    case Transaction::OP_CREATE:
       {
         coll_t cid = i.get_cid(op->cid);
         ghobject_t oid = i.get_oid(op->oid);
index a14de9558a5d27dd74cab044947f89e825a02d0c..cad3fc40cc21c9ab8d8f0f145ab2c96092a36410 100644 (file)
@@ -1980,7 +1980,8 @@ bool ECBackend::try_reads_to_commit()
       &trans,
       &(op->temp_added),
       &(op->temp_cleared),
-      get_parent()->get_dpp());
+      get_parent()->get_dpp(),
+      get_osdmap()->require_osd_release);
   }
 
   dout(20) << __func__ << ": " << cache << dendl;
index 38402004c5d918e0c34a3e2e443c8ff46edcd169..0489fd7b5a78f3f7c42d9c22425fd5836f45897d 100644 (file)
@@ -105,7 +105,8 @@ void ECTransaction::generate_transactions(
   map<shard_id_t, ObjectStore::Transaction> *transactions,
   set<hobject_t> *temp_added,
   set<hobject_t> *temp_removed,
-  DoutPrefixProvider *dpp)
+  DoutPrefixProvider *dpp,
+  const ceph_release_t require_osd_release)
 {
   ceph_assert(written_map);
   ceph_assert(transactions);
@@ -264,9 +265,15 @@ void ECTransaction::generate_transactions(
        [&](const PGTransaction::ObjectOperation::Init::None &) {},
        [&](const PGTransaction::ObjectOperation::Init::Create &op) {
          for (auto &&st: *transactions) {
-           st.second.touch(
-             coll_t(spg_t(pgid, st.first)),
-             ghobject_t(oid, ghobject_t::NO_GEN, st.first));
+           if (require_osd_release >= ceph_release_t::nautilus) {
+             st.second.create(
+               coll_t(spg_t(pgid, st.first)),
+               ghobject_t(oid, ghobject_t::NO_GEN, st.first));
+           } else {
+             st.second.touch(
+               coll_t(spg_t(pgid, st.first)),
+               ghobject_t(oid, ghobject_t::NO_GEN, st.first));
+           }
          }
        },
        [&](const PGTransaction::ObjectOperation::Init::Clone &op) {
index ae0faf5df4de4ee172dc9720bbe0150a1ce20d72..704be1f08269c1073bed062897607a1a6f53cc33 100644 (file)
@@ -193,7 +193,8 @@ namespace ECTransaction {
     map<shard_id_t, ObjectStore::Transaction> *transactions,
     set<hobject_t> *temp_added,
     set<hobject_t> *temp_removed,
-    DoutPrefixProvider *dpp);
+    DoutPrefixProvider *dpp,
+    const ceph_release_t require_osd_release = ceph_release_t::unknown);
 };
 
 #endif
index 81e2651d988bc9d618a1a67a721139c06855e2b8..31e0af78d4ea58d92141e0bd2998ad2f0215c4d0 100644 (file)
@@ -282,7 +282,8 @@ void generate_transaction(
   vector<pg_log_entry_t> &log_entries,
   ObjectStore::Transaction *t,
   set<hobject_t> *added,
-  set<hobject_t> *removed)
+  set<hobject_t> *removed,
+  const ceph_release_t require_osd_release = ceph_release_t::unknown )
 {
   ceph_assert(t);
   ceph_assert(added);
@@ -323,7 +324,11 @@ void generate_transaction(
        [&](const PGTransaction::ObjectOperation::Init::None &) {
        },
        [&](const PGTransaction::ObjectOperation::Init::Create &op) {
-         t->touch(coll, goid);
+         if (require_osd_release >= ceph_release_t::nautilus) {
+           t->create(coll, goid);
+         } else {
+           t->touch(coll, goid);
+         }
        },
        [&](const PGTransaction::ObjectOperation::Init::Clone &op) {
          t->clone(
@@ -449,7 +454,8 @@ void ReplicatedBackend::submit_transaction(
     log_entries,
     &op_t,
     &added,
-    &removed);
+    &removed,
+    get_osdmap()->require_osd_release);
   ceph_assert(added.size() <= 1);
   ceph_assert(removed.size() <= 1);