greenplumn CJobGroupExploration 源码
greenplumn CJobGroupExploration 代码
文件路径:/src/backend/gporca/libgpopt/src/search/CJobGroupExploration.cpp
//---------------------------------------------------------------------------
// Greenplum Database
// Copyright (C) 2011 EMC Corp.
//
// @filename:
// CJobGroupExploration.cpp
//
// @doc:
// Implementation of group exploration job
//---------------------------------------------------------------------------
#include "gpopt/search/CJobGroupExploration.h"
#include "gpopt/engine/CEngine.h"
#include "gpopt/search/CGroup.h"
#include "gpopt/search/CGroupExpression.h"
#include "gpopt/search/CGroupProxy.h"
#include "gpopt/search/CJobFactory.h"
#include "gpopt/search/CJobGroupExpressionExploration.h"
#include "gpopt/search/CJobQueue.h"
#include "gpopt/search/CScheduler.h"
#include "gpopt/search/CSchedulerContext.h"
using namespace gpopt;
// State transition diagram for group exploration job state machine;
//
// +------------------------+
// | estInitialized: |
// | EevtStartExploration() |
// +------------------------+
// |
// | eevStartedExploration
// v
// +------------------------+ eevNewChildren
// | estExploringChildren: | -----------------+
// | EevtExploreChildren() | |
// | | <----------------+
// +------------------------+
// |
// | eevExplored
// v
// +------------------------+
// | estCompleted |
// +------------------------+
//
const CJobGroupExploration::EEvent
rgeev[CJobGroupExploration::estSentinel]
[CJobGroupExploration::estSentinel] = {
{// estInitialized
CJobGroupExploration::eevSentinel,
CJobGroupExploration::eevStartedExploration,
CJobGroupExploration::eevSentinel},
{// estExploringChildren
CJobGroupExploration::eevSentinel,
CJobGroupExploration::eevNewChildren,
CJobGroupExploration::eevExplored},
{// estCompleted
CJobGroupExploration::eevSentinel,
CJobGroupExploration::eevSentinel,
CJobGroupExploration::eevSentinel},
};
#ifdef GPOS_DEBUG
// names for states
const WCHAR
rgwszStates[CJobGroupExploration::estSentinel][GPOPT_FSM_NAME_LENGTH] = {
GPOS_WSZ_LIT("initialized"), GPOS_WSZ_LIT("children explored"),
GPOS_WSZ_LIT("completed")};
// names for events
const WCHAR
rgwszEvents[CJobGroupExploration::eevSentinel][GPOPT_FSM_NAME_LENGTH] = {
GPOS_WSZ_LIT("started exploration"), GPOS_WSZ_LIT("exploring children"),
GPOS_WSZ_LIT("finalized")};
#endif // GPOS_DEBUG
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::CJobGroupExploration
//
// @doc:
// Ctor
//
//---------------------------------------------------------------------------
CJobGroupExploration::CJobGroupExploration() = default;
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::~CJobGroupExploration
//
// @doc:
// Dtor
//
//---------------------------------------------------------------------------
CJobGroupExploration::~CJobGroupExploration() = default;
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::Init
//
// @doc:
// Initialize job
//
//---------------------------------------------------------------------------
void
CJobGroupExploration::Init(CGroup *pgroup)
{
CJobGroup::Init(pgroup);
m_jsm.Init(rgeev
#ifdef GPOS_DEBUG
,
rgwszStates, rgwszEvents
#endif // GPOS_DEBUG
);
// set job actions
m_jsm.SetAction(estInitialized, EevtStartExploration);
m_jsm.SetAction(estExploringChildren, EevtExploreChildren);
SetJobQueue(pgroup->PjqExploration());
CJob::SetInit();
}
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::FScheduleGroupExpressions
//
// @doc:
// Schedule exploration jobs for all unexplored group expressions;
// the function returns true if it could schedule any new jobs
//
//---------------------------------------------------------------------------
BOOL
CJobGroupExploration::FScheduleGroupExpressions(CSchedulerContext *psc)
{
CGroupExpression *pgexprLast = m_pgexprLastScheduled;
// iterate on expressions and schedule them as needed
CGroupExpression *pgexpr = PgexprFirstUnsched();
while (nullptr != pgexpr)
{
if (!pgexpr->FTransitioned(CGroupExpression::estExplored))
{
CJobGroupExpressionExploration::ScheduleJob(psc, pgexpr, this);
pgexprLast = pgexpr;
}
// move to next expression
{
CGroupProxy gp(m_pgroup);
pgexpr = gp.PgexprNext(pgexpr);
}
}
BOOL fNewJobs = (m_pgexprLastScheduled != pgexprLast);
// set last scheduled expression
m_pgexprLastScheduled = pgexprLast;
return fNewJobs;
}
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::EevtStartExploration
//
// @doc:
// Start group exploration
//
//---------------------------------------------------------------------------
CJobGroupExploration::EEvent
CJobGroupExploration::EevtStartExploration(CSchedulerContext *, //psc
CJob *pjOwner)
{
// get a job pointer
CJobGroupExploration *pjge = PjConvert(pjOwner);
CGroup *pgroup = pjge->m_pgroup;
// move group to exploration state
{
CGroupProxy gp(pgroup);
gp.SetState(CGroup::estExploring);
}
return eevStartedExploration;
}
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::EevtExploreChildren
//
// @doc:
// Explore child group expressions
//
//---------------------------------------------------------------------------
CJobGroupExploration::EEvent
CJobGroupExploration::EevtExploreChildren(CSchedulerContext *psc, CJob *pjOwner)
{
// get a job pointer
CJobGroupExploration *pjge = PjConvert(pjOwner);
if (pjge->FScheduleGroupExpressions(psc))
{
// new expressions have been added to group
return eevNewChildren;
}
else
{
// no new expressions have been added to group, move to explored state
{
CGroupProxy gp(pjge->m_pgroup);
gp.SetState(CGroup::estExplored);
}
// if this is the root, complete exploration phase
if (psc->Peng()->FRoot(pjge->m_pgroup))
{
psc->Peng()->FinalizeExploration();
}
return eevExplored;
}
}
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::FExecute
//
// @doc:
// Main job function
//
//---------------------------------------------------------------------------
BOOL
CJobGroupExploration::FExecute(CSchedulerContext *psc)
{
GPOS_ASSERT(FInit());
return m_jsm.FRun(psc, this);
}
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::ScheduleJob
//
// @doc:
// Schedule a new group exploration job
//
//---------------------------------------------------------------------------
void
CJobGroupExploration::ScheduleJob(CSchedulerContext *psc, CGroup *pgroup,
CJob *pjParent)
{
CJob *pj = psc->Pjf()->PjCreate(CJob::EjtGroupExploration);
// initialize job
CJobGroupExploration *pjge = PjConvert(pj);
pjge->Init(pgroup);
psc->Psched()->Add(pjge, pjParent);
}
#ifdef GPOS_DEBUG
//---------------------------------------------------------------------------
// @function:
// CJobGroupExploration::OsPrint
//
// @doc:
// Print function
//
//---------------------------------------------------------------------------
IOstream &
CJobGroupExploration::OsPrint(IOstream &os) const
{
return m_jsm.OsHistory(os);
}
#endif // GPOS_DEBUG
// EOF
相关信息
相关文章
greenplumn CGroupExpression 源码
greenplumn CJobGroupExpression 源码
0
赞
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