/** * Increment number of safe blocks if current block has * reached minimal replication. * @param replication current replication */ private synchronized void incrementSafeBlockCount(short replication) { if (replication == safeReplication) { this.blockSafe++; // Report startup progress only if we haven't completed startup yet. StartupProgress prog = NameNode.getStartupProgress(); if (prog.getStatus(Phase.SAFEMODE) != Status.COMPLETE) { if (this.awaitingReportedBlocksCounter == null) { this.awaitingReportedBlocksCounter = prog.getCounter(Phase.SAFEMODE, STEP_AWAITING_REPORTED_BLOCKS); } this.awaitingReportedBlocksCounter.increment(); } checkMode(); } }
/** * Prints one line of content for a phase in the Startup Progress report. * * @param fout FormattedWriter to receive output * @param view StartupProgressView containing information to print * @param phase Phase to print * @throws IOException thrown if there is an I/O error */ private void printPhase(FormattedWriter fout, StartupProgressView view, Phase phase) throws IOException { StringBuilder phaseLine = new StringBuilder(); phaseLine.append(phase.getDescription()); String file = view.getFile(phase); if (file != null) { phaseLine.append(" ").append(file); } long size = view.getSize(phase); if (size != Long.MIN_VALUE) { phaseLine.append(" (").append(StringUtils.byteDesc(size)).append(")"); } fout.println("<td class=\"startupdesc\">%s</td>", phaseLine.toString()); fout.println("<td>%s</td>", StringUtils.formatPercent( view.getPercentComplete(phase), 2)); fout.println("<td>%s</td>", view.getStatus(phase) == Status.PENDING ? "" : StringUtils.formatTime(view.getElapsedTime(phase))); }
/** * Prints one line of content for a step in the Startup Progress report. * * @param fout FormattedWriter to receive output * @param view StartupProgressView containing information to print * @param phase Phase to print * @param step Step to print * @throws IOException thrown if there is an I/O error */ private void printStep(FormattedWriter fout, StartupProgressView view, Phase phase, Step step) throws IOException { StringBuilder stepLine = new StringBuilder(); String file = step.getFile(); if (file != null) { stepLine.append(file); } long size = step.getSize(); if (size != Long.MIN_VALUE) { stepLine.append(" (").append(StringUtils.byteDesc(size)).append(")"); } StepType type = step.getType(); if (type != null) { stepLine.append(" ").append(type.getDescription()); } fout.println("<td class=\"startupdesc\">%s (%d/%d)</td>", stepLine.toString(), view.getCount(phase, step), view.getTotal(phase, step)); fout.println("<td>%s</td>", StringUtils.formatPercent( view.getPercentComplete(phase), 2)); fout.println("<td>%s</td>", view.getStatus(phase) == Status.PENDING ? "" : StringUtils.formatTime(view.getElapsedTime(phase))); }
/** * Leave safe mode. * <p> * Check for invalid, under- & over-replicated blocks in the end of startup. */ private synchronized void leave() { // if not done yet, initialize replication queues. // In the standby, do not populate repl queues if (!isPopulatingReplQueues() && shouldPopulateReplQueues()) { initializeReplQueues(); } long timeInSafemode = now() - startTime; NameNode.stateChangeLog.info("STATE* Leaving safe mode after " + timeInSafemode/1000 + " secs"); NameNode.getNameNodeMetrics().setSafeModeTime((int) timeInSafemode); //Log the following only once (when transitioning from ON -> OFF) if (reached >= 0) { NameNode.stateChangeLog.info("STATE* Safe mode is OFF"); } reached = -1; reachedTimestamp = -1; safeMode = null; final NetworkTopology nt = blockManager.getDatanodeManager().getNetworkTopology(); NameNode.stateChangeLog.info("STATE* Network topology has " + nt.getNumOfRacks() + " racks and " + nt.getNumOfLeaves() + " datanodes"); NameNode.stateChangeLog.info("STATE* UnderReplicatedBlocks has " + blockManager.numOfUnderReplicatedBlocks() + " blocks"); startSecretManagerIfNecessary(); // If startup has not yet completed, end safemode phase. StartupProgress prog = NameNode.getStartupProgress(); if (prog.getStatus(Phase.SAFEMODE) != Status.COMPLETE) { prog.endStep(Phase.SAFEMODE, STEP_AWAITING_REPORTED_BLOCKS); prog.endPhase(Phase.SAFEMODE); } }
/** * Leave safe mode. * <p> * Check for invalid, under- & over-replicated blocks in the end of startup. */ private synchronized void leave() { // if not done yet, initialize replication queues. // In the standby, do not populate repl queues if (!isPopulatingReplQueues() && shouldPopulateReplQueues()) { initializeReplQueues(); } long timeInSafemode = now() - startTime; NameNode.stateChangeLog.info("STATE* Leaving safe mode after " + timeInSafemode/1000 + " secs"); NameNode.getNameNodeMetrics().setSafeModeTime((int) timeInSafemode); //Log the following only once (when transitioning from ON -> OFF) if (reached >= 0) { NameNode.stateChangeLog.info("STATE* Safe mode is OFF"); } reached = -1; safeMode = null; final NetworkTopology nt = blockManager.getDatanodeManager().getNetworkTopology(); NameNode.stateChangeLog.info("STATE* Network topology has " + nt.getNumOfRacks() + " racks and " + nt.getNumOfLeaves() + " datanodes"); NameNode.stateChangeLog.info("STATE* UnderReplicatedBlocks has " + blockManager.numOfUnderReplicatedBlocks() + " blocks"); startSecretManagerIfNecessary(); // If startup has not yet completed, end safemode phase. StartupProgress prog = NameNode.getStartupProgress(); if (prog.getStatus(Phase.SAFEMODE) != Status.COMPLETE) { prog.endStep(Phase.SAFEMODE, STEP_AWAITING_REPORTED_BLOCKS); prog.endPhase(Phase.SAFEMODE); } }
/** * Generates the Startup Progress report. * * @param out JspWriter to receive output * @param prog StartupProgress tracking NameNode startup progress * @throws IOException thrown if there is an I/O error */ void generateStartupProgress(JspWriter out, StartupProgress prog) throws IOException { StartupProgressView view = prog.createView(); FormattedWriter fout = new FormattedWriter(out); fout.println("<div id=\"startupprogress\">"); fout.println("<div><span>Elapsed Time:</span> %s</div>", StringUtils.formatTime(view.getElapsedTime())); fout.println("<div><span>Percent Complete:</span> %s</div>", StringUtils.formatPercent(view.getPercentComplete(), 2)); fout.println("<table>"); fout.println("<tr>"); fout.println("<th>Phase</th>"); fout.println("<th>Completion</th>"); fout.println("<th>Elapsed Time</th>"); fout.println("</tr>"); for (Phase phase: view.getPhases()) { final String timeClass; Status status = view.getStatus(phase); if (status == Status.PENDING) { timeClass = "later"; } else if (status == Status.RUNNING) { timeClass = "current"; } else { timeClass = "prior"; } fout.println("<tr class=\"phase %s\">", timeClass); printPhase(fout, view, phase); fout.println("</tr>"); for (Step step: view.getSteps(phase)) { fout.println("<tr class=\"step %s\">", timeClass); printStep(fout, view, phase, step); fout.println("</tr>"); } } fout.println("</table>"); fout.println("</div>"); }