blob: 4275c7b9b186b9117b4dea9cdf39d733e0680f20 [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
#ifndef GLOBALS_H
#define GLOBALS_H
/* -*-C++-*-
*****************************************************************************
*
* File: Globals.h
* Description: CLI globals. For each process that uses the CLI there
* should be exactly one object of type CliGlobals.
*
* Created: 7/10/95
* Language: C++
*
*
*
*
*****************************************************************************
*/
/* this file is also sourced in from a C program, cli/fixup.c */
#include "NAAssert.h"
/* -----------------------------------------------------------------------
* Some parameters for the first privileged NSK flat segment used by CLI
* and executor (NOTE: this part can be sourced in from a C program)
* -----------------------------------------------------------------------
*/
#define NA_CLI_FIRST_PRIV_SEG_ID NAASSERT_FIRST_PRIV_SEG_ID
#define NA_CLI_FIRST_PRIV_SEG_SIZE 4*1024*1024
#define NA_CLI_FIRST_PRIV_SEG_MAX_SIZE 64*1024*1024
/* The removal of spoofing has made these two #defines history
#define NA_CLI_GLOBALS_OFFSET_IN_PRIV_SEG NAASSERT_GLOBALS_OFFSET_IN_PRIV_SEG
#define NA_CLI_FIRST_PRIV_SEG_START_ADDR 0x42000000
*/
#define BYTEALIGN 16 // 16-byte align entire first flat seg on all platforms
#define NA_CLI_GLOBALS_SIZE \
(((sizeof(CliGlobals)+BYTEALIGN-1)/BYTEALIGN)*BYTEALIGN)
#ifdef __cplusplus
// -----------------------------------------------------------------------
#include <setjmp.h>
#include "NAMemory.h"
#include "sqlcli.h"
#include "Ipc.h"
#include "ComQueue.h"
#include "logmxevent.h"
#include "ComExeTrace.h"
#include "ComRtUtils.h"
#include "ComSmallDefs.h"
#include "JavaObjectInterface.h"
class ContextCli;
class Statement;
class ComDiagsArea;
class ExEspManager;
class ExSsmpManager;
class ExSqlComp;
class IpcEnvironment;
class MemoryMonitor;
class HashQueue;
class ExUdrServerManager;
class ExControlArea;
class StatsGlobals;
class ex_tcb; // for keeping the root (split bottom, in ESP) tcb
class ExProcessStats;
class CliGlobals;
class CLISemaphore;
class HBaseClient_JNI;
class HiveClient_JNI;
class HdfsClient;
class TransMode;
class ContextTidMap;
class LmLanguageManager;
class LmLanguageManagerC;
class LmLanguageManagerJava;
extern CliGlobals *cli_globals;
static __thread ContextTidMap *tsCurrentContextMap = NULL;
static pthread_key_t thread_key;
// A cleanup function when thread exits
void SQ_CleanupThread(void *arg);
enum ArkcmpFailMode { arkcmpIS_OK_ = FALSE/*no failure*/,
arkcmpWARN_,
arkcmpERROR_ };
class CliGlobals : public NAAssertGlobals
{
public:
Lng32 getNextUniqueContextHandle();
ExControlArea * getSharedControl() { return sharedCtrl_; }
CollHeap * exCollHeap() { return &executorMemory_; }
// old interface, changed to the get/set methods below
ArkcmpFailMode & arkcmpInitFailed()
{ return arkcmpInitFailed_; }
ArkcmpFailMode getArkcmpInitFailMode()
{ return arkcmpInitFailed_; }
void setArkcmpInitFailMode(ArkcmpFailMode arkcmpFailMode)
{
arkcmpInitFailed_ = arkcmpFailMode;
}
void deleteAndCreateNewArkcmp();
void init( NABoolean espProcess,
StatsGlobals *statsGlobals);
CliGlobals(NABoolean espProcess);
~CliGlobals();
void initiateDefaultContext();
ContextCli * currContext();
ContextCli * getDefaultContext() { return defaultContext_; }
inline ExProcessStats *getExProcessStats() { return processStats_; }
void setExProcessStats(ExProcessStats *processStats)
{ processStats_ = processStats; }
ExSqlComp * getArkcmp(short index = 0);
IpcEnvironment *getEnvironment();
char ** getEnvVars() { return envvars_; } ;
char * getEnv(const char * envvar);
Lng32 setEnvVars(char ** envvars);
Lng32 setEnvVar(const char * name, const char * value,
NABoolean reset = FALSE);
Lng32 sendEnvironToMxcmp();
ExEspManager * getEspManager();
ExUdrServerManager *getUdrServerManager();
inline MemoryMonitor * getMemoryMonitor() { return memMonitor_; }
inline void setMemoryMonitor(MemoryMonitor *memMon) { memMonitor_ = memMon; }
inline NAHeap * getExecutorMemory() { return &executorMemory_; }
inline void setNodeName(const char *nodeName)
{ strncpy(nodeName_, nodeName, sizeof(nodeName_)); }
inline char *getNodeName() { return nodeName_; }
inline Lng32 incrNumOfCliCalls() { return ++numCliCalls_; }
inline Lng32 decrNumOfCliCalls()
{
if (numCliCalls_ > 0)
return --numCliCalls_;
else
return numCliCalls_;
}
inline Int64 incrTotalOfCliCalls()
{
return ++totalCliCalls_;
}
inline UInt32 * getEventConsumed() { return &eventConsumed_; }
inline NABoolean processIsStopping() { return processIsStopping_; }
// create the CLI globals (caller may determine their address)
static CliGlobals * createCliGlobals(NABoolean espProcess = FALSE);
static void * getSegmentStartAddrOnNSK();
// perform a bounds check for a parameter passed into the CLI, note that
// our bounds check does not prevent access violations if the address
// points into unallocated memory that doesn't violate the bounds
// (note that the method always returns a SQLCODE value, AND that it
// side-effects retcode in case of an error)
Lng32 boundsCheck(void *startAddress,
ULng32 length,
Lng32 &retcode);
inline NABoolean breakEnabled() { return breakEnabled_; }
inline void setBreakEnabled(NABoolean enabled)
{ breakEnabled_ = enabled;
getEnvironment()->setBreakEnabled(enabled);
}
inline NABoolean SPBreakReceived() { return SPBreakReceived_; }
inline void setSPBreakReceived(NABoolean val)
{ SPBreakReceived_ = val; }
inline NABoolean isESPProcess() { return isESPProcess_; }
inline void setIsESPProcess(NABoolean val)
{ isESPProcess_ = val; }
Lng32 createContext(ContextCli* &newContext);
Lng32 dropContext(ContextCli* context);
ContextCli * getContext(SQLCTX_HANDLE context_handle,
NABoolean calledFromDrop = FALSE);
ContextTidMap * getThreadContext(pid_t tid);
Lng32 switchContext(ContextCli*newContext);
//
// Context management functions added to implement user-defined routines
//
// Lng32 deleteContext(SQLCTX_HANDLE contextHandle);
Lng32 resetContext(ContextCli *context, void *contextMsg);
inline HashQueue * getContextList() { return contextList_; }
NAHeap * getIpcHeap();
NAHeap * getProcessIpcHeap() { return ipcHeap_; }
StatsGlobals *getStatsGlobals() { return statsGlobals_; }
void setStatsGlobals(StatsGlobals *statsGlobals) { statsGlobals_ = statsGlobals; }
NAHeap *getStatsHeap() { return statsHeap_; }
void setStatsHeap(NAHeap *statsHeap) { statsHeap_ = statsHeap; }
// EMS event generation functions
inline void setEMSBeginnerExperienceLevel()
{emsEventExperienceLevel_ = SQLMXLoggingArea::eBeginnerEL;}
inline SQLMXLoggingArea::ExperienceLevel getEMSEventExperienceLevel()
{return emsEventExperienceLevel_;}
inline void setUncProcess() { isUncProcess_ = TRUE; }
inline NABoolean isUncProcess() {return isUncProcess_;}
NAHeap *getCurrContextHeap();
void setJniErrorStr(NAString errorStr) { setSqlJniErrorStr(errorStr); }
void setJniErrorStr(const char *errorStr) { setSqlJniErrorStr(errorStr); }
const char* getJniErrorStr() { return getSqlJniErrorStr(); }
void updateTransMode(TransMode *transMode);
inline
short getGlobalSbbCount()
{ return globalSbbCount_; }
inline
void incGlobalSbbCount()
{ globalSbbCount_++; }
inline
void resetGlobalSbbCount()
{ globalSbbCount_ = 0; }
//
// Accessor and mutator functions for UDR error checking. Notes on
// UDR error checking appear below with the data member
// declarations.
//
NABoolean getUdrErrorChecksEnabled();
Lng32 getUdrSQLAccessMode();
NABoolean getUdrAccessModeViolation();
NABoolean getUdrXactViolation();
NABoolean getUdrXactAborted();
void setUdrErrorChecksEnabled(NABoolean b);
void setUdrSQLAccessMode(Lng32 mode);
void setUdrAccessModeViolation(NABoolean b);
void setUdrXactViolation(NABoolean b);
void setUdrXactAborted(Int64 currTransId, NABoolean b);
//
// A few useful wrapper functions to ease management of the UDR
// error checking fields
//
void clearUdrErrorFlags();
NABoolean sqlAccessAllowed();
void getUdrErrorFlags(NABoolean &sqlViolation,
NABoolean &xactViolation,
NABoolean &xactAborted);
char * programDir() { return programDir_;};
// 0, oss process. 1, guardian process.
short processType() { return processType_;};
NABoolean ossProcess() { return (processType_ == 0); };
inline NABoolean logReclaimEventDone() { return logReclaimEventDone_; };
inline void setLogReclaimEventDone(NABoolean x) { logReclaimEventDone_ = x; };
char * myNodeName() { return myNodeName_; }
Int32 myCpu() { return myCpu_; };
Int32 myPin() { return myPin_; };
SB_Verif_Type myVerifier() const {return myVerifier_;}
Lng32 myNodeNumber() { return myNodeNumber_; };
Int64 myStartTime() { return myStartTime_; };
// number of CPUs (Linux nodes) in the cluster
Lng32 myNumCpus() { return myNumCpus_; };
// an array of myNumCpus_ node ids, the index into
// this array is a "logical" CPU id (0 ... myNumCpus_-1)
// and the content of the array is a physical id,
// a node id (nid) of a node that actually exists
// (but still may be down)
const Int32 *myCPUArray() { return cpuArray_; }
// return the physical node id for a logical id,
// the physical id is always >= the logical id
Int32 mapLogicalToPhysicalCPUNum(Int32 ix)
{ return cpuArray_[ix % myNumCpus_]; }
// are logical/physical node ids the same?
NABoolean nodeIdsAreContiguous()
{ return cpuArray_[myNumCpus_-1] == myNumCpus_ - 1; }
IpcPriority myPriority() { return myPriority_; }
void setMyPriority(IpcPriority p) { myPriority_= p; }
NABoolean priorityChanged() { return priorityChanged_;}
void setPriorityChanged(NABoolean v) { priorityChanged_ = v; }
IpcPriority myCurrentPriority();
Int64 getNextUniqueNumber()
{ return ++lastUniqueNumber_; }
void genSessionUniqueNumber()
{ sessionUniqueNumber_++; }
Int64 getSessionUniqueNumber()
{ return sessionUniqueNumber_; }
// returns the current ENVVAR context.
Int64 getCurrentEnvvarsContext() { return envvarsContext_;};
void incrCurrentEnvvarsContext() { envvarsContext_++;};
Long &getSemId() { return semId_; };
void setSemId(Long semId) { semId_ = semId; }
void setSavedVersionOfCompiler(short version) { savedCompilerVersion_ = version;}
short getSavedVersionOfCompiler() { return savedCompilerVersion_;}
void setSavedSqlTerminateAction(short val) { savedSqlTerminateAction_ = val; }
short getSavedSqlTerminateAction() { return savedSqlTerminateAction_; }
void setSavedPriority(short val) { savedPriority_ = val; }
short getSavedPriority() { return savedPriority_; }
ExSsmpManager *getSsmpManager();
NABoolean getIsBeingInitialized() { return inConstructor_; }
// For debugging (dumps) only -- keep current fragment root tcb
void setRootTcb( ex_tcb * root ) { currRootTcb_ = root; }
ex_tcb * getRootTcb() { return currRootTcb_; }
char *myProcessNameString() { return myProcessNameString_; }
char *myParentProcessNameString() { return parentProcessNameString_;}
Int32 getSharedMemId() { return shmId_; }
void setSharedMemId(Int32 shmId) { shmId_ = shmId; }
void initMyProgName();
char * myProgName() { return myProgName_; }
ExeTraceInfo * getExeTraceInfo();
CLISemaphore *getSemaphore() { return cliSemaphore_; }
// for trusted UDR invocations from executor and compiler
LmLanguageManager * getLanguageManager(ComRoutineLanguage language);
LmLanguageManagerC * getLanguageManagerC();
LmLanguageManagerJava * getLanguageManagerJava();
#ifdef _DEBUG
void deleteContexts();
#endif // _DEBUG
NABoolean grabMemoryQuotaIfAvailable(ULng32 size);
void resetMemoryQuota();
ULng32 unusedMemoryQuota();
void yieldMemoryQuota(ULng32 size);
NABoolean isEspProcess() { return espProcess_; }
private:
enum {
DEFAULT_CONTEXT_HANDLE = 2000
};
ex_tcb * currRootTcb_ ; // for keeping the root (split bottom, in ESP) tcb
// pointer to the server used to communicate with ARKCMP.
ExSqlComp * sharedArkcmp_;
ArkcmpFailMode arkcmpInitFailed_;
ExControlArea *sharedCtrl_;
// The globals are placed at a fixed address in the first priv
// segment allocated by the executor. To find out whether they
// have been initialized, check this data member which will
// be set to TRUE by the constructor (it is 0 when the memory
// is unchanged since allocation of the segment)
HashQueue * contextList_;
// this is the the default context for executor.
// Created on the first call to CLI when CliGlobals
// is allocated.
ContextCli * defaultContext_;
// executor memory that maintains all heap memory for this executor
NAHeap executorMemory_;
// heap used by the IPC procedures
NAHeap * ipcHeap_;
// memory monitor for this process
MemoryMonitor *memMonitor_;
// copy of the oss envvars
char ** envvars_;
Int64 envvarsContext_;
// to return a unique SQLCTX_HANDLE on a new ContextCli
SQLCTX_HANDLE nextUniqueContextHandle;
// indicator for Sql_Qfo_IOComp() that a WAIT operation completed on LDONE
// also contains indicator that IpcSetOfConnections::wait consumed LSIG
UInt32 eventConsumed_;
NABoolean processIsStopping_;
/*
//
// Fields to enforce SQL semantics inside the UDR server. These
// fields are checked by the UDR server after a user-defined routine
// returns control, to see if that routine violated any SQL
// semantics for UDRs. Some examples of violations include a NO SQL
// routine attempting to access SQL, and a routine attempting to
// issue SQL transaction statements such as BEGIN WORK.
//
// If the udrErrorChecksEnabled_ flag is FALSE then none of this UDR
// error checking is performed. The only SQL application that
// enables the UDR error checking is the UDR server.
//
//
NABoolean udrErrorChecksEnabled_;
Lng32 udrSqlAccessMode_;
NABoolean udrAccessModeViolation_;
NABoolean udrXactViolation_;
NABoolean udrXactAborted_;
Int64 udrXactId_; // transid that UDR Server is interested to know
// if aborted
*/
Int64 totalCliCalls_;
short globalSbbCount_;
short savedSqlTerminateAction_;
NABoolean breakEnabled_;
NABoolean SPBreakReceived_;
NABoolean isESPProcess_;
// location of the application program which is calling SQL.
// Fully qualified oss pathname for OSS processes.
char * programDir_;
short processType_; // 0, oss process. 1, guardian process.
NABoolean logReclaimEventDone_;
short savedCompilerVersion_; // saved version from previous CLI call
// node, cpu and pin this process is running at.
char myNodeName_[8];
Int32 myCpu_;
SB_Verif_Type myVerifier_;
pid_t myPin_;
Lng32 myNodeNumber_;
// number of configured cpus (Linux nodes) on this system
// and an array with their node ids (nids)
Lng32 myNumCpus_;
Int32 *cpuArray_;
IpcPriority myPriority_;
NABoolean priorityChanged_;
// timestamp when cli globals were initialized. Start of master executor.
Int64 myStartTime_;
// remember the last unique number.
// Starts at 0 and increments when needed.
Int64 lastUniqueNumber_;
// remember the last session unique number.
// Starts at 0 and increments when needed.
Int64 sessionUniqueNumber_;
// EMS event descriptor
SQLMXLoggingArea::ExperienceLevel emsEventExperienceLevel_;
char nodeName_[9];
StatsGlobals *statsGlobals_;
// heap used for the Stats collection
NAHeap *statsHeap_;
Long semId_;
NABoolean inConstructor_; //IsExecutor should return TRUE while cliGlobals is being
// constructed. CliGlobals is constructed outside of CLI
// calls and no. of cliCalls is not yet incremented
short savedPriority_;
Int32 shmId_;
NABoolean isUncProcess_;
char myProcessNameString_[PROCESSNAME_STRING_LEN]; // PROCESSNAME_STRING_LEN in ComRtUtils.h =40 in ms.h the equiv seabed limit is 32
char parentProcessNameString_[PROCESSNAME_STRING_LEN];
// For executor trace.
char myProgName_[PROGRAM_NAME_LEN]; // 64, see define in ComRtUtils.h
HashQueue *tidList_;
CLISemaphore *cliSemaphore_;
ExProcessStats *processStats_;
// for trusted UDR invocations from executor and compiler
LmLanguageManagerC *langManC_;
LmLanguageManagerJava *langManJava_;
NABoolean espProcess_;
};
// -----------------------------------------------------------------------
// A global method to get a pointer to the CLI globals. The method
// will create the globals if they don't exist already (it will
// not create the executor segment, though).
//
// Note that this method is semi-expensive and shouldn't be called
// a lot of times. It is better to cache the pointer to the globals.
// -----------------------------------------------------------------------
CliGlobals * GetCliGlobals();
#endif /* __cplusplus */
#endif