You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by en...@apache.org on 2015/12/04 23:34:14 UTC
incubator-hawq git commit: HAWQ-221. Cleanup unused files related to
optimizer
Repository: incubator-hawq
Updated Branches:
refs/heads/master 099717d29 -> ad8ed914d
HAWQ-221. Cleanup unused files related to optimizer
Closes #159.
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/ad8ed914
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/ad8ed914
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/ad8ed914
Branch: refs/heads/master
Commit: ad8ed914df9919cb09c6f50e5f78f1f5519b303b
Parents: 099717d
Author: Entong Shen <sh...@gmail.com>
Authored: Thu Dec 3 13:21:07 2015 -0800
Committer: Entong Shen <sh...@gmail.com>
Committed: Fri Dec 4 14:33:08 2015 -0800
----------------------------------------------------------------------
src/backend/gpopt/utils/COptClient.cpp | 427 ---------------------
src/backend/gpopt/utils/COptServer.cpp | 568 ----------------------------
src/backend/gpopt/utils/Makefile | 4 +-
src/backend/gpopt/utils/funcs.cpp | 41 --
src/backend/optimizer/plan/planner.c | 13 -
src/backend/postmaster/Makefile | 2 +-
src/backend/postmaster/optserver.c | 257 -------------
src/backend/postmaster/postmaster.c | 10 -
src/include/postmaster/optserver.h | 48 ---
9 files changed, 3 insertions(+), 1367 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/gpopt/utils/COptClient.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/COptClient.cpp b/src/backend/gpopt/utils/COptClient.cpp
deleted file mode 100644
index f7ba486..0000000
--- a/src/backend/gpopt/utils/COptClient.cpp
+++ /dev/null
@@ -1,427 +0,0 @@
-//---------------------------------------------------------------------------
-// Greenplum Database
-// Copyright (C) 2012 EMC Corp.
-//
-// @filename:
-// COptClient.cpp
-//
-// @doc:
-// Implementation of communication handler for message exchange
-// between OPT and QD
-//
-// @owner:
-// solimm1
-//
-// @test:
-//
-//---------------------------------------------------------------------------
-
-#define ALLOW_printf
-#define ALLOW_sigsetjmp
-#define ALLOW_DatumGetPointer
-#define ALLOW_ntohl
-
-#include "gpopt/utils/gpdbdefs.h"
-#include "gpopt/config/CConfigParamMapping.h"
-#include "gpopt/relcache/CMDProviderRelcache.h"
-#include "gpopt/translate/CStateDXLToQuery.h"
-#include "gpopt/translate/CTranslatorUtils.h"
-#include "gpopt/translate/CTranslatorQueryToDXL.h"
-#include "gpopt/translate/CTranslatorDXLToPlStmt.h"
-#include "gpopt/translate/CTranslatorDXLToQuery.h"
-#include "gpopt/translate/CContextDXLToPlStmt.h"
-#include "gpopt/translate/CTranslatorRelcacheToDXL.h"
-
-#include "cdb/cdbvars.h"
-#include "utils/guc.h"
-
-#include "gpos/_api.h"
-#include "gpos/base.h"
-#include "gpos/common/CAutoP.h"
-#include "gpos/common/CBitSetIter.h"
-#include "gpos/error/CErrorHandlerStandard.h"
-#include "gpos/io/COstreamString.h"
-#include "gpos/memory/CAutoMemoryPool.h"
-#include "gpos/net/CSocketConnectorUDS.h"
-#include "gpos/string/CWStringDynamic.h"
-
-#include "gpopt/base/CAutoOptCtxt.h"
-#include "gpopt/mdcache/CAutoMDAccessor.h"
-#include "gpopt/xforms/CXform.h"
-
-#include "naucrates/exception.h"
-#include "naucrates/comm/CCommunicator.h"
-#include "naucrates/dxl/operators/CDXLNode.h"
-#include "naucrates/dxl/CDXLUtils.h"
-#include "naucrates/dxl/CIdGenerator.h"
-#include "naucrates/md/CMDProviderCommProxy.h"
-#include "naucrates/md/CSystemId.h"
-
-#include "gpopt/utils/COptClient.h"
-#include "gpopt/gpdbwrappers.h"
-
-using namespace gpos;
-using namespace gpnaucrates;
-using namespace gpoptudfs;
-
-// initialization of static members
-const CSystemId COptClient::m_sysidDefault(IMDId::EmdidGPDB, GPOS_WSZ_STR_LENGTH("GPDB"));
-
-ULONG COptClient::m_rgrgulSev[CException::ExsevSentinel][2] =
-{
- {CException::ExsevInvalid, LOG},
- {CException::ExsevPanic, PANIC},
- {CException::ExsevFatal, FATAL},
- {CException::ExsevError, ERROR},
- {CException::ExsevWarning, WARNING},
- {CException::ExsevNotice, NOTICE},
- {CException::ExsevTrace, LOG},
-};
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::PvRun
-//
-// @doc:
-// Invoke optimizer instance
-//
-//---------------------------------------------------------------------------
-void *
-COptClient::PvRun
- (
- void *pv
- )
-{
- for (ULONG ul = 0; ul < (ULONG) optimizer_retries; ul++)
- {
- CErrorHandlerStandard errhdl;
- GPOS_TRY_HDL(&errhdl)
- {
- COptClient optProc((SOptParams *) pv);
- return optProc.PplstmtOptimize();
- }
- GPOS_CATCH_EX(ex)
- {
- if (!GPOS_MATCH_EX(ex, CException::ExmaSystem, CException::ExmiNetError) ||
- ul + 1 == (ULONG) optimizer_retries)
- {
- GPOS_RETHROW(ex);
- }
-
- GPOS_RESET_EX;
- }
- GPOS_CATCH_END;
- }
-
- return NULL;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::PplstmtOptimize
-//
-// @doc:
-// Request optimization from server
-//
-//---------------------------------------------------------------------------
-PlannedStmt *
-COptClient::PplstmtOptimize()
-{
- ITask::PtskSelf()->PlogErr()->SetErrorInfoLevel(ILogger::EeilMsg);
-
- CAutoMemoryPool amp
- (
- CAutoMemoryPool::ElcNone,
- CMemoryPoolManager::EatMalloc,
- false /*fThreadSafe*/
- );
- m_pmp = amp.Pmp();
-
- // scope for socket connector
- {
- // setup communication with server
- CSocketConnectorUDS sc(m_pmp, m_szPath);
- sc.Connect();
- CCommunicator comm(m_pmp, sc.Psocket());
- m_pcomm = &comm;
-
- SetTraceflags();
-
- // scope for MD provider
- {
- IMDProvider *pmdp = New(m_pmp) CMDProviderRelcache(m_pmp);
-
- // scope for MD accessor
- {
- CAutoMDAccessor amda(m_pmp, pmdp, m_sysidDefault);
-
- // scope for optimization context
- {
- COptimizerConfig *poconfig = NULL;
- // install opt context in TLS
- CAutoOptCtxt aoc
- (
- m_pmp,
- amda.Pmda(),
- NULL, /* IConstExprEvaluator */
- poconfig
- );
-
- // send request to client
- SendRequest(amda.Pmda());
-
- // retrieve serialized plan
- const CHAR *szPlanDXL = SzPlanDXL(pmdp);
-
- // create and return planned statement
- return PplstmtConstruct(amda.Pmda(), szPlanDXL);
- }
- }
- }
- }
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::SetTraceflags
-//
-// @doc:
-// Set trace flags to current task
-//
-//---------------------------------------------------------------------------
-void
-COptClient::SetTraceflags()
-{
- CBitSet *pbs = CConfigParamMapping::PbsPack(m_pmp, CXform::ExfSentinel);
-
- CWStringDynamic str(m_pmp);
- COstreamString oss(&str);
-
- oss << "Traceflags: " << *pbs;
- Elog(CException::ExsevNotice, str.Wsz());
-
- // scope for iterator
- {
- CBitSetIter bsi(*pbs);
- while (bsi.FAdvance())
- {
- GPOS_SET_TRACE(bsi.UlBit());
- }
- }
-
- pbs->Release();
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::SendRequest
-//
-// @doc:
-// Send query optimization request to server
-//
-//---------------------------------------------------------------------------
-void
-COptClient::SendRequest
- (
- CMDAccessor *pmda
- )
-{
- GPOS_ASSERT(NULL != m_pmp);
- GPOS_ASSERT(NULL != m_pcomm);
-
- // translate query to DXL
- CIdGenerator *pidgtorCol = New(m_pmp) CIdGenerator(GPDXL_COL_ID_START);
- CIdGenerator *pidgtorCTE = New(m_pmp) CIdGenerator(GPDXL_CTE_ID_START);
- CMappingVarColId *pmapvarcolid = New(m_pmp) CMappingVarColId(m_pmp);
- CAutoP<CTranslatorQueryToDXL> ptrquerytodxl;
- ptrquerytodxl = CTranslatorQueryToDXL::PtrquerytodxlInstance
- (
- m_pmp,
- pmda,
- pidgtorCol,
- pidgtorCTE,
- pmapvarcolid,
- m_pquery,
- 0 // ulQueryLevel
- );
-
- CDXLNode *pdxlnRoot = ptrquerytodxl->PdxlnFromQuery();
- DrgPdxln *pdrgpdxlnQueryOutput = ptrquerytodxl->PdrgpdxlnQueryOutput();
- DrgPdxln *pdrgpdxlnCTE = ptrquerytodxl->PdrgpdxlnCTE();
- GPOS_ASSERT(NULL != pdrgpdxlnQueryOutput);
-
- CWStringDynamic *pstrQuery = CDXLUtils::PstrSerializeQuery
- (
- m_pmp,
- pdxlnRoot,
- pdrgpdxlnQueryOutput,
- pdrgpdxlnCTE,
- true /*fDocumentHeaderFootter*/,
- false /*fIndent*/
- );
-
- // create optimization request message and send it
- CCommMessage msg(CCommMessage::EcmtOptRequest, pstrQuery->Wsz(), 0 /*ullUserData*/);
- m_pcomm->SendMsg(&msg);
-
- // clean up
- delete pstrQuery;
- pdxlnRoot->Release();
- pdrgpdxlnQueryOutput->Release();
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::SzPlanDXL
-//
-// @doc:
-// Retrieve DXL plan
-//
-//---------------------------------------------------------------------------
-const CHAR *
-COptClient::SzPlanDXL
- (
- IMDProvider *pmdp
- )
-{
- GPOS_ASSERT(NULL != m_pmp);
- GPOS_ASSERT(NULL != m_pcomm);
-
- const CHAR *szPlan = NULL;
- CMDProviderCommProxy mdpcp(m_pmp, pmdp);
-
- while (NULL == szPlan)
- {
- CCommMessage *pmsg = m_pcomm->PmsgReceiveMsg();
- switch (pmsg->Ecmt())
- {
- case CCommMessage::EcmtMDRequest:
- SendMDResponse(&mdpcp, pmsg->Wsz());
- break;
-
- case CCommMessage::EcmtLog:
- // log message
- Elog((ULONG) pmsg->UllInfo(), pmsg->Wsz());
- break;
-
- case CCommMessage::EcmtOptResponse:
- szPlan = CDXLUtils::SzFromWsz(m_pmp, pmsg->Wsz());
- break;
-
- default:
- GPOS_RAISE(gpdxl::ExmaComm, gpdxl::ExmiCommUnexpectedMessage, pmsg->Ecmt());
- }
-
- delete [] pmsg->Wsz();
- delete pmsg;
- }
-
- GPOS_ASSERT(NULL != szPlan);
-
- return szPlan;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::SendMDResponse
-//
-// @doc:
-// Send MD response
-//
-//---------------------------------------------------------------------------
-void
-COptClient::SendMDResponse
- (
- CMDProviderCommProxy *pmdpcp,
- const WCHAR *wszReq
- )
-{
- GPOS_ASSERT(NULL != m_pmp);
- GPOS_ASSERT(NULL != m_pcomm);
-
- CWStringBase *pstrResponse = pmdpcp->PstrObject(wszReq);
-
- // send response
- CCommMessage msgResponse(CCommMessage::EcmtMDResponse, pstrResponse->Wsz(), 0 /*ullUserData*/);
- m_pcomm->SendMsg(&msgResponse);
-
- delete pstrResponse;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::PplstmtConstruct
-//
-// @doc:
-// Build planned statement from serialized plan
-//
-//---------------------------------------------------------------------------
-PlannedStmt *
-COptClient::PplstmtConstruct
- (
- CMDAccessor *pmda,
- const CHAR *szPlan
- )
-{
- GPOS_ASSERT(NULL != m_pmp);
-
- CIdGenerator idgtorPlanId(1 /* ulStartId */);
- CIdGenerator idgtorMotionId(1 /* ulStartId */);
- CIdGenerator idgtorParamId(0 /* ulStartId */);
-
- List *plRTable = NULL;
- List *plSubplans = NULL;
-
- CContextDXLToPlStmt ctxdxltoplstmt
- (
- m_pmp,
- &idgtorPlanId,
- &idgtorMotionId,
- &idgtorParamId,
- &plRTable,
- &plSubplans
- );
-
- // translate DXL -> PlannedStmt
- CTranslatorDXLToPlStmt trdxltoplstmt(m_pmp, pmda, &ctxdxltoplstmt, gpdb::UlSegmentCountGP());
- ULLONG ullPlanId = 0;
- ULLONG ullPlanSpaceSize = 0;
- CDXLNode *pdxlnPlan = CDXLUtils::PdxlnParsePlan(m_pmp, szPlan, NULL /*szXSDPath*/, &ullPlanId, &ullPlanSpaceSize);
- PlannedStmt *pplstmt = trdxltoplstmt.PplstmtFromDXL(pdxlnPlan);
-
- GPOS_ASSERT(NULL != pplstmt);
- GPOS_ASSERT(CurrentMemoryContext);
-
- return (PlannedStmt *) gpdb::PvCopyObject(pplstmt);;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptClient::Elog
-//
-// @doc:
-// elog wrapper
-//
-//---------------------------------------------------------------------------
-void
-COptClient::Elog
- (
- ULONG ulSev,
- const WCHAR *wszMsg
- )
-{
- GPOS_ASSERT(CException::ExsevSentinel > ulSev);
- GPOS_ASSERT(m_rgrgulSev[ulSev][0] == ulSev);
-
- PG_TRY();
- {
- elog(m_rgrgulSev[ulSev][1], "%ls", wszMsg);
- }
- PG_CATCH();
- {
- GPOS_RAISE(gpdxl::ExmaGPDB, gpdxl::ExmiGPDBError);
- }
- PG_END_TRY();
-}
-
-// EOF
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/gpopt/utils/COptServer.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/COptServer.cpp b/src/backend/gpopt/utils/COptServer.cpp
deleted file mode 100644
index 695538a..0000000
--- a/src/backend/gpopt/utils/COptServer.cpp
+++ /dev/null
@@ -1,568 +0,0 @@
-//---------------------------------------------------------------------------
-// Greenplum Database
-// Copyright (C) 2012 EMC Corp.
-//
-// @filename:
-// COptServer.cpp
-//
-// @doc:
-// Implementation of communication handler for message exchange
-// between OPT and QD
-//
-// @owner:
-// solimm1
-//
-// @test:
-//
-//
-//---------------------------------------------------------------------------
-
-#define ALLOW_DatumGetPointer
-#define ALLOW_ntohl
-#define ALLOW_memset
-#define ALLOW_printf
-
-#include "postgres.h"
-#include "gpopt/config/CConfigParamMapping.h"
-#include "gpopt/translate/CStateDXLToQuery.h"
-#include "gpopt/translate/CTranslatorUtils.h"
-#include "gpopt/translate/CTranslatorQueryToDXL.h"
-#include "gpopt/translate/CTranslatorDXLToPlStmt.h"
-#include "gpopt/translate/CTranslatorDXLToQuery.h"
-#include "gpopt/translate/CContextDXLToPlStmt.h"
-#include "gpopt/translate/CTranslatorRelcacheToDXL.h"
-
-#include "gpos/_api.h"
-#include "gpos/base.h"
-#include "gpos/utils.h"
-#include "gpos/common/CAutoP.h"
-#include "gpos/error/CErrorHandlerStandard.h"
-#include "gpos/error/CAutoLogger.h"
-#include "gpos/memory/CAutoMemoryPool.h"
-#include "gpos/net/CAutoSocketProxy.h"
-#include "gpos/net/CSocketListenerUDS.h"
-#include "gpos/task/CAutoTaskProxy.h"
-
-#include "naucrates/base/CQueryToDXLResult.h"
-#include "naucrates/comm/CCommunicator.h"
-#include "naucrates/comm/CLoggerComm.h"
-
-#include "gpopt/base/CAutoOptCtxt.h"
-#include "gpopt/base/CQueryContext.h"
-#include "gpopt/engine/CEngine.h"
-#include "gpopt/mdcache/CAutoMDAccessor.h"
-#include "gpopt/minidump/CMiniDumperDXL.h"
-#include "gpopt/minidump/CMinidumperUtils.h"
-#include "gpopt/minidump/CSerializableStackTrace.h"
-#include "gpopt/minidump/CSerializableQuery.h"
-#include "gpopt/minidump/CSerializablePlan.h"
-#include "gpopt/minidump/CSerializableMDAccessor.h"
-#include "gpopt/translate/CTranslatorDXLToExpr.h"
-#include "gpopt/translate/CTranslatorExprToDXL.h"
-
-#include "naucrates/exception.h"
-#include "gpopt/utils/COptServer.h"
-
-#include "naucrates/dxl/operators/CDXLNode.h"
-#include "naucrates/dxl/CDXLUtils.h"
-#include "naucrates/dxl/CIdGenerator.h"
-#include "naucrates/md/CMDProviderComm.h"
-#include "naucrates/md/CSystemId.h"
-
-#include "gpopt/gpdbwrappers.h"
-
-#include "gpdbcost/CCostModelGPDB.h"
-
-using namespace gpos;
-using namespace gpmd;
-using namespace gpnaucrates;
-using namespace gpoptudfs;
-using namespace gpdbcost;
-
-#define GPOPT_FILE_NAME_LEN (1024)
-#define GPOPT_CONN_HT_SIZE (ULONG(128))
-#define GPOPT_CONN_CHECK_SLEEP_MS (ULONG(1000))
-
-// initialization of static members
-ULONG_PTR COptServer::SConnectionDescriptor::m_ulpInvalid = 0;
-const CSystemId COptServer::m_sysidDefault(IMDId::EmdidGPDB, GPOS_WSZ_STR_LENGTH("GPDB"));
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::COptServer
-//
-// @doc:
-// Ctor
-//
-//---------------------------------------------------------------------------
-COptServer::COptServer
- (
- const CHAR *szSocketPath
- )
- :
- m_szSocketPath(szSocketPath),
- m_pshtConnections(NULL)
-{}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::~COptServer
-//
-// @doc:
-// Dtor
-//
-//---------------------------------------------------------------------------
-COptServer::~COptServer()
-{}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::PvRun
-//
-// @doc:
-// Invoke optimizer instance
-//
-//---------------------------------------------------------------------------
-void *
-COptServer::PvRun
- (
- void *pv
- )
-{
- COptServer optProc((const char *) pv);
- optProc.Loop();
-
- return NULL;
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::Loop
-//
-// @doc:
-// Start serving requests
-//
-//---------------------------------------------------------------------------
-void
-COptServer::Loop()
-{
- CAutoMemoryPool amp
- (
- CAutoMemoryPool::ElcNone,
- CMemoryPoolManager::EatMalloc,
- true /*fThreadSafe*/
- );
-
- m_pmp = amp.Pmp();
-
- gpos_set_threads(4, 4);
-
- // scope for socket listener
- {
- CSocketListenerUDS sl(m_pmp, m_szSocketPath);
- sl.StartListener();
-
- InitHT();
-
- // scope for tasks
- {
- CWorkerPoolManager *pwpm = CWorkerPoolManager::Pwpm();
- CAutoTaskProxy atp(m_pmp, pwpm, false /*fPropagateError*/);
-
- // start task that checks connection status
- CTask *ptskCheck = atp.PtskCreate(PvCheckConnections, m_pshtConnections);
- atp.Schedule(ptskCheck);
-
- // keep listening for new requests
- while (true)
- {
- CSocket *psocket = sl.PsocketNext();
-
- // create new task to handle communication
- CTask *ptsk = atp.PtskCreate(PvOptimize, psocket);
- ptsk->Tls().Reset(m_pmp);
-
- TrackConnection(ptsk, psocket);
-
- atp.Schedule(ptsk);
-
- // release completed tasks
- while (0 != atp.UlTasks() &&
- GPOS_OK == atp.EresTimedWaitAny(&ptsk, 0 /*ulTimeoutMs*/))
- {
- ReleaseConnection(ptsk);
- atp.Destroy(ptsk);
- }
-
- GPOS_CHECK_ABORT;
- }
- }
- }
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::InitHT
-//
-// @doc:
-// Initialize hashtable
-//
-//---------------------------------------------------------------------------
-void
-COptServer::InitHT()
-{
- GPOS_ASSERT(NULL != m_pmp);
- GPOS_ASSERT(NULL == m_pshtConnections);
-
- m_pshtConnections = New(m_pmp) ConnectionHT();
- m_pshtConnections->Init
- (
- m_pmp,
- GPOPT_CONN_HT_SIZE,
- GPOS_OFFSET(SConnectionDescriptor, m_link),
- GPOS_OFFSET(SConnectionDescriptor, m_ulpId),
- &(SConnectionDescriptor::m_ulpInvalid),
- UlHashUlp,
- FEqualUlp
- );
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::TrackConnection
-//
-// @doc:
-// Register connection for status checking
-//
-//---------------------------------------------------------------------------
-void
-COptServer::TrackConnection
- (
- CTask *ptsk,
- CSocket *psocket
- )
-{
- GPOS_ASSERT(NULL != m_pmp);
- GPOS_ASSERT(NULL != psocket);
- GPOS_ASSERT(NULL != ptsk);
-
- SConnectionDescriptor *pcd = New(m_pmp) SConnectionDescriptor(ptsk, psocket);
-
- // scope for accessor
- {
- ConnectionKeyAccessor shtacc(*m_pshtConnections, (ULONG_PTR) pcd->m_ptsk);
- shtacc.Insert(pcd);
- }
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::ReleaseConnection
-//
-// @doc:
-// Release connection
-//
-//---------------------------------------------------------------------------
-void
-COptServer::ReleaseConnection
- (
- CTask *ptsk
- )
-{
- SConnectionDescriptor *pcd = NULL;
-
- // scope for accessor
- {
- ConnectionKeyAccessor shtacc(*m_pshtConnections, (ULONG_PTR) ptsk);
- pcd = shtacc.PtLookup();
- shtacc.Remove(pcd);
- }
-
- // release socket
- CAutoSocketProxy asp(pcd->m_psocket);
- delete pcd;
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::PvCheckConnections
-//
-// @doc:
-// Connection check task
-//
-//---------------------------------------------------------------------------
-void *
-COptServer::PvCheckConnections
- (
- void *pv
- )
-{
- ConnectionHT *pshtConnections = static_cast<ConnectionHT*>(pv);
-
- while (true)
- {
- GPOS_CHECK_ABORT;
-
- ConnectionIter conniter(*pshtConnections);
- while (conniter.FAdvance())
- {
- ConnectionIterAccessor shtacc(conniter);
- SConnectionDescriptor *pcd = shtacc.Pt();
-
- // cancel task if its connection is broken
- if (NULL != pcd && !pcd->m_psocket->FCheck())
- {
- pcd->m_ptsk->Cancel();
- }
- }
-
- clib::USleep(GPOPT_CONN_CHECK_SLEEP_MS);
- }
-
- return NULL;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::PvOptimize
-//
-// @doc:
-// Optimization task
-//
-//---------------------------------------------------------------------------
-void *
-COptServer::PvOptimize
- (
- void *pv
- )
-{
- CSocket *psocket = static_cast<CSocket*>(pv);
-
- CAutoMemoryPool amp
- (
- CAutoMemoryPool::ElcNone,
- CMemoryPoolManager::EatMalloc,
- true /*fThreadSafe*/
- );
-
- IMemoryPool *pmp = amp.Pmp();
- CCommunicator comm(pmp, psocket);
- CCommunicator *pcomm = &comm;
-
- const ULONG ulSegments = gpdb::UlSegmentCountGP();
- // scope for setup objects
- {
- // setup loggers
- CAutoP<CLoggerComm> a_ploggerComm;
- a_ploggerComm = New(pmp) CLoggerComm(&comm);
- a_ploggerComm.Pt()->SetErrorInfoLevel(ILogger::EeilMsg);
- CAutoLogger alError(a_ploggerComm.Pt(), true /*fError*/);
- CAutoLogger alOut(a_ploggerComm.Pt(), false /*fError*/);
-
- // setup MD cache accessor
- CMDProviderComm *pmdp = New(pmp) CMDProviderComm(pmp, &comm);
- CAutoMDAccessor amda(pmp, pmdp, m_sysidDefault);
-
- CMiniDumperDXL mdmp(pmp);
- mdmp.Init();
-
- CErrorHandlerStandard errhdl;
- GPOS_TRY_HDL(&errhdl)
- {
- CSerializableStackTrace serStack;
- serStack.AllocateBuffer(pmp);
- CSerializableMDAccessor serMDA(amda.Pmda());
-
- // install opt context in TLS
- CAutoOptCtxt aoc
- (
- pmp,
- amda.Pmda(),
- NULL /*pceeval*/,
- New(pmp) CCostModelGPDB(pmp, ulSegments)
- );
-
- // build query context from requested query
- CQueryContext *pqc = PqcRecvQuery(pmp, pcomm, amda.Pmda());
-
- // optimize logical expression tree into physical expression tree.
- CEngine eng(pmp);
- eng.Init(pqc, NULL /*pdrgpss*/);
- eng.Optimize();
-
- // extract plan and send it back
- SendPlan(pmp, pcomm, amda.Pmda(), pqc, eng.PexprExtractPlan());
-
- // TODO: add traceflag to create minidump without error during optimization
- }
- GPOS_CATCH_EX(ex)
- {
- FinalizeMinidump(&mdmp);
-
- GPOS_RESET_EX;
- }
- GPOS_CATCH_END;
- }
-
- return NULL;
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::PqcRecvQuery
-//
-// @doc:
-// Receive optimization request and construct query context for it
-//
-//---------------------------------------------------------------------------
-CQueryContext *
-COptServer::PqcRecvQuery
- (
- IMemoryPool *pmp,
- CCommunicator *pcomm,
- CMDAccessor *pmda
- )
-{
- GPOS_ASSERT(NULL != pmp);
- GPOS_ASSERT(NULL != pcomm);
- GPOS_ASSERT(NULL != pmda);
-
- // receive query request
- CCommMessage *pmsg = pcomm->PmsgReceiveMsg();
- GPOS_ASSERT(CCommMessage::EcmtOptRequest == pmsg->Ecmt());
- const CHAR *szQuery = CDXLUtils::SzFromWsz(pmp, pmsg->Wsz());
- delete [] pmsg->Wsz();
- delete pmsg;
-
- CQueryToDXLResult *pqdxlr = CDXLUtils::PdxlnParseDXLQuery(pmp, szQuery, NULL /*szXSDPath*/);
- CSerializableQuery serQuery(pqdxlr->Pdxln(), pqdxlr->PdrgpdxlnOutputCols(), pqdxlr->PdrgpdxlnCTE());
- serQuery.Serialize(pmp);
-
- // translate DXL Tree -> Expr Tree
- CTranslatorDXLToExpr *pdxltr = New(pmp) CTranslatorDXLToExpr(pmp, pmda);
- CExpression *pexprTranslated = pdxltr->PexprTranslateQuery(pqdxlr->Pdxln(), pqdxlr->PdrgpdxlnOutputCols(), pqdxlr->PdrgpdxlnCTE());
- gpdxl::DrgPul *pdrgul = pdxltr->PdrgpulOutputColRefs();
- gpmd::DrgPmdname *pdrgpmdname = pdxltr->Pdrgpmdname();
-
- CQueryContext *pqc = CQueryContext::PqcGenerate(pmp, pexprTranslated, pdrgul, pdrgpmdname, true /*fDeriveStats*/);
-
- if (GPOS_FTRACE(EopttracePrintQuery))
- {
- (void) pqc->Pexpr()->PdpDerive();
-
- CAutoTrace at(pmp);
- at.Os()
- << "\nTranslated expression: \n" << *pexprTranslated
- << "\nPreprocessed expression: \n" << *(pqc->Pexpr());
- }
-
- return pqc;
-}
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::SendPlan
-//
-// @doc:
-// Extract query plan, serialize it and send it to client
-//
-//---------------------------------------------------------------------------
-void
-COptServer::SendPlan
- (
- IMemoryPool *pmp,
- CCommunicator *pcomm,
- CMDAccessor *pmda,
- CQueryContext *pqc,
- CExpression *pexprPlan
- )
-{
- GPOS_ASSERT(NULL != pmp);
- GPOS_ASSERT(NULL != pcomm);
- GPOS_ASSERT(NULL != pmda);
- GPOS_ASSERT(NULL != pqc);
-
- (void) pexprPlan->PrppCompute(pmp, pqc->Prpp());
-
- if (GPOS_FTRACE(EopttracePrintPlan))
- {
- CAutoTrace at(pmp);
- at.Os() << "\nPhysical plan: \n%ls" << *pexprPlan;
- }
-
- // translate plan into DXL
- DrgPi *pdrgpiSegments = New(pmp) DrgPi(pmp);
-
- // TODO: replace function with entry in request message
- const ULONG ulSegments = gpdb::UlSegmentCountGP();
- GPOS_ASSERT(0 < ulSegments);
- for (ULONG ul = 0; ul < ulSegments; ul++)
- {
- pdrgpiSegments->Append(New(pmp) INT(ul));
- }
-
- CTranslatorExprToDXL ptrexprtodxl(pmp, pmda, pdrgpiSegments);
- CDXLNode *pdxlnPlan = ptrexprtodxl.PdxlnTranslate(pexprPlan, pqc->PdrgPcr(), pqc->Pdrgpmdname());
-
- ULLONG ullPlanId = 0;
- ULLONG ullPlanSpaceSize = 0;
- CSerializablePlan serPlan(pdxlnPlan, ullPlanId, ullPlanSpaceSize);
- serPlan.Serialize(pmp);
-
- // serialize DXL to xml
- CWStringDynamic *pstrPlan = CDXLUtils::PstrSerializePlan
- (
- pmp,
- pdxlnPlan,
- ullPlanId,
- ullPlanSpaceSize,
- true /*fSerializeHeaderFooter*/,
- false /*fIndent*/
- );
-
- CCommMessage msg(CCommMessage::EcmtOptResponse, pstrPlan->Wsz(), 0 /*ullUserData*/);
- pcomm->SendMsg(&msg);
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// COptServer::FinalizeMinidump
-//
-// @doc:
-// Dump collected artifacts to file
-//
-//---------------------------------------------------------------------------
-void
-COptServer::FinalizeMinidump
- (
- CMiniDumperDXL *pmdmp
- )
-{
- pmdmp->Finalize();
-
- // dump to a temp file
- //TODO: pass session and command ID from QD
- CHAR szFileName[GPOPT_FILE_NAME_LEN];
- CMinidumperUtils::GenerateMinidumpFileName
- (
- szFileName,
- GPOPT_FILE_NAME_LEN,
- 0 /*gp_session_id*/,
- 0 /*gp_command_count*/
- );
-
- // dump the same to given file
- CMinidumperUtils::Dump(szFileName, pmdmp);
-}
-
-
-// EOF
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/gpopt/utils/Makefile
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/Makefile b/src/backend/gpopt/utils/Makefile
index 60ba8c7..8996063 100644
--- a/src/backend/gpopt/utils/Makefile
+++ b/src/backend/gpopt/utils/Makefile
@@ -22,8 +22,8 @@ endif
override CPPFLAGS := $(CFLAGS_DL) $(CPPFLAGS)
-OBJS = COptTasks.o COptServer.o COptClient.o CCatalogUtils.o CConstExprEvaluatorProxy.o nodeutils.o funcs.o
+OBJS = COptTasks.o CCatalogUtils.o CConstExprEvaluatorProxy.o nodeutils.o funcs.o
include $(top_srcdir)/src/backend/common.mk
-
\ No newline at end of file
+
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/gpopt/utils/funcs.cpp
----------------------------------------------------------------------
diff --git a/src/backend/gpopt/utils/funcs.cpp b/src/backend/gpopt/utils/funcs.cpp
index dffdb58..f47ca7e 100644
--- a/src/backend/gpopt/utils/funcs.cpp
+++ b/src/backend/gpopt/utils/funcs.cpp
@@ -22,8 +22,6 @@
#include "gpopt/utils/nodeutils.h"
#include "gpopt/utils/CCatalogUtils.h"
#include "gpopt/utils/COptTasks.h"
-#include "gpopt/utils/COptClient.h"
-#include "gpopt/utils/COptServer.h"
#include "gpos/_api.h"
#include "gpos/io/CFileReader.h"
@@ -1348,45 +1346,6 @@ PlannedStmt *orca(Query *pquery)
}
-//---------------------------------------------------------------------------
-// @function:
-// optimize_query
-//
-// @doc:
-// Optimize query using the OPT process
-//
-//---------------------------------------------------------------------------
-
-extern "C" {
-int optimize_query(void *pv)
-{
- gpos_exec_params *pparams = (gpos_exec_params *) pv;
- pparams->func = gpoptudfs::COptClient::PvRun;
-
- return gpos_exec(pparams);
-}
-}
-
-
-//---------------------------------------------------------------------------
-// @function:
-// optimizer_loop
-//
-// @doc:
-// API for optimizer loop initialization
-//
-//---------------------------------------------------------------------------
-
-extern "C" {
-int optimizer_loop(void *pv)
-{
- gpos_exec_params *pparams = (gpos_exec_params *) pv;
- pparams->func = gpoptudfs::COptServer::PvRun;
-
- return gpos_exec(pparams);
-}
-}
-
extern "C" {
char *read_file(const char *szFilename)
{
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/optimizer/plan/planner.c
----------------------------------------------------------------------
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index e007a69..b09389a 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -63,7 +63,6 @@
#include "utils/debugbreak.h"
#include "catalog/gp_policy.h"
-#include "postmaster/optserver.h"
#include "postmaster/identity.h"
/* GUC parameter */
@@ -84,18 +83,6 @@ ParamListInfo PlannerBoundParamList = NULL; /* current boundParams */
#define EXPRKIND_APPINFO 6
#define EXPRKIND_WINDOW_BOUND 7
-/*
- * struct containing optimization request parameters;
- * needs to be in sync with the argument expected by COptClient object;
- */
-struct optimizer_params
-{
- // path where socket is initialized
- const char *socketPath;
-
- // input query
- Query *query;
-};
/*
* structure containing psudo optimization result
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/postmaster/Makefile
----------------------------------------------------------------------
diff --git a/src/backend/postmaster/Makefile b/src/backend/postmaster/Makefile
index 83d1aa8..1f37dd2 100644
--- a/src/backend/postmaster/Makefile
+++ b/src/backend/postmaster/Makefile
@@ -15,7 +15,7 @@ override CPPFLAGS := -I$(top_srcdir)/src/backend/gp_libpq_fe $(CPPFLAGS)
override CPPFLAGS := -I$(top_srcdir)/src/backend/resourcemanager/include $(CPPFLAGS)
OBJS = bgwriter.o autovacuum.o service.o checkpoint.o seqserver.o ddaserver.o walsendserver.o walredoserver.o pgarch.o pgstat.o \
postmaster.o primary_mirror_mode.o primary_mirror_transition_client.o syslogger.o \
- fork_process.o perfmon.o perfmon_segmentinfo.o optserver.o identity.o backoff.o \
+ fork_process.o perfmon.o perfmon_segmentinfo.o identity.o backoff.o \
sendalert.o alertseverity.o
include $(top_srcdir)/src/backend/common.mk
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/postmaster/optserver.c
----------------------------------------------------------------------
diff --git a/src/backend/postmaster/optserver.c b/src/backend/postmaster/optserver.c
deleted file mode 100644
index 601b5ef..0000000
--- a/src/backend/postmaster/optserver.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * optserver.c
- * Process handling all query optimization requests.
- *
- * Copyright (c) 2012, EMC Corp.
- *
- *-------------------------------------------------------------------------
- */
-
-#include <dlfcn.h>
-#include <unistd.h>
-#include <wchar.h>
-
-#include "postgres.h"
-#include "miscadmin.h"
-#include "gp-libpq-fe.h"
-#include "cdb/cdbdisp.h"
-#include "libpq/pqsignal.h"
-#include "postmaster/fork_process.h"
-#include "postmaster/optserver.h"
-#include "postmaster/postmaster.h"
-#include "storage/backendid.h"
-#include "storage/ipc.h"
-#include "storage/proc.h"
-#include "tcop/tcopprot.h"
-#include "utils/ps_status.h"
-
-#define GP_EXCEPTION_MSG L"PG exception raised"
-
-/*
- * STATIC VARIABLES
- */
-
-static volatile bool shutdown_requested = false;
-
-
-/*
- * FUNCTION PROTOTYPES
- */
-
-/* run optimizer */
-static void OptimizerMain(void);
-
-/* start optimizer server loop */
-static void OptimizerLaunch(void);
-
-/* record shutdown request */
-static void RequestShutdown(SIGNAL_ARGS);
-
-
-/*
- * Entry point for optimizer process
- */
-int
-optimizer_start()
-{
- pid_t optimizerPID;
-
- switch ((optimizerPID = fork_process()))
- {
- case -1:
- ereport(LOG, (errmsg("could not fork optimizer process: %m")));
- return 0;
-
-#ifndef EXEC_BACKEND
- case 0:
- /* in postmaster child ... */
- ClosePostmasterPorts(false);
-
- OptimizerMain();
- break;
-#endif /* EXEC_BACKEND */
- default:
- return (int) optimizerPID;
- }
-
- return 0;
-}
-
-
-/*
- * run optimizer
- */
-static void
-OptimizerMain()
-{
- sigjmp_buf local_sigjmp_buf;
-
- IsUnderPostmaster = true;
-
- /* Reset MyProcPid */
- MyProcPid = getpid();
-
- /* Save our main thread-id for comparison during signal handling */
- main_tid = pthread_self();
-
- /* Lose the postmaster's on-exit routines */
- on_exit_reset();
-
- /* Identify this process via ps */
- init_ps_display("optimizer process", "", "", "");
-
- SetProcessingMode(InitProcessing);
-
- /* Set up reference point for stack depth checking */
- char stack_base;
- stack_base_ptr = &stack_base;
-
- /*
- * Set up signal handlers. This process behaves much like a regular
- * backend, so it uses the same signal handling. See equivalent code in
- * tcop/postgres.c.
- */
- pqsignal(SIGHUP, SIG_IGN);
- pqsignal(SIGINT, SIG_IGN);
- pqsignal(SIGALRM, SIG_IGN);
- pqsignal(SIGPIPE, SIG_IGN);
- pqsignal(SIGUSR1, SIG_IGN);
-
- pqsignal(SIGTERM, die);
- pqsignal(SIGQUIT, quickdie);
- pqsignal(SIGUSR2, RequestShutdown);
-
- pqsignal(SIGFPE, FloatExceptionHandler);
- pqsignal(SIGCHLD, SIG_DFL);
-
- pqsignal(SIGILL, CdbProgramErrorHandler);
- pqsignal(SIGSEGV, CdbProgramErrorHandler);
- pqsignal(SIGBUS, CdbProgramErrorHandler);
-
- CurrentResourceOwner = ResourceOwnerCreate(NULL, "Optimizer");
-
- /* Early initialization */
- BaseInit();
-
- /* See InitPostgres()... */
- InitProcess();
-
- SetProcessingMode(NormalProcessing);
-
- /*
- * If an exception is encountered, processing resumes here.
- *
- * See notes in postgres.c about the design of this coding.
- */
- if (sigsetjmp(local_sigjmp_buf, 1) != 0)
- {
- /* Prevents interrupts while cleaning up */
- HOLD_INTERRUPTS();
-
- /* Report the error to the server log */
- EmitErrorReport();
-
- /*
- * We can now go away. Note that because we'll call InitProcess, a
- * callback will be registered to do ProcKill, which will clean up
- * necessary state.
- */
- proc_exit(0);
- }
-
- /* We can now handle ereport(ERROR) */
- PG_exception_stack = &local_sigjmp_buf;
-
- PG_SETMASK(&UnBlockSig);
-
- MyBackendId = InvalidBackendId;
-
- /* Unlink optimizer socket */
- (void) unlink(OPT_SOCKET_NAME);
-
- /* Start optimizer loop */
- OptimizerLaunch();
-
- proc_exit(0);
-}
-
-
-/*
- * Start optimizer server loop
- */
-static void
-OptimizerLaunch()
-{
- char error_buffer[OPT_ERROR_BUFFER_SIZE];
-
- (void) libopt_exec("optimizer_loop", OPT_SOCKET_NAME, error_buffer, sizeof(error_buffer),
- &shutdown_requested);
-}
-
-/*
- * dynamically load optimizer library;
- * invoke requested function and return result;
- */
-void *
-libopt_exec(const char *funcName, void *args, void *error_buffer, int error_buffer_size,
- volatile bool *abort)
-{
- void *libOptHandle = dlopen(OPT_LIB, RTLD_LAZY);
- if (libOptHandle == NULL)
- {
- elog(LOG, "Unable to load optimizer library");
- return NULL;
- }
-
- /* gpos task signature */
- typedef int (*optTask)(void *);
-
- /* dynamically load function */
- optTask funcPtr = (optTask) dlsym(libOptHandle, funcName);
-
- char *error = NULL;
- if ((error = dlerror()) != NULL)
- {
- elog(LOG, "Unable to load function %s from library %s", funcName, error);
- return NULL;
- }
-
- struct gpos_exec_params params;
- params.func = NULL; /* set by the called function to avoid including GPOS headers here */
- params.arg = args;
- params.error_buffer = error_buffer;
- params.error_buffer_size = error_buffer_size;
- params.result = NULL;
- params.stack_start = stack_base_ptr;
- params.abort_requested = abort;
-
- /* execute function */
- int result = (*funcPtr)(¶ms);
-
- (void) dlclose(libOptHandle);
-
- if (result != 0)
- {
- if (wcsstr(error_buffer, GP_EXCEPTION_MSG) != NULL)
- {
- PG_RE_THROW();
- }
- elog(ERROR, "%ls", (const wchar_t *) params.error_buffer);
- }
-
- return params.result;
-}
-
-
-/*
- * record shutdown request
- */
-static void
-RequestShutdown(SIGNAL_ARGS)
-{
- shutdown_requested = true;
-}
-
-
-/* EOF */
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/backend/postmaster/postmaster.c
----------------------------------------------------------------------
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 03a5ec5..ff954b8 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -134,7 +134,6 @@
#include "postmaster/ddaserver.h"
#include "postmaster/syslogger.h"
#include "postmaster/perfmon_segmentinfo.h"
-#include "postmaster/optserver.h"
#include "storage/fd.h"
#include "storage/ipc.h"
#include "storage/pg_shmem.h"
@@ -196,7 +195,6 @@ typedef struct bkend
static Dllist *BackendList;
/* #define DO_DDA_SERV 1 */
-/* #define GP_OPT_PROCESS 1 */
/* CDB */
typedef enum pmsub_type
{
@@ -210,9 +208,6 @@ typedef enum pmsub_type
PerfmonSegmentInfoProc,
MetadataCacheProc,
ResouceManagerProc,
-#ifdef GP_OPT_PROCESS
- OptProc,
-#endif
MaxPMSubType
} PMSubType;
@@ -489,11 +484,6 @@ static PMSubProc PMSubProcList[MaxPMSubType] =
{0, ResouceManagerProc,
(PMSubStartCallback*)&ResManagerProcessStartup,
"resourcemanager process", PMSUBPROC_FLAG_QD_AND_QE, true},
-#ifdef GP_OPT_PROCESS
- {0, OptProc,
- (PMSubStartCallback*)&optimizer_start,
- "optimizer process", PMSUBPROC_FLAG_QD, true},
-#endif // !GP_OPT_PROCESS
#ifdef DO_DDA_SERV
{0, DdaServerProc,
(PMSubStartCallback*)&ddaserver_start,
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/ad8ed914/src/include/postmaster/optserver.h
----------------------------------------------------------------------
diff --git a/src/include/postmaster/optserver.h b/src/include/postmaster/optserver.h
deleted file mode 100644
index d2d44f9..0000000
--- a/src/include/postmaster/optserver.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * optserver.h
- * Interface for Optimizer process management.
- *
- *
- * Copyright (c) 2012, EMC Corp.
- *
- *
- *-------------------------------------------------------------------------
- */
-#ifndef OPTSERVER_H
-#define OPTSERVER_H
-
-#include "postgres.h"
-
-#ifdef __darwin__
-#define OPT_LIB "libgpoptudf.dylib"
-#else
-#define OPT_LIB "libgpoptudf.so"
-#endif
-
-#define OPT_SOCKET_NAME "gp_opt_socket"
-#define OPT_ERROR_BUFFER_SIZE (4096)
-
-/* struct with configuration parameters for GPOS task execution */
-struct gpos_exec_params
-{
- void *(*func)(void*); /* task function */
- void *arg; /* task argument */
- void *result; /* task result */
- void *stack_start; /* start of current thread's stack */
- char *error_buffer; /* buffer used to store error messages */
- int error_buffer_size; /* size of error message buffer */
- volatile bool *abort_requested; /* flag indicating if abort is requested */
-};
-
-
-/* start optimizer */
-extern int optimizer_start(void);
-
-/* invoke optimizer function */
-extern void *libopt_exec(const char *funcName, void *args, void *error_buffer,
- int error_buffer_size, volatile bool *abort);
-
-
-
-#endif /* OPTSERVER_H */