| 136 | } |
| 137 | |
| 138 | static std::vector<DiskSizeEntry> collectDiskSizeInfo(const ClientContext* context) { |
| 139 | std::vector<DiskSizeEntry> entries; |
| 140 | std::unordered_map<std::string, idx_t> entryLookup; |
| 141 | auto storageManager = StorageManager::Get(*context); |
| 142 | auto catalog = Catalog::Get(*context); |
| 143 | auto dataFH = storageManager->getDataFH(); |
| 144 | |
| 145 | // Handle in-memory databases |
| 146 | if (storageManager->isInMemory()) { |
| 147 | entries.push_back({"info", "in_memory_database", 0, 0}); |
| 148 | return entries; |
| 149 | } |
| 150 | |
| 151 | auto pageManager = dataFH->getPageManager(); |
| 152 | |
| 153 | // 1. Database header (always 1 page at index 0) |
| 154 | entries.push_back({"header", "database_header", 1, LBUG_PAGE_SIZE}); |
| 155 | |
| 156 | // 2. Get catalog and metadata page ranges from database header |
| 157 | auto databaseHeader = DatabaseHeader::readDatabaseHeader(*dataFH->getFileInfo()); |
| 158 | if (databaseHeader.has_value()) { |
| 159 | entries.push_back({"catalog", "catalog", databaseHeader->catalogPageRange.numPages, |
| 160 | databaseHeader->catalogPageRange.numPages * LBUG_PAGE_SIZE}); |
| 161 | |
| 162 | entries.push_back({"metadata", "metadata", databaseHeader->metadataPageRange.numPages, |
| 163 | databaseHeader->metadataPageRange.numPages * LBUG_PAGE_SIZE}); |
| 164 | } |
| 165 | |
| 166 | // 3. Count table data pages |
| 167 | auto nodeTableEntries = |
| 168 | catalog->getNodeTableEntries(&transaction::DUMMY_CHECKPOINT_TRANSACTION); |
| 169 | auto relGroupEntries = catalog->getRelGroupEntries(&transaction::DUMMY_CHECKPOINT_TRANSACTION); |
| 170 | |
| 171 | for (const auto tableEntry : nodeTableEntries) { |
| 172 | auto& nodeTable = storageManager->getTable(tableEntry->getTableID())->cast<NodeTable>(); |
| 173 | uint64_t tablePages = 0; |
| 174 | auto numNodeGroups = nodeTable.getNumNodeGroups(); |
| 175 | for (auto i = 0ul; i < numNodeGroups; i++) { |
| 176 | tablePages += countNodeGroupPages(nodeTable.getNodeGroup(i)); |
| 177 | } |
| 178 | entries.push_back( |
| 179 | {"node_table", tableEntry->getName(), tablePages, tablePages * LBUG_PAGE_SIZE}); |
| 180 | |
| 181 | for (const auto& indexHolder : nodeTable.getIndexes()) { |
| 182 | if (!indexHolder.isLoaded()) { |
| 183 | continue; |
| 184 | } |
| 185 | const auto* index = indexHolder.getIndex(); |
| 186 | const auto indexInfo = index->getIndexInfo(); |
| 187 | for (const auto& storageEntry : index->getStorageEntries()) { |
| 188 | if (storageEntry.pageRange.startPageIdx == INVALID_PAGE_IDX || |
| 189 | storageEntry.pageRange.numPages == 0) { |
| 190 | continue; |
| 191 | } |
| 192 | appendOrIncrementEntry(entries, entryLookup, "index", |
| 193 | tableEntry->getName() + "." + indexInfo.name + ":" + storageEntry.component, |
| 194 | storageEntry.pageRange.numPages); |
| 195 | } |
no test coverage detected