]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
memstore: BufferlistObject uses spinlock for data
authorCasey Bodley <cbodley@redhat.com>
Wed, 19 Aug 2015 14:06:04 +0000 (10:06 -0400)
committerCasey Bodley <cbodley@redhat.com>
Wed, 26 Aug 2015 21:49:46 +0000 (17:49 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/os/MemStore.cc
src/os/MemStore.h

index 24470dcc4318b44475bcae5faf65a893302a848e..68db70569ec5d3fe290c7ee1ab87aa66a31388f4 100644 (file)
@@ -1387,6 +1387,7 @@ int MemStore::_split_collection(coll_t cid, uint32_t bits, uint32_t match,
 int MemStore::BufferlistObject::read(uint64_t offset, uint64_t len,
                                      bufferlist &bl)
 {
+  std::lock_guard<Spinlock> lock(mutex);
   bl.substr_of(data, offset, len);
   return bl.length();
 }
@@ -1395,6 +1396,8 @@ int MemStore::BufferlistObject::write(uint64_t offset, const bufferlist &src)
 {
   unsigned len = src.length();
 
+  std::lock_guard<Spinlock> lock(mutex);
+
   // before
   bufferlist newdata;
   if (get_size() >= offset) {
@@ -1422,21 +1425,25 @@ int MemStore::BufferlistObject::write(uint64_t offset, const bufferlist &src)
 int MemStore::BufferlistObject::clone(Object *src, uint64_t srcoff,
                                       uint64_t len, uint64_t dstoff)
 {
-  auto srcbl = dynamic_cast<const BufferlistObject*>(src);
+  auto srcbl = dynamic_cast<BufferlistObject*>(src);
   if (srcbl == nullptr)
     return -ENOTSUP;
 
-  if (srcoff == dstoff && len == src->get_size()) {
-    data = srcbl->data;
-    return 0;
-  }
   bufferlist bl;
-  bl.substr_of(srcbl->data, srcoff, len);
+  {
+    std::lock_guard<Spinlock> lock(srcbl->mutex);
+    if (srcoff == dstoff && len == src->get_size()) {
+      data = srcbl->data;
+      return 0;
+    }
+    bl.substr_of(srcbl->data, srcoff, len);
+  }
   return write(dstoff, bl);
 }
 
 int MemStore::BufferlistObject::truncate(uint64_t size)
 {
+  std::lock_guard<Spinlock> lock(mutex);
   if (get_size() > size) {
     bufferlist bl;
     bl.substr_of(data, 0, size);
index 0aeacca4d18d21a7660970882496cd2f09e93909..21da3121d3a28603a7de310e39fce8062dc2b5fb 100644 (file)
@@ -22,6 +22,7 @@
 #include "include/assert.h"
 #include "include/unordered_map.h"
 #include "include/memory.h"
+#include "include/Spinlock.h"
 #include "common/Finisher.h"
 #include "common/RefCountedObj.h"
 #include "common/RWLock.h"
@@ -91,6 +92,7 @@ public:
   typedef Object::Ref ObjectRef;
 
   struct BufferlistObject : public Object {
+    Spinlock mutex;
     bufferlist data;
 
     size_t get_size() const override { return data.length(); }