]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/memstore: implement open_collection
authorSage Weil <sage@redhat.com>
Mon, 18 Jan 2016 16:05:32 +0000 (11:05 -0500)
committerSage Weil <sage@redhat.com>
Wed, 27 Jan 2016 19:34:51 +0000 (14:34 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/os/memstore/MemStore.cc
src/os/memstore/MemStore.h

index 06919d0f9a9c8c2e974f4f59d1c951dc9f969397..bf56cf3eab6a5723d82b42da7f9c576dc1464117 100644 (file)
@@ -1250,6 +1250,7 @@ int MemStore::_destroy_collection(coll_t cid)
     RWLock::RLocker l2(cp->second->lock);
     if (!cp->second->object_map.empty())
       return -ENOTEMPTY;
+    cp->second->exists = false;
   }
   used_bytes -= cp->second->used_bytes();
   coll_map.erase(cp);
index ac410a1d5d63066b00d56858f78d6c1efad08a52..174915f32880bac74d3a7762b054b86960308112 100644 (file)
@@ -156,18 +156,24 @@ public:
     }
   };
 
-  struct Collection : public RefCountedObject {
+  struct Collection : public CollectionImpl {
+    coll_t cid;
     CephContext *cct;
     bool use_page_set;
     ceph::unordered_map<ghobject_t, ObjectRef> object_hash;  ///< for lookup
     map<ghobject_t, ObjectRef,ghobject_t::BitwiseComparator> object_map;        ///< for iteration
     map<string,bufferptr> xattr;
     RWLock lock;   ///< for object_{map,hash}
+    bool exists;
 
     typedef boost::intrusive_ptr<Collection> Ref;
     friend void intrusive_ptr_add_ref(Collection *c) { c->get(); }
     friend void intrusive_ptr_release(Collection *c) { c->put(); }
 
+    const coll_t &get_cid() override {
+      return cid;
+    }
+
     ObjectRef create_object() const {
       if (use_page_set)
         return new PageSetObject(cct->_conf->memstore_page_size);
@@ -239,7 +245,7 @@ public:
 
     Collection(CephContext *cct)
       : cct(cct), use_page_set(cct->_conf->memstore_page_set),
-        lock("MemStore::Collection::lock") {}
+        lock("MemStore::Collection::lock"), exists(true) {}
   };
   typedef Collection::Ref CollectionRef;
 
@@ -396,6 +402,10 @@ public:
   int getattrs(coll_t cid, const ghobject_t& oid, map<string,bufferptr>& aset);
 
   int list_collections(vector<coll_t>& ls);
+
+  CollectionHandle open_collection(const coll_t& c) {
+    return get_collection(c);
+  }
   bool collection_exists(coll_t c);
   bool collection_empty(coll_t c);
   int collection_list(coll_t cid, ghobject_t start, ghobject_t end,