COptServer.h 3.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//---------------------------------------------------------------------------
//	Greenplum Database
//	Copyright (C) 2012 EMC Corp.
//
//	@filename:
//		COptServer.h
//
//	@doc:
//		API for optimizer server
//
//	@test:
//
//
//---------------------------------------------------------------------------
#ifndef COptServer_H
#define COptServer_H

18
#include "naucrates/md/CSystemId.h"
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

#include "gpos/base.h"
#include "gpos/common/CSyncHashtable.h"
#include "gpos/common/CSyncHashtableAccessByKey.h"
#include "gpos/common/CSyncHashtableAccessByIter.h"
#include "gpos/common/CSyncHashtableIter.h"
#include "gpos/net/CSocket.h"
#include "gpos/task/CTask.h"

// forward declarations
namespace gpopt
{
	class CExpression;
	class CMDAccessor;
	class CMiniDumperDXL;
	class CQueryContext;
}

namespace gpnaucrates
{
	class CCommunicator;
}


namespace gpoptudfs
{
	using namespace gpos;
	using namespace gpopt;
	using namespace gpnaucrates;

	//---------------------------------------------------------------------------
	//	@class:
	//		COptServer
	//
	//	@doc:
	//		Optimizer server; processes optimization requests from QDs;
	//
	//---------------------------------------------------------------------------
	class COptServer
	{
		private:

			// connection descriptor
			struct SConnectionDescriptor
			{
				// ID
65
				ULONG_PTR m_id;
66 67

				// task
68
				CTask *m_task;
69 70

				// socket
71
				CSocket *m_socket;
72 73 74 75 76 77

				// link for hashtable
				SLink m_link;

				// invalid connection id
				static
78
				ULONG_PTR m_invalid_id;
79 80 81 82

				// ctor
				SConnectionDescriptor
					(
83 84
					CTask *task,
					CSocket *socket
85 86
					)
					:
87 88 89
					m_id((ULONG_PTR) task),
					m_task(task),
					m_socket(socket)
90 91 92 93
				{}

			};

94
			typedef CSyncHashtable<SConnectionDescriptor, ULONG_PTR>
95 96 97
				ConnectionHT;

			// path where socket is initialized
98
			const CHAR *m_socket_path;
99 100

			// memory pool for connections
101
			CMemoryPool *m_mp;
102 103

			// hashtable of connections
104
			ConnectionHT *m_connections_ht;
105 106 107

			// default id for the source system
			static
108
			const CSystemId m_default_id;
109 110 111

			// ctor
			explicit
112
			COptServer(const CHAR *path);
113 114 115 116 117 118 119 120 121 122 123

			// dtor
			~COptServer();

			// start serving requests
			void Loop();

			// initialize hashtable
			void InitHT();

			// register connection for status checking
124
			void TrackConnection(CTask *task, CSocket *socket);
125 126

			// release connection
127
			void ReleaseConnection(CTask *task);
128 129 130

			// connection check task
			static
131
			void * CheckConnections(void *ptr);
132 133 134

			// optimization task
			static
135
			void *Optimize(void *ptr);
136 137 138

			// receive optimization request and construct query context for it
			static
139
			CQueryContext *RecvQuery(CMemoryPool *mp, CCommunicator *communicator, CMDAccessor *md_accessor);
140 141 142 143 144

			// extract query plan, serialize it and send it to client
			static
			void SendPlan
				(
145
				CMemoryPool *mp,
146 147 148 149
				CCommunicator *communicator,
				CMDAccessor *md_accessor,
				CQueryContext *query_ctxt,
				CExpression *plan_expr
150 151 152 153
				);

			// dump collected artifacts to file
			static
154
			void FinalizeMinidump(CMiniDumperDXL *dump);
155 156 157 158 159

		public:

			// invoke optimizer instance
			static
160
			void *Run(void *ptr);
161 162 163 164 165 166 167 168

	}; // class COptServer
}

#endif // !COptServer_H


// EOF