From: Casey Bodley Date: Wed, 19 Aug 2015 14:06:04 +0000 (-0400) Subject: memstore: BufferlistObject uses spinlock for data X-Git-Tag: v9.1.0~253^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=46f92f0d57cdae7c2fb105ac7d07b063e48c80f0;p=ceph.git memstore: BufferlistObject uses spinlock for data Signed-off-by: Casey Bodley --- diff --git a/src/os/MemStore.cc b/src/os/MemStore.cc index 24470dcc4318..68db70569ec5 100644 --- a/src/os/MemStore.cc +++ b/src/os/MemStore.cc @@ -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 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 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(src); + auto srcbl = dynamic_cast(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 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 lock(mutex); if (get_size() > size) { bufferlist bl; bl.substr_of(data, 0, size); diff --git a/src/os/MemStore.h b/src/os/MemStore.h index 0aeacca4d18d..21da3121d3a2 100644 --- a/src/os/MemStore.h +++ b/src/os/MemStore.h @@ -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(); }