]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
tools: use bufferlist to implement ObjectCacheFile
authorshangdehao1 <dehao.shang@intel.com>
Tue, 25 Dec 2018 22:53:35 +0000 (06:53 +0800)
committerYuan Zhou <yuan.zhou@intel.com>
Thu, 21 Mar 2019 16:16:26 +0000 (00:16 +0800)
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 <dehao.shang@intel.com>
src/test/immutable_object_cache/test_sync_file.cc
src/tools/immutable_object_cache/ObjectCacheFile.cc
src/tools/immutable_object_cache/ObjectCacheFile.h
src/tools/immutable_object_cache/ObjectCacheStore.cc

index f4b196b42ed840fbcfb39ad18e84f855da25efd5..1358ac60a448d8d09eed8a0a295875e23461af38 100644 (file)
@@ -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;
index 750a2249e0c6ba8bc28a3efb5d395ae6313dfea0..c83e1e6e7570891d5210ad2912e72f847b0d7bd8 100644 (file)
@@ -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
index 7d878390472f404e7c3b53b20b0af5b285f4292f..3bbdaa2d8287a35aa662a069a10f45b3b7ab9673 100644 (file)
@@ -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);
index 0baa875ce197fee74df325faf08683be4e467670..3b0b19d8deb1b0a7f79231681822f64359cfef70 100644 (file)
@@ -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) {