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
 | 
