149 lines
4.7 KiB
C++
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
|