Files
oceanbase/unittest/storage/blocksstable/test_sstable_generator.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

149 lines
4.7 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 "test_sstable_generator.h"
#include "storage/ob_i_store.h"
#include "storage/blocksstable/ob_data_file.h"
namespace oceanbase
{
using namespace common;
using namespace blocksstable;
using namespace storage;
namespace unittest
{
TestSSTableGenerator::TestSSTableGenerator()
: desc_(),
data_file_(),
logger_(),
image_(),
writer_(),
marker_(),
row_count_(0),
mod_(ObModIds::TEST),
arena_(ModuleArena::DEFAULT_PAGE_SIZE, mod_)
{
path_[0] = 0;
}
int TestSSTableGenerator::open(
ObDataStoreDesc &desc,
const char *path,
const int64_t row_count)
{
int ret = OB_SUCCESS;
if (OB_SUCCESS != (ret = desc_.assign(desc))) {
STORAGE_LOG(WARN, "desc fail to assign.", K(ret));
} else {
row_count_ = row_count;
memcpy(path_, path, strlen(path));
char cmd[1024];
sprintf(cmd, "rm -rf %s", path_);
system(cmd);
sprintf(cmd, "mkdir -p %s", path_);
system(cmd);
ObBlockFile::FileLocation location;
location.disk_no_ = 1;
location.install_sequence_ = 0;
char file_name[1024];
sprintf(file_name, "%s/test.sst", path_);
memcpy(location.path_, file_name, strlen(file_name) + 1);
ObMacroDataSeq start_seq(0);
ObBlockFile::FileSpec spec;
spec.data_file_size_ = 64 * 1024 * 1024;
spec.macro_block_size_ = 2 * 1024 * 1024;
if (OB_SUCCESS != (ret = data_file_.format(location, spec))) {
STORAGE_LOG(WARN, "data file fail to format.", K(ret));
} else if (OB_SUCCESS != (ret = data_file_.open(location, &image_))) {
STORAGE_LOG(WARN, "data file fail to open.", K(ret));
} else if (OB_SUCCESS != (ret = image_.initialize(&data_file_, &logger_))) {
STORAGE_LOG(WARN, "image fail to initialize.", K(ret));
} else if (OB_SUCCESS != (ret = logger_.init(data_file_, path, 2 * 1024 * 1024))) {
STORAGE_LOG(WARN, "logger fail to init.", K(ret));
//} else if (OB_SUCCESS != (ret = logger_.replay())) {
// STORAGE_LOG(WARN, "logger fail to replay.", K(ret));
} else if (OB_SUCCESS != (ret = marker_.initialize(&data_file_, &image_))) {
STORAGE_LOG(WARN, "marker fail to initialize.", K(ret));
} else if (OB_SUCCESS != (ret = marker_.register_storage_meta(&image_))) {
STORAGE_LOG(WARN, "marker failt to register.", K(ret));
} else if (OB_SUCCESS != (ret = marker_.mark_init())) {
STORAGE_LOG(WARN, "marker fail to mark init.", K(ret));
} else if (OB_SUCCESS != (ret = writer_.open(&data_file_, desc_, start_seq))) {
STORAGE_LOG(WARN, "macro block writer fail to open.", K(ret));
}
}
return ret;
}
int TestSSTableGenerator::generate()
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < row_count_; ++ i) {
if (OB_SUCCESS != (ret = generate_row(i))) {
STORAGE_LOG(WARN, "sstable generator fail to generate row.", K(ret));
}
}
if (OB_SUCC(ret)) {
if (OB_SUCCESS != (ret = writer_.close())) {
STORAGE_LOG(WARN, "sstable generator fail to close.", K(ret));
}
}
return ret;
}
int TestSSTableGenerator::close()
{
int ret = OB_SUCCESS;
char cmd[1024];
sprintf(cmd, "rm -rf %s", path_);
system(cmd);
return ret;
}
int TestSSTableGenerator::generate_row(const int64_t index)
{
int ret = OB_SUCCESS;
arena_.reuse();
for (int64_t i = 0; OB_SUCC(ret) && i < desc_.column_cnt_; ++ i) {
switch (desc_.col_desc_array_.at(i).col_type_.get_type()) {
case ObIntType: {
cells_[i].set_int(index);
break;
}
case ObVarcharType: {
char *buf = arena_.alloc(1024);
sprintf(buf, "%ld", index);
ObString str(0, static_cast<int32_t>(strlen(buf)), buf);
cells_[i].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
cells_[i].set_varchar(str);
break;
}
default:
STORAGE_LOG(WARN, "not supported");
ret = OB_NOT_SUPPORTED;
}
}
if (OB_SUCC(ret)) {
ObStoreRow row;
row.row_val_.cells_ = cells_;
row.row_val_.count_ = desc_.column_cnt_;
row.flag_.set_flag(ObDmlFlag::DF_INSERT);
if (OB_SUCCESS != (ret = writer_.append_row(row))) {
STORAGE_LOG(WARN, "macro block writer fail to append row.", K(ret));
}
}
return ret;
}
}//end namespace unittest
}//end namespace oceanbase