fix spm bugs when modify inner table

This commit is contained in:
obdev
2023-08-25 05:10:31 +00:00
committed by ob-robot
parent cafa6cb294
commit ecff447ade
6 changed files with 47 additions and 11 deletions

View File

@ -555,6 +555,7 @@ void ObPhysicalPlan::update_plan_stat(const ObAuditRecordData &record,
// - (record.exec_timestamp_.run_ts_ - record.exec_timestamp_.receive_ts_)); // - (record.exec_timestamp_.run_ts_ - record.exec_timestamp_.receive_ts_));
ATOMIC_AAF(&(stat_.evolution_stat_.cpu_time_), record.exec_timestamp_.executor_t_); ATOMIC_AAF(&(stat_.evolution_stat_.cpu_time_), record.exec_timestamp_.executor_t_);
ATOMIC_AAF(&(stat_.evolution_stat_.elapsed_time_), record.get_elapsed_time()); ATOMIC_AAF(&(stat_.evolution_stat_.elapsed_time_), record.get_elapsed_time());
ATOMIC_STORE(&(stat_.evolution_stat_.last_exec_ts_), record.exec_timestamp_.executor_end_ts_);
} }
if (stat_.is_bind_sensitive_ && execute_count > 0) { if (stat_.is_bind_sensitive_ && execute_count > 0) {
int64_t pos = execute_count % ObPlanStat::MAX_SCAN_STAT_SIZE; int64_t pos = execute_count % ObPlanStat::MAX_SCAN_STAT_SIZE;

View File

@ -210,11 +210,6 @@ int64_t ObILibCacheNode::dec_ref_count(const CacheRefHandleID ref_handle)
LOG_ERROR("invalid null lib cache"); LOG_ERROR("invalid null lib cache");
} else { } else {
ObLCNodeFactory &ln_factory = lib_cache_->get_cache_node_factory(); ObLCNodeFactory &ln_factory = lib_cache_->get_cache_node_factory();
if (OB_FAIL(before_cache_evicted())) {
LOG_WARN("failed to process before_cache_evicted", K(ret));
}
// regardless of whether before_cache_evicted succeeds or fails, the cache node
// will be evicted. so ignore the error code here
lib_cache_->dec_mem_used(get_mem_size()); lib_cache_->dec_mem_used(get_mem_size());
ln_factory.destroy_cache_node(this); ln_factory.destroy_cache_node(this);
} }

View File

@ -54,7 +54,7 @@ public:
ObPlanBaselineMgr* baseline_mgr_; ObPlanBaselineMgr* baseline_mgr_;
}; };
typedef ObList<EvolutionTaskResult*, ObIAllocator> task_result_list; typedef ObList<EvoResultUpdateTask*, ObIAllocator> task_result_list;
class ObPlanBaselineMgr class ObPlanBaselineMgr
{ {
@ -90,7 +90,6 @@ public:
int force_accept_new_plan_baseline(ObSpmCacheCtx& spm_ctx, uint64_t plan_hash, const bool with_plan_hash); int force_accept_new_plan_baseline(ObSpmCacheCtx& spm_ctx, uint64_t plan_hash, const bool with_plan_hash);
int sync_baseline_from_inner_table(); int sync_baseline_from_inner_table();
int sync_baseline_from_server(); int sync_baseline_from_server();
int sync_baseline_before_evict(ObBaselineKey &key, ObIArray<ObPlanBaselineItem*>& baselines);
int alter_plan_baseline(const uint64_t tenant_id, int alter_plan_baseline(const uint64_t tenant_id,
const uint64_t database_id, const uint64_t database_id,

View File

@ -113,6 +113,26 @@ public:
const ObString &input_str, const ObString &input_str,
ObString &output_str); ObString &output_str);
int update_plan_baselines_result(const uint64_t tenant_id,
EvoResultUpdateTask& evo_res);
int update_baseline_item_evolving_result(ObMySQLTransaction& trans,
const uint64_t tenant_id,
const ObBaselineKey& key,
const uint64_t& plan_hash,
const ObEvolutionStat &evo_stat,
int64_t& affected_rows);
int insert_new_baseline(ObIAllocator& allocator,
const uint64_t tenant_id,
const ObBaselineKey& key,
ObPlanBaselineItem* baseline);
int insert_new_baseline_item(ObMySQLTransaction& trans,
ObIAllocator& allocator,
const uint64_t tenant_id,
const ObBaselineKey& key,
const ObPlanBaselineItem& baseline_item);
private: private:
const static char *EMPTY_STR; const static char *EMPTY_STR;
bool inited_; bool inited_;

View File

@ -222,7 +222,6 @@ public:
virtual int inner_add_cache_obj(ObILibCacheCtx &ctx, virtual int inner_add_cache_obj(ObILibCacheCtx &ctx,
ObILibCacheKey *key, ObILibCacheKey *key,
ObILibCacheObject *cache_obj) override; ObILibCacheObject *cache_obj) override;
virtual int before_cache_evicted() override;
void destroy(); void destroy();
void set_baseline_key(ObBaselineKey &key) { baseline_key_ = key; } void set_baseline_key(ObBaselineKey &key) { baseline_key_ = key; }
ObBaselineKey &get_baseline_key() { return baseline_key_; } ObBaselineKey &get_baseline_key() { return baseline_key_; }
@ -364,6 +363,23 @@ public:
ObEvolutionStat new_stat_; ObEvolutionStat new_stat_;
}; };
struct EvoResultUpdateTask
{
public:
EvoResultUpdateTask()
: key_(),
plan_hash_(),
plan_stat_()
{}
~EvoResultUpdateTask() {}
int init_task(common::ObIAllocator& allocator, const EvolutionTaskResult& evo_task_result);
TO_STRING_KV(K_(key), K_(plan_hash), K_(plan_stat));
public:
ObBaselineKey key_;
common::ObSEArray<uint64_t, 4> plan_hash_;
common::ObSEArray<ObEvolutionStat, 4> plan_stat_;
};
} // namespace sql end } // namespace sql end
} // namespace oceanbase end } // namespace oceanbase end

