165 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.2 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 <cstdlib>
 | 
						|
#include <gtest/gtest.h>
 | 
						|
 | 
						|
#include "lib/allocator/ob_malloc.h"
 | 
						|
#include "lib/allocator/ob_concurrent_fifo_allocator.h"
 | 
						|
#include "lib/container/ob_array.h"
 | 
						|
 | 
						|
#include "obcdc/src/ob_i_log_fetcher.h"
 | 
						|
#include "obcdc/src/ob_log_fetcher_utils.h"
 | 
						|
#include "obcdc/src/ob_log_fetcher.h"
 | 
						|
 | 
						|
#include "test_log_fetcher_common_utils.h"
 | 
						|
 | 
						|
using namespace oceanbase;
 | 
						|
using namespace common;
 | 
						|
using namespace liboblog;
 | 
						|
using namespace storage;
 | 
						|
using namespace transaction;
 | 
						|
using namespace clog;
 | 
						|
using namespace fetcher;
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace unittest
 | 
						|
{
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
 * Manual:
 | 
						|
 *  - This test allows you to fetch log data from
 | 
						|
 *    a single observer.
 | 
						|
 *  - Partitions and data are set up by this test.
 | 
						|
 */
 | 
						|
/*
 | 
						|
 * Fetch Log Test.
 | 
						|
 * Use schema 1.
 | 
						|
 */
 | 
						|
TEST(DISABLED_ObLogFetcherEnhanced, FetchLogTest1)
 | 
						|
//TEST(ObLogFetcherEnhanced, FetchLogTest1)
 | 
						|
{
 | 
						|
  ObClockGenerator::init();
 | 
						|
 | 
						|
  // Prepare svr.
 | 
						|
  SvrCfg svr_cfg;
 | 
						|
  svr_cfg.svr_addr_ = "10.210.177.162";
 | 
						|
  svr_cfg.internal_port_ = 43000;
 | 
						|
  svr_cfg.mysql_port_ = 43001;
 | 
						|
  svr_cfg.mysql_db_ = "oceanbase";
 | 
						|
  svr_cfg.mysql_password_ = "";
 | 
						|
  svr_cfg.mysql_user_ = "root";
 | 
						|
  svr_cfg.mysql_timeout_ = 1 * _SEC_;
 | 
						|
 | 
						|
  // Prepare table.
 | 
						|
  ObArray<ObPartitionKey> pkeys;
 | 
						|
  const int64_t table_cnt = 3;
 | 
						|
  prepare_table_1(svr_cfg,
 | 
						|
                  prepare_table_name_1(),
 | 
						|
                  table_cnt,
 | 
						|
                  prepare_table_schema_1(),
 | 
						|
                  pkeys);
 | 
						|
 | 
						|
  // Print them.
 | 
						|
  for (int64_t idx = 0; idx < pkeys.count(); ++idx) {
 | 
						|
    ObPartitionKey &key = pkeys.at(idx);
 | 
						|
    _I_(">>> add partition key", K(key));
 | 
						|
  }
 | 
						|
 | 
						|
  // Prepare svr provider.
 | 
						|
  MockSvrProvider1 svr_provider;
 | 
						|
  ObAddr addr(ObAddr::IPV4, svr_cfg.svr_addr_, svr_cfg.mysql_port_);
 | 
						|
  svr_provider.add_svr(addr);
 | 
						|
 | 
						|
  // Prepare err handler.
 | 
						|
  MockLiboblogErrHandler1 err_handler;
 | 
						|
 | 
						|
  // Prepare parser.
 | 
						|
  MockParser1 mock_parser;
 | 
						|
 | 
						|
  // Fetcher config.
 | 
						|
  FetcherConfig fcfg;
 | 
						|
  fcfg.reset();
 | 
						|
 | 
						|
  ObConcurrentFIFOAllocator fifo;
 | 
						|
  int64_t G = 1024 * 1024 * 1024;
 | 
						|
  EXPECT_EQ(OB_SUCCESS, fifo.init(1 * G, 1 * G, OB_MALLOC_BIG_BLOCK_SIZE));
 | 
						|
 | 
						|
  // Task Pool
 | 
						|
  ObLogTransTaskPool<PartTransTask> task_pool;
 | 
						|
  EXPECT_EQ(OB_SUCCESS, task_pool.init(&fifo, 10240, 1024, 4 * 1024L * 1024L, true));
 | 
						|
 | 
						|
  // Prepare fetcher.
 | 
						|
  ObLogFetcherEnhanced fetcher;
 | 
						|
  int ret = fetcher.init(&mock_parser,
 | 
						|
                         &err_handler,
 | 
						|
                         &svr_provider,
 | 
						|
                         &task_pool,
 | 
						|
                         fcfg);
 | 
						|
  EXPECT_EQ(OB_SUCCESS, ret);
 | 
						|
 | 
						|
  // Add partitions.
 | 
						|
  for (int64_t idx = 0; idx < pkeys.count(); ++idx) {
 | 
						|
    ret = fetcher.start_fetch(pkeys.at(idx), 1);
 | 
						|
    EXPECT_EQ(OB_SUCCESS, ret);
 | 
						|
  }
 | 
						|
 | 
						|
  // Start worker.
 | 
						|
  ret = fetcher.start();
 | 
						|
  EXPECT_EQ(OB_SUCCESS, ret);
 | 
						|
  _I_(">>> Start fetch");
 | 
						|
 | 
						|
  // Generate data.
 | 
						|
  _I_(">>> Generate data");
 | 
						|
  const int64_t trans_cnt_per_part = 100;
 | 
						|
  const int64_t part_cnt = table_cnt; // pcnt == table cnt.
 | 
						|
  const int64_t trans_cnt = part_cnt * trans_cnt_per_part;
 | 
						|
  ConnectorConfig cfg = prepare_cfg_1(svr_cfg);
 | 
						|
  for (int64_t idx = 0; idx < table_cnt; ++idx) {
 | 
						|
    DataGenerator1 gen(cfg);
 | 
						|
    gen.insert(prepare_table_name_1()[idx], 0, trans_cnt_per_part);
 | 
						|
    gen.join();
 | 
						|
  }
 | 
						|
 | 
						|
  // Wait.
 | 
						|
  while (mock_parser.get_trans_cnt() < trans_cnt) {
 | 
						|
    usec_sleep(1 * _SEC_);
 | 
						|
    _I_(">>> Waiting...");
 | 
						|
  }
 | 
						|
 | 
						|
  // Stop everything.
 | 
						|
  _I_(">>> Stop fetch");
 | 
						|
  for (int64_t idx = 0; idx < pkeys.count(); ++idx) {
 | 
						|
    ret = fetcher.stop_fetch(pkeys.at(idx));
 | 
						|
    EXPECT_EQ(OB_SUCCESS, ret);
 | 
						|
  }
 | 
						|
 | 
						|
  fetcher.stop();
 | 
						|
  ret = fetcher.destroy();
 | 
						|
  EXPECT_EQ(OB_SUCCESS, ret);
 | 
						|
}
 | 
						|
 | 
						|
}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
  ObLogger::get_logger().set_mod_log_levels("ALL.*:DEBUG, TLOG.*:DEBUG");
 | 
						|
  testing::InitGoogleTest(&argc,argv);
 | 
						|
  // testing::FLAGS_gtest_filter = "DO_NOT_RUN";
 | 
						|
  return RUN_ALL_TESTS();
 | 
						|
}
 |