178 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include "lib/file/file_directory_utils.h"
 | |
| #include "clog/ob_log_direct_reader.h"
 | |
| #include "clog/ob_log_file_trailer.h"
 | |
| #include "clog/ob_log_file_pool.h"
 | |
| #include "clog/ob_clog_mgr.h"
 | |
| #include "share/redolog/ob_log_file_reader.h"
 | |
| #include <gtest/gtest.h>
 | |
| #include <gmock/gmock.h>
 | |
| 
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace clog;
 | |
| namespace unittest {
 | |
| 
 | |
| class TestObLogDirectReader : public ::testing::Test {
 | |
| public:
 | |
|   TestObLogDirectReader();
 | |
|   virtual ~TestObLogDirectReader();
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
| 
 | |
| protected:
 | |
|   int fd_;
 | |
|   char log_path_[1024];
 | |
|   char shm_path_[1024];
 | |
|   ObBaseLogBufferCtrl* log_ctrl_;
 | |
|   ObBaseLogBuffer* log_buffer_;
 | |
|   ObLogDir log_dir_;
 | |
|   ObLogWriteFilePool write_pool_;
 | |
|   ObLogCache log_cache_;
 | |
|   ObTailCursor tail_cursor_;
 | |
|   ObLogDirectReader log_reader_;
 | |
| };
 | |
| 
 | |
| TestObLogDirectReader::TestObLogDirectReader()
 | |
|     : fd_(-1),
 | |
|       log_ctrl_(NULL),
 | |
|       log_buffer_(NULL),
 | |
|       log_dir_(),
 | |
|       write_pool_(),
 | |
|       log_cache_(),
 | |
|       tail_cursor_(),
 | |
|       log_reader_()
 | |
| {}
 | |
| 
 | |
| TestObLogDirectReader::~TestObLogDirectReader()
 | |
| {}
 | |
| 
 | |
| void TestObLogDirectReader::SetUp()
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   enum ObLogWritePoolType type = ObLogWritePoolType::CLOG_WRITE_POOL;
 | |
|   getcwd(log_path_, 1024);
 | |
|   strcat(log_path_, "/test_log_direct_reader");
 | |
|   getcwd(shm_path_, 1024);
 | |
|   strcat(shm_path_, "/test_log_direct_reader/shm_buf");
 | |
| 
 | |
|   system("rm -rf test_log_direct_reader");
 | |
| 
 | |
|   ret = log_dir_.init(log_path_);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ret = write_pool_.init(&log_dir_, 64 * 1024 * 1024, type);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ret = write_pool_.get_fd(1, fd_);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ret = OB_LOG_FILE_READER.init();
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ret = log_reader_.init(log_path_, shm_path_, true, &log_cache_, &tail_cursor_, type);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
| 
 | |
|   ret = ObBaseLogBufferMgr::get_instance().get_buffer(shm_path_, log_ctrl_);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   log_buffer_ = log_ctrl_->base_buf_;
 | |
| 
 | |
|   MEMSET(log_ctrl_->data_buf_, 'A', log_buffer_->buf_len_);
 | |
|   ob_pwrite(fd_, log_ctrl_->data_buf_, log_buffer_->buf_len_, 0);
 | |
|   MEMSET(log_ctrl_->data_buf_, 'B', log_buffer_->buf_len_);
 | |
|   ob_pwrite(fd_, log_ctrl_->data_buf_, log_buffer_->buf_len_, log_buffer_->buf_len_);
 | |
| }
 | |
| 
 | |
| void TestObLogDirectReader::TearDown()
 | |
| {
 | |
|   if (fd_ >= 0) {
 | |
|     write_pool_.close_fd(1, fd_);
 | |
|     fd_ = -1;
 | |
|   }
 | |
|   log_reader_.destroy();
 | |
|   OB_LOG_FILE_READER.destroy();
 | |
| }
 | |
| 
 | |
| TEST_F(TestObLogDirectReader, read_from_io)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObReadParam read_param;
 | |
|   ObReadBuf read_buf;
 | |
