]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/objectstore: add new op OP_CREATE for create a new object. 22385/head
authorJianpeng Ma <jianpeng.ma@intel.com>
Wed, 19 Sep 2018 12:45:17 +0000 (20:45 +0800)
committerJianpeng Ma <jianpeng.ma@intel.com>
Mon, 19 Nov 2018 08:38:42 +0000 (16:38 +0800)
For OP_CREATE in bluestore mean node didn't exist, so skip search form kvdb.

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
src/os/ObjectStore.h
src/os/Transaction.cc
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/ECTransaction.cc
src/osd/ReplicatedBackend.cc

index 3c2ced9af05152c825f64d8e40962dc43a29a234..d8978cff5c414a2fc384be6d127cf5d6e1470d71 100644 (file)
@@ -307,6 +307,7 @@ public:
   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
@@ -601,6 +602,7 @@ public:
       case OP_NOP:
         break;
 
+      case OP_CREATE:
       case OP_TOUCH:
       case OP_REMOVE:
       case OP_SETATTR:
@@ -996,6 +998,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 ad390a1c3eeebab445dabab9285080f8d51c7978..e0c2b7b26ac36fc9686a30ee58b02bb1f49d8b40 100644 (file)
@@ -19,6 +19,16 @@ void ObjectStore::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 e0de190a1dd8d59e3d24852b42632a09c31bbc0f..962c4077759699d7df39ce0e88a60d4e5d925bd8 100644 (file)
@@ -3299,7 +3299,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());
 
@@ -3312,9 +3313,12 @@ BlueStore::OnodeRef BlueStore::Collection::get_onode(
     }
   }
 
-  OnodeRef o = onode_map.lookup(oid);
-  if (o)
-    return o;
+  OnodeRef o = OnodeRef();
+  if (!is_createop) {
+    o = onode_map.lookup(oid);
+    if (o)
+      return o;
+  }
 
   mempool::bluestore_cache_other::string key;
   get_object_key(store->cct, oid, &key);
@@ -3323,9 +3327,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 &&
@@ -10399,6 +10406,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;
@@ -10409,7 +10417,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 "
@@ -10419,6 +10427,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 05324916456eac0c6ca92f4c6267b1834712e4e6..cc80b949f3294754499b96002b3ab6a45f253b74 100644 (file)
@@ -1379,7 +1379,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 46a27b058752346d2109602f2cfe431722b566e4..970a1db5e2b756cfac56fcf521a2f4b06a85b1c0 100644 (file)
@@ -2749,6 +2749,7 @@ void FileStore::_do_transaction(
     switch (op->op) {
     case Transaction::OP_NOP:
       break;
+    case Transaction::OP_CREATE:
     case Transaction::OP_TOUCH:
       {
         const coll_t &_cid = i.get_cid(op->cid);
index 616ca1b6a25eed8c290efb1bfd8536aa9e5ac27d..5c447145383bde3d27410084265e48a1d1e695e2 100644 (file)
@@ -2308,6 +2308,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;
@@ -2325,6 +2326,7 @@ void KStore::_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 f3a7e39abbbe890484e9d7024dd3b32ff026b798..7e1c96e0411c6f48e3996943207117f0bf560d53 100644 (file)
@@ -662,6 +662,7 @@ void MemStore::_do_transaction(Transaction& t)
     switch (op->op) {
     case Transaction::OP_NOP:
       break;
+    case Transaction::OP_CREATE:
     case Transaction::OP_TOUCH:
       {
         coll_t cid = i.get_cid(op->cid);
index ee791d633c6ea8ecdba5005cae452626228d6057..e2db8aa5508df4e2778203874ab13d1c05adf209 100644 (file)
@@ -264,7 +264,7 @@ void ECTransaction::generate_transactions(
        [&](const PGTransaction::ObjectOperation::Init::None &) {},
        [&](const PGTransaction::ObjectOperation::Init::Create &op) {
          for (auto &&st: *transactions) {
-           st.second.touch(
+           st.second.create(
              coll_t(spg_t(pgid, st.first)),
              ghobject_t(oid, ghobject_t::NO_GEN, st.first));
          }
index fb93bf9a587888aa12e1d655dc66993621430828..92a686825715b98f75430db9a45a8c0e9082844d 100644 (file)
@@ -322,7 +322,7 @@ void generate_transaction(
        [&](const PGTransaction::ObjectOperation::Init::None &) {
        },
        [&](const PGTransaction::ObjectOperation::Init::Create &op) {
-         t->touch(coll, goid);
+         t->create(coll, goid);
        },
        [&](const PGTransaction::ObjectOperation::Init::Clone &op) {
          t->clone(