View File

@ -26,13 +26,15 @@ public:
: executions_(0), : executions_(0),
cpu_time_(0), cpu_time_(0),
elapsed_time_(0), elapsed_time_(0),
error_cnt_(0) error_cnt_(0),
last_exec_ts_(0)
{} {}
ObEvolutionStat(const ObEvolutionStat &other) ObEvolutionStat(const ObEvolutionStat &other)
: executions_(other.executions_), : executions_(other.executions_),
cpu_time_(other.cpu_time_), cpu_time_(other.cpu_time_),
elapsed_time_(other.elapsed_time_), elapsed_time_(other.elapsed_time_),
error_cnt_(other.error_cnt_) error_cnt_(other.error_cnt_),
last_exec_ts_(other.last_exec_ts_)
{} {}
virtual ~ObEvolutionStat() {} virtual ~ObEvolutionStat() {}
inline void reset() inline void reset()
@ -41,6 +43,7 @@ public:
cpu_time_ = 0; cpu_time_ = 0;
elapsed_time_ = 0; elapsed_time_ = 0;
error_cnt_ = 0; error_cnt_ = 0;
last_exec_ts_ = 0;
} }
inline ObEvolutionStat& operator=(const ObEvolutionStat &other) inline ObEvolutionStat& operator=(const ObEvolutionStat &other)
{ {
@ -49,15 +52,17 @@ public:
cpu_time_ = other.cpu_time_; cpu_time_ = other.cpu_time_;
elapsed_time_ = other.elapsed_time_; elapsed_time_ = other.elapsed_time_;
error_cnt_ = other.error_cnt_; error_cnt_ = other.error_cnt_;
last_exec_ts_ = other.last_exec_ts_;
} }
return *this; return *this;
} }
TO_STRING_KV(K_(executions), K_(cpu_time), K_(elapsed_time), K_(error_cnt)); TO_STRING_KV(K_(executions), K_(cpu_time), K_(elapsed_time), K_(error_cnt), K_(last_exec_ts));
public: public:
int64_t executions_; // The total number of executions in the evolution process int64_t executions_; // The total number of executions in the evolution process
int64_t cpu_time_; // The total CPU time consumed during the evolution process int64_t cpu_time_; // The total CPU time consumed during the evolution process
int64_t elapsed_time_; int64_t elapsed_time_;
int64_t error_cnt_; int64_t error_cnt_;
int64_t last_exec_ts_;
}; };
struct AlterPlanBaselineArg struct AlterPlanBaselineArg