You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-06-12 05:01:56 +03:00
MCOL-5021 For the DELETE operation, empty magic values are only
written to database files for AUX column. Perform read-only operation for other columns in the table to update the Casual Partitioning information.
This commit is contained in:
@ -4601,31 +4601,9 @@ int WriteEngineWrapper::updateColumnRec(const TxnID& txnid, const vector<CSCType
|
||||
// timer.start("markExtentsInvalid");
|
||||
//#endif
|
||||
|
||||
if (m_opType == DELETE && hasAUXCol)
|
||||
{
|
||||
ColStructList colStructListAUX(1, colStructList.back());
|
||||
WriteEngine::CSCTypesList cscColTypeListAUX(1, cscColTypeList.back());
|
||||
ColValueList colValueListAUX(1, colValueList.back());
|
||||
std::vector<ExtCPInfo*> currentExtentRangesPtrsAUX(1, currentExtentRangesPtrs.back());
|
||||
|
||||
rc = writeColumnRecUpdate(txnid, cscColTypeListAUX, colStructListAUX, colValueListAUX, colOldValueList,
|
||||
ridLists[extent], tableOid, true, ridLists[extent].size(),
|
||||
¤tExtentRangesPtrsAUX);
|
||||
|
||||
for (auto& cpInfoPtr : currentExtentRangesPtrs)
|
||||
{
|
||||
if (cpInfoPtr)
|
||||
{
|
||||
cpInfoPtr->toInvalid();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = writeColumnRecUpdate(txnid, cscColTypeList, colStructList, colValueList, colOldValueList,
|
||||
ridLists[extent], tableOid, true, ridLists[extent].size(),
|
||||
¤tExtentRangesPtrs);
|
||||
}
|
||||
rc = writeColumnRecUpdate(txnid, cscColTypeList, colStructList, colValueList, colOldValueList,
|
||||
ridLists[extent], tableOid, true, ridLists[extent].size(),
|
||||
¤tExtentRangesPtrs, hasAUXCol);
|
||||
|
||||
if (rc != NO_ERROR)
|
||||
break;
|
||||
@ -5727,7 +5705,8 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
const ColValueList& colValueList, vector<void*>& colOldValueList,
|
||||
const RIDList& ridList, const int32_t tableOid,
|
||||
bool convertStructFlag, ColTupleList::size_type nRows,
|
||||
std::vector<ExtCPInfo*>* cpInfos)
|
||||
std::vector<ExtCPInfo*>* cpInfos,
|
||||
bool hasAUXCol)
|
||||
{
|
||||
bool bExcp;
|
||||
int rc = 0;
|
||||
@ -5753,7 +5732,8 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
std::vector<VBRange> freeList;
|
||||
vector<vector<uint32_t> > fboLists;
|
||||
vector<vector<LBIDRange> > rangeLists;
|
||||
rc = processBeginVBCopy(txnid, colStructList, ridList, freeList, fboLists, rangeLists, rangeListTot);
|
||||
rc = processBeginVBCopy(txnid, ((m_opType == DELETE && hasAUXCol) ? ColStructList(1, colStructList.back()) : colStructList),
|
||||
ridList, freeList, fboLists, rangeLists, rangeListTot);
|
||||
|
||||
if (rc != NO_ERROR)
|
||||
{
|
||||
@ -5823,6 +5803,8 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
}
|
||||
|
||||
string segFile;
|
||||
bool isFlush = (m_opType != DELETE || !hasAUXCol || (i == colStructList.size() - 1));
|
||||
|
||||
rc = colOp->openColumnFile(curCol, segFile, true, IO_BUFF_SIZE); // @bug 5572 HDFS tmp file
|
||||
|
||||
if (rc != NO_ERROR)
|
||||
@ -5834,7 +5816,6 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
aFile.oid = curColStruct.dataOid;
|
||||
aFile.partitionNum = curColStruct.fColPartition;
|
||||
aFile.dbRoot = curColStruct.fColDbRoot;
|
||||
;
|
||||
aFile.segmentNum = curColStruct.fColSegment;
|
||||
aFile.compType = curColStruct.fCompressionType;
|
||||
files.push_back(aFile);
|
||||
@ -5846,13 +5827,19 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
|
||||
if (!idbdatafile::IDBPolicy::useHdfs())
|
||||
{
|
||||
if (rangeListTot.size() > 0)
|
||||
if (rangeListTot.size() > 0 &&
|
||||
(m_opType != DELETE || !hasAUXCol || (i == colStructList.size() - 1)))
|
||||
{
|
||||
if (freeList[0].size >= (blocksProcessed + rangeLists[i].size()))
|
||||
ColStructList::size_type j = i;
|
||||
|
||||
if (m_opType == DELETE && hasAUXCol && (i == colStructList.size() - 1))
|
||||
j = 0;
|
||||
|
||||
if (freeList[0].size >= (blocksProcessed + rangeLists[j].size()))
|
||||
{
|
||||
aRange.vbOID = freeList[0].vbOID;
|
||||
aRange.vbFBO = freeList[0].vbFBO + blocksProcessed;
|
||||
aRange.size = rangeLists[i].size();
|
||||
aRange.size = rangeLists[j].size();
|
||||
curFreeList.push_back(aRange);
|
||||
}
|
||||
else
|
||||
@ -5867,7 +5854,7 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
{
|
||||
aRange.vbOID = freeList[1].vbOID;
|
||||
aRange.vbFBO = freeList[1].vbFBO + blocksProcessedThisOid;
|
||||
aRange.size = rangeLists[i].size() - blockUsed;
|
||||
aRange.size = rangeLists[j].size() - blockUsed;
|
||||
curFreeList.push_back(aRange);
|
||||
blocksProcessedThisOid += aRange.size;
|
||||
}
|
||||
@ -5878,10 +5865,10 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
}
|
||||
}
|
||||
|
||||
blocksProcessed += rangeLists[i].size();
|
||||
blocksProcessed += rangeLists[j].size();
|
||||
|
||||
rc = BRMWrapper::getInstance()->writeVB(curCol.dataFile.pFile, (BRM::VER_t)txnid,
|
||||
curColStruct.dataOid, fboLists[i], rangeLists[i], colOp,
|
||||
curColStruct.dataOid, fboLists[j], rangeLists[j], colOp,
|
||||
curFreeList, curColStruct.fColDbRoot, true);
|
||||
}
|
||||
}
|
||||
@ -5946,7 +5933,10 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
#ifdef PROFILE
|
||||
timer.start("writeRows ");
|
||||
#endif
|
||||
rc = colOp->writeRows(curCol, totalRow, ridList, valArray, oldValArray, true);
|
||||
if (!hasAUXCol || (i == colStructList.size() - 1))
|
||||
rc = colOp->writeRows(curCol, totalRow, ridList, valArray, oldValArray, true);
|
||||
else
|
||||
rc = colOp->writeRowsReadOnly(curCol, totalRow, ridList, oldValArray);
|
||||
#ifdef PROFILE
|
||||
timer.stop("writeRows ");
|
||||
#endif
|
||||
@ -5954,10 +5944,9 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
|
||||
updateMaxMinRange(1, totalRow, cscColTypeList[i], curColStruct.colType,
|
||||
m_opType == DELETE ? NULL : valArray, oldValArray, cpInfo, false);
|
||||
// timer.start("Delete:closefile");
|
||||
colOp->clearColumn(curCol);
|
||||
|
||||
// timer.stop("Delete:closefile");
|
||||
colOp->clearColumn(curCol, isFlush);
|
||||
|
||||
if (valArray != NULL)
|
||||
{
|
||||
free(valArray);
|
||||
@ -5976,18 +5965,16 @@ int WriteEngineWrapper::writeColumnRecUpdate(const TxnID& txnid, const CSCTypesL
|
||||
|
||||
} // end of for (i = 0)
|
||||
|
||||
// timer.start("Delete:purgePrimProcFdCache");
|
||||
if ((idbdatafile::IDBPolicy::useHdfs()) && (files.size() > 0))
|
||||
cacheutils::purgePrimProcFdCache(files, Config::getLocalModuleID());
|
||||
|
||||
// timer.stop("Delete:purgePrimProcFdCache");
|
||||
if (rangeListTot.size() > 0)
|
||||
BRMWrapper::getInstance()->writeVBEnd(txnid, rangeListTot);
|
||||
|
||||
// timer.stop("Delete:writecolrec");
|
||||
//#ifdef PROFILE
|
||||
// timer.finish();
|
||||
//#endif
|
||||
#ifdef PROFILE
|
||||
timer.finish();
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user