| 1025 | } |
| 1026 | |
| 1027 | void CSRNodeGroup::checkpointInMemOnly(const UniqLock& lock, NodeGroupCheckpointState& state) { |
| 1028 | const auto* txn = state.transaction ? state.transaction : &DUMMY_CHECKPOINT_TRANSACTION; |
| 1029 | auto numRels = 0u; |
| 1030 | for (auto& chunkedGroup : chunkedGroups.getAllGroups(lock)) { |
| 1031 | numRels += chunkedGroup->getNumRows(); |
| 1032 | } |
| 1033 | if (numRels == 0) { |
| 1034 | return; |
| 1035 | } |
| 1036 | // Construct in-mem csr header chunks. |
| 1037 | auto& csrState = state.cast<CSRNodeGroupCheckpointState>(); |
| 1038 | csrState.newHeader = std::make_unique<InMemChunkedCSRHeader>(*state.mm, |
| 1039 | false /*enableCompression*/, StorageConfig::NODE_GROUP_SIZE); |
| 1040 | const auto numNodes = csrIndex->getMaxOffsetWithRels() + 1; |
| 1041 | csrState.newHeader->setNumValues(numNodes); |
| 1042 | populateCSRLengthInMemOnly(lock, numNodes, csrState); |
| 1043 | const auto rightCSROffsetsOfRegions = |
| 1044 | csrState.newHeader->populateStartCSROffsetsFromLength(true /* leaveGap */); |
| 1045 | csrState.newHeader->populateEndCSROffsetFromStartAndLength(); |
| 1046 | csrState.newHeader->finalizeCSRRegionEndOffsets(rightCSROffsetsOfRegions); |
| 1047 | |
| 1048 | // Init scan chunk and scan state. |
| 1049 | const auto numColumnsToCheckpoint = csrState.columnIDs.size(); |
| 1050 | auto scanChunk = initScanDataChunk(csrState, dataTypes); |
| 1051 | std::vector<const Column*> columns(numColumnsToCheckpoint); |
| 1052 | for (auto i = 0u; i < numColumnsToCheckpoint; i++) { |
| 1053 | columns[i] = csrState.columns[i]; |
| 1054 | } |
| 1055 | std::vector<ValueVector*> outVectors; |
| 1056 | for (auto i = 0u; i < numColumnsToCheckpoint; i++) { |
| 1057 | outVectors.push_back(scanChunk.valueVectors[i].get()); |
| 1058 | } |
| 1059 | auto scanState = std::make_unique<TableScanState>(nullptr, outVectors, scanChunk.state); |
| 1060 | scanState->columnIDs = csrState.columnIDs; |
| 1061 | scanState->columns = columns; |
| 1062 | scanState->nodeGroupScanState = |
| 1063 | std::make_unique<CSRNodeGroupScanState>(csrState.columnIDs.size()); |
| 1064 | |
| 1065 | auto dummyChunk = initScanDataChunk(csrState, dataTypes); |
| 1066 | for (auto i = 0u; i < dummyChunk.getNumValueVectors(); i++) { |
| 1067 | dummyChunk.getValueVectorMutable(i).setAllNull(); |
| 1068 | } |
| 1069 | |
| 1070 | // Init data chunks to be appended and flushed. |
| 1071 | auto chunkCapacity = rightCSROffsetsOfRegions.back() + 1; |
| 1072 | std::vector<std::unique_ptr<ColumnChunk>> dataChunksToFlush(numColumnsToCheckpoint); |
| 1073 | for (auto i = 0u; i < numColumnsToCheckpoint; i++) { |
| 1074 | const auto columnID = csrState.columnIDs[i]; |
| 1075 | DASSERT(columnID < dataTypes.size()); |
| 1076 | dataChunksToFlush[i] = std::make_unique<ColumnChunk>(*state.mm, dataTypes[columnID].copy(), |
| 1077 | chunkCapacity, enableCompression, ResidencyState::IN_MEMORY); |
| 1078 | } |
| 1079 | |
| 1080 | // Scan tuples from in mem node groups and append to data chunks to flush. |
| 1081 | for (auto offset = 0u; offset < numNodes; offset++) { |
| 1082 | const auto numRows = csrIndex->getNumRows(offset); |
| 1083 | auto rows = csrIndex->indices[offset].getRows(); |
| 1084 | auto numRowsTryAppended = 0u; |
nothing calls this directly
no test coverage detected