From 8037af5161244320d418127962c7451fb5acf198 Mon Sep 17 00:00:00 2001 From: Roman Nozdrin Date: Sun, 25 Mar 2018 22:03:08 +0300 Subject: [PATCH] MCOL-498 Fill up next block with empty values if insert values up to the block boundary. --- writeengine/server/we_dmlcommandproc.cpp | 4 +- writeengine/shared/.we_fileop.h.swo | Bin 0 -> 16384 bytes writeengine/shared/we_fileop.cpp | 1 - writeengine/shared/we_fileop.h | 2 + writeengine/wrapper/we_colop.cpp | 57 +++++++++++++++++++++-- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 writeengine/shared/.we_fileop.h.swo diff --git a/writeengine/server/we_dmlcommandproc.cpp b/writeengine/server/we_dmlcommandproc.cpp index 5da10433e..a6c5b025c 100644 --- a/writeengine/server/we_dmlcommandproc.cpp +++ b/writeengine/server/we_dmlcommandproc.cpp @@ -102,13 +102,13 @@ uint8_t WE_DMLCommandProc::processSingleInsert(messageqcpp::ByteStream& bs, std: bs >> tmp32; uint32_t dbroot = tmp32; - //cout << "processSingleInsert received bytestream length " << bs.length() << endl; + cout << "processSingleInsert received bytestream length " << bs.length() << endl; messageqcpp::ByteStream::byte packageType; bs >> packageType; insertPkg.read( bs); uint32_t sessionId = insertPkg.get_SessionID(); - //cout << " processSingleInsert for session " << sessionId << endl; + cout << " processSingleInsert for session " << sessionId << endl; DMLTable* tablePtr = insertPkg.get_Table(); RowList rows = tablePtr->get_RowList(); diff --git a/writeengine/shared/.we_fileop.h.swo b/writeengine/shared/.we_fileop.h.swo new file mode 100644 index 0000000000000000000000000000000000000000..46e47f43e9e4b891f218888636cb9d5f0e6c00e1 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/writeengine/shared/we_fileop.cpp b/writeengine/shared/we_fileop.cpp index f77817962..e08bea3fb 100644 --- a/writeengine/shared/we_fileop.cpp +++ b/writeengine/shared/we_fileop.cpp @@ -63,7 +63,6 @@ namespace WriteEngine /*static*/ boost::mutex FileOp::m_createDbRootMutexes; /*static*/ boost::mutex FileOp::m_mkdirMutex; /*static*/ std::map FileOp::m_DbRootAddExtentMutexes; -const int MAX_NBLOCKS = 8192; // max number of blocks written to an extent // in 1 call to fwrite(), during initialization //StopWatch timer; diff --git a/writeengine/shared/we_fileop.h b/writeengine/shared/we_fileop.h index 67d926910..175b3fb0d 100644 --- a/writeengine/shared/we_fileop.h +++ b/writeengine/shared/we_fileop.h @@ -50,6 +50,8 @@ #define EXPORT #endif +#define MAX_NBLOCKS 8192 + #include "brmtypes.h" /** Namespace WriteEngine */ diff --git a/writeengine/wrapper/we_colop.cpp b/writeengine/wrapper/we_colop.cpp index 56c1b923a..067453b87 100644 --- a/writeengine/wrapper/we_colop.cpp +++ b/writeengine/wrapper/we_colop.cpp @@ -35,6 +35,7 @@ using namespace std; #include "idbcompress.h" #include "writeengine.h" #include "cacheutils.h" +#include "we_fileop.h" using namespace execplan; @@ -471,6 +472,13 @@ int ColumnOp::allocRowId(const TxnID& txnid, bool useStartingExtent, if ( rc != NO_ERROR) return rc; + // MCOL-498 Fill up the first block with empty values. + { + uint64_t emptyVal = getEmptyRowValue(column.colDataType, column.colWidth); + setEmptyBuf(buf, BYTE_PER_BLOCK, emptyVal, column.colWidth); + } + + for (j = 0; j < totalRowPerBlock; j++) { if (isEmptyRow(buf, j, column)) @@ -1536,12 +1544,14 @@ int ColumnOp::writeRow(Column& curCol, uint64_t totalRow, const RID* rowIdArray, int rc = NO_ERROR; bool fillUpWEmptyVals = false; bool fistRowInBlock = false; + bool lastRowInBlock = false; + uint16_t rowsInBlock = BYTE_PER_BLOCK / curCol.colWidth; while (!bExit) { curRowId = rowIdArray[i]; - calculateRowId(curRowId, BYTE_PER_BLOCK / curCol.colWidth, curCol.colWidth, dataFbo, dataBio); + calculateRowId(curRowId, rowsInBlock, curCol.colWidth, dataFbo, dataBio); // load another data block if necessary if (curDataFbo != dataFbo) @@ -1562,7 +1572,7 @@ int ColumnOp::writeRow(Column& curCol, uint64_t totalRow, const RID* rowIdArray, // MCOL-498 CS hasn't touched any block yet, // but the row fill be the first in the block. - fistRowInBlock = ( !(curRowId % (BYTE_PER_BLOCK / curCol.colWidth)) ) ? true : false; + fistRowInBlock = ( !(curRowId % (rowsInBlock)) ) ? true : false; if( fistRowInBlock && !bDelete ) fillUpWEmptyVals = true; @@ -1696,11 +1706,48 @@ int ColumnOp::writeRow(Column& curCol, uint64_t totalRow, const RID* rowIdArray, int writeSize = BYTE_PER_BLOCK - ( dataBio + curCol.colWidth ); // MCOL-498 Add the check though this is unlikely at the moment of writing. if ( writeSize ) - setEmptyBuf( dataBuf + dataBio + curCol.colWidth, writeSize, emptyVal, curCol.colWidth ); - fillUpWEmptyVals = false; - fistRowInBlock = false; + setEmptyBuf( dataBuf + dataBio + curCol.colWidth, writeSize, + emptyVal, curCol.colWidth ); + //fillUpWEmptyVals = false; + //fistRowInBlock = false; } + rc = saveBlock(curCol.dataFile.pFile, dataBuf, curDataFbo); + + if ( rc != NO_ERROR) + return rc; + + // MCOL-498 If it was the last row in a block fill the next block with + // empty vals, otherwise next ColumnOp::allocRowId() + // will fail on the next block. + lastRowInBlock = ( rowsInBlock - ( curRowId % rowsInBlock ) == 1 ) ? true : false; + if ( lastRowInBlock ) + { + if( !fillUpWEmptyVals ) + emptyVal = getEmptyRowValue(curCol.colDataType, curCol.colWidth); + // MCOL-498 Skip if this is the last block in an extent. + if ( curDataFbo != MAX_NBLOCKS - 1) + { + rc = saveBlock(curCol.dataFile.pFile, dataBuf, curDataFbo); + if ( rc != NO_ERROR) + return rc; + + curDataFbo += 1; + rc = readBlock(curCol.dataFile.pFile, dataBuf, curDataFbo); + if ( rc != NO_ERROR) + return rc; + + unsigned char zeroSubBlock[BYTE_PER_SUBBLOCK]; + std::memset(zeroSubBlock, 0, BYTE_PER_SUBBLOCK); + // The first subblock is made of 0 - fill the block with empty vals. + if ( !std::memcmp(dataBuf, zeroSubBlock, BYTE_PER_SUBBLOCK) ) + { + setEmptyBuf(dataBuf, BYTE_PER_BLOCK, emptyVal, curCol.colWidth); + rc = saveBlock(curCol.dataFile.pFile, dataBuf, curDataFbo); + } + } + } + } return rc; }