public KeyExtent getExtent() { if (extent == null) { extent = new KeyExtent(getTableId(), getEndRow(), getPrevEndRow()); } return extent; }
@Override public Stream<Reference> getReferences() { Stream<TabletMetadata> tabletStream = TabletsMetadata.builder().scanTable(tableName) .checkConsistency().fetchDir().fetchFiles().fetchScans().build(getClient()).stream(); Stream<Reference> refStream = tabletStream.flatMap(tm -> { Stream<Reference> refs = Stream.concat(tm.getFiles().stream(), tm.getScans().stream()) .map(f -> new Reference(tm.getTableId(), f, false)); if (tm.getDir() != null) { refs = Stream.concat(refs, Stream.of(new Reference(tm.getTableId(), tm.getDir(), true))); } return refs; }); return refStream; }
@Override public TabletMetadata next() { long sleepTime = 250; TabletMetadata currTablet = null; while (currTablet == null) { TabletMetadata tmp = source.next(); if (prevTablet == null) { if (tmp.sawPrevEndRow()) { currTablet = tmp; } else { log.warn("Tablet has no prev end row " + tmp.getTableId() + " " + tmp.getEndRow()); } } else if (goodTransition(prevTablet, tmp)) { currTablet = tmp; } if (currTablet == null) { sleepUninterruptibly(sleepTime, TimeUnit.MILLISECONDS); resetSource(); sleepTime = Math.min(2 * sleepTime, 5000); } } prevTablet = currTablet; return currTablet; } }
private void resetSource() { if (prevTablet == null) { source = iteratorFactory.apply(range); } else { // get the metadata table row for the previous tablet Text prevMetaRow = TabletsSection.getRow(prevTablet.getTableId(), prevTablet.getEndRow()); // ensure the previous tablet still exists in the metadata table if (Iterators.size(iteratorFactory.apply(new Range(prevMetaRow))) == 0) { throw new TabletDeletedException("Tablet " + prevMetaRow + " was deleted while iterating"); } // start scanning at next possible row in metadata table Range seekRange = new Range(new Key(prevMetaRow).followingKey(PartialKey.ROW), true, range.getEndKey(), range.isEndKeyInclusive()); log.info("Resetting scanner to {}", seekRange); source = iteratorFactory.apply(seekRange); } }
sizes.put(new FileRef(k, fs.getFullPath(tablet.getTableId(), k)), v); });
static boolean goodTransition(TabletMetadata prev, TabletMetadata curr) { if (!curr.sawPrevEndRow()) { log.warn("Tablet {} had no prev end row.", curr.getExtent()); return false; } if (!curr.getTableId().equals(prev.getTableId())) { if (prev.getEndRow() != null) { log.debug("Non-null end row for last tablet in table: " + prev.getExtent() + " " + curr.getExtent()); return false; } if (curr.getPrevEndRow() != null) { log.debug("First tablet for table had prev end row {} {} ", prev.getExtent(), curr.getExtent()); return false; } } else { if (prev.getEndRow() == null) { throw new IllegalStateException("Null end row for tablet in middle of table: " + prev.getExtent() + " " + curr.getExtent()); } if (curr.getPrevEndRow() == null || !prev.getEndRow().equals(curr.getPrevEndRow())) { log.debug("Tablets end row and prev end row not equals {} {} ", prev.getExtent(), curr.getExtent()); return false; } } return true; }