HDFS-1013. Miscellaneous improvements to HTML markup for web UIs. Contributed by Eugene Koontz.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1342102 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
cf7b017422
commit
14bf2d4357
@ -203,6 +203,9 @@ Release 2.0.1-alpha - UNRELEASED
|
||||
HDFS-3454. Balancer unconditionally logs InterruptedException at
|
||||
INFO level on shutdown if security is enabled. (eli)
|
||||
|
||||
HDFS-1013. Miscellaneous improvements to HTML markup for web UIs
|
||||
(Eugene Koontz via todd)
|
||||
|
||||
OPTIMIZATIONS
|
||||
|
||||
HDFS-2982. Startup performance suffers when there are many edit log
|
||||
|
@ -438,9 +438,9 @@ public static int string2ChunkSizeToView(String s, int defaultValue) {
|
||||
|
||||
/** Return a table containing version information. */
|
||||
public static String getVersionTable() {
|
||||
return "<div id='dfstable'><table>"
|
||||
+ "\n <tr><td id='col1'>Version:</td><td>" + VersionInfo.getVersion() + ", " + VersionInfo.getRevision()
|
||||
+ "\n <tr><td id='col1'>Compiled:</td><td>" + VersionInfo.getDate() + " by " + VersionInfo.getUser() + " from " + VersionInfo.getBranch()
|
||||
return "<div class='dfstable'><table>"
|
||||
+ "\n <tr><td class='col1'>Version:</td><td>" + VersionInfo.getVersion() + ", " + VersionInfo.getRevision() + "</td></tr>"
|
||||
+ "\n <tr><td class='col1'>Compiled:</td><td>" + VersionInfo.getDate() + " by " + VersionInfo.getUser() + " from " + VersionInfo.getBranch() + "</td></tr>"
|
||||
+ "\n</table></div>";
|
||||
}
|
||||
|
||||
|
@ -67,16 +67,16 @@ static String getSafeModeText(FSNamesystem fsn) {
|
||||
return "";
|
||||
return "Safe mode is ON. <em>" + fsn.getSafeModeTip() + "</em><br>";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns security mode of the cluster (namenode)
|
||||
* @return "on" if security is on, and "off" otherwise
|
||||
*/
|
||||
static String getSecurityModeText() {
|
||||
static String getSecurityModeText() {
|
||||
if(UserGroupInformation.isSecurityEnabled()) {
|
||||
return "Security is <em>ON</em> <br>";
|
||||
return "<div class=\"security\">Security is <em>ON</em></div>";
|
||||
} else {
|
||||
return "Security is <em>OFF</em> <br>";
|
||||
return "<div class=\"security\">Security is <em>OFF</em></div>";
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,22 +99,22 @@ static String getInodeLimitText(FSNamesystem fsn) {
|
||||
long used = (totalMemory * 100) / commitedMemory;
|
||||
long usedNonHeap = (totalNonHeap * 100) / commitedNonHeap;
|
||||
|
||||
String str = inodes + " files and directories, " + blocks + " blocks = "
|
||||
String str = "<div>" + inodes + " files and directories, " + blocks + " blocks = "
|
||||
+ (inodes + blocks) + " total";
|
||||
if (maxobjects != 0) {
|
||||
long pct = ((inodes + blocks) * 100) / maxobjects;
|
||||
str += " / " + maxobjects + " (" + pct + "%)";
|
||||
}
|
||||
str += ".<br>";
|
||||
str += "Heap Memory used " + StringUtils.byteDesc(totalMemory) + " is "
|
||||
+ " " + used + "% of Commited Heap Memory "
|
||||
str += ".</div>";
|
||||
str += "<div>Heap Memory used " + StringUtils.byteDesc(totalMemory) + " is "
|
||||
+ " " + used + "% of Commited Heap Memory "
|
||||
+ StringUtils.byteDesc(commitedMemory)
|
||||
+ ". Max Heap Memory is " + StringUtils.byteDesc(maxMemory) +
|
||||
". <br>";
|
||||
str += "Non Heap Memory used " + StringUtils.byteDesc(totalNonHeap) + " is"
|
||||
". </div>";
|
||||
str += "<div>Non Heap Memory used " + StringUtils.byteDesc(totalNonHeap) + " is"
|
||||
+ " " + usedNonHeap + "% of " + " Commited Non Heap Memory "
|
||||
+ StringUtils.byteDesc(commitedNonHeap) + ". Max Non Heap Memory is "
|
||||
+ StringUtils.byteDesc(maxNonHeap) + ".<br>";
|
||||
+ StringUtils.byteDesc(maxNonHeap) + ".</div>";
|
||||
return str;
|
||||
}
|
||||
|
||||
@ -133,19 +133,17 @@ static String getUpgradeStatusText(FSNamesystem fsn) {
|
||||
|
||||
/** Return a table containing version information. */
|
||||
static String getVersionTable(FSNamesystem fsn) {
|
||||
return "<div id='dfstable'><table>"
|
||||
+ "\n <tr><td id='col1'>Started:</td><td>" + fsn.getStartTime()
|
||||
+ "</td></tr>\n" + "\n <tr><td id='col1'>Version:</td><td>"
|
||||
return "<div class='dfstable'><table>"
|
||||
+ "\n <tr><td class='col1'>Started:</td><td>" + fsn.getStartTime()
|
||||
+ "</td></tr>\n" + "\n <tr><td class='col1'>Version:</td><td>"
|
||||
+ VersionInfo.getVersion() + ", " + VersionInfo.getRevision()
|
||||
+ "\n <tr><td id='col1'>Compiled:</td><td>" + VersionInfo.getDate()
|
||||
+ "</td></tr>\n" + "\n <tr><td class='col1'>Compiled:</td><td>" + VersionInfo.getDate()
|
||||
+ " by " + VersionInfo.getUser() + " from " + VersionInfo.getBranch()
|
||||
+ "\n <tr><td id='col1'>Upgrades:</td><td>"
|
||||
+ getUpgradeStatusText(fsn)
|
||||
+ "\n <tr><td id='col1'>Cluster ID:</td><td>" + fsn.getClusterId()
|
||||
+ "</td></tr>\n"
|
||||
+ "\n <tr><td id='col1'>Block Pool ID:</td><td>" + fsn.getBlockPoolId()
|
||||
+ "</td></tr>\n"
|
||||
+ "\n</table></div>";
|
||||
+ "</td></tr>\n <tr><td class='col1'>Upgrades:</td><td>"
|
||||
+ getUpgradeStatusText(fsn)
|
||||
+ "</td></tr>\n <tr><td class='col1'>Cluster ID:</td><td>" + fsn.getClusterId()
|
||||
+ "</td></tr>\n <tr><td class='col1'>Block Pool ID:</td><td>" + fsn.getBlockPoolId()
|
||||
+ "</td></tr>\n</table></div>";
|
||||
}
|
||||
|
||||
/**
|
||||
@ -157,14 +155,15 @@ static String getCorruptFilesWarning(FSNamesystem fsn) {
|
||||
if (missingBlocks > 0) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
// Warning class is typically displayed in RED
|
||||
result.append("<br/><a class=\"warning\" href=\"/corrupt_files.jsp\" title=\"List corrupt files\">\n");
|
||||
// Warning class is typically displayed in RED.
|
||||
result.append("<div>"); // opening tag of outer <div>.
|
||||
result.append("<a class=\"warning\" href=\"/corrupt_files.jsp\" title=\"List corrupt files\">\n");
|
||||
result.append("<b>WARNING : There are " + missingBlocks
|
||||
+ " missing blocks. Please check the logs or run fsck in order to identify the missing blocks.</b>");
|
||||
result.append("</a>");
|
||||
|
||||
result.append("<br/><div class=\"small\">See the Hadoop FAQ for common causes and potential solutions.");
|
||||
result.append("<br/><br/>\n");
|
||||
result.append("<div class=\"small\">See the Hadoop FAQ for common causes and potential solutions.</div>");
|
||||
result.append("</div>\n"); // closing tag of outer <div>.
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
@ -205,11 +204,11 @@ void generateConfReport(JspWriter out, NameNode nn,
|
||||
|
||||
// FS Image storage configuration
|
||||
out.print("<h3> " + nn.getRole() + " Storage: </h3>");
|
||||
out.print("<div id=\"dfstable\"> <table border=1 cellpadding=10 cellspacing=0 title=\"NameNode Storage\">\n"
|
||||
out.print("<div class=\"dfstable\"> <table class=\"storage\" title=\"NameNode Storage\">\n"
|
||||
+ "<thead><tr><td><b>Storage Directory</b></td><td><b>Type</b></td><td><b>State</b></td></tr></thead>");
|
||||
|
||||
StorageDirectory st = null;
|
||||
for (Iterator<StorageDirectory> it
|
||||
for (Iterator<StorageDirectory> it
|
||||
= fsImage.getStorage().dirIterator(); it.hasNext();) {
|
||||
st = it.next();
|
||||
String dir = "" + st.getRoot();
|
||||
@ -224,10 +223,10 @@ void generateConfReport(JspWriter out, NameNode nn,
|
||||
String dir = "" + st.getRoot();
|
||||
String type = "" + st.getStorageDirType();
|
||||
out.print("<tr><td>" + dir + "</td><td>" + type
|
||||
+ "</td><td><font color=red>Failed</font></td></tr>");
|
||||
+ "</td><td><span class=\"failed\">Failed</span></td></tr>");
|
||||
}
|
||||
|
||||
out.print("</table></div><br>\n");
|
||||
out.print("</table></div>\n");
|
||||
}
|
||||
|
||||
void generateHealthReport(JspWriter out, NameNode nn,
|
||||
@ -320,7 +319,7 @@ void generateHealthReport(JspWriter out, NameNode nn,
|
||||
+ "Number of Under-Replicated Blocks" + colTxt() + ":" + colTxt()
|
||||
+ fsn.getBlockManager().getUnderReplicatedNotMissingBlocks();
|
||||
}
|
||||
out.print("<div id=\"dfstable\"> <table>\n" + rowTxt() + colTxt()
|
||||
out.print("<div class=\"dfstable\"> <table>\n" + rowTxt() + colTxt()
|
||||
+ "Configured Capacity" + colTxt() + ":" + colTxt()
|
||||
+ StringUtils.byteDesc(total) + rowTxt() + colTxt() + "DFS Used"
|
||||
+ colTxt() + ":" + colTxt() + StringUtils.byteDesc(used) + rowTxt()
|
||||
@ -359,7 +358,7 @@ void generateHealthReport(JspWriter out, NameNode nn,
|
||||
+ "</table></div><br>\n");
|
||||
|
||||
if (live.isEmpty() && dead.isEmpty()) {
|
||||
out.print("There are no datanodes in the cluster");
|
||||
out.print("There are no datanodes in the cluster.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -633,7 +632,7 @@ void generateNodesList(ServletContext context, JspWriter out,
|
||||
if (whatNodes.equals("LIVE")) {
|
||||
out.print("<a name=\"LiveNodes\" id=\"title\">" + "Live Datanodes : "
|
||||
+ live.size() + "</a>"
|
||||
+ "<br><br>\n<table border=1 cellspacing=0>\n");
|
||||
+ "<br><br>\n<table class=\"nodes\">\n");
|
||||
|
||||
counterReset();
|
||||
|
||||
|
@ -39,10 +39,10 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="/static/hadoop.css">
|
||||
<title>Hadoop <%=namenodeRole%> <%=namenodeLabel%></title>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<h1><%=namenodeRole%> '<%=namenodeLabel%>' (<%=namenodeState%>)</h1>
|
||||
<%= NamenodeJspHelper.getVersionTable(fsn) %>
|
||||
|
@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
body {
|
||||
background-color : #ffffff;
|
||||
font-family : sans-serif;
|
||||
}
|
||||
|
||||
.small {
|
||||
font-size : smaller;
|
||||
}
|
||||
|
||||
div#dfsnodetable tr#row1, div.dfstable td.col1 {
|
||||
font-weight : bolder;
|
||||
}
|
||||
|
||||
div.dfstable th {
|
||||
text-align:left;
|
||||
vertical-align : top;
|
||||
}
|
||||
|
||||
div.dfstable td#col3 {
|
||||
text-align : right;
|
||||
}
|
||||
|
||||
div#dfsnodetable caption {
|
||||
text-align : left;
|
||||
}
|
||||
|
||||
div#dfsnodetable a#title {
|
||||
font-size : larger;
|
||||
font-weight : bolder;
|
||||
}
|
||||
|
||||
div#dfsnodetable td, th {
|
||||
border-bottom-style : none;
|
||||
padding-bottom : 4px;
|
||||
padding-top : 4px;
|
||||
}
|
||||
|
||||
div#dfsnodetable A:link, A:visited {
|
||||
text-decoration : none;
|
||||
}
|
||||
|
||||
div#dfsnodetable th.header, th.headerASC, th.headerDSC {
|
||||
padding-bottom : 8px;
|
||||
padding-top : 8px;
|
||||
}
|
||||
div#dfsnodetable th.header:hover, th.headerASC:hover, th.headerDSC:hover,
|
||||
td.name:hover {
|
||||
text-decoration : underline;
|
||||
cursor : pointer;
|
||||
}
|
||||
|
||||
div#dfsnodetable td.blocks, td.size, td.pcused, td.adminstate, td.lastcontact {
|
||||
text-align : right;
|
||||
}
|
||||
|
||||
div#dfsnodetable .rowNormal .header {
|
||||
background-color : #ffffff;
|
||||
}
|
||||
div#dfsnodetable .rowAlt, .headerASC, .headerDSC {
|
||||
background-color : lightyellow;
|
||||
}
|
||||
|
||||
.warning {
|
||||
font-weight : bolder;
|
||||
color : red;
|
||||
}
|
||||
|
||||
div.dfstable table {
|
||||
white-space : pre;
|
||||
}
|
||||
|
||||
table.storage, table.nodes {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
table.storage td {
|
||||
padding:10px;
|
||||
border:1px solid black;
|
||||
}
|
||||
|
||||
table.nodes td {
|
||||
padding:0px;
|
||||
border:1px solid black;
|
||||
}
|
||||
|
||||
div#dfsnodetable td, div#dfsnodetable th, div.dfstable td {
|
||||
padding-left : 10px;
|
||||
padding-right : 10px;
|
||||
}
|
||||
|
||||
td.perc_filled {
|
||||
background-color:#AAAAFF;
|
||||
}
|
||||
|
||||
td.perc_nonfilled {
|
||||
background-color:#FFFFFF;
|
||||
}
|
||||
|
||||
line.taskgraphline {
|
||||
stroke-width:1;stroke-linecap:round;
|
||||
}
|
||||
|
||||
#quicklinks {
|
||||
margin: 0;
|
||||
padding: 2px 4px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
text-align: right;
|
||||
background-color: #eee;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#quicklinks ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
#quicklinks ul {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#quicklinks a {
|
||||
font-size: smaller;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#quicklinks ul a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
span.failed {
|
||||
color:red;
|
||||
}
|
||||
|
||||
div.security {
|
||||
width:100%;
|
||||
}
|
Loading…
Reference in New Issue
Block a user