You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-08-01 06:46:55 +03:00
MCOL-5352 Properly handle PP restart for DML/DDL operations.
This commit is contained in:
committed by
Leonid Fedorov
parent
e43472aedc
commit
c17f24b90f
@ -53,7 +53,7 @@ namespace dmlpackageprocessor
|
||||
/*static*/ std::set<uint64_t> CommandPackageProcessor::fActiveClearTableLockCmds;
|
||||
/*static*/ boost::mutex CommandPackageProcessor::fActiveClearTableLockCmdMutex;
|
||||
|
||||
DMLPackageProcessor::DMLResult CommandPackageProcessor::processPackage(
|
||||
DMLPackageProcessor::DMLResult CommandPackageProcessor::processPackageInternal(
|
||||
dmlpackage::CalpontDMLPackage& cpackage)
|
||||
{
|
||||
SUMMARY_INFO("CommandPackageProcessor::processPackage");
|
||||
@ -485,17 +485,24 @@ DMLPackageProcessor::DMLResult CommandPackageProcessor::processPackage(
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
cerr << "CommandPackageProcessor::processPackage: " << ex.what() << endl;
|
||||
if (checkPPLostConnection(ex))
|
||||
{
|
||||
result.result = PP_LOST_CONNECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "CommandPackageProcessor::processPackage: " << ex.what() << endl;
|
||||
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
args.add(ex.what());
|
||||
args.add("");
|
||||
args.add("");
|
||||
message.format(args);
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
args.add(ex.what());
|
||||
args.add("");
|
||||
args.add("");
|
||||
message.format(args);
|
||||
|
||||
result.result = COMMAND_ERROR;
|
||||
result.message = message;
|
||||
result.result = COMMAND_ERROR;
|
||||
result.message = message;
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -47,17 +47,13 @@ class CommandPackageProcessor : public DMLPackageProcessor
|
||||
CommandPackageProcessor(BRM::DBRM* aDbrm, uint32_t sid) : DMLPackageProcessor(aDbrm, sid)
|
||||
{
|
||||
}
|
||||
/** @brief process an CommandDMLPackage
|
||||
*
|
||||
* @param cpackage the CommandDMLPackage to process
|
||||
*/
|
||||
EXPORT DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage);
|
||||
|
||||
protected:
|
||||
private:
|
||||
void viewTableLock(const dmlpackage::CalpontDMLPackage& cpackage, DMLResult& result);
|
||||
void clearTableLock(uint64_t uniqueId, const dmlpackage::CalpontDMLPackage& cpackage, DMLResult& result);
|
||||
void establishTableLockToClear(uint64_t tableLockID, BRM::TableLockInfo& lockInfo);
|
||||
DMLResult processPackageInternal(dmlpackage::CalpontDMLPackage& cpackage) override;
|
||||
|
||||
// Tracks active cleartablelock commands by storing set of table lock IDs
|
||||
static std::set<uint64_t> fActiveClearTableLockCmds;
|
||||
|
@ -57,7 +57,8 @@ using namespace messageqcpp;
|
||||
using namespace oam;
|
||||
namespace dmlpackageprocessor
|
||||
{
|
||||
DMLPackageProcessor::DMLResult DeletePackageProcessor::processPackage(dmlpackage::CalpontDMLPackage& cpackage)
|
||||
DMLPackageProcessor::DMLResult DeletePackageProcessor::processPackageInternal(
|
||||
dmlpackage::CalpontDMLPackage& cpackage)
|
||||
{
|
||||
SUMMARY_INFO("DeletePackageProcessor::processPackage");
|
||||
|
||||
@ -174,7 +175,6 @@ DMLPackageProcessor::DMLResult DeletePackageProcessor::processPackage(dmlpackage
|
||||
abs_ts.tv_nsec = rm_ts.tv_nsec;
|
||||
} while (nanosleep(&abs_ts, &rm_ts) < 0);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
processID = ::getpid();
|
||||
@ -264,15 +264,22 @@ DMLPackageProcessor::DMLResult DeletePackageProcessor::processPackage(dmlpackage
|
||||
}
|
||||
catch (exception& ex)
|
||||
{
|
||||
cerr << "DeletePackageProcessor::processPackage: " << ex.what() << endl;
|
||||
|
||||
//@Bug 4994 Cancelled job is not error
|
||||
if (result.result == 0)
|
||||
if (checkPPLostConnection(ex))
|
||||
{
|
||||
result.result = DELETE_ERROR;
|
||||
result.result = PP_LOST_CONNECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "DeletePackageProcessor::processPackage: " << ex.what() << endl;
|
||||
|
||||
result.message = Message(ex.what());
|
||||
//@Bug 4994 Cancelled job is not error
|
||||
if (result.result == 0)
|
||||
{
|
||||
result.result = DELETE_ERROR;
|
||||
}
|
||||
|
||||
result.message = Message(ex.what());
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -45,14 +45,11 @@ class DeletePackageProcessor : public DMLPackageProcessor
|
||||
DeletePackageProcessor(BRM::DBRM* aDbrm, uint32_t sid) : DMLPackageProcessor(aDbrm, sid)
|
||||
{
|
||||
}
|
||||
/** @brief process a DeleteDMLPackage
|
||||
*
|
||||
* @param cpackage the delete dml package to process
|
||||
*/
|
||||
EXPORT DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage);
|
||||
|
||||
protected:
|
||||
private:
|
||||
DMLResult processPackageInternal(dmlpackage::CalpontDMLPackage& cpackage) override;
|
||||
|
||||
/** @brief delete a row
|
||||
*
|
||||
* @param txnID the transaction id
|
||||
|
@ -287,6 +287,31 @@ int32_t DMLPackageProcessor::tryToRollBackTransaction(uint64_t uniqueId, BRM::Tx
|
||||
return weRc;
|
||||
}
|
||||
|
||||
DMLPackageProcessor::DMLResult DMLPackageProcessor::processPackage(dmlpackage::CalpontDMLPackage& cpackage)
|
||||
{
|
||||
auto result = processPackageInternal(cpackage);
|
||||
uint32_t tries = 0;
|
||||
// Try to setup connection and process package one more time.
|
||||
while ((result.result == PP_LOST_CONNECTION) && (tries < 5))
|
||||
{
|
||||
std::cerr << "DMLPackageProcessor: NETWORK ERROR; attempt # " << tries << std::endl;
|
||||
joblist::ResourceManager* rm = joblist::ResourceManager::instance(true);
|
||||
joblist::DistributedEngineComm* fEc = joblist::DistributedEngineComm::instance(rm);
|
||||
if (fEc->Setup())
|
||||
return result;
|
||||
|
||||
result = processPackageInternal(cpackage);
|
||||
++tries;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
bool DMLPackageProcessor::checkPPLostConnection(std::exception& ex)
|
||||
{
|
||||
std::string error = ex.what();
|
||||
return error.find(PPLostConnectionErrorCode) != std::string::npos;
|
||||
}
|
||||
|
||||
int DMLPackageProcessor::rollBackTransaction(uint64_t uniqueId, BRM::TxnID txnID, uint32_t sessionID,
|
||||
std::string& errorMsg)
|
||||
{
|
||||
|
@ -98,7 +98,8 @@ class DMLPackageProcessor
|
||||
TABLE_LOCK_ERROR,
|
||||
JOB_ERROR,
|
||||
JOB_CANCELED,
|
||||
DBRM_READ_ONLY
|
||||
DBRM_READ_ONLY,
|
||||
PP_LOST_CONNECTION
|
||||
};
|
||||
|
||||
enum DebugLevel /** @brief Debug level type enumeration */
|
||||
@ -212,7 +213,11 @@ class DMLPackageProcessor
|
||||
*
|
||||
* @param cpackage the CalpontDMLPackage to process
|
||||
*/
|
||||
virtual DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage) = 0;
|
||||
DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage);
|
||||
|
||||
/** @brief Check that give exception is related to PP lost connection.
|
||||
*/
|
||||
bool checkPPLostConnection(std::exception& ex);
|
||||
|
||||
inline void setRM(joblist::ResourceManager* frm)
|
||||
{
|
||||
@ -502,6 +507,8 @@ class DMLPackageProcessor
|
||||
execplan::ClientRotator* fExeMgr;
|
||||
|
||||
private:
|
||||
virtual DMLResult processPackageInternal(dmlpackage::CalpontDMLPackage& cpackage) = 0;
|
||||
|
||||
/** @brief clean beginning and ending glitches and spaces from string
|
||||
*
|
||||
* @param s string to be cleaned
|
||||
@ -509,6 +516,8 @@ class DMLPackageProcessor
|
||||
void cleanString(std::string& s);
|
||||
|
||||
DebugLevel fDebugLevel; // internal use debug level
|
||||
|
||||
const std::string PPLostConnectionErrorCode = "MCS-2045";
|
||||
};
|
||||
|
||||
/** @brief helper template function to do safe from string to type conversions
|
||||
|
@ -50,7 +50,8 @@ using namespace messageqcpp;
|
||||
|
||||
namespace dmlpackageprocessor
|
||||
{
|
||||
DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage::CalpontDMLPackage& cpackage)
|
||||
DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackageInternal(
|
||||
dmlpackage::CalpontDMLPackage& cpackage)
|
||||
{
|
||||
SUMMARY_INFO("InsertPackageProcessor::processPackage");
|
||||
|
||||
@ -184,7 +185,6 @@ DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage
|
||||
abs_ts.tv_nsec = rm_ts.tv_nsec;
|
||||
} while (nanosleep(&abs_ts, &rm_ts) < 0);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
processID = ::getpid();
|
||||
@ -365,21 +365,28 @@ DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage
|
||||
}
|
||||
catch (exception& ex)
|
||||
{
|
||||
cerr << "InsertPackageProcessor::processPackage: " << ex.what() << endl;
|
||||
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
args.add("Insert Failed: ");
|
||||
args.add(ex.what());
|
||||
args.add("");
|
||||
args.add("");
|
||||
message.format(args);
|
||||
|
||||
if (result.result != VB_OVERFLOW_ERROR)
|
||||
if (checkPPLostConnection(ex))
|
||||
{
|
||||
result.result = INSERT_ERROR;
|
||||
result.message = message;
|
||||
errorMsg = ex.what();
|
||||
result.result = PP_LOST_CONNECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "InsertPackageProcessor::processPackage: " << ex.what() << endl;
|
||||
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
args.add("Insert Failed: ");
|
||||
args.add(ex.what());
|
||||
args.add("");
|
||||
args.add("");
|
||||
message.format(args);
|
||||
|
||||
if (result.result != VB_OVERFLOW_ERROR)
|
||||
{
|
||||
result.result = INSERT_ERROR;
|
||||
result.message = message;
|
||||
errorMsg = ex.what();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
@ -397,7 +404,19 @@ DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage
|
||||
result.message = message;
|
||||
}
|
||||
|
||||
if ((rc != 0) && (rc != IDBRANGE_WARNING))
|
||||
if (rc == 1)
|
||||
{
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
args.add("Insert Failed: ");
|
||||
args.add(errorMsg);
|
||||
args.add("");
|
||||
args.add("");
|
||||
message.format(args);
|
||||
result.result = PP_LOST_CONNECTION;
|
||||
result.message = message;
|
||||
}
|
||||
else if ((rc != 0) && (rc != IDBRANGE_WARNING))
|
||||
{
|
||||
logging::Message::Args args;
|
||||
logging::Message message(1);
|
||||
@ -427,4 +446,3 @@ DMLPackageProcessor::DMLResult InsertPackageProcessor::processPackage(dmlpackage
|
||||
}
|
||||
|
||||
} // namespace dmlpackageprocessor
|
||||
|
||||
|
@ -45,14 +45,10 @@ class InsertPackageProcessor : public DMLPackageProcessor
|
||||
InsertPackageProcessor(BRM::DBRM* aDbrm, uint32_t sid) : DMLPackageProcessor(aDbrm, sid)
|
||||
{
|
||||
}
|
||||
/** @brief process an InsertDMLPackage
|
||||
*
|
||||
* @param cpackage the InsertDMLPackage to process
|
||||
*/
|
||||
EXPORT DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage);
|
||||
|
||||
protected:
|
||||
private:
|
||||
DMLResult processPackageInternal(dmlpackage::CalpontDMLPackage& cpackage) override;
|
||||
};
|
||||
|
||||
} // namespace dmlpackageprocessor
|
||||
|
@ -61,7 +61,8 @@ using namespace oam;
|
||||
namespace dmlpackageprocessor
|
||||
{
|
||||
// StopWatch timer;
|
||||
DMLPackageProcessor::DMLResult UpdatePackageProcessor::processPackage(dmlpackage::CalpontDMLPackage& cpackage)
|
||||
DMLPackageProcessor::DMLResult UpdatePackageProcessor::processPackageInternal(
|
||||
dmlpackage::CalpontDMLPackage& cpackage)
|
||||
{
|
||||
SUMMARY_INFO("UpdatePackageProcessor::processPackage");
|
||||
|
||||
@ -201,7 +202,6 @@ DMLPackageProcessor::DMLResult UpdatePackageProcessor::processPackage(dmlpackage
|
||||
abs_ts.tv_nsec = rm_ts.tv_nsec;
|
||||
} while (nanosleep(&abs_ts, &rm_ts) < 0);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
processID = ::getpid();
|
||||
@ -301,22 +301,28 @@ DMLPackageProcessor::DMLResult UpdatePackageProcessor::processPackage(dmlpackage
|
||||
}
|
||||
catch (std::exception& ex)
|
||||
{
|
||||
cerr << "UpdatePackageProcessor::processPackage:" << ex.what() << endl;
|
||||
|
||||
if (result.result == 0)
|
||||
if (checkPPLostConnection(ex))
|
||||
{
|
||||
result.result = UPDATE_ERROR;
|
||||
result.result = PP_LOST_CONNECTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
cerr << "UpdatePackageProcessor::processPackage:" << ex.what() << endl;
|
||||
if (result.result == 0)
|
||||
{
|
||||
result.result = UPDATE_ERROR;
|
||||
}
|
||||
|
||||
result.message = Message(ex.what());
|
||||
result.rowCount = 0;
|
||||
LoggingID logid(DMLLoggingId, fSessionID, txnid.id);
|
||||
logging::Message::Args args1;
|
||||
logging::Message msg(1);
|
||||
args1.add("End SQL statement with error");
|
||||
msg.format(args1);
|
||||
logging::Logger logger(logid.fSubsysID);
|
||||
logger.logMessage(LOG_TYPE_DEBUG, msg, logid);
|
||||
result.message = Message(ex.what());
|
||||
result.rowCount = 0;
|
||||
LoggingID logid(DMLLoggingId, fSessionID, txnid.id);
|
||||
logging::Message::Args args1;
|
||||
logging::Message msg(1);
|
||||
args1.add("End SQL statement with error");
|
||||
msg.format(args1);
|
||||
logging::Logger logger(logid.fSubsysID);
|
||||
logger.logMessage(LOG_TYPE_DEBUG, msg, logid);
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
@ -42,14 +42,11 @@ class UpdatePackageProcessor : public DMLPackageProcessor
|
||||
UpdatePackageProcessor(BRM::DBRM* aDbrm, uint32_t sid) : DMLPackageProcessor(aDbrm, sid)
|
||||
{
|
||||
}
|
||||
/** @brief process an UpdateDMLPackage
|
||||
*
|
||||
* @param cpackage the UpdateDMLPackage to process
|
||||
*/
|
||||
EXPORT DMLResult processPackage(dmlpackage::CalpontDMLPackage& cpackage);
|
||||
|
||||
protected:
|
||||
private:
|
||||
DMLResult processPackageInternal(dmlpackage::CalpontDMLPackage& cpackage) override;
|
||||
|
||||
/** @brief send execution plan to ExeMgr and fetch rows
|
||||
*
|
||||
* @param cpackage the UpdateDMLPackage to process
|
||||
|
Reference in New Issue
Block a user