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/branches/branch-2@1342103 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Todd Lipcon 2012-05-24 00:27:57 +00:00
parent 897314775b
commit b36a80a731
5 changed files with 197 additions and 38 deletions

View File

@ -57,6 +57,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

View File

@ -438,9 +438,9 @@ public class JspHelper {
/** 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>";
}

View File

@ -67,16 +67,16 @@ class NamenodeJspHelper {
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 @@ class NamenodeJspHelper {
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 @@ class NamenodeJspHelper {
/** 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 @@ class NamenodeJspHelper {
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 @@ class NamenodeJspHelper {
// 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 @@ class NamenodeJspHelper {
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 @@ class NamenodeJspHelper {
+ "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 @@ class NamenodeJspHelper {
+ "</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 @@ class NamenodeJspHelper {
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();

View File

@ -39,10 +39,10 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/static/hadoop.css">
<title>Hadoop <%=namenodeRole%>&nbsp;<%=namenodeLabel%></title>
</head>
<body>
<h1><%=namenodeRole%> '<%=namenodeLabel%>' (<%=namenodeState%>)</h1>
<%= NamenodeJspHelper.getVersionTable(fsn) %>

View File

@ -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%;
}