562 lines
20 KiB
C++
562 lines
20 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 "clog/ob_raw_entry_iterator.h"
|
|
#include "clog/ob_log_file_trailer.h"
|
|
#include "clog/ob_log_file_pool.h"
|
|
#include "clog/ob_log_direct_reader.h"
|
|
#include "clog/ob_log_common.h"
|
|
#include "common/ob_partition_key.h"
|
|
#include "clog/ob_clog_mgr.h"
|
|
|
|
#include <libaio.h>
|
|
#include <gtest/gtest.h>
|
|
#include <gmock/gmock.h>
|
|
|
|
using namespace oceanbase::common;
|
|
namespace oceanbase {
|
|
using namespace clog;
|
|
namespace unittest {
|
|
class TestObRawLogIterator : public ::testing::Test {
|
|
public:
|
|
virtual void SetUp();
|
|
virtual void TearDown();
|
|
void prepare_entry();
|
|
int write_data(const int fd, const char* buf, const int64_t data_len, const int64_t offset);
|
|
int submit_aio(struct iocb* p);
|
|
int wait_event(struct iocb* p);
|
|
int write_file();
|
|
|
|
static const int64_t data_len1 = 1 << 6; // 64
|
|
static const int64_t data_len2 = 1 << 7; // 128
|
|
static const int64_t data_len3 = 1 << 8; // 256
|
|
|
|
int64_t size;
|
|
int64_t align_size;
|
|
int64_t trailer_offset;
|
|
offset_t header_offset;
|
|
file_id_t file_id;
|
|
const char* path;
|
|
const char* shm_path;
|
|
|
|
io_context_t ctx_;
|
|
ObLogBlockMetaV2 meta;
|
|
ObAlignedBuffer buffer;
|
|
clog::ObLogEntry entry1;
|
|
clog::ObLogEntry entry2;
|
|
clog::ObLogEntry entry3;
|
|
char buf1[data_len1];
|
|
char buf2[data_len2];
|
|
char buf3[data_len3];
|
|
ObLogCache cache;
|
|
ObLogDirectReader reader;
|
|
ObRawLogIterator iterator;
|
|
};
|
|
|
|
void TestObRawLogIterator::SetUp()
|
|
{
|
|
int task_num = 1024;
|
|
const char* label = "3";
|
|
|
|
size = 1 << 10;
|
|
align_size = 512;
|
|
trailer_offset = CLOG_TRAILER_OFFSET;
|
|
header_offset = 0;
|
|
file_id = 31;
|
|
path = "readers/";
|
|
shm_path = "readers/shm_buf";
|
|
|
|
memset(buf1, 'A', sizeof(buf1));
|
|
memset(buf2, 'B', sizeof(buf2));
|
|
memset(buf3, 'C', sizeof(buf3));
|
|
|
|
memset(&ctx_, 0, sizeof(ctx_));
|
|
|
|
EXPECT_LE(0, system("rm -rf readers"));
|
|
EXPECT_LE(0, system("mkdir readers"));
|
|
|
|
EXPECT_EQ(OB_SUCCESS, buffer.init(size, align_size, label));
|
|
EXPECT_EQ(0, io_setup(task_num, &ctx_));
|
|
|
|
const int64_t bucket_num = 1024;
|
|
const int64_t max_cache_size = 1024 * 1024 * 512;
|
|
const int64_t block_size = common::OB_MALLOC_BIG_BLOCK_SIZE;
|
|
ObKVGlobalCache::get_instance().init(bucket_num, max_cache_size, block_size);
|
|
|
|
const int64_t hot_cache_size = 1L << 28;
|
|
common::ObAddr addr(ObAddr::VER::IPV4, "100.81.152.48", 2828);
|
|
EXPECT_EQ(OB_SUCCESS, cache.init(addr, "TestObLogCache", 5, hot_cache_size));
|
|
}
|
|
|
|
void TestObRawLogIterator::TearDown()
|
|
{
|
|
if (NULL != ctx_) {
|
|
io_destroy(ctx_);
|
|
}
|
|
buffer.destroy();
|
|
cache.destroy();
|
|
ObKVGlobalCache::get_instance().destroy();
|
|
}
|
|
|
|
void TestObRawLogIterator::prepare_entry()
|
|
{
|
|
ObLogType ltype = OB_LOG_SUBMIT;
|
|
int64_t gts = ::oceanbase::common::ObTimeUtility::current_time();
|
|
int64_t tts = ::oceanbase::common::ObTimeUtility::current_time();
|
|
ObProposalID rts;
|
|
rts.ts_ = ::oceanbase::common::ObTimeUtility::current_time();
|
|
uint64_t log_id1 = 3;
|
|
uint64_t log_id2 = 4;
|
|
uint64_t log_id3 = 5;
|
|
ObPartitionKey partition_key1;
|
|
ObPartitionKey partition_key2;
|
|
ObPartitionKey partition_key3;
|
|
ObLogEntryHeader header1;
|
|
ObLogEntryHeader header2;
|
|
ObLogEntryHeader header3;
|
|
|
|
EXPECT_EQ(OB_SUCCESS, partition_key1.init(3, 8, 512));
|
|
EXPECT_EQ(OB_SUCCESS, partition_key2.init(4, 8, 512));
|
|
EXPECT_EQ(OB_SUCCESS, partition_key3.init(5, 7, 512));
|
|
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
header1.generate_header(ltype, partition_key1, log_id1, buf1, data_len1, gts, tts, rts, gts, ObVersion(0), true));
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
header2.generate_header(ltype, partition_key2, log_id2, buf2, data_len2, gts, tts, rts, gts, ObVersion(0), true));
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
header3.generate_header(ltype, partition_key3, log_id3, buf3, data_len3, gts, tts, rts, gts, ObVersion(0), true));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.generate_entry(header1, buf1));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.generate_entry(header2, buf2));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.generate_entry(header3, buf3));
|
|
}
|
|
|
|
int TestObRawLogIterator::write_data(const int fd, const char* buf, const int64_t data_len, const int64_t offset)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
OB_ASSERT(-1 != fd);
|
|
OB_ASSERT(NULL != buf);
|
|
OB_ASSERT(data_len > 0);
|
|
OB_ASSERT(offset >= 0);
|
|
struct iocb io;
|
|
struct iocb* p = &io;
|
|
memset(&io, 0x0, sizeof(io));
|
|
io_prep_pwrite(&io, fd, (void*)buf, data_len, offset);
|
|
EXPECT_EQ(1, io_submit(ctx_, 1, &p));
|
|
EXPECT_EQ(OB_SUCCESS, wait_event(p));
|
|
return ret;
|
|
}
|
|
|
|
int TestObRawLogIterator::wait_event(struct iocb* p)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
struct io_event e;
|
|
struct timespec timeout;
|
|
OB_ASSERT(p->u.c.offset != -1);
|
|
OB_ASSERT(static_cast<int64_t>(p->u.c.nbytes) >= 0);
|
|
|
|
timeout.tv_sec = 100;
|
|
timeout.tv_nsec = 0; // 100s
|
|
EXPECT_EQ(1, io_getevents(ctx_, 1, 1, &e, &timeout));
|
|
EXPECT_EQ(0U, e.res2);
|
|
EXPECT_EQ(p->u.c.nbytes, e.res);
|
|
EXPECT_EQ(p->data, e.data);
|
|
return ret;
|
|
}
|
|
|
|
int TestObRawLogIterator::write_file()
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObLogDir log_dir;
|
|
ObLogWriteFilePool write_pool;
|
|
ObLogFileTrailer trailer;
|
|
int fd = -1;
|
|
int64_t pos = 0;
|
|
int64_t file_size = CLOG_FILE_SIZE;
|
|
int64_t meta_len = meta.get_serialize_size();
|
|
int64_t block_num = 5;
|
|
int64_t info_len = 512;
|
|
|
|
prepare_entry();
|
|
|
|
EXPECT_EQ(OB_SUCCESS, log_dir.init(path));
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.init(&log_dir, file_size, CLOG_WRITE_POOL));
|
|
|
|
//------------------test case 1: file_id = 31, correct file-----------------------
|
|
pos = meta_len;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.serialize(buffer.get_align_buf(), size, pos));
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
|
|
for (int64_t i = 0; i < block_num; i++) {
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset + i * size));
|
|
}
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
memset(buffer.get_align_buf() + meta_len, 'I', static_cast<int>(info_len));
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, info_len, OB_INFO_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset + block_num * size));
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
trailer.build_serialized_trailer(buffer.get_align_buf(),
|
|
size,
|
|
header_offset + static_cast<offset_t>((block_num + 1) * size),
|
|
file_id + 1,
|
|
pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), align_size, trailer_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 2: file_id = 32, correct file, EOF-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
pos = meta_len;
|
|
buffer.reuse();
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), size, pos));
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
// The EOF block should be placed at the end of a block, at this time you need to know the length of a block
|
|
// memcpy(buffer.get_align_buf() + meta.get_total_len(), ObEOFBuf::eof_flag_buf_, align_size);
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset));
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 3: file_id = 33, INFO block missing-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
pos = meta_len;
|
|
buffer.reuse();
|
|
pos = meta_len;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.serialize(buffer.get_align_buf(), size, pos));
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset));
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
trailer.build_serialized_trailer(
|
|
buffer.get_align_buf(), size, header_offset + static_cast<offset_t>(size), file_id + 1, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), align_size, trailer_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 4: file_id = 34, Trailer block missing-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
pos = meta_len;
|
|
buffer.reuse();
|
|
pos = meta_len;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.serialize(buffer.get_align_buf(), size, pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.serialize(buffer.get_align_buf(), size, pos));
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset));
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
memset(buffer.get_align_buf() + meta_len, 'I', static_cast<int>(info_len));
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, info_len, OB_INFO_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset + size));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 5: block check fail-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
pos = meta_len;
|
|
buffer.reuse();
|
|
pos = meta_len;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
|
|
*(buffer.get_align_buf() + 143) = 'M';
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), buffer.get_size(), header_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 6: block check fail-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
buffer.reuse();
|
|
pos = meta_len;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS, entry1.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry2.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
EXPECT_EQ(OB_SUCCESS, entry3.serialize(buffer.get_align_buf(), buffer.get_size(), pos));
|
|
*(buffer.get_align_buf() + 81) = 'M';
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, pos - meta_len, OB_DATA_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), buffer.get_size(), header_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 7: only info block-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
buffer.reuse();
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
memset(buffer.get_align_buf() + meta_len, 'I', info_len);
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, info_len, OB_INFO_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset));
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
EXPECT_EQ(
|
|
OB_SUCCESS, trailer.build_serialized_trailer(buffer.get_align_buf(), size, header_offset, file_id + 1, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), align_size, trailer_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
//------------------test case 8: unknown block-----------------------
|
|
fd = -1;
|
|
file_id++;
|
|
buffer.reuse();
|
|
|
|
buffer.reuse();
|
|
pos = 0;
|
|
EXPECT_EQ(OB_SUCCESS, write_pool.get_fd(file_id, fd));
|
|
EXPECT_EQ(OB_SUCCESS,
|
|
meta.build_serialized_block(
|
|
buffer.get_align_buf(), meta_len, buffer.get_align_buf() + meta_len, info_len, OB_TRAILER_BLOCK, pos));
|
|
EXPECT_EQ(OB_SUCCESS, write_data(fd, buffer.get_align_buf(), size, header_offset));
|
|
|
|
if (-1 != fd) {
|
|
close(fd);
|
|
}
|
|
|
|
file_id = 31;
|
|
return ret;
|
|
}
|
|
|
|
TEST_F(TestObRawLogIterator, test_read_data)
|
|
{
|
|
ObReadParam param;
|
|
ObReadParam read_param;
|
|
ObReadRes res;
|
|
clog::ObLogEntry tmp_entry;
|
|
ObAlignedBuffer buffer;
|
|
int64_t block_num = 5;
|
|
int64_t entry1_len;
|
|
int64_t entry2_len;
|
|
int64_t entry3_len;
|
|
int64_t header_len = meta.get_serialize_size() + header_offset;
|
|
ObLogDir log_dir;
|
|
|
|
ObTailCursor tail;
|
|
EXPECT_EQ(OB_SUCCESS, log_dir.init(path));
|
|
EXPECT_EQ(OB_SUCCESS, reader.init(path, shm_path, true, &cache, &tail, ObLogWritePoolType::CLOG_WRITE_POOL));
|
|
EXPECT_EQ(OB_SUCCESS, write_file());
|
|
|
|
// Test init failed
|
|
param.reset();
|
|
EXPECT_EQ(OB_INVALID_ARGUMENT, iterator.init(NULL, param.file_id_, 0, param.file_id_, param.timeout_));
|
|
EXPECT_EQ(OB_INVALID_ARGUMENT, iterator.init(&reader, param.file_id_, 0, param.file_id_, param.timeout_));
|
|
|
|
param.file_id_ = file_id;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; // 5s
|
|
int64_t persist_len = 0;
|
|
EXPECT_EQ(OB_NOT_INIT, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
|
|
// Start to test read
|
|
entry1_len = entry1.get_serialize_size();
|
|
entry2_len = entry2.get_serialize_size();
|
|
entry3_len = entry3.get_serialize_size();
|
|
|
|
(void)entry3_len;
|
|
|
|
CLOG_LOG(INFO, "begin unittest::test_ob_raw_log_iterator");
|
|
EXPECT_EQ(OB_SUCCESS, iterator.init(&reader, param.file_id_, 0, param.file_id_, param.timeout_));
|
|
EXPECT_EQ(OB_INIT_TWICE, iterator.init(&reader, param.file_id_, 0, param.file_id_, param.timeout_));
|
|
|
|
//------------------test case 1: file_id = 31, correct file----------------------------
|
|
for (int64_t i = 0; i < block_num; i++) {
|
|
CLOG_LOG(WARN, "warning", "param", to_cstring(read_param));
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(header_len + i * size, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry1);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + header_len + i * size, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry2);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + entry2_len + header_len + i * size, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry3);
|
|
}
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry1);
|
|
EXPECT_EQ(OB_ITER_END, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 1 success");
|
|
|
|
/*
|
|
//------------------test case 2: file_id = 32, correct file, EOF-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_NOT_SUPPORTED, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry1);
|
|
EXPECT_EQ(OB_ITER_END, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 2 success");
|
|
|
|
//------------------test case 3: file_id = 33, INFO block missing-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_NOT_SUPPORTED, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry1);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry2);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + entry2_len + header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry3);
|
|
|
|
// next_entry() do not rewrite ret now
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 3 success");
|
|
|
|
//------------------test case 4: file_id = 34, Trailer block missing-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_NOT_SUPPORTED, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry1);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry2);
|
|
|
|
EXPECT_EQ(OB_SUCCESS, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
EXPECT_EQ(entry1_len + entry2_len + header_len, read_param.offset_);
|
|
EXPECT_TRUE(tmp_entry == entry3);
|
|
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 4 success");
|
|
|
|
//------------------test case 5: block check fail-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_NOT_SUPPORTED, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 5 success");
|
|
|
|
//------------------test case 6: block check fail-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_NOT_SUPPORTED, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 6 success");
|
|
|
|
//------------------test case 7: switch file fail-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_SUCCESS, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 7 success");
|
|
|
|
//------------------test case 8: unknown block-----------------------
|
|
param.file_id_ = param.file_id_ + 1;
|
|
param.read_len_ = OB_MAX_LOG_BUFFER_SIZE;
|
|
param.timeout_ = 5000000; //5s
|
|
EXPECT_EQ(OB_SUCCESS, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
|
|
EXPECT_EQ(OB_INVALID_DATA, iterator.next_entry(tmp_entry, read_param, persist_len));
|
|
CLOG_LOG(INFO, "test case 8 success");
|
|
|
|
|
|
param.reset();
|
|
EXPECT_EQ(OB_INVALID_ARGUMENT, iterator.reuse(param.file_id_, 0, param.timeout_));
|
|
*/
|
|
}
|
|
|
|
} // end namespace unittest
|
|
} // end namespace oceanbase
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
OB_LOGGER.set_file_name("test_ob_raw_entry_iterator.log", true);
|
|
OB_LOGGER.set_log_level("DEBUG");
|
|
CLOG_LOG(INFO, "begin unittest::test_ob_raw_entry_iterator");
|
|
testing::InitGoogleTest(&argc, argv);
|
|
// return RUN_ALL_TESTS();
|
|
return 0;
|
|
}
|