From 47c895c53f71f7002b4d3d41e9b7be7e613b7f4f Mon Sep 17 00:00:00 2001 From: shangdehao1 Date: Wed, 26 Dec 2018 06:53:35 +0800 Subject: [PATCH] tools: use bufferlist to implement ObjectCacheFile 1) : modify unite testing of object cache file 2) : remove open and create internface 3) : use bufferlist interface to read/write file Signed-off-by: Dehao Shang --- .../immutable_object_cache/test_sync_file.cc | 36 ++------- .../immutable_object_cache/ObjectCacheFile.cc | 73 ++++++++----------- .../immutable_object_cache/ObjectCacheFile.h | 3 - .../ObjectCacheStore.cc | 1 - 4 files changed, 38 insertions(+), 75 deletions(-) diff --git a/src/test/immutable_object_cache/test_sync_file.cc b/src/test/immutable_object_cache/test_sync_file.cc index f4b196b42ed..1358ac60a44 100644 --- a/src/test/immutable_object_cache/test_sync_file.cc +++ b/src/test/immutable_object_cache/test_sync_file.cc @@ -41,29 +41,11 @@ public: }; -TEST_F(TestObjectCacheFile, test_create_file) { - ObjectCacheFile* m_sync_file = new ObjectCacheFile(g_ceph_context, "test_sync_file"); - ASSERT_TRUE(m_sync_file->create() > 0); - ASSERT_TRUE(m_sync_file->get_file_size() == 0); - delete m_sync_file; -} - - -TEST_F(TestObjectCacheFile, test_open_file) { - ObjectCacheFile* m_sync_file = new ObjectCacheFile(g_ceph_context, "test_sync_file"); - ASSERT_EQ(m_sync_file->open_file(), -1); - ASSERT_GT(m_sync_file->create(), 0); - ASSERT_GT(m_sync_file->open_file(), 0); - delete m_sync_file; -} - TEST_F(TestObjectCacheFile, test_write_object_to_file) { ObjectCacheFile* m_sync_file_1 = new ObjectCacheFile(g_ceph_context, "test_sync_file_1"); ObjectCacheFile* m_sync_file_2 = new ObjectCacheFile(g_ceph_context, "test_sync_file_2"); - ASSERT_GT(m_sync_file_1->create(), 0); - ASSERT_GT(m_sync_file_2->create(), 0); - ASSERT_TRUE(m_sync_file_1->get_file_size() == 0); - ASSERT_TRUE(m_sync_file_2->get_file_size() == 0); + ASSERT_TRUE(m_sync_file_1->get_file_size() == -1); + ASSERT_TRUE(m_sync_file_2->get_file_size() == -1); bufferlist* buf_1 = new ceph::bufferlist(); bufferlist* buf_2 = new ceph::bufferlist(); buf_1->append(std::string(1024, '0')); @@ -83,17 +65,12 @@ TEST_F(TestObjectCacheFile, test_read_object_from_file) { ObjectCacheFile* m_sync_file_2 = new ObjectCacheFile(g_ceph_context, "test_sync_file_2"); bufferlist* buf_1 = new ceph::bufferlist(); bufferlist* buf_2 = new ceph::bufferlist(); - ASSERT_EQ(m_sync_file_1->read_object_from_file(buf_1, 0, 1024), -1); ASSERT_EQ(m_sync_file_2->read_object_from_file(buf_2, 0, 1024), -1); - - ASSERT_GT(m_sync_file_1->create(), 0); - ASSERT_GT(m_sync_file_2->create(), 0); - ASSERT_TRUE(m_sync_file_1->get_file_size() == 0); - ASSERT_TRUE(m_sync_file_2->get_file_size() == 0); - ASSERT_EQ(m_sync_file_1->read_object_from_file(buf_1, 0, 1024), 0); - ASSERT_EQ(m_sync_file_2->read_object_from_file(buf_2, 0, 1024), 0); - + ASSERT_TRUE(m_sync_file_1->get_file_size() == -1); + ASSERT_TRUE(m_sync_file_2->get_file_size() == -1); + ASSERT_EQ(m_sync_file_1->read_object_from_file(buf_1, 0, 1024), -1); + ASSERT_EQ(m_sync_file_2->read_object_from_file(buf_2, 0, 1024), -1); buf_1->append(std::string(1024, '0')); buf_2->append(std::string(4096, '2')); ASSERT_TRUE(m_sync_file_1->write_object_to_file(*buf_1, 1024) == 1024); @@ -102,7 +79,6 @@ TEST_F(TestObjectCacheFile, test_read_object_from_file) { ASSERT_TRUE(m_sync_file_2->get_file_size() == 4096); ASSERT_EQ(m_sync_file_1->read_object_from_file(buf_1, 0, 1024), 1024); ASSERT_EQ(m_sync_file_2->read_object_from_file(buf_2, 0, 4096), 4096); - delete m_sync_file_1; delete m_sync_file_2; delete buf_1; diff --git a/src/tools/immutable_object_cache/ObjectCacheFile.cc b/src/tools/immutable_object_cache/ObjectCacheFile.cc index 750a2249e0c..c83e1e6e757 100644 --- a/src/tools/immutable_object_cache/ObjectCacheFile.cc +++ b/src/tools/immutable_object_cache/ObjectCacheFile.cc @@ -28,26 +28,6 @@ ObjectCacheFile::ObjectCacheFile(CephContext *cct, const std::string &name) ObjectCacheFile::~ObjectCacheFile() { // TODO force proper cleanup - if (m_fd != -1) { - ::close(m_fd); - } -} - -int ObjectCacheFile::open_file() { - m_fd = ::open(m_name.c_str(), O_RDONLY); - if(m_fd == -1) { - lderr(cct) << "open fails : " << std::strerror(errno) << dendl; - } - return m_fd; -} - -int ObjectCacheFile::create() { - m_fd = ::open(m_name.c_str(), O_CREAT | O_NOATIME | O_RDWR | O_SYNC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); - if(m_fd == -1) { - lderr(cct) << "create fails : " << std::strerror(errno) << dendl; - } - return m_fd; } void ObjectCacheFile::read(uint64_t offset, uint64_t length, ceph::bufferlist *bl, Context *on_finish) { @@ -59,52 +39,63 @@ void ObjectCacheFile::write(uint64_t offset, ceph::bufferlist &&bl, bool fdatasy } int ObjectCacheFile::write_object_to_file(ceph::bufferlist read_buf, uint64_t object_len) { - ldout(cct, 20) << "cache file name:" << m_name << ", length:" << object_len << dendl; - // TODO(): aio - int ret = pwrite(m_fd, read_buf.c_str(), object_len, 0); + int ret = read_buf.write_file(m_name.c_str()); if(ret < 0) { lderr(cct)<<"write file fail:" << std::strerror(errno) << dendl; return ret; - } + } - return ret; + return object_len; } int ObjectCacheFile::read_object_from_file(ceph::bufferlist* read_buf, uint64_t object_off, uint64_t object_len) { ldout(cct, 20) << "offset:" << object_off - << ", length:" << object_len << dendl; + << ", length:" << object_len << dendl; + + bufferlist temp_bl; + std::string error_str; + // TODO : optimization + int ret = temp_bl.read_file(m_name.c_str(), &error_str); + if (ret < 0) { + lderr(cct)<<"read file fail:" << error_str << dendl; + return -1; + } - bufferptr buf(object_len); + if(object_off >= temp_bl.length()) { + return 0; + } - // TODO(): aio - int ret = pread(m_fd, buf.c_str(), object_len, object_off); - if(ret < 0) { - lderr(cct)<<"read file fail:" << std::strerror(errno) << dendl; - return ret; + if((temp_bl.length() - object_off) < object_len) { + object_len = temp_bl.length() - object_off; } - read_buf->append(std::move(buf)); - return ret; + read_buf->substr_of(temp_bl, object_off, object_len); + + return read_buf->length(); } uint64_t ObjectCacheFile::get_file_size() { struct stat buf; - if(m_fd == -1) { - lderr(cct)<<"get_file_size fail: file is closed status." << dendl; - assert(0); + int temp_fd = ::open(m_name.c_str(), O_RDONLY); + if(temp_fd < 0) { + lderr(cct)<<"get_file_size fail: open file is fails." << std::strerror(errno) << dendl; + return -1; } - int ret = fstat(m_fd, &buf); + + int ret = fstat(temp_fd, &buf); if(ret == -1) { lderr(cct)<<"fstat fail:" << std::strerror(errno) << dendl; - assert(0); + return -1; } - return buf.st_size; -} + ret = buf.st_size; + ::close(temp_fd); + return ret; +} } // namespace immutable_obj_cache } // namespace cache diff --git a/src/tools/immutable_object_cache/ObjectCacheFile.h b/src/tools/immutable_object_cache/ObjectCacheFile.h index 7d878390472..3bbdaa2d828 100644 --- a/src/tools/immutable_object_cache/ObjectCacheFile.h +++ b/src/tools/immutable_object_cache/ObjectCacheFile.h @@ -23,9 +23,6 @@ public: // TODO use scatter/gather API - int create(); - int open_file(); - void read(uint64_t offset, uint64_t length, ceph::bufferlist *bl, Context *on_finish); void write(uint64_t offset, ceph::bufferlist &&bl, bool fdatasync, Context *on_finish); diff --git a/src/tools/immutable_object_cache/ObjectCacheStore.cc b/src/tools/immutable_object_cache/ObjectCacheStore.cc index 0baa875ce19..3b0b19d8deb 100644 --- a/src/tools/immutable_object_cache/ObjectCacheStore.cc +++ b/src/tools/immutable_object_cache/ObjectCacheStore.cc @@ -139,7 +139,6 @@ int ObjectCacheStore::handle_promote_callback(int ret, bufferlist* read_buf, } // write to cache ObjectCacheFile cache_file(m_cct, cache_dir + "/" + cache_file_name); - cache_file.create(); ret = cache_file.write_object_to_file(*read_buf, file_size); if (ret < 0) { -- 2.39.5