Files
oceanbase/src/sql/optimizer/ob_px_resource_analyzer.h
gm 4a92b6d7df reformat source code
according to code styles, 'AccessModifierOffset' should be -2.
2021-06-17 10:40:36 +08:00

153 lines
3.8 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_PX_RESOURCE_ANALYZER_H
#define _OB_PX_RESOURCE_ANALYZER_H 1
#include "sql/resolver/dml/ob_select_stmt.h"
#include "lib/container/ob_bit_set.h"
#include "lib/container/ob_se_array.h"
namespace oceanbase {
namespace sql {
enum DfoStatus { INIT, SCHED, FINISH };
struct DfoInfo {
DfoInfo() : parent_(nullptr), depend_sibling_(nullptr), child_dfos_(), status_(DfoStatus::INIT), dop_(0)
{}
DfoInfo* parent_;
DfoInfo* depend_sibling_;
common::ObSEArray<DfoInfo*, 3> child_dfos_;
DfoStatus status_;
int64_t dop_;
bool has_sibling() const
{
return nullptr != depend_sibling_;
}
void set_depend_sibling(DfoInfo* sibling)
{
depend_sibling_ = sibling;
}
inline bool has_child() const
{
return child_dfos_.count() > 0;
}
inline bool has_parent() const
{
return nullptr != parent_;
}
inline bool is_leaf_node() const
{
return !has_child();
}
int add_child(DfoInfo* child);
int get_child(int64_t idx, DfoInfo*& child);
int64_t get_child_count() const
{
return child_dfos_.count();
}
inline void set_parent(DfoInfo* p)
{
parent_ = p;
}
void set_dop(int64_t dop)
{
dop_ = dop;
}
int64_t get_dop() const
{
return dop_;
}
int64_t set_sched()
{
int64_t set = 0;
if (DfoStatus::INIT == status_) {
set = dop_;
status_ = DfoStatus::SCHED;
}
return set;
}
int64_t set_parent_sched()
{
int64_t set = 0;
if (has_parent()) {
set = parent_->set_sched();
}
return set;
}
int64_t set_finish()
{
int64_t set = 0;
if (DfoStatus::SCHED == status_) {
set = dop_;
status_ = DfoStatus::FINISH;
}
return set;
}
bool is_finish() const
{
return DfoStatus::FINISH == status_;
}
bool is_all_child_finish() const
{
bool f = true;
for (int64_t i = 0; i < child_dfos_.count(); ++i) {
if (false == child_dfos_.at(i)->is_finish()) {
f = false;
break;
}
}
return f;
}
TO_STRING_KV(K_(status), K_(dop));
};
class ObLogExchange;
struct PxInfo {
PxInfo() : root_op_(nullptr), root_dfo_(nullptr), threads_(0), acc_threads_(0)
{}
PxInfo(ObLogExchange* root_op, DfoInfo* root_dfo)
: root_op_(root_op), root_dfo_(root_dfo), threads_(0), acc_threads_(0)
{}
ObLogExchange* root_op_;
DfoInfo* root_dfo_;
int64_t threads_;
int64_t acc_threads_;
TO_STRING_KV(K_(threads), K_(acc_threads));
};
class ObPxResourceAnalyzer {
public:
ObPxResourceAnalyzer();
~ObPxResourceAnalyzer() = default;
int analyze(ObLogicalOperator& root_op, int64_t& max_parallel_thread_group_count);
private:
int convert_log_plan_to_nested_px_tree(common::ObIArray<PxInfo>& px_trees, ObLogicalOperator& root_op);
int create_dfo_tree(ObIArray<PxInfo>& px_trees, ObLogExchange& root_op);
int do_split(common::ObIArray<PxInfo>& px_trees, PxInfo& px_info, ObLogicalOperator& root_op, DfoInfo* parent_dfo);
int walk_through_px_trees(common::ObIArray<PxInfo>& px_trees, int64_t& max_parallel_thread_group_count);
int walk_through_dfo_tree(PxInfo& px_root, int64_t& max_parallel_thread_group_count);
int create_dfo(DfoInfo*& dfo, int64_t dop);
private:
/* variables */
common::ObArenaAllocator dfo_allocator_;
DISALLOW_COPY_AND_ASSIGN(ObPxResourceAnalyzer);
};
} // namespace sql
} // namespace oceanbase
#endif