1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-20 09:07:44 +03:00
Roman Nozdrin 4fe9cd64a3
Revert "No boost condition (#2822)" (#2828)
This reverts commit f916e64927cd81569327014f20c4cc0b8aca40ff.
2023-04-22 15:49:50 +03:00

412 lines
10 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
/*******************************************************************************
* $Id$
*
*******************************************************************************/
/*
* we_spltrdatahandler.h
*
* Created on: Oct 17, 2011
* Author: bpaul
*/
#pragma once
#include "liboamcpp.h"
#include "resourcemanager.h"
#include "threadsafequeue.h"
#include "dbrm.h"
#include "batchloader.h"
#include "we_log.h"
#include "we_type.h"
#include "we_filereadthread.h"
#include "we_splclient.h"
namespace WriteEngine
{
class WESplitterApp; // forward declaration
class WESplClient;
class WEFileReadThread;
//------------------------------------------------------------------------------
// a stl list to keep Next PM to send data
//------------------------------------------------------------------------------
class WEPmList
{
public:
WEPmList() : fPmList(), fListMutex()
{
}
virtual ~WEPmList()
{
fPmList.clear();
}
void addPm2List(int PmId);
void addPriorityPm2List(int PmId);
int getNextPm();
void clearPmList();
bool check4Pm(int PmId);
private:
typedef std::list<int> WePmList; // List to add in front
WePmList fPmList;
boost::mutex fListMutex; // mutex controls add/remove
};
//------------------------------------------------------------------------------
class WESDHandler
{
public:
WESDHandler(WESplitterApp& Ref);
WESDHandler(const WESDHandler& rhs);
virtual ~WESDHandler();
void setup();
void shutdown();
void reset();
void send2Pm(messageqcpp::SBS& Sbs, unsigned int PmId = 0);
void send2Pm(messageqcpp::ByteStream& Bs, unsigned int PmId = 0);
void sendEODMsg();
void checkForRespMsgs();
void add2RespQueue(const messageqcpp::SBS& Sbs);
void exportJobFile(std::string& JobId, std::string& JobFileName);
int leastDataSendPm();
bool check4AllBrmReports();
bool updateCPAndHWMInBRM();
void cancelOutstandingCpimports();
void doRollback();
void doCleanup(bool deleteHdfsTempDbFiles);
void getErrorLog(int PmId, const std::string& ErrFileName);
void getBadLog(int PmId, const std::string& BadFileName);
int check4RollbackRslts();
bool check4AllRollbackStatus();
int check4CleanupRslts();
bool check4AllCleanupStatus();
bool check4AllCpiStarts();
bool releaseTableLocks();
void check4CpiInvokeMode();
bool check4PmArguments();
void setInputFileList(std::string InFileName);
bool check4CriticalErrMsgs(std::string& Entry);
void onStartCpiResponse(int PmId);
void onDataRqstResponse(int PmId);
void onAckResponse(int PmId);
void onNakResponse(int PmId);
void onEodResponse(int Pmid);
void onPmErrorResponse(int PmId);
void onKeepAliveMessage(int PmId);
void onCpimportPass(int PmId);
void onCpimportFail(int PmId, bool SigHandle = false);
void onImpFileError(int PmId);
void onBrmReport(int PmId, messageqcpp::SBS& Sbs);
void onErrorFile(int PmId, messageqcpp::SBS& Sbs);
void onBadFile(int PmId, messageqcpp::SBS& Sbs);
void onRollbackResult(int PmId, messageqcpp::SBS& Sbs);
void onCleanupResult(int PmId, messageqcpp::SBS& Sbs);
void onDBRootCount(int PmId, messageqcpp::SBS& Sbs);
void onHandlingSignal();
void onHandlingSigHup();
void onDisconnectFailure();
int getNextPm2Feed();
int getNextDbrPm2Send();
int getTableOID(std::string Schema, std::string Table);
std::string getTime2Str() const;
bool checkAllCpiPassStatus();
bool checkAllCpiFailStatus();
bool checkForRollbackAndCleanup();
bool checkForCpiFailStatus();
void checkForConnections();
void sendHeartbeats();
std::string getTableName() const;
std::string getSchemaName() const;
char getEnclChar();
char getEscChar();
char getDelimChar();
bool getConsoleLog();
int getReadBufSize();
ImportDataMode getImportDataMode() const;
void sysLog(const logging::Message::Args& msgArgs, logging::LOG_TYPE logType,
logging::Message::MessageID msgId);
boost::thread* getFpRespThread() const
{
return fpRespThread;
}
unsigned int getQId() const
{
return fQId;
}
void setFpRespThread(boost::thread* pRespThread)
{
fpRespThread = pRespThread;
}
void setQId(unsigned int QId)
{
fQId = QId;
}
bool isContinue() const
{
return fContinue;
}
void setContinue(bool Continue)
{
fContinue = Continue;
}
int getPmCount() const
{
return fPmCount;
}
void setPmCount(int PmCount)
{
fPmCount = PmCount;
}
int getNextPm2Send()
{
return fDataFeedList.getNextPm();
}
bool check4Ack(unsigned int PmId)
{
return fDataFeedList.check4Pm(PmId);
}
int getTableOID()
{
return fTableOId;
}
void setDebugLvl(int DebugLvl)
{
fDebugLvl = DebugLvl;
}
int getDebugLvl()
{
return fDebugLvl;
}
unsigned int getTableRecLen() const
{
return fFixedBinaryRecLen;
}
void updateRowTx(unsigned int RowCnt, int CIdx)
{
fWeSplClients[CIdx]->updateRowTx(RowCnt);
}
void resetRowTx()
{
for (int aCnt = 1; aCnt <= fPmCount; aCnt++)
{
if (fWeSplClients[aCnt] != 0)
{
fWeSplClients[aCnt]->resetRowTx();
}
}
}
void setRowsUploadInfo(int PmId, int64_t RowsRead, int64_t RowsInserted)
{
fWeSplClients[PmId]->setRowsUploadInfo(RowsRead, RowsInserted);
}
void add2ColOutOfRangeInfo(int PmId, int ColNum, execplan::CalpontSystemCatalog::ColDataType ColType,
std::string& ColName, int NoOfOors)
{
fWeSplClients[PmId]->add2ColOutOfRangeInfo(ColNum, ColType, ColName, NoOfOors);
}
void setErrorFileName(int PmId, const std::string& ErrFileName)
{
fWeSplClients[PmId]->setErrInfoFile(ErrFileName);
}
void setBadFileName(int PmId, const std::string& BadFileName)
{
fWeSplClients[PmId]->setBadDataFile(BadFileName);
}
void setDisconnectFailure(bool Flag);
bool getDisconnectFailure()
{
return fDisconnectFailure;
}
public: // for multi-table support
WESplitterApp& fRef;
Log fLog; // logger
private:
unsigned int fQId;
joblist::ResourceManager* fRm;
oam::Oam fOam;
oam::ModuleTypeConfig fModuleTypeConfig;
int fDebugLvl;
int fPmCount;
int64_t fTableLock;
int32_t fTableOId;
uint32_t fFixedBinaryRecLen;
boost::mutex fRespMutex;
boost::condition fRespCond;
boost::mutex fSendMutex;
// It could be a queue too. Stores all the responses from PMs
typedef std::list<messageqcpp::SBS> WESRespList;
WESRespList fRespList;
// Other member variables
boost::thread* fpRespThread;
WEPmList fDataFeedList;
WEFileReadThread fFileReadThread;
bool fDisconnectFailure; // Failure due to disconnect from PM
bool fForcedFailure;
bool fAllCpiStarted;
bool fFirstDataSent;
unsigned int fFirstPmToSend;
bool fSelectOtherPm; // Don't send first data to First PM
bool fContinue;
// set of PM specific vector entries
typedef std::vector<WESplClient*> WESplClients;
WESplClients fWeSplClients;
enum
{
MAX_PMS = 512,
MAX_QSIZE = 10,
MAX_WES_QSIZE = 100
};
typedef std::vector<std::string> StrVec;
StrVec fBrmRptVec;
BRM::DBRM fDbrm;
batchloader::BatchLoader* fpBatchLoader;
unsigned int calcTableRecLen(const std::string& schema, const std::string table);
class WEImportRslt
{
public:
WEImportRslt() : fRowsPro(0), fRowsIns(0), fStartTime(), fEndTime(), fTotTime(0)
{
}
~WEImportRslt()
{
}
public:
void reset()
{
fRowsPro = 0;
fRowsIns = 0;
fTotTime = 0;
fColOorVec.clear();
}
void updateRowsProcessed(int64_t Rows)
{
fRowsPro += Rows;
}
void updateRowsInserted(int64_t Rows)
{
fRowsIns += Rows;
}
void updateColOutOfRangeInfo(int aColNum, execplan::CalpontSystemCatalog::ColDataType aColType,
std::string aColName, int aNoOfOors)
{
WEColOorVec::iterator aIt = fColOorVec.begin();
while (aIt != fColOorVec.end())
{
if ((*aIt).fColNum == aColNum)
{
(*aIt).fNoOfOORs += aNoOfOors;
break;
}
aIt++;
}
if (aIt == fColOorVec.end())
{
// First time for aColNum to have out of range count
WEColOORInfo aColOorInfo;
aColOorInfo.fColNum = aColNum;
aColOorInfo.fColType = aColType;
aColOorInfo.fColName = aColName;
aColOorInfo.fNoOfOORs = aNoOfOors;
fColOorVec.push_back(aColOorInfo);
}
#if 0
try
{
fColOorVec.at(aColNum).fNoOfOORs += aNoOfOors;
}
catch (out_of_range& e)
{
// First time for aColNum to have out of range count
WEColOORInfo aColOorInfo;
aColOorInfo.fColNum = aColNum;
aColOorInfo.fColName = aColName;
aColOorInfo.fNoOfOORs = aNoOfOors;
fColOorVec[aColNum] = aColOorInfo;
}
#endif
}
void startTimer()
{
gettimeofday(&fStartTime, 0);
}
void stopTimer()
{
gettimeofday(&fEndTime, 0);
}
float getTotalRunTime()
{
// fTotTime = (fEndTime>0)?(fEndTime-fStartTime):0;
fTotTime = (fEndTime.tv_sec + (fEndTime.tv_usec / 1000000.0)) -
(fStartTime.tv_sec + (fStartTime.tv_usec / 1000000.0));
return fTotTime;
}
public:
int64_t fRowsPro; // Rows processed
int64_t fRowsIns; // Rows inserted
timeval fStartTime; // StartTime
timeval fEndTime; // EndTime
float fTotTime; // TotalTime
// A vector containing a list of rows and counts of Out of Range values
WEColOorVec fColOorVec;
};
WEImportRslt fImportRslt;
friend class WESplClient;
friend class WEBrmUpdater;
friend class WESplitterApp;
friend class WEFileReadThread;
friend class WETableLockGrabber;
};
//------------------------------------------------------------------------------
} /* namespace WriteEngine */