213 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			5.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.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef OB_ADMIN_BENCHMARK_TASK_EXECUTOR_H_
 | 
						|
#define OB_ADMIN_BENCHMARK_TASK_EXECUTOR_H_
 | 
						|
 | 
						|
#include "share/backup/ob_backup_struct.h"
 | 
						|
#include "deps/oblib/src/lib/ob_define.h"
 | 
						|
#include <sys/time.h>
 | 
						|
#include <sys/resource.h>
 | 
						|
#include <unistd.h>
 | 
						|
 | 
						|
namespace oceanbase
 | 
						|
{
 | 
						|
namespace tools
 | 
						|
{
 | 
						|
 | 
						|
enum BenchmarkTaskType
 | 
						|
{
 | 
						|
  BENCHMARK_TASK_NORMAL_WRITE = 0,
 | 
						|
  BENCHMARK_TASK_APPEND_WRITE = 1,
 | 
						|
  BENCHMARK_TASK_MULTIPART_WRITE = 2,
 | 
						|
  BENCHMARK_TASK_READ = 3,
 | 
						|
  BENCHMARK_TASK_DEL = 4,
 | 
						|
  BENCHMARK_TASK_IS_EXIST = 5,
 | 
						|
  BENCHMARK_TASK_MAX_TYPE
 | 
						|
};
 | 
						|
 | 
						|
struct TaskConfig
 | 
						|
{
 | 
						|
  TaskConfig();
 | 
						|
  int assign(const TaskConfig &other);
 | 
						|
  TO_STRING_KV(K_(thread_num), K_(max_task_runs), K_(time_limit_s),
 | 
						|
      K_(obj_size), K_(obj_num), K_(fragment_size), K_(is_adaptive), K_(type));
 | 
						|
 | 
						|
  int64_t thread_num_;
 | 
						|
  int64_t max_task_runs_;   // 每个线程执行次数
 | 
						|
  int64_t time_limit_s_;
 | 
						|
  int64_t obj_size_;
 | 
						|
  int64_t obj_num_;
 | 
						|
  int64_t fragment_size_;
 | 
						|
  bool is_adaptive_;
 | 
						|
  BenchmarkTaskType type_;
 | 
						|
};
 | 
						|
 | 
						|
struct TimeMap
 | 
						|
{
 | 
						|
  TimeMap();
 | 
						|
  int log_entry(const int64_t start_time_us);
 | 
						|
  int add(const TimeMap &other);
 | 
						|
  int assign(const TimeMap &other);
 | 
						|
  void summary(const char *map_name_str);
 | 
						|
 | 
						|
  int64_t total_entry_;
 | 
						|
  std::map<int64_t, int64_t> time_ms_map_;
 | 
						|
};
 | 
						|
 | 
						|
struct Metrics
 | 
						|
{
 | 
						|
  Metrics();
 | 
						|
  int assign(const Metrics &other);
 | 
						|
  int add(const Metrics &other);
 | 
						|
  void summary(
 | 
						|
      const struct timeval &start_real_time,
 | 
						|
      const struct rusage &start_usage,
 | 
						|
      const int64_t thread_num);
 | 
						|
 | 
						|
  int64_t status_;
 | 
						|
  int64_t throughput_bytes_;
 | 
						|
  int64_t operation_num_;
 | 
						|
  TimeMap total_op_time_ms_map_;
 | 
						|
  TimeMap open_time_ms_map_;
 | 
						|
  TimeMap close_time_ms_map_;
 | 
						|
};
 | 
						|
 | 
						|
class ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  ITaskExecutor();
 | 
						|
  virtual ~ITaskExecutor() {}
 | 
						|
  void reset();
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config);
 | 
						|
  virtual int execute() { return OB_SUCCESS; };
 | 
						|
  const Metrics &get_metrics() { return metrics_; }
 | 
						|
 | 
						|
protected:
 | 
						|
  int prepare_(const int64_t object_id);
 | 
						|
  void finish_(const int64_t ob_errcode);
 | 
						|
 | 
						|
protected:
 | 
						|
  bool is_inited_;
 | 
						|
  int64_t base_uri_len_;
 | 
						|
  char base_uri_[common::OB_MAX_URI_LENGTH];
 | 
						|
  share::ObBackupStorageInfo *storage_info_;
 | 
						|
  Metrics metrics_;
 | 
						|
};
 | 
						|
 | 
						|
void init_random_content();
 | 
						|
int init_task_executor(const char *base_uri,
 | 
						|
    share::ObBackupStorageInfo *storage_info, const TaskConfig &config, ITaskExecutor *&executor);
 | 
						|
 | 
						|
class WriteTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  WriteTaskExecutor();
 | 
						|
  virtual ~WriteTaskExecutor() {}
 | 
						|
  void reset();
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  int64_t obj_size_;
 | 
						|
  char *write_buf_;
 | 
						|
  ObArenaAllocator allocator_;
 | 
						|
};
 | 
						|
 | 
						|
class AppendWriteTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  AppendWriteTaskExecutor();
 | 
						|
  virtual ~AppendWriteTaskExecutor() {}
 | 
						|
  void reset();
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  int64_t obj_size_;
 | 
						|
  int64_t fragment_size_;
 | 
						|
  char *write_buf_;
 | 
						|
  ObArenaAllocator allocator_;
 | 
						|
};
 | 
						|
 | 
						|
class MultipartWriteTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  MultipartWriteTaskExecutor();
 | 
						|
  virtual ~MultipartWriteTaskExecutor() {}
 | 
						|
  void reset();
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  int64_t obj_size_;
 | 
						|
  int64_t part_size_;
 | 
						|
  char *write_buf_;
 | 
						|
  ObArenaAllocator allocator_;
 | 
						|
};
 | 
						|
 | 
						|
class ReadTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  ReadTaskExecutor();
 | 
						|
  virtual ~ReadTaskExecutor() {}
 | 
						|
  void reset();
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  int64_t obj_size_;
 | 
						|
  int64_t obj_num_;
 | 
						|
  bool is_adaptive_;
 | 
						|
  int64_t expected_read_size_;
 | 
						|
  char *read_buf_;
 | 
						|
  ObArenaAllocator allocator_;
 | 
						|
 | 
						|
private:
 | 
						|
  static const int64_t ALIGNMENT = 16 * 1024;
 | 
						|
};
 | 
						|
 | 
						|
class DelTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  DelTaskExecutor();
 | 
						|
  virtual ~DelTaskExecutor() {}
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  bool is_adaptive_;
 | 
						|
};
 | 
						|
 | 
						|
class IsExistTaskExecutor : public ITaskExecutor
 | 
						|
{
 | 
						|
public:
 | 
						|
  IsExistTaskExecutor();
 | 
						|
  virtual ~IsExistTaskExecutor() {}
 | 
						|
  virtual int init(const char *base_uri,
 | 
						|
      share::ObBackupStorageInfo *storage_info, const TaskConfig &config) override;
 | 
						|
  virtual int execute() override;
 | 
						|
 | 
						|
private:
 | 
						|
  int64_t obj_num_;
 | 
						|
};
 | 
						|
 | 
						|
} //namespace tools
 | 
						|
} //namespace oceanbase
 | 
						|
 | 
						|
#endif  // OB_ADMIN_BENCHMARK_TASK_EXECUTOR_H_
 |