use of org.apache.ignite.internal.processors.cache.persistence.freelist.io.PagesListMetaIO in project ignite by apache.
the class IgniteIndexReader method getPageListsInfo.
/**
* Gets info about page lists.
*
* @param metaPageListId Page list meta id.
* @return Page list info.
*/
private PageListsInfo getPageListsInfo(long metaPageListId) {
Map<IgniteBiTuple<Long, Integer>, List<Long>> bucketsData = new HashMap<>();
Set<Long> allPages = new HashSet<>();
Map<Class, Long> pageListStat = new HashMap<>();
Map<Long, List<Throwable>> errors = new HashMap<>();
try {
doWithBuffer((buf, addr) -> {
long nextMetaId = metaPageListId;
while (nextMetaId != 0) {
try {
buf.rewind();
readPage(idxStore, nextMetaId, buf);
PagesListMetaIO io = PageIO.getPageIO(addr);
Map<Integer, GridLongList> data = new HashMap<>();
io.getBucketsData(addr, data);
final long fNextMetaId = nextMetaId;
data.forEach((k, v) -> {
List<Long> listIds = LongStream.of(v.array()).map(IgniteIndexReader::normalizePageId).boxed().collect(toList());
for (Long listId : listIds) {
try {
allPages.addAll(getPageList(listId, pageListStat));
} catch (Exception e) {
errors.put(listId, singletonList(e));
}
}
bucketsData.put(new IgniteBiTuple<>(fNextMetaId, k), listIds);
});
nextMetaId = io.getNextMetaPageId(addr);
} catch (Exception e) {
errors.put(nextMetaId, singletonList(e));
nextMetaId = 0;
}
}
return null;
});
} catch (IgniteCheckedException e) {
throw new IgniteException(e);
}
return new PageListsInfo(bucketsData, allPages, pageListStat, errors);
}
use of org.apache.ignite.internal.processors.cache.persistence.freelist.io.PagesListMetaIO in project ignite by apache.
the class RandomLruPageReplacementPolicy method isStoreMetadataPage.
/**
* @param absPageAddr Absolute page address
* @return {@code True} if page is related to partition metadata, which is loaded in saveStoreMetadata().
*/
private static boolean isStoreMetadataPage(long absPageAddr) {
try {
long dataAddr = absPageAddr + PAGE_OVERHEAD;
int type = PageIO.getType(dataAddr);
int ver = PageIO.getVersion(dataAddr);
PageIO io = PageIO.getPageIO(type, ver);
return io instanceof PagePartitionMetaIO || io instanceof PagesListMetaIO || io instanceof PagePartitionCountersIO;
} catch (IgniteCheckedException ignored) {
return false;
}
}
use of org.apache.ignite.internal.processors.cache.persistence.freelist.io.PagesListMetaIO in project ignite by apache.
the class IgniteIndexReader method readIdx.
/**
* Read index file.
*/
public void readIdx() {
long partPageStoresNum = Arrays.stream(partStores).filter(Objects::nonNull).count();
print("Partitions files num: " + partPageStoresNum);
Map<Class, Long> pageClasses = new HashMap<>();
long pagesNum = isNull(idxStore) ? 0 : (idxStore.size() - idxStore.headerSize()) / pageSize;
print("Going to check " + pagesNum + " pages.");
Set<Long> pageIds = new HashSet<>();
AtomicReference<Map<String, TreeTraversalInfo>> treeInfo = new AtomicReference<>();
AtomicReference<Map<String, TreeTraversalInfo>> horizontalScans = new AtomicReference<>();
AtomicReference<PageListsInfo> pageListsInfo = new AtomicReference<>();
List<Throwable> errors;
try {
IgniteBiTuple<Long, Long> indexPartitionRoots = partitionRoots(partMetaPageId(INDEX_PARTITION, FLAG_IDX));
long metaTreeRootId = indexPartitionRoots.get1();
long pageListMetaPageId = indexPartitionRoots.get2();
// Traversing trees.
treeInfo.set(traverseAllTrees("Index trees traversal", metaTreeRootId, CountOnlyStorage::new, this::traverseTree));
treeInfo.get().forEach((name, info) -> {
pageIds.addAll(info.innerPageIds);
pageIds.add(info.rootPageId);
});
Supplier<ItemStorage> itemStorageFactory = checkParts ? LinkStorage::new : CountOnlyStorage::new;
horizontalScans.set(traverseAllTrees("Scan index trees horizontally", metaTreeRootId, itemStorageFactory, this::horizontalTreeScan));
// Scanning page reuse lists.
if (pageListMetaPageId != 0)
pageListsInfo.set(getPageListsInfo(pageListMetaPageId));
ProgressPrinter progressPrinter = new ProgressPrinter(System.out, "Reading pages sequentially", pagesNum);
// Scan all pages in file.
errors = scanFileStore(INDEX_PARTITION, FLAG_IDX, idxStore, (pageId, addr, io) -> {
progressPrinter.printProgress();
pageClasses.compute(io.getClass(), (k, v) -> v == null ? 1 : v + 1);
if (!(io instanceof PageMetaIO || io instanceof PagesListMetaIO)) {
if (idxFilter == null) {
if ((io instanceof BPlusMetaIO || io instanceof BPlusInnerIO) && !pageIds.contains(pageId) && pageListsInfo.get() != null && !pageListsInfo.get().allPages.contains(pageId)) {
throw new IgniteException("Possibly orphan " + io.getClass().getSimpleName() + " page, pageId=" + pageId);
}
}
}
return true;
});
} catch (IgniteCheckedException e) {
throw new IgniteException(INDEX_FILE_NAME + " scan problem", e);
}
if (treeInfo.get() == null)
printErr("No tree meta info found.");
else {
printTraversalResults(RECURSIVE_TRAVERSE_NAME, treeInfo.get());
printTraversalResults(HORIZONTAL_SCAN_NAME, horizontalScans.get());
}
compareTraversals(treeInfo.get(), horizontalScans.get());
if (pageListsInfo.get() == null)
printErr("No page lists meta info found.");
else
printPagesListsInfo(pageListsInfo.get());
printPageStat("", "\n---These pages types were encountered during sequential scan:", pageClasses);
if (!errors.isEmpty()) {
printErr("---");
printErr("Errors:");
errors.forEach(this::printStackTrace);
}
print("---");
print("Total pages encountered during sequential scan: " + pageClasses.values().stream().mapToLong(a -> a).sum());
print("Total errors occurred during sequential scan: " + errors.size());
if (idxFilter != null)
print("Orphan pages were not reported due to --indexes filter.");
print("Note that some pages can be occupied by meta info, tracking info, etc., so total page count can differ " + "from count of pages found in index trees and page lists.");
if (checkParts) {
Map<Integer, List<Throwable>> checkPartsErrors = checkParts(horizontalScans.get());
print("");
printErrors("", "Partitions check:", "Partitions check detected no errors.", "Errors detected in partition, partId=%s", false, checkPartsErrors);
print("\nPartition check finished, total errors: " + checkPartsErrors.values().stream().mapToInt(List::size).sum() + ", total problem partitions: " + checkPartsErrors.size());
}
}
Aggregations