1
0
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:
Denis Khalikov
2024-02-01 13:27:01 +00:00
committed by Leonid Fedorov
parent e43472aedc
commit c17f24b90f
31 changed files with 736 additions and 401 deletions

View File

@ -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 (...)
{

View File

@ -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;

View File

@ -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 (...)
{

View File

@ -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

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 (...)
{

View File

@ -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