@Override public long isReady(long tid, Master env) { if (!env.getMergeInfo(tableId).getState().equals(MergeState.NONE)) { return 50; } return 0; }
@Override public void undo(long tid, Master env) throws Exception { // Not sure this is a good thing to do. The Master state engine should be the one to remove it. MergeInfo mergeInfo = env.getMergeInfo(tableId); if (mergeInfo.getState() != MergeState.NONE) log.info("removing merge information {}", mergeInfo); env.clearMergeState(tableId); Utils.unreserveNamespace(env, namespaceId, tid, false); Utils.unreserveTable(env, tableId, tid, true); }
public static void setMerges(IteratorSetting cfg, Collection<MergeInfo> merges) { DataOutputBuffer buffer = new DataOutputBuffer(); try { for (MergeInfo info : merges) { KeyExtent extent = info.getExtent(); if (extent != null && !info.getState().equals(MergeState.NONE)) { info.write(buffer); } } } catch (Exception ex) { throw new RuntimeException(ex); } String encoded = Base64.getEncoder() .encodeToString(Arrays.copyOf(buffer.getData(), buffer.getLength())); cfg.addOption(MERGES_OPTION, encoded); }
private void sendChopRequest(MergeInfo info, TabletState state, TabletLocationState tls) { // Don't bother if we're in the wrong state if (!info.getState().equals(MergeState.WAITING_FOR_CHOPPED)) return; // Tablet must be online if (!state.equals(TabletState.HOSTED)) return; // Tablet isn't already chopped if (tls.chopped) return; // Tablet ranges intersect if (info.needsToBeChopped(tls.extent)) { TServerConnection conn; try { conn = this.master.tserverSet.getConnection(tls.current); if (conn != null) { Master.log.info("Asking {} to chop {}", tls.current, tls.extent); conn.chop(this.master.masterLock, tls.extent); } else { Master.log.warn("Could not connect to server {}", tls.current); } } catch (TException e) { Master.log.warn("Communications error asking tablet server to chop a tablet"); } } }
public MergeStats(MergeInfo info) { this.info = info; if (info.getState().equals(MergeState.NONE)) return; if (info.getExtent().getEndRow() == null) upperSplit = true; if (info.getExtent().getPrevEndRow() == null) lowerSplit = true; }
log.debug("mergeInfo overlaps: {} {}", extent, mergeInfo.overlaps(extent)); if (mergeInfo.overlaps(extent)) { switch (mergeInfo.getState()) { case NONE: case COMPLETE:
public MergeState nextMergeState(AccumuloClient accumuloClient, CurrentState master) throws Exception { MergeState state = info.getState(); if (state == MergeState.NONE) return state;
public static void main(String[] args) throws Exception { ServerUtilOpts opts = new ServerUtilOpts(); opts.parseArgs(MergeStats.class.getName(), args); try (AccumuloClient client = opts.createClient()) { Map<String,String> tableIdMap = client.tableOperations().tableIdMap(); ZooReaderWriter zooReaderWriter = opts.getServerContext().getZooReaderWriter(); for (Entry<String,String> entry : tableIdMap.entrySet()) { final String table = entry.getKey(), tableId = entry.getValue(); String path = ZooUtil.getRoot(client.getInstanceID()) + Constants.ZTABLES + "/" + tableId + "/merge"; MergeInfo info = new MergeInfo(); if (zooReaderWriter.exists(path)) { byte[] data = zooReaderWriter.getData(path, new Stat()); DataInputBuffer in = new DataInputBuffer(); in.reset(data, data.length); info.readFields(in); } System.out.println(String.format("%25s %10s %10s %s", table, info.getState(), info.getOperation(), info.getExtent())); } } } }
private void sendSplitRequest(MergeInfo info, TabletState state, TabletLocationState tls) { if (!info.getState().equals(MergeState.SPLITTING)) return;
@Override public Repo<Master> call(long tid, Master env) throws Exception { if (RootTable.ID.equals(tableId) && Operation.MERGE.equals(op)) { log.warn("Attempt to merge tablets for {} does nothing. It is not splittable.", RootTable.NAME); } Text start = startRow.length == 0 ? null : new Text(startRow); Text end = endRow.length == 0 ? null : new Text(endRow); if (start != null && end != null) if (start.compareTo(end) >= 0) throw new AcceptableThriftTableOperationException(tableId.canonicalID(), null, TableOperation.MERGE, TableOperationExceptionType.BAD_RANGE, "start row must be less than end row"); env.mustBeOnline(tableId); MergeInfo info = env.getMergeInfo(tableId); if (info.getState() == MergeState.NONE) { KeyExtent range = new KeyExtent(tableId, end, start); env.setMergeState(new MergeInfo(range, op), MergeState.STARTED); } return new TableRangeOpWait(namespaceId, tableId); }
public void update(KeyExtent ke, TabletState state, boolean chopped, boolean hasWALs) { if (info.getState().equals(MergeState.NONE)) return; if (!upperSplit && info.getExtent().getEndRow().equals(ke.getPrevEndRow())) { log.info("Upper split found"); upperSplit = true; } if (!lowerSplit && info.getExtent().getPrevEndRow().equals(ke.getEndRow())) { log.info("Lower split found"); lowerSplit = true; } if (!info.overlaps(ke)) return; if (info.needsToBeChopped(ke)) { this.needsToBeChopped++; if (chopped) { if (state.equals(TabletState.HOSTED)) { this.chopped++; } else if (!hasWALs) { this.chopped++; } } } this.total++; if (state.equals(TabletState.HOSTED)) this.hosted++; if (state.equals(TabletState.UNASSIGNED) || state.equals(TabletState.SUSPENDED)) this.unassigned++; }
if (update != stats.getMergeInfo().getState()) { this.master.setMergeState(stats.getMergeInfo(), update);
@Override public long isReady(long tid, Master env) throws Exception { Text tableIdText = new Text(tableId); if (!env.getMergeInfo(tableIdText).getState().equals(MergeState.NONE)) { return 50; } return 0; }
@Override public void undo(long tid, Master env) throws Exception { // Not sure this is a good thing to do. The Master state engine should be the one to remove it. Text tableIdText = new Text(tableId); MergeInfo mergeInfo = env.getMergeInfo(tableIdText); if (mergeInfo.getState() != MergeState.NONE) log.info("removing merge information " + mergeInfo); env.clearMergeState(tableIdText); Utils.unreserveTable(tableId, tid, true); }
@Override public long isReady(long tid, Master env) throws Exception { if (!env.getMergeInfo(tableId).getState().equals(MergeState.NONE)) { return 50; } return 0; }
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); }
@Override public void undo(long tid, Master env) throws Exception { // Not sure this is a good thing to do. The Master state engine should be the one to remove it. MergeInfo mergeInfo = env.getMergeInfo(tableId); if (mergeInfo.getState() != MergeState.NONE) log.info("removing merge information " + mergeInfo); env.clearMergeState(tableId); Utils.unreserveNamespace(namespaceId, tid, false); Utils.unreserveTable(tableId, tid, true); Utils.unreserveNamespace(getNamespaceId(env), tid, false); }
public MergeStats(MergeInfo info) { this.info = info; if (info.getState().equals(MergeState.NONE)) return; if (info.getExtent().getEndRow() == null) upperSplit = true; if (info.getExtent().getPrevEndRow() == null) lowerSplit = true; }
public static void setMerges(IteratorSetting cfg, Collection<MergeInfo> merges) { DataOutputBuffer buffer = new DataOutputBuffer(); try { for (MergeInfo info : merges) { KeyExtent extent = info.getExtent(); if (extent != null && !info.getState().equals(MergeState.NONE)) { info.write(buffer); } } } catch (Exception ex) { throw new RuntimeException(ex); } String encoded = Base64.encodeBase64String(Arrays.copyOf(buffer.getData(), buffer.getLength())); cfg.addOption(MERGES_OPTION, encoded); }
public MergeStats(MergeInfo info) { this.info = info; if (info.getState().equals(MergeState.NONE)) return; if (info.getRange().getEndRow() == null) upperSplit = true; if (info.getRange().getPrevEndRow() == null) lowerSplit = true; }