| 395 | } |
| 396 | |
| 397 | void NodeGroup::checkpoint(MemoryManager& memoryManager, NodeGroupCheckpointState& state) { |
| 398 | const auto lock = chunkedGroups.lock(); |
| 399 | DASSERT(chunkedGroups.getNumGroups(lock) >= 1); |
| 400 | const auto firstGroup = chunkedGroups.getFirstGroup(lock); |
| 401 | const auto hasPersistentData = firstGroup->getResidencyState() == ResidencyState::ON_DISK; |
| 402 | const auto* txn = state.transaction ? state.transaction : &DUMMY_CHECKPOINT_TRANSACTION; |
| 403 | // Re-populate version info here first. |
| 404 | auto checkpointedVersionInfo = checkpointVersionInfo(lock, txn); |
| 405 | std::unique_ptr<ChunkedNodeGroup> checkpointedChunkedGroup; |
| 406 | if (checkpointedVersionInfo->getNumDeletions(txn, 0, numRows) == |
| 407 | numRows - firstGroup->getStartRowIdx()) { |
| 408 | reclaimStorage(state.pageAllocator, lock); |
| 409 | checkpointedChunkedGroup = |
| 410 | ChunkedNodeGroup::flushEmpty(memoryManager, dataTypes, enableCompression, |
| 411 | StorageConfig::CHUNKED_NODE_GROUP_CAPACITY, numRows, state.pageAllocator); |
| 412 | } else { |
| 413 | if (hasPersistentData) { |
| 414 | checkpointedChunkedGroup = checkpointInMemAndOnDisk(memoryManager, lock, state); |
| 415 | } else { |
| 416 | checkpointedChunkedGroup = checkpointInMemOnly(memoryManager, lock, state); |
| 417 | } |
| 418 | checkpointedChunkedGroup->setVersionInfo(std::move(checkpointedVersionInfo)); |
| 419 | } |
| 420 | chunkedGroups.clear(lock); |
| 421 | chunkedGroups.appendGroup(lock, std::move(checkpointedChunkedGroup)); |
| 422 | checkpointDataTypesNoLock(state); |
| 423 | } |
| 424 | |
| 425 | void NodeGroup::checkpointDataTypesNoLock(const NodeGroupCheckpointState& state) { |
| 426 | std::vector<LogicalType> checkpointedTypes; |
no test coverage detected