};
-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'));
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);
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;
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) {
}
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