
Co-authored-by: wxhwang <wxhwang@126.com> Co-authored-by: godyangfight <godyangfight@gmail.com> Co-authored-by: Tyshawn <tuyunshan@gmail.com>
175 lines
4.7 KiB
C++
175 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.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX SQL
|
|
|
|
#include <gtest/gtest.h>
|
|
#include "lib/alloc/ob_malloc_allocator.h"
|
|
#include "storage/blocksstable/ob_data_file_prepare.h"
|
|
#include "storage/blocksstable/ob_macro_file.h"
|
|
#include "sql/executor/ob_interm_result.h"
|
|
#include "sql/executor/ob_interm_result_pool.h"
|
|
#include "sql/executor/ob_interm_result_manager.h"
|
|
#include "sql/executor/ob_interm_result_item.h"
|
|
#include "share/config/ob_server_config.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace sql
|
|
{
|
|
using namespace common;
|
|
|
|
class TestDiskIntermResult : public blocksstable::TestDataFilePrepare
|
|
{
|
|
public:
|
|
TestDiskIntermResult() : blocksstable::TestDataFilePrepare("TestDiskIR", 2<<20, 1000)
|
|
{
|
|
}
|
|
|
|
virtual void SetUp() override
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
blocksstable::TestDataFilePrepare::SetUp();
|
|
ret = blocksstable::ObMacroFileManager::get_instance().init();
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
GCONF.enable_sql_operator_dump.set_value("True");
|
|
}
|
|
|
|
virtual void TearDown() override
|
|
{
|
|
blocksstable::TestDataFilePrepare::TearDown();
|
|
}
|
|
|
|
protected:
|
|
};
|
|
|
|
TEST_F(TestDiskIntermResult, disk_write_read)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
ObObj cells[2];
|
|
cells[0].set_int(1);
|
|
const char *str = __FILE__;
|
|
cells[1].set_varchar(str, (int32_t)strlen(str));
|
|
|
|
ObNewRow row;
|
|
row.count_ = 2;
|
|
row.cells_ = cells;
|
|
|
|
ObIntermResult *ir = NULL;
|
|
ret = ObIntermResultManager::get_instance()->alloc_result(ir);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
lib::ObMallocAllocator *malloc_allocator = lib::ObMallocAllocator::get_instance();
|
|
ret = malloc_allocator->create_and_add_tenant_allocator(OB_SYS_TENANT_ID);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
malloc_allocator->set_tenant_limit(OB_SYS_TENANT_ID, 1L << 30);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
// 50MB for work area
|
|
ret = lib::set_wa_limit(OB_SYS_TENANT_ID, 5);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
// write 100MB
|
|
static int64_t max_row_cnt = 1000000000;
|
|
int64_t row_cnt = 0;
|
|
for (;row_cnt < max_row_cnt; row_cnt++) {
|
|
ret = ir->add_row(OB_SYS_TENANT_ID, row);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
if (row_cnt % 10000 == 0) {
|
|
int64_t size = 0;
|
|
ret = ir->get_all_data_size(size);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
if (size > (100L << 20)) {
|
|
row_cnt++;
|
|
break;
|
|
} else {
|
|
LOG_INFO("write progress", K(row_cnt), K(size));
|
|
}
|
|
}
|
|
}
|
|
|
|
ret = ir->complete_add_rows(OB_SYS_TENANT_ID);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
int64_t mem_size = 0;
|
|
int64_t disk_size = 0;
|
|
ret = ir->get_data_size_detail(mem_size, disk_size);
|
|
ASSERT_GT(mem_size + disk_size, 100L << 20);
|
|
ASSERT_GT(mem_size, 0);
|
|
ASSERT_GT(disk_size, 0);
|
|
|
|
ObAddr server;
|
|
server.set_ip_addr("127.0.0.1", 80);
|
|
ObSliceID slice_id;
|
|
slice_id.set_server(server);
|
|
slice_id.set_execution_id(1);
|
|
slice_id.set_job_id(1);
|
|
slice_id.set_task_id(1);
|
|
slice_id.set_slice_id(1);
|
|
ObIntermResultInfo iraddr;
|
|
iraddr.init(slice_id);
|
|
|
|
ret = ObIntermResultManager::get_instance()->add_result(iraddr, ir, 1000000000L);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ObIntermResultIterator iter;
|
|
ret = ObIntermResultManager::get_instance()->get_result(iraddr, iter);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
char *buf = new char[ObScanner::DEFAULT_MAX_SERIALIZE_SIZE * 2];
|
|
int64_t read_row_cnt = 0;
|
|
ObScanner scanner;
|
|
while (true) {
|
|
ObIIntermResultItem *it = NULL;
|
|
ret = iter.get_next_interm_result_item(it);
|
|
if (OB_ITER_END == ret) {
|
|
break;
|
|
}
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(it != NULL);
|
|
|
|
int64_t len = it->get_data_len();
|
|
ret = it->copy_data(buf, len);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
int64_t pos = 0;
|
|
ret = scanner.deserialize(buf, len, pos);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ObScanner::Iterator row_iter = scanner.begin();
|
|
while (OB_SUCCESS == row_iter.get_next_row(row)) {
|
|
read_row_cnt++;
|
|
}
|
|
}
|
|
|
|
ASSERT_EQ(row_cnt, read_row_cnt);
|
|
}
|
|
|
|
} // end namespace sql
|
|
} // end namespace oceanbase
|
|
|
|
void ignore_sig(int sig)
|
|
{
|
|
UNUSED(sig);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
signal(49, ignore_sig);
|
|
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
|
|
oceanbase::sql::ObIntermResultItemPool::build_instance();
|
|
oceanbase::sql::ObIntermResultPool::build_instance();
|
|
oceanbase::sql::ObIntermResultManager::build_instance();
|
|
testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|