diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon index 23330096cf39..d837b8504623 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.jamon @@ -299,7 +299,12 @@ $(document).ready(function() type: "numeric" }); - $("#baseStatsTable").tablesorter(); + $("#baseStatsTable").tablesorter({ + headers: { + 1: {empty: 'emptyMin'}, + 2: {empty: 'emptyMax'} + } + }); $("#requestStatsTable").tablesorter({ headers: { 1: {sorter: 'separator'}, diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp index 56a0c8096d32..fdec6849de0a 100644 --- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp @@ -93,7 +93,7 @@ * its region server. * @return an anchor tag if one can be built, {@code null} otherwise. */ - private static String buildRegionServerLink(final ServerName serverName, final int rsInfoPort, + private static String buildRegionLink(final ServerName serverName, final int rsInfoPort, final RegionInfo regionInfo, final RegionState.State regionState) { if (serverName == null || regionInfo == null) { return null; } @@ -107,15 +107,74 @@ + "?name=" + regionInfo.getEncodedName(); return "" + serverName.getServerName() + ""; } + + /** + * Render an tag contents server name which the given region deploys. + * Links to the server rs-status page. + * not deployed instead if can not find the deploy message. + * @return an tag contents server name links to server rs-status page. + */ + private static String buildRegionDeployedServerTag(RegionInfo regionInfo, HMaster master, + Map regionsToServer) { + ServerName serverName = regionsToServer.get(regionInfo); + + if (serverName == null) { + return "not deployed"; + } + + String hostName = serverName.getHostname(); + String hostNameEncoded = URLEncoder.encode(hostName); + // This port might be wrong if RS actually ended up using something else. + int serverInfoPort = master.getRegionServerInfoPort(serverName); + String urlRegionServer = "//" + hostNameEncoded + ":" + serverInfoPort + "/rs-status"; + + return "" + StringEscapeUtils.escapeHtml4(hostName) + + ":" + serverInfoPort + ""; + } + + /** + * @return an

tag guide user to see all region messages. + */ + private static String moreRegionsToRender(int numRegionsRendered, int numRegions, String fqtn) { + if (numRegions > numRegionsRendered) { + String allRegionsUrl = "?name=" + URLEncoder.encode(fqtn) + "&numRegions=all"; + + return "This table has " + numRegions + + " regions in total, in order to improve the page load time, only " + + numRegionsRendered + " regions are displayed here, click here to see all regions.

"; + } + return ""; + } %> + + + + + <% final String ZEROMB = "0 MB"; HMaster master = (HMaster)getServletContext().getAttribute(HMaster.MASTER); Configuration conf = master.getConfiguration(); String fqtn = request.getParameter("name"); + // handle the case for fqtn is null or master is not initialized with error message + redirect + if (fqtn == null || !master.isInitialized()) { +%> +
+
+ +
+


+ +

+<% return; + } %> + +<% final String escaped_fqtn = StringEscapeUtils.escapeHtml4(fqtn); - Table table; - boolean withReplica = false; + Table table = master.getConnection().getTable(TableName.valueOf(fqtn)); boolean showFragmentation = conf.getBoolean("hbase.master.ui.fragmentation.enabled", false); boolean readOnly = !InfoServer.canUserModifyUI(request, getServletContext(), conf); int numMetaReplicas = @@ -162,35 +221,36 @@ final MetaBrowser metaBrowser = new MetaBrowser(connection, request); %> - - - - -<% - if (fqtn != null && master.isInitialized()) { - try { - table = master.getConnection().getTable(TableName.valueOf(fqtn)); - if (table.getTableDescriptor().getRegionReplication() > 1) { - withReplica = true; - } - if ( !readOnly && action != null ) { -%> -
-
- -


- <% - if (action.equals("split")) { +<% return; + } %> + +<% // table split/compact/merge actions + if ( !readOnly && action != null ) { %> +

+
+ +
+


+<% if (action.equals("split")) { if (key != null && key.length() > 0) { admin.split(TableName.valueOf(fqtn), Bytes.toBytes(key)); } else { admin.split(TableName.valueOf(fqtn)); } - - %> Split request accepted. <% +%> Split request accepted. <% } else if (action.equals("major compact")) { if (key != null && key.length() > 0) { List regions = admin.getRegions(TableName.valueOf(fqtn)).get(); @@ -203,7 +263,7 @@ } else { admin.majorCompact(TableName.valueOf(fqtn)); } - %> major Compact request accepted. <% +%> major Compact request accepted. <% } else if (action.equals("compact")) { if (key != null && key.length() > 0) { List regions = admin.getRegions(TableName.valueOf(fqtn)).get(); @@ -217,246 +277,232 @@ } else { admin.compact(TableName.valueOf(fqtn)); } - %> Compact request accepted. <% +%> Compact request accepted. <% } else if (action.equals("merge")) { - if (left != null && left.length() > 0 && right != null && right.length() > 0) { - admin.mergeRegions(Bytes.toBytesBinary(left), Bytes.toBytesBinary(right), false); - } - %> Merge request accepted. <% - } -%> - -

-<% -} else { -%> -
-
- +<% return; + } %> + +
+
+ -
- <% - if(fqtn.equals(TableName.META_TABLE_NAME.getNameAsString())) { - %> -

Table Regions

-
- -
-
- - - - - - - - - - - - - - <% - if (withReplica) { - %> - - <% - } - %> - - - - <% - // NOTE: Presumes meta with one or more replicas - for (int j = 0; j < numMetaReplicas; j++) { - RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( + + +
+<% //Meta table. + if(fqtn.equals(TableName.META_TABLE_NAME.getNameAsString())) { %> +

Table Regions

+
+ + +
+
+
NameRegion ServerReadRequestsWriteRequestsUncompressed StoreFileSizeStorefileSizeNum.StorefilesMemSizeStart KeyEnd KeyReplicaID
+ + + + + + + + + + + + + + + + + <% + // NOTE: Presumes meta with one or more replicas + for (int j = 0; j < numMetaReplicas; j++) { + RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( RegionInfoBuilder.FIRST_META_REGIONINFO, j); - //If a metaLocation is null, All of its info would be empty here to be displayed. - RegionStateNode rsn = master.getAssignmentManager().getRegionStates() - .getRegionStateNode(meta); - ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; - for (int i = 0; i < 1; i++) { - //If metaLocation is null, default value below would be displayed in UI. - String hostAndPort = ""; - String readReq = "N/A"; - String writeReq = "N/A"; - String fileSizeUncompressed = ZEROMB; - String fileSize = ZEROMB; - String fileCount = "N/A"; - String memSize = ZEROMB; - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { - RegionMetrics load = map.get(meta.getRegionName()); - readReq = String.format("%,1d", load.getReadRequestCount()); - writeReq = String.format("%,1d", load.getWriteRequestCount()); - double rSize = load.getStoreFileSize().get(Size.Unit.BYTE); - if (rSize > 0) { - fileSize = StringUtils.byteDesc((long) rSize); - } - double rSizeUncompressed = load.getUncompressedStoreFileSize().get(Size.Unit.BYTE); - if (rSizeUncompressed > 0) { - fileSizeUncompressed = StringUtils.byteDesc((long) rSizeUncompressed); - } - fileCount = String.format("%,1d", load.getStoreFileCount()); - double mSize = load.getMemStoreSize().get(Size.Unit.BYTE); - if (mSize > 0) { - memSize = StringUtils.byteDesc((long)mSize); - } - } + //If a metaLocation is null, All of its info would be empty here to be displayed. + RegionStateNode rsn = master.getAssignmentManager().getRegionStates() + .getRegionStateNode(meta); + ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; + for (int i = 0; i < 1; i++) { + //If metaLocation is null, default value below would be displayed in UI. + String hostAndPort = ""; + String readReq = "N/A"; + String writeReq = "N/A"; + String fileSizeUncompressed = ZEROMB; + String fileSize = ZEROMB; + String fileCount = "N/A"; + String memSize = ZEROMB; + + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); + // The host name portion should be safe, but I don't know how we handle IDNs so err on the side of failing safely. + hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { + RegionMetrics load = map.get(meta.getRegionName()); + readReq = String.format("%,1d", load.getReadRequestCount()); + writeReq = String.format("%,1d", load.getWriteRequestCount()); + double rSize = load.getStoreFileSize().get(Size.Unit.BYTE); + if (rSize > 0) { + fileSize = StringUtils.byteDesc((long) rSize); + } + double rSizeUncompressed = load.getUncompressedStoreFileSize().get(Size.Unit.BYTE); + if (rSizeUncompressed > 0) { + fileSizeUncompressed = StringUtils.byteDesc((long) rSizeUncompressed); + } + fileCount = String.format("%,1d", load.getStoreFileCount()); + double mSize = load.getMemStoreSize().get(Size.Unit.BYTE); + if (mSize > 0) { + memSize = StringUtils.byteDesc((long)mSize); } } - %> - - - - - - - - - - - - <% - if (withReplica) { - %> - - <% } - %> - - <% } %> - <%} %> - -
NameRegion ServerReadRequestsWriteRequestsUncompressed StoreFileSizeStorefileSizeNum.StorefilesMemSizeStart KeyEnd KeyReplicaID
<%= escapeXml(meta.getRegionNameAsString()) %><%= StringEscapeUtils.escapeHtml4(hostAndPort) %><%= readReq%><%= writeReq%><%= fileSizeUncompressed%><%= fileSize%><%= fileCount%><%= memSize%><%= escapeXml(Bytes.toString(meta.getStartKey())) %><%= escapeXml(Bytes.toString(meta.getEndKey())) %><%= meta.getReplicaId() %>
-
-
- - - - - - - - - - - <% - // NOTE: Presumes meta with one or more replicas - for (int j = 0; j < numMetaReplicas; j++) { - RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( - RegionInfoBuilder.FIRST_META_REGIONINFO, j); - //If a metaLocation is null, All of its info would be empty here to be displayed. - RegionStateNode rsn = master.getAssignmentManager().getRegionStates() - .getRegionStateNode(meta); - ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; - for (int i = 0; i < 1; i++) { - //If metaLocation is null, default value below would be displayed in UI. - String hostAndPort = ""; - float locality = 0.0f; - float localityForSsd = 0.0f; - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { - RegionMetrics load = map.get(meta.getRegionName()); - locality = load.getDataLocality(); - localityForSsd = load.getDataLocalityForSsd(); - } - } + } + %> + + + + + + + + + + + + + + <% } %> + <%} %> + +
NameRegion ServerLocalityLocalityForSsd
<%= escapeXml(meta.getRegionNameAsString()) %><%= StringEscapeUtils.escapeHtml4(hostAndPort) %><%= readReq%><%= writeReq%><%= fileSizeUncompressed%><%= fileSize%><%= fileCount%><%= memSize%><%= escapeXml(Bytes.toString(meta.getStartKey())) %><%= escapeXml(Bytes.toString(meta.getEndKey())) %><%= meta.getReplicaId() %>
+
+
+ + + + + + + + + + + <% + // NOTE: Presumes meta with one or more replicas + for (int j = 0; j < numMetaReplicas; j++) { + RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( + RegionInfoBuilder.FIRST_META_REGIONINFO, j); + //If a metaLocation is null, All of its info would be empty here to be displayed. + RegionStateNode rsn = master.getAssignmentManager().getRegionStates() + .getRegionStateNode(meta); + ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; + for (int i = 0; i < 1; i++) { + //If metaLocation is null, default value below would be displayed in UI. + String hostAndPort = ""; + float locality = 0.0f; + float localityForSsd = 0.0f; + + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); + hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { + RegionMetrics load = map.get(meta.getRegionName()); + locality = load.getDataLocality(); + localityForSsd = load.getDataLocalityForSsd(); } - %> - - - - - - - <% } %> - <%} %> - -
NameRegion ServerLocalityLocalityForSsd
<%= escapeXml(meta.getRegionNameAsString()) %><%= StringEscapeUtils.escapeHtml4(hostAndPort) %><%= locality%><%= localityForSsd%>
-
-
- - - - - - - - - - - - - <% - // NOTE: Presumes meta with one or more replicas - for (int j = 0; j < numMetaReplicas; j++) { - RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( + } + } + %> + + + + + + + <% } %> + <%} %> + +
NameRegion ServerNum. Compacting CellsNum. Compacted CellsRemaining CellsCompaction Progress
<%= escapeXml(meta.getRegionNameAsString()) %><%= StringEscapeUtils.escapeHtml4(hostAndPort) %><%= locality%><%= localityForSsd%>
+
+
+ + + + + + + + + + + + + <% + // NOTE: Presumes meta with one or more replicas + for (int j = 0; j < numMetaReplicas; j++) { + RegionInfo meta = RegionReplicaUtil.getRegionInfoForReplica( RegionInfoBuilder.FIRST_META_REGIONINFO, j); - //If a metaLocation is null, All of its info would be empty here to be displayed. - RegionStateNode rsn = master.getAssignmentManager().getRegionStates() - .getRegionStateNode(meta); - ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; - for (int i = 0; i < 1; i++) { - //If metaLocation is null, default value below would be displayed in UI. - String hostAndPort = ""; - long compactingCells = 0; - long compactedCells = 0; - String compactionProgress = ""; - if (metaLocation != null) { - ServerMetrics sl = master.getServerManager().getLoad(metaLocation); - hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); - if (sl != null) { - Map map = sl.getRegionMetrics(); - if (map.containsKey(meta.getRegionName())) { - RegionMetrics load = map.get(meta.getRegionName()); - compactingCells = load.getCompactingCellCount(); - compactedCells = load.getCompactedCellCount(); - if (compactingCells > 0) { - compactionProgress = String.format("%.2f", 100 * ((float) - compactedCells / compactingCells)) + "%"; - } - } + //If a metaLocation is null, All of its info would be empty here to be displayed. + RegionStateNode rsn = master.getAssignmentManager().getRegionStates() + .getRegionStateNode(meta); + ServerName metaLocation = rsn != null ? rsn.getRegionLocation() : null; + for (int i = 0; i < 1; i++) { + //If metaLocation is null, default value below would be displayed in UI. + String hostAndPort = ""; + long compactingCells = 0; + long compactedCells = 0; + String compactionProgress = ""; + + if (metaLocation != null) { + ServerMetrics sl = master.getServerManager().getLoad(metaLocation); + hostAndPort = URLEncoder.encode(metaLocation.getHostname()) + ":" + master.getRegionServerInfoPort(metaLocation); + if (sl != null) { + Map map = sl.getRegionMetrics(); + if (map.containsKey(meta.getRegionName())) { + RegionMetrics load = map.get(meta.getRegionName()); + compactingCells = load.getCompactingCellCount(); + compactedCells = load.getCompactedCellCount(); + if (compactingCells > 0) { + compactionProgress = String.format("%.2f", 100 * ((float) + compactedCells / compactingCells)) + "%"; } } - %> - - - - - - - - - <% } %> - <%} %> - -
NameRegion ServerNum. Compacting CellsNum. Compacted CellsRemaining CellsCompaction Progress
<%= escapeXml(meta.getRegionNameAsString()) %><%= StringEscapeUtils.escapeHtml4(hostAndPort) %><%= String.format("%,1d", compactingCells)%><%= String.format("%,1d", compactedCells)%><%= String.format("%,1d", compactingCells - compactedCells)%><%= compactionProgress%>
-
-
+ } + } + %> + + <%= escapeXml(meta.getRegionNameAsString()) %> + <%= StringEscapeUtils.escapeHtml4(hostAndPort) %> + <%= String.format("%,1d", compactingCells)%> + <%= String.format("%,1d", compactedCells)%> + <%= String.format("%,1d", compactingCells - compactedCells)%> + <%= compactionProgress%> + + <% } %> + <%} %> + +
-

Meta Entries

+
+
+ +

Meta Entries

<% if (!metaBrowser.getErrorMessages().isEmpty()) { for (final String errorMessage : metaBrowser.getErrorMessages()) { @@ -524,6 +570,7 @@ final RegionInfo regionInfo = regionReplicaInfo.getRegionInfo(); final ServerName serverName = regionReplicaInfo.getServerName(); final RegionState.State regionState = regionReplicaInfo.getRegionState(); + final int rsPort = master.getRegionServerInfoPort(serverName); final long seqNum = regionReplicaInfo.getSeqNum(); @@ -541,20 +588,20 @@ splitRegions.entrySet().stream() .map(entry -> String.format(regionSpanFormat, entry.getKey(), entry.getValue().getRegionNameAsString())) .collect(Collectors.joining("
")); -%> - - <%= regionNameDisplay %> - <%= startKeyDisplay %> - <%= endKeyDisplay %> - <%= replicaIdDisplay %> - <%= regionStateDisplay %> - "><%= serverName != null ? buildRegionServerLink(serverName, master.getRegionServerInfoPort(serverName), regionInfo, regionState) : "" %> - <%= seqNum %> - <%= targetServerName %> - <%= mergeRegionNames %> - <%= splitName %> - -<% + %> + + <%= regionNameDisplay %> + <%= startKeyDisplay %> + <%= endKeyDisplay %> + <%= replicaIdDisplay %> + <%= regionStateDisplay %> + "><%= buildRegionLink(serverName, rsPort, regionInfo, regionState) %> + <%= seqNum %> + <%= targetServerName %> + <%= mergeRegionNames %> + <%= splitName %> + + <% } metaScanHasMore = results.hasMoreResults(); @@ -608,149 +655,152 @@ <% } %> - - -
- + +
-
- <%} else { - RegionStates states = master.getAssignmentManager().getRegionStates(); - Map> regionStates = states.getRegionByStateOfTable(table.getName()); - Map stateMap = new HashMap<>(); - for (RegionState.State regionState : regionStates.keySet()) { - for (RegionInfo regionInfo : regionStates.get(regionState)) { - stateMap.put(regionInfo.getEncodedName(), regionState); - } + +
+
+<%} else { + //Common tables + RegionStates states = master.getAssignmentManager().getRegionStates(); + Map> regionStates = states.getRegionByStateOfTable(table.getName()); + Map stateMap = new HashMap<>(); + for (RegionState.State regionState : regionStates.keySet()) { + for (RegionInfo regionInfo : regionStates.get(regionState)) { + stateMap.put(regionInfo.getEncodedName(), regionState); + } + } + RegionLocator r = master.getConnection().getRegionLocator(table.getName()); + + try { +%> +

Table Attributes

+ + + + + + + + + + + + + + + + +<% if (showFragmentation) { %> + + + + + +<% } %> +<% + if (quotasEnabled) { + TableName tn = TableName.valueOf(fqtn); + SpaceQuotaSnapshot masterSnapshot = null; + Quotas quota = QuotaTableUtil.getTableQuota(master.getConnection(), tn); + if (quota == null || !quota.hasSpace()) { + quota = QuotaTableUtil.getNamespaceQuota(master.getConnection(), tn.getNamespaceAsString()); + if (quota != null) { + masterSnapshot = master.getQuotaObserverChore().getNamespaceQuotaSnapshots() + .get(tn.getNamespaceAsString()); } - RegionLocator r = master.getConnection().getRegionLocator(table.getName()); - try { %> -

Table Attributes

-
Attribute NameValueDescription
Enabled<%= master.getTableStateManager().isTableState(table.getName(), TableState.State.ENABLED) %>Is the table enabled
Compaction +<% + if (master.getTableStateManager().isTableState(table.getName(), TableState.State.ENABLED)) { + CompactionState compactionState = master.getCompactionState(table.getName()); + %><%= compactionState==null?"UNKNOWN":compactionState %><% + } else { + %><%= CompactionState.NONE %><% + } +%> + Is the table compacting
Fragmentation<%= frags.get(fqtn) != null ? frags.get(fqtn).intValue() + "%" : "n/a" %>How fragmented is the table. After a major compaction it is 0%.
- - - - - - - - - - - - - - - - <% if (showFragmentation) { %> - - - - - - <% } %> - <% - if (quotasEnabled) { - TableName tn = TableName.valueOf(fqtn); - SpaceQuotaSnapshot masterSnapshot = null; - Quotas quota = QuotaTableUtil.getTableQuota(master.getConnection(), tn); - if (quota == null || !quota.hasSpace()) { - quota = QuotaTableUtil.getNamespaceQuota(master.getConnection(), tn.getNamespaceAsString()); - if (quota != null) { - masterSnapshot = master.getQuotaObserverChore().getNamespaceQuotaSnapshots() - .get(tn.getNamespaceAsString()); - } - } else { - masterSnapshot = master.getQuotaObserverChore().getTableQuotaSnapshots().get(tn); - } - if (quota != null && quota.hasSpace()) { - SpaceQuota spaceQuota = quota.getSpace(); - %> - - - - - - <% - } - if (quota != null && quota.hasThrottle()) { - List throttles = QuotaSettingsFactory.fromTableThrottles(table.getName(), quota.getThrottle()); - if (throttles.size() > 0) { - %> - - - - - - <% - } - } - } - %> -
Attribute NameValueDescription
Enabled<%= master.getTableStateManager().isTableState(table.getName(), TableState.State.ENABLED) %>Is the table enabled
Compaction - <% - if (master.getTableStateManager().isTableState(table.getName(), TableState.State.ENABLED)) { - CompactionState compactionState = master.getCompactionState(table.getName()); - %><%= compactionState==null?"UNKNOWN":compactionState %><% - } else { - %><%= CompactionState.NONE %><% - } - %> - Is the table compacting
Fragmentation<%= frags.get(fqtn) != null ? frags.get(fqtn).intValue() + "%" : "n/a" %>How fragmented is the table. After a major compaction it is 0%.
Space Quota - - - - - - - - - - - - - - <% - if (masterSnapshot != null) { - %> - - - - - - - - - <% - } - %> -
PropertyValue
Limit<%= StringUtils.byteDesc(spaceQuota.getSoftLimit()) %>
Policy<%= spaceQuota.getViolationPolicy() %>
Usage<%= StringUtils.byteDesc(masterSnapshot.getUsage()) %>
State<%= masterSnapshot.getQuotaStatus().isInViolation() ? "In Violation" : "In Observance" %>
-
Information about a Space Quota on this table, if set.
Throttle Quota - - - - - - - - <% - for (ThrottleSettings throttle : throttles) { - %> - - - - - - - <% - } - %> -
LimitTypeTimeUnitScope
<%= throttle.getSoftLimit() %><%= throttle.getThrottleType() %><%= throttle.getTimeUnit() %><%= throttle.getQuotaScope() %>
-
Information about a Throttle Quota on this table, if set.
-

Table Schema

- + } else { + masterSnapshot = master.getQuotaObserverChore().getTableQuotaSnapshots().get(tn); + } + if (quota != null && quota.hasSpace()) { + SpaceQuota spaceQuota = quota.getSpace(); +%> + + + + + +<% + } + if (quota != null && quota.hasThrottle()) { + List throttles = QuotaSettingsFactory.fromTableThrottles(table.getName(), quota.getThrottle()); + if (throttles.size() > 0) { +%> + + + + + +<% + } + } + } +%> +
Space Quota + + + + + + + + + + + + + +<% + if (masterSnapshot != null) { +%> + + + + + + + + +<% + } +%> +
PropertyValue
Limit<%= StringUtils.byteDesc(spaceQuota.getSoftLimit()) %>
Policy<%= spaceQuota.getViolationPolicy() %>
Usage<%= StringUtils.byteDesc(masterSnapshot.getUsage()) %>
State<%= masterSnapshot.getQuotaStatus().isInViolation() ? "In Violation" : "In Observance" %>
+
Information about a Space Quota on this table, if set.
Throttle Quota + + + + + + + +<% + for (ThrottleSettings throttle : throttles) { +%> + + + + + + +<% + } +%> +
LimitTypeTimeUnitScope
<%= throttle.getSoftLimit() %><%= throttle.getThrottleType() %><%= throttle.getTimeUnit() %><%= throttle.getQuotaScope() %>
+
Information about a Throttle Quota on this table, if set.
+

Table Schema

+ <% ColumnFamilyDescriptor[] families = table.getDescriptor().getColumnFamilies(); Set familyKeySet = new HashSet<>(); @@ -818,358 +868,278 @@ ServerName addr = hriEntry.getServerName(); regionsToServer.put(regionInfo, addr); - if (addr != null) { - ServerMetrics sl = master.getServerManager().getLoad(addr); - if (sl != null) { - RegionMetrics regionMetrics = sl.getRegionMetrics().get(regionInfo.getRegionName()); - regionsToLoad.put(regionInfo, regionMetrics); - if (regionMetrics != null) { - totalReadReq += regionMetrics.getReadRequestCount(); - totalWriteReq += regionMetrics.getWriteRequestCount(); - totalSizeUncompressed += regionMetrics.getUncompressedStoreFileSize().get(Size.Unit.MEGABYTE); - totalSize += regionMetrics.getStoreFileSize().get(Size.Unit.MEGABYTE); - totalStoreFileCount += regionMetrics.getStoreFileCount(); - totalMemSize += regionMetrics.getMemStoreSize().get(Size.Unit.MEGABYTE); - totalStoreFileSizeMB += regionMetrics.getStoreFileSize().get(Size.Unit.MEGABYTE); - totalCompactingCells += regionMetrics.getCompactingCellCount(); - totalCompactedCells += regionMetrics.getCompactedCellCount(); - totalBlocksTotalWeight += regionMetrics.getBlocksTotalWeight(); - totalBlocksLocalWeight += regionMetrics.getBlocksLocalWeight(); - totalBlocksLocalWithSsdWeight += regionMetrics.getBlocksLocalWithSsdWeight(); - } else { - RegionMetrics load0 = getEmptyRegionMetrics(regionInfo); - regionsToLoad.put(regionInfo, load0); - } - } else{ - RegionMetrics load0 = getEmptyRegionMetrics(regionInfo); - regionsToLoad.put(regionInfo, load0); - } + if (addr != null) { + ServerMetrics sl = master.getServerManager().getLoad(addr); + if (sl != null) { + RegionMetrics regionMetrics = sl.getRegionMetrics().get(regionInfo.getRegionName()); + regionsToLoad.put(regionInfo, regionMetrics); + if (regionMetrics != null) { + totalReadReq += regionMetrics.getReadRequestCount(); + totalWriteReq += regionMetrics.getWriteRequestCount(); + totalSizeUncompressed += regionMetrics.getUncompressedStoreFileSize().get(Size.Unit.MEGABYTE); + totalSize += regionMetrics.getStoreFileSize().get(Size.Unit.MEGABYTE); + totalStoreFileCount += regionMetrics.getStoreFileCount(); + totalMemSize += regionMetrics.getMemStoreSize().get(Size.Unit.MEGABYTE); + totalStoreFileSizeMB += regionMetrics.getStoreFileSize().get(Size.Unit.MEGABYTE); + totalCompactingCells += regionMetrics.getCompactingCellCount(); + totalCompactedCells += regionMetrics.getCompactedCellCount(); + totalBlocksTotalWeight += regionMetrics.getBlocksTotalWeight(); + totalBlocksLocalWeight += regionMetrics.getBlocksLocalWeight(); + totalBlocksLocalWithSsdWeight += regionMetrics.getBlocksLocalWithSsdWeight(); } else { RegionMetrics load0 = getEmptyRegionMetrics(regionInfo); regionsToLoad.put(regionInfo, load0); } + } else{ + RegionMetrics load0 = getEmptyRegionMetrics(regionInfo); + regionsToLoad.put(regionInfo, load0); } - if (totalSize > 0) { - totalSizeStr = StringUtils.byteDesc(totalSize*1024l*1024); - } - if (totalSizeUncompressed > 0){ - totalSizeUncompressedStr = StringUtils.byteDesc(totalSizeUncompressed*1024l*1024); - } - if (totalMemSize > 0) { - totalMemSizeStr = StringUtils.byteDesc(totalMemSize*1024l*1024); - } - if (totalCompactingCells > 0) { - totalCompactionProgress = String.format("%.2f", 100 * - ((float) totalCompactedCells / totalCompactingCells)) + "%"; - } - if (totalBlocksTotalWeight > 0) { - totalLocality = String.format("%.1f", - ((float) totalBlocksLocalWeight / totalBlocksTotalWeight)); - totalLocalityForSsd = String.format("%.1f", - ((float) totalBlocksLocalWithSsdWeight / totalBlocksTotalWeight)); - } - if(regions != null && regions.size() > 0) { %> -

Table Regions

-
- -
-
-
- - - - - - - - - - - - - - <% - if (withReplica) { - %> - - <% - } - %> - - - - <% - List> entryList = new ArrayList<>(regionsToLoad.entrySet()); - numRegions = regions.size(); - int numRegionsRendered = 0; - // render all regions - if (numRegionsToRender < 0) { - numRegionsToRender = numRegions; + } else { + RegionMetrics load0 = getEmptyRegionMetrics(regionInfo); + regionsToLoad.put(regionInfo, load0); + } + } + if (totalSize > 0) { + totalSizeStr = StringUtils.byteDesc(totalSize*1024l*1024); + } + if (totalSizeUncompressed > 0){ + totalSizeUncompressedStr = StringUtils.byteDesc(totalSizeUncompressed*1024l*1024); + } + if (totalMemSize > 0) { + totalMemSizeStr = StringUtils.byteDesc(totalMemSize*1024l*1024); + } + if (totalCompactingCells > 0) { + totalCompactionProgress = String.format("%.2f", 100 * + ((float) totalCompactedCells / totalCompactingCells)) + "%"; + } + if (totalBlocksTotalWeight > 0) { + totalLocality = String.format("%.1f", + ((float) totalBlocksLocalWeight / totalBlocksTotalWeight)); + totalLocalityForSsd = String.format("%.1f", + ((float) totalBlocksLocalWithSsdWeight / totalBlocksTotalWeight)); + } + if(regions != null && regions.size() > 0) { %> +

Table Regions

+
Name(<%= String.format("%,1d", regions.size())%>)Region ServerReadRequests
(<%= String.format("%,1d", totalReadReq)%>)
WriteRequests
(<%= String.format("%,1d", totalWriteReq)%>)
Uncompressed StoreFileSize
(<%= totalSizeUncompressedStr %>)
StorefileSize
(<%= totalSizeStr %>)
Num.Storefiles
(<%= String.format("%,1d", totalStoreFileCount)%>)
MemSize
(<%= totalMemSizeStr %>)
Start KeyEnd KeyRegion StateReplicaID
+ + + + + + + + + + + + + + + + + + <% + List> entryList = new ArrayList<>(regionsToLoad.entrySet()); + numRegions = regions.size(); + int numRegionsRendered = 0; + // render all regions + if (numRegionsToRender < 0) { + numRegionsToRender = numRegions; + } + for (Map.Entry hriEntry : entryList) { + RegionInfo regionInfo = hriEntry.getKey(); + ServerName addr = regionsToServer.get(regionInfo); + RegionMetrics load = hriEntry.getValue(); + String readReq = "N/A"; + String writeReq = "N/A"; + String regionSizeUncompressed = ZEROMB; + String regionSize = ZEROMB; + String fileCount = "N/A"; + String memSize = ZEROMB; + String state = "N/A"; + if (load != null) { + readReq = String.format("%,1d", load.getReadRequestCount()); + writeReq = String.format("%,1d", load.getWriteRequestCount()); + double rSize = load.getStoreFileSize().get(Size.Unit.BYTE); + if (rSize > 0) { + regionSize = StringUtils.byteDesc((long)rSize); } - for (Map.Entry hriEntry : entryList) { - RegionInfo regionInfo = hriEntry.getKey(); - ServerName addr = regionsToServer.get(regionInfo); - RegionMetrics load = hriEntry.getValue(); - String readReq = "N/A"; - String writeReq = "N/A"; - String regionSizeUncompressed = ZEROMB; - String regionSize = ZEROMB; - String fileCount = "N/A"; - String memSize = ZEROMB; - String state = "N/A"; - if (load != null) { - readReq = String.format("%,1d", load.getReadRequestCount()); - writeReq = String.format("%,1d", load.getWriteRequestCount()); - double rSize = load.getStoreFileSize().get(Size.Unit.BYTE); - if (rSize > 0) { - regionSize = StringUtils.byteDesc((long)rSize); - } - double rSizeUncompressed = load.getUncompressedStoreFileSize().get(Size.Unit.BYTE); - if (rSizeUncompressed > 0) { - regionSizeUncompressed = StringUtils.byteDesc((long)rSizeUncompressed); - } - fileCount = String.format("%,1d", load.getStoreFileCount()); - double mSize = load.getMemStoreSize().get(Size.Unit.BYTE); - if (mSize > 0) { - memSize = StringUtils.byteDesc((long)mSize); - } - } - if (stateMap.containsKey(regionInfo.getEncodedName())) { - state = stateMap.get(regionInfo.getEncodedName()).toString(); - } - if (addr != null) { - ServerMetrics sl = master.getServerManager().getLoad(addr); - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; - if(sl != null) { - Integer i = regDistribution.get(addr); - if (null == i) i = Integer.valueOf(0); - regDistribution.put(addr, i + 1); - if (withReplica && RegionReplicaUtil.isDefaultReplica(regionInfo.getReplicaId())) { - i = primaryRegDistribution.get(addr); - if (null == i) i = Integer.valueOf(0); - primaryRegDistribution.put(addr, i+1); - } - } - } - if (numRegionsRendered < numRegionsToRender) { - numRegionsRendered++; - %> - - - <% - if (urlRegionServer != null) { - %> - - <% - } else { - %> - - <% - } - %> - - - - - - - - - - <% - if (withReplica) { - %> - - <% - } - %> - - <% } %> - <% } %> - -
Name(<%= String.format("%,1d", regions.size())%>)Region ServerReadRequests
(<%= String.format("%,1d", totalReadReq)%>)
WriteRequests
(<%= String.format("%,1d", totalWriteReq)%>)
Uncompressed StoreFileSize
(<%= totalSizeUncompressedStr %>)
StorefileSize
(<%= totalSizeStr %>)
Num.Storefiles
(<%= String.format("%,1d", totalStoreFileCount)%>)
MemSize
(<%= totalMemSizeStr %>)
Start KeyEnd KeyRegion StateReplicaID
<%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> - not deployed<%= readReq%><%= writeReq%><%= regionSizeUncompressed%><%= regionSize%><%= fileCount%><%= memSize%><%= escapeXml(Bytes.toStringBinary(regionInfo.getStartKey()))%><%= escapeXml(Bytes.toStringBinary(regionInfo.getEndKey()))%><%= state%><%= regionInfo.getReplicaId() %>
- <% if (numRegions > numRegionsRendered) { - String allRegionsUrl = "?name=" + URLEncoder.encode(fqtn,"UTF-8") + "&numRegions=all"; - %> -

This table has <%= numRegions %> regions in total, in order to improve the page load time, - only <%= numRegionsRendered %> regions are displayed here, click - here to see all regions.

- <% } %> - -
- - - - - - - - - - - <% - numRegionsRendered = 0; - for (Map.Entry hriEntry : entryList) { - RegionInfo regionInfo = hriEntry.getKey(); - ServerName addr = regionsToServer.get(regionInfo); - RegionMetrics load = hriEntry.getValue(); - float locality = 0.0f; - float localityForSsd = 0.0f; - String state = "N/A"; - if (load != null) { - locality = load.getDataLocality(); - localityForSsd = load.getDataLocalityForSsd(); - } - if (addr != null) { - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; - } - if (numRegionsRendered < numRegionsToRender) { - numRegionsRendered++; - %> - - - <% - if (urlRegionServer != null) { - %> - - <% - } else { - %> - - <% + double rSizeUncompressed = load.getUncompressedStoreFileSize().get(Size.Unit.BYTE); + if (rSizeUncompressed > 0) { + regionSizeUncompressed = StringUtils.byteDesc((long)rSizeUncompressed); } - %> - - - - <% } %> - <% } %> - -
Name(<%= String.format("%,1d", regions.size())%>)Region ServerLocality
(<%= totalLocality %>)
LocalityForSsd
(<%= totalLocalityForSsd %>)
<%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> - not deployed<%= locality%><%= localityForSsd%>
-
-
- - - - - - - - - - - - - <% - numRegionsRendered = 0; - for (Map.Entry hriEntry : entryList) { - RegionInfo regionInfo = hriEntry.getKey(); - ServerName addr = regionsToServer.get(regionInfo); - RegionMetrics load = hriEntry.getValue(); - long compactingCells = 0; - long compactedCells = 0; - String compactionProgress = ""; - if (load != null) { - compactingCells = load.getCompactingCellCount(); - compactedCells = load.getCompactedCellCount(); - if (compactingCells > 0) { - compactionProgress = String.format("%.2f", 100 * ((float) - compactedCells / compactingCells)) + "%"; - } - } - if (addr != null) { - // This port might be wrong if RS actually ended up using something else. - urlRegionServer = - "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; - } - if (numRegionsRendered < numRegionsToRender) { - numRegionsRendered++; - %> - - - <% - if (urlRegionServer != null) { - %> - - <% - } else { - %> - - <% + fileCount = String.format("%,1d", load.getStoreFileCount()); + double mSize = load.getMemStoreSize().get(Size.Unit.BYTE); + if (mSize > 0) { + memSize = StringUtils.byteDesc((long)mSize); + } + } + + if (stateMap.containsKey(regionInfo.getEncodedName())) { + state = stateMap.get(regionInfo.getEncodedName()).toString(); + } + + if (addr != null) { + ServerMetrics sl = master.getServerManager().getLoad(addr); + if(sl != null) { + Integer i = regDistribution.get(addr); + if (null == i) i = Integer.valueOf(0); + regDistribution.put(addr, i + 1); + if (RegionReplicaUtil.isDefaultReplica(regionInfo.getReplicaId())) { + i = primaryRegDistribution.get(addr); + if (null == i) i = Integer.valueOf(0); + primaryRegDistribution.put(addr, i+1); } - %> - - - - - - <% } %> - <% } %> - -
Name(<%= String.format("%,1d", regions.size())%>)Region ServerNum. Compacting Cells
(<%= String.format("%,1d", totalCompactingCells)%>)
Num. Compacted Cells
(<%= String.format("%,1d", totalCompactedCells)%>)
Remaining Cells
(<%= String.format("%,1d", totalCompactingCells-totalCompactedCells)%>)
Compaction Progress
(<%= totalCompactionProgress %>)
<%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %> - <%= addr == null? "-": StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %> - not deployed<%= String.format("%,1d", compactingCells)%><%= String.format("%,1d", compactedCells)%><%= String.format("%,1d", compactingCells - compactedCells)%><%= compactionProgress%>
- <% if (numRegions > numRegionsRendered) { - String allRegionsUrl = "?name=" + URLEncoder.encode(fqtn,"UTF-8") + "&numRegions=all"; - %> -

This table has <%= numRegions %> regions in total, in order to improve the page load time, - only <%= numRegionsRendered %> regions are displayed here, click - here to see all regions.

- <% } %> -
- + } + } + if (numRegionsRendered < numRegionsToRender) { + numRegionsRendered++; + %> + + <%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %> + <%= buildRegionDeployedServerTag(regionInfo, master, regionsToServer) %> + <%= readReq%> + <%= writeReq%> + <%= regionSizeUncompressed%> + <%= regionSize%> + <%= fileCount%> + <%= memSize%> + <%= escapeXml(Bytes.toStringBinary(regionInfo.getStartKey()))%> + <%= escapeXml(Bytes.toStringBinary(regionInfo.getEndKey()))%> + <%= state%> + <%= regionInfo.getReplicaId() %> + + <% } %> + <% } %> + + + <%= moreRegionsToRender(numRegionsRendered, numRegions, fqtn) %> -

Regions by Region Server

- <% - if (withReplica) { - %> - - <% -} else { -%> -
Region ServerRegion CountPrimary Region Count
+
+
Region ServerRegion Count
+ + + + + + + + <% - } + numRegionsRendered = 0; + for (Map.Entry hriEntry : entryList) { + RegionInfo regionInfo = hriEntry.getKey(); + ServerName addr = regionsToServer.get(regionInfo); + RegionMetrics load = hriEntry.getValue(); + float locality = 0.0f; + float localityForSsd = 0.0f; + String state = "N/A"; + if (load != null) { + locality = load.getDataLocality(); + localityForSsd = load.getDataLocalityForSsd(); + } + + if (numRegionsRendered < numRegionsToRender) { + numRegionsRendered++; %> + + + <%= buildRegionDeployedServerTag(regionInfo, master, regionsToServer) %> + + + + <% } %> + <% } %> + +
Name(<%= String.format("%,1d", regions.size())%>)Region ServerLocality
(<%= totalLocality %>)
LocalityForSsd
(<%= totalLocalityForSsd %>)
<%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %><%= locality%><%= localityForSsd%>
+ <%= moreRegionsToRender(numRegionsRendered, numRegions, fqtn) %> + +
+ + + + + + + + + + + + <% - for (Map.Entry rdEntry : regDistribution.entrySet()) { - ServerName addr = rdEntry.getKey(); - String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + master.getRegionServerInfoPort(addr) + "/rs-status"; + numRegionsRendered = 0; + for (Map.Entry hriEntry : entryList) { + RegionInfo regionInfo = hriEntry.getKey(); + ServerName addr = regionsToServer.get(regionInfo); + RegionMetrics load = hriEntry.getValue(); + long compactingCells = 0; + long compactedCells = 0; + String compactionProgress = ""; + if (load != null) { + compactingCells = load.getCompactingCellCount(); + compactedCells = load.getCompactedCellCount(); + if (compactingCells > 0) { + compactionProgress = String.format("%.2f", 100 * ((float) + compactedCells / compactingCells)) + "%"; + } + } + + if (numRegionsRendered < numRegionsToRender) { + numRegionsRendered++; %> - - - <% - if (withReplica) { - %> - - <% - } - %> + + <%= buildRegionDeployedServerTag(regionInfo, master, regionsToServer) %> + + + + <% } %> + <% } %>
Name(<%= String.format("%,1d", regions.size())%>)Region ServerNum. Compacting Cells
(<%= String.format("%,1d", totalCompactingCells)%>)
Num. Compacted Cells
(<%= String.format("%,1d", totalCompactedCells)%>)
Remaining Cells
(<%= String.format("%,1d", totalCompactingCells-totalCompactedCells)%>)
Compaction Progress
(<%= totalCompactionProgress %>)
<%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + ":" + master.getRegionServerInfoPort(addr) %><%= rdEntry.getValue()%><%= primaryRegDistribution.get(addr)%><%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %><%= String.format("%,1d", compactingCells)%><%= String.format("%,1d", compactedCells)%><%= String.format("%,1d", compactingCells - compactedCells)%><%= compactionProgress%>
- <% } + <%= moreRegionsToRender(numRegionsRendered, numRegions, fqtn) %> +
+ + + +

Regions by Region Server

+ + + + + + + + + <% + for (Map.Entry rdEntry : regDistribution.entrySet()) { + ServerName addr = rdEntry.getKey(); + String url = "//" + URLEncoder.encode(addr.getHostname()) + ":" + + master.getRegionServerInfoPort(addr) + "/rs-status"; + %> + + + + + + <% } %> + +
Region ServerRegion CountPrimary Region Count
<%= StringEscapeUtils.escapeHtml4(addr.getHostname().toString()) + + ":" + master.getRegionServerInfoPort(addr) %><%= rdEntry.getValue()%><%= primaryRegDistribution.get(addr) == null ? 0 : primaryRegDistribution.get(addr)%>
+ +<% } } catch(Exception ex) { %> Unknown Issue with Regions
@@ -1215,122 +1185,87 @@ - <% if (!readOnly) { %> -


- Actions: -

-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - This action will force a major compaction of all regions of the table, or, - if a key is supplied, only the region major containing the - given key. -
- - - - - This action will force a compaction of all regions of the table, or, - if a key is supplied, only the region containing the - given key. -
- - - - - This action will force a split of all eligible - regions of the table, or, if a key is supplied, only the region containing the - given key. An eligible region is one that does not contain any references to - other regions. Split requests for noneligible regions will be ignored. -
- - - - - - This action will merge two regions of the table, Merge requests for - noneligible regions will be ignored. -
-
-

- <% } %> -
+<% if (!readOnly) { %> +


+Actions: +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + This action will force a major compaction of all regions of the table, or, + if a key is supplied, only the region major containing the + given key. +
+ + + + + This action will force a compaction of all regions of the table, or, + if a key is supplied, only the region containing the + given key. +
+ + + + + This action will force a split of all eligible + regions of the table, or, if a key is supplied, only the region containing the + given key. An eligible region is one that does not contain any references to + other regions. Split requests for noneligible regions will be ignored. +
+ + + + + + This action will merge two regions of the table, Merge requests for + noneligible regions will be ignored. +
+
+

+<% } %> -<% } -} catch(TableNotFoundException e) { %> -
-
- -
-


-

Go Back -

<% -} catch(IllegalArgumentException e) { %> -
-
- -
-


-

Go Back -

<% - } -} -else { // handle the case for fqtn is null or master is not initialized with error message + redirect -%> -
-
- -
-


-

-<% } %> @@ -1338,78 +1273,94 @@ else { // handle the case for fqtn is null or master is not initialized with err