|   ObReadRes read_res;
 | |
|   ObReadCost read_cost;
 | |
| 
 | |
|   char* test_buf = (char*)ob_malloc_align(4096, 2 * 1024 * 1024, ObModIds::TEST);
 | |
|   ASSERT_TRUE(NULL != test_buf);
 | |
|   ret = log_reader_.alloc_buf(ObModIds::OB_LOG_DIRECT_READER_COMPRESS_ID, read_buf);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
| 
 | |
|   log_buffer_->file_write_pos_.file_id_ = 1;
 | |
|   log_buffer_->file_write_pos_.file_offset_ = 1024 * 1024;
 | |
|   log_buffer_->file_flush_pos_.file_id_ = 1;
 | |
|   log_buffer_->file_flush_pos_.file_offset_ = 4096 * 2 + 1;
 | |
|   int64_t shm_data_len =
 | |
|       log_buffer_->file_write_pos_.file_offset_ - lower_align(log_buffer_->file_flush_pos_.file_offset_, 4096);
 | |
|   MEMSET(log_ctrl_->data_buf_, 'X', shm_data_len);
 | |
|   log_ctrl_->data_buf_[0] = 'A';
 | |
|   ob_pwrite(fd_, log_ctrl_->data_buf_, shm_data_len, lower_align(log_buffer_->file_flush_pos_.file_offset_, 4096));
 | |
| 
 | |
|   // no shm read
 | |
|   read_param.file_id_ = 1;
 | |
|   read_param.offset_ = 0;
 | |
|   read_param.read_len_ = 4096;
 | |
|   ret = log_reader_.read_data_direct(read_param, read_buf, read_res, read_cost);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ob_pread(fd_, test_buf, read_param.read_len_, read_param.offset_);
 | |
|   ASSERT_EQ(0, MEMCMP(test_buf, read_res.buf_, read_param.read_len_));
 | |
| 
 | |
|   // half shm read
 | |
|   read_param.file_id_ = 1;
 | |
|   read_param.offset_ = 0;
 | |
|   read_param.read_len_ = 4096 * 4;
 | |
|   ret = log_reader_.read_data_direct(read_param, read_buf, read_res, read_cost);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ob_pread(fd_, test_buf, read_param.read_len_, read_param.offset_);
 | |
|   ASSERT_EQ(0, MEMCMP(test_buf, read_res.buf_, read_param.read_len_));
 | |
| 
 | |
|   // right half shm read
 | |
|   read_param.file_id_ = 1;
 | |
|   read_param.offset_ = 512 * 1024;
 | |
|   read_param.read_len_ = 1024 * 1024;
 | |
|   ret = log_reader_.read_data_direct(read_param, read_buf, read_res, read_cost);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ob_pread(fd_, test_buf, read_param.read_len_, read_param.offset_);
 | |
|   ASSERT_EQ(0, MEMCMP(test_buf, read_res.buf_, read_param.read_len_));
 | |
| 
 | |
|   // only shm read
 | |
|   read_param.file_id_ = 1;
 | |
|   read_param.offset_ = 4096 * 4;
 | |
|   read_param.read_len_ = 4096;
 | |
|   ret = log_reader_.read_data_direct(read_param, read_buf, read_res, read_cost);
 | |
|   ASSERT_EQ(OB_SUCCESS, ret);
 | |
|   ob_pread(fd_, test_buf, read_param.read_len_, read_param.offset_);
 | |
|   ASSERT_EQ(0, MEMCMP(test_buf, read_res.buf_, read_param.read_len_));
 | |
| 
 | |
|   log_reader_.free_buf(read_buf);
 | |
|   ob_free_align(test_buf);
 | |
| }
 | |
| 
 | |
| }  // end namespace unittest
 | |
| }  // end namespace oceanbase
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   OB_LOGGER.set_file_name("test_ob_log_direct_reader.log", true);
 | |
|   OB_LOGGER.set_log_level("DEBUG");
 | |
|   CLOG_LOG(INFO, "begin unittest::test_ob_log_direct_reader");
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
