| 153 | } |
| 154 | |
| 155 | void Checkpointer::writeCheckpoint() { |
| 156 | if (isInMemory) { |
| 157 | return; |
| 158 | } |
| 159 | |
| 160 | checkpointTargets = collectCheckpointTargets(); |
| 161 | |
| 162 | for (const auto& target : checkpointTargets) { |
| 163 | auto rotated = target.storageManager->getWAL().rotateForCheckpoint(&clientContext); |
| 164 | walRotatedByManager[target.storageManager] = rotated; |
| 165 | walRotated = walRotated || rotated; |
| 166 | } |
| 167 | |
| 168 | auto databaseHeader = *mainStorageManager->getOrInitDatabaseHeader(clientContext); |
| 169 | const auto oldStorageVersion = databaseHeader.storageVersion; |
| 170 | databaseHeader.storageVersion = StorageVersionInfo::getStorageVersion(); |
| 171 | hasStorageVersionUpgrade = oldStorageVersion != databaseHeader.storageVersion; |
| 172 | bool localHasStorageChanges = checkpointStorage(); |
| 173 | serializeCatalogAndMetadata(databaseHeader, localHasStorageChanges); |
| 174 | databaseHeader.dataFileNumPages = mainStorageManager->getDataFH()->getNumPages(); |
| 175 | writeDatabaseHeader(databaseHeader); |
| 176 | logCheckpointAndApplyShadowPages(walRotatedByManager.at(mainStorageManager)); |
| 177 | for (const auto& target : checkpointTargets) { |
| 178 | if (target.storageManager == mainStorageManager) { |
| 179 | continue; |
| 180 | } |
| 181 | logCheckpointAndApplyShadowPagesForStorage(clientContext, *target.storageManager, |
| 182 | walRotatedByManager.at(target.storageManager)); |
| 183 | } |
| 184 | |
| 185 | // Snapshot versions while the write gate is still held. |
| 186 | for (const auto& target : checkpointTargets) { |
| 187 | catalogVersionAtCheckpointByCatalog[target.catalog] = target.catalog->getVersion(); |
| 188 | pageManagerVersionAtCheckpointByManager[target.storageManager] = |
| 189 | target.storageManager->getDataFH()->getPageManager()->getVersion(); |
| 190 | } |
| 191 | catalogVersionAtCheckpoint = |
| 192 | catalogVersionAtCheckpointByCatalog[clientContext.getDatabase()->getCatalog()]; |
| 193 | pageManagerVersionAtCheckpoint = pageManagerVersionAtCheckpointByManager[mainStorageManager]; |
| 194 | |
| 195 | postCheckpointCleanup(); |
| 196 | } |
| 197 | |
| 198 | void Checkpointer::beginCheckpoint(common::transaction_t snapshotTimestamp) { |
| 199 | if (isInMemory) { |
nothing calls this directly
no test coverage detected