return state; if (total == 0) { log.trace("failed to see any tablets for this range, ignoring " + info.getRange()); return state; log.info("Computing next merge state for " + info.getRange() + " which is presently " + state + " isDelete : " + info.isDelete()); if (state == MergeState.STARTED) { state = MergeState.SPLITTING; log.info(hosted + " are hosted, total " + total); if (!info.isDelete() && total == 1) { log.info("Merge range is already contained in a single tablet " + info.getRange()); state = MergeState.COMPLETE; } else if (hosted == total) { if (info.isDelete()) { if (!lowerSplit) log.info("Waiting for " + info + " lower split to occur " + info.getRange()); else if (!upperSplit) log.info("Waiting for " + info + " upper split to occur " + info.getRange()); else state = MergeState.WAITING_FOR_CHOPPED; log.info("Waiting for " + hosted + " hosted tablets to be " + total + " " + info.getRange()); log.info(chopped + " tablets are chopped " + info.getRange()); if (chopped == needsToBeChopped) { state = MergeState.WAITING_FOR_OFFLINE; } else { log.info("Waiting for " + chopped + " chopped tablets to be " + needsToBeChopped + " " + info.getRange());
public static void setMerges(IteratorSetting cfg, Collection<MergeInfo> merges) { DataOutputBuffer buffer = new DataOutputBuffer(); try { for (MergeInfo info : merges) { KeyExtent extent = info.getRange(); if (extent != null && !info.getState().equals(MergeState.NONE)) { info.write(buffer); } } } catch (Exception ex) { throw new RuntimeException(ex); } String encoded = new String(Base64.encodeBase64(Arrays.copyOf(buffer.getData(), buffer.getLength())), UTF_8); cfg.addOption(MERGES_OPTION, encoded); }
if (info.getState().equals(MergeState.NONE)) return; if (!upperSplit && info.getRange().getEndRow().equals(ke.getPrevEndRow())) { log.info("Upper split found"); upperSplit = true; if (!lowerSplit && info.getRange().getPrevEndRow().equals(ke.getEndRow())) { log.info("Lower split found"); lowerSplit = true;
public void setMergeState(MergeInfo info, MergeState state) throws IOException, KeeperException, InterruptedException { synchronized (mergeLock) { String path = ZooUtil.getRoot(instance.getInstanceID()) + Constants.ZTABLES + "/" + info.getRange().getTableId().toString() + "/merge"; info.setState(state); if (state.equals(MergeState.NONE)) { ZooReaderWriter.getInstance().recursiveDelete(path, NodeMissingPolicy.SKIP); } else { DataOutputBuffer out = new DataOutputBuffer(); try { info.write(out); } catch (IOException ex) { throw new RuntimeException("Unlikely", ex); } ZooReaderWriter.getInstance().putPersistentData(path, out.getData(), state.equals(MergeState.STARTED) ? ZooUtil.NodeExistsPolicy.FAIL : ZooUtil.NodeExistsPolicy.OVERWRITE); } mergeLock.notifyAll(); } nextEvent.event("Merge state of %s set to %s", info.getRange(), state); }
return; KeyExtent range = info.getRange(); if (tls.extent.overlaps(range)) { for (Text splitPoint : new Text[] {range.getPrevEndRow(), range.getEndRow()}) {
if (mergeInfo.getRange() != null) { log.debug("mergeInfo overlaps: " + extent + " " + mergeInfo.overlaps(extent)); if (mergeInfo.overlaps(extent)) {
Scanner scanner = connector.createScanner(Constants.METADATA_TABLE_NAME, Constants.NO_AUTHS); MetaDataTableScanner.configureScanner(scanner, master); KeyExtent extent = info.getRange(); Text start = extent.getPrevEndRow(); if (start == null) {
private void updateMergeState(Map<Text,MergeStats> mergeStatsCache) { for (MergeStats stats : mergeStatsCache.values()) { try { MergeState update = stats.nextMergeState(getConnector(), Master.this); // when next state is MERGING, its important to persist this before // starting the merge... the verification check that is done before // moving into the merging state could fail if merge starts but does // not finish if (update == MergeState.COMPLETE) update = MergeState.NONE; if (update != stats.getMergeInfo().getState()) { setMergeState(stats.getMergeInfo(), update); } if (update == MergeState.MERGING) { try { if (stats.getMergeInfo().isDelete()) { deleteTablets(stats.getMergeInfo()); } else { mergeMetadataRecords(stats.getMergeInfo()); } setMergeState(stats.getMergeInfo(), update = MergeState.COMPLETE); } catch (Exception ex) { log.error("Unable merge metadata table records", ex); } } } catch (Exception ex) { log.error("Unable to update merge state for merge " + stats.getMergeInfo().getRange(), ex); } } }
private void deleteTablets(MergeInfo info) throws AccumuloException { KeyExtent range = info.getRange(); log.debug("Deleting tablets for " + range); char timeType = '\0';
private void mergeMetadataRecords(MergeInfo info) throws AccumuloException { KeyExtent range = info.getRange(); log.debug("Merging metadata for " + range); KeyExtent stop = getHighTablet(range);