HDFS-6156. Simplify the JMX API that provides snapshot information. Contributed by Shinichi Yamashita.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1582847 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
92b9c6ff60
commit
2e799e5984
|
@ -286,6 +286,9 @@ Release 2.5.0 - UNRELEASED
|
|||
HDFS-6162. Format strings should use platform independent line separator.
|
||||
(suresh)
|
||||
|
||||
HDFS-6156. Simplify the JMX API that provides snapshot information.
|
||||
(wheat9)
|
||||
|
||||
Release 2.4.0 - UNRELEASED
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -86,10 +86,11 @@ public class SnapshotInfo {
|
|||
private final String snapshotDirectory;
|
||||
private final long modificationTime;
|
||||
|
||||
public Bean(Snapshot s) {
|
||||
this.snapshotID = s.getRoot().getLocalName();
|
||||
this.snapshotDirectory = s.getRoot().getFullPathName();
|
||||
this.modificationTime = s.getRoot().getModificationTime();
|
||||
public Bean(String snapshotID, String snapshotDirectory,
|
||||
long modificationTime) {
|
||||
this.snapshotID = snapshotID;
|
||||
this.snapshotDirectory = snapshotDirectory;
|
||||
this.modificationTime = modificationTime;
|
||||
}
|
||||
|
||||
public String getSnapshotID() {
|
||||
|
|
|
@ -176,16 +176,15 @@ public class SnapshottableDirectoryStatus {
|
|||
private final String owner;
|
||||
private final String group;
|
||||
|
||||
public Bean(SnapshottableDirectoryStatus s) {
|
||||
this.path = s.getFullPath().toString();
|
||||
this.snapshotNumber = s.getSnapshotNumber();
|
||||
this.snapshotQuota = s.getSnapshotQuota();
|
||||
this.modificationTime = s.getDirStatus().getModificationTime();
|
||||
this.permission =
|
||||
Short.valueOf(Integer.toOctalString(
|
||||
s.getDirStatus().getPermission().toShort()));
|
||||
this.owner = s.getDirStatus().getOwner();
|
||||
this.group = s.getDirStatus().getGroup();
|
||||
public Bean(String path, int snapshotNumber, int snapshotQuota,
|
||||
long modificationTime, short permission, String owner, String group) {
|
||||
this.path = path;
|
||||
this.snapshotNumber = snapshotNumber;
|
||||
this.snapshotQuota = snapshotQuota;
|
||||
this.modificationTime = modificationTime;
|
||||
this.permission = permission;
|
||||
this.owner = owner;
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
|
|
|
@ -387,44 +387,43 @@ public class SnapshotManager implements SnapshotStatsMXBean {
|
|||
}
|
||||
|
||||
@Override // SnapshotStatsMXBean
|
||||
public SnapshotDirectoryMXBean getSnapshotStats() {
|
||||
SnapshottableDirectoryStatus[] stats = getSnapshottableDirListing(null);
|
||||
if (stats == null) {
|
||||
return null;
|
||||
public SnapshottableDirectoryStatus.Bean[]
|
||||
getSnapshottableDirectories() {
|
||||
List<SnapshottableDirectoryStatus.Bean> beans =
|
||||
new ArrayList<SnapshottableDirectoryStatus.Bean>();
|
||||
for (INodeDirectorySnapshottable d : getSnapshottableDirs()) {
|
||||
beans.add(toBean(d));
|
||||
}
|
||||
return new SnapshotDirectoryMXBean(stats);
|
||||
return beans.toArray(new SnapshottableDirectoryStatus.Bean[beans.size()]);
|
||||
}
|
||||
|
||||
public class SnapshotDirectoryMXBean {
|
||||
private List<SnapshottableDirectoryStatus.Bean> directory =
|
||||
new ArrayList<SnapshottableDirectoryStatus.Bean>();
|
||||
private List<SnapshotInfo.Bean> snapshots =
|
||||
new ArrayList<SnapshotInfo.Bean>();
|
||||
|
||||
public SnapshotDirectoryMXBean(SnapshottableDirectoryStatus[] stats) {
|
||||
set(stats);
|
||||
}
|
||||
|
||||
public void set(SnapshottableDirectoryStatus[] stats) {
|
||||
for (SnapshottableDirectoryStatus s : stats) {
|
||||
directory.add(new SnapshottableDirectoryStatus.Bean(s));
|
||||
try {
|
||||
for (Snapshot shot : getSnapshottableRoot(
|
||||
s.getFullPath().toString()).getSnapshotList()) {
|
||||
snapshots.add(new SnapshotInfo.Bean(shot));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
continue;
|
||||
}
|
||||
@Override // SnapshotStatsMXBean
|
||||
public SnapshotInfo.Bean[] getSnapshots() {
|
||||
List<SnapshotInfo.Bean> beans = new ArrayList<SnapshotInfo.Bean>();
|
||||
for (INodeDirectorySnapshottable d : getSnapshottableDirs()) {
|
||||
for (Snapshot s : d.getSnapshotList()) {
|
||||
beans.add(toBean(s));
|
||||
}
|
||||
}
|
||||
return beans.toArray(new SnapshotInfo.Bean[beans.size()]);
|
||||
}
|
||||
|
||||
public List<SnapshottableDirectoryStatus.Bean> getDirectory() {
|
||||
return directory;
|
||||
}
|
||||
public static SnapshottableDirectoryStatus.Bean toBean(
|
||||
INodeDirectorySnapshottable d) {
|
||||
return new SnapshottableDirectoryStatus.Bean(
|
||||
d.getFullPathName(),
|
||||
d.getNumSnapshots(),
|
||||
d.getSnapshotQuota(),
|
||||
d.getModificationTime(),
|
||||
Short.valueOf(Integer.toOctalString(
|
||||
d.getFsPermissionShort())),
|
||||
d.getUserName(),
|
||||
d.getGroupName());
|
||||
}
|
||||
|
||||
public List<SnapshotInfo.Bean> getSnapshots() {
|
||||
return snapshots;
|
||||
}
|
||||
public static SnapshotInfo.Bean toBean(Snapshot s) {
|
||||
return new SnapshotInfo.Bean(
|
||||
s.getRoot().getLocalName(), s.getRoot().getFullPathName(),
|
||||
s.getRoot().getModificationTime());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,8 @@
|
|||
*/
|
||||
package org.apache.hadoop.hdfs.server.namenode.snapshot;
|
||||
|
||||
import org.apache.hadoop.hdfs.server.namenode.snapshot.SnapshotManager.SnapshotDirectoryMXBean;
|
||||
import org.apache.hadoop.hdfs.protocol.SnapshotInfo;
|
||||
import org.apache.hadoop.hdfs.protocol.SnapshottableDirectoryStatus;
|
||||
|
||||
/**
|
||||
* This is an interface used to retrieve statistic information related to
|
||||
|
@ -30,5 +31,13 @@ public interface SnapshotStatsMXBean {
|
|||
*
|
||||
* @return the list of snapshottable directories
|
||||
*/
|
||||
public SnapshotDirectoryMXBean getSnapshotStats();
|
||||
public SnapshottableDirectoryStatus.Bean[] getSnapshottableDirectories();
|
||||
|
||||
/**
|
||||
* Return the list of snapshots
|
||||
*
|
||||
* @return the list of snapshots
|
||||
*/
|
||||
public SnapshotInfo.Bean[] getSnapshots();
|
||||
|
||||
}
|
||||
|
|
|
@ -189,7 +189,7 @@
|
|||
|
||||
<script type="text/x-dust-template" id="tmpl-snapshot">
|
||||
<div class="page-header"><h1>Snapshot Summary</h1></div>
|
||||
<div class="page-header"><h1><small>Snapshottable directories: {@size key=SnapshotStats.directory}{/size}</small></div>
|
||||
<div class="page-header"><h1><small>Snapshottable directories: {@size key=SnapshottableDirectories}{/size}</small></div>
|
||||
<small>
|
||||
<table class="table">
|
||||
<thead>
|
||||
|
@ -203,7 +203,7 @@
|
|||
<th>Group</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{#SnapshotStats.directory}
|
||||
{#SnapshottableDirectories}
|
||||
<tr>
|
||||
<td>{path}</td>
|
||||
<td>{snapshotNumber}</td>
|
||||
|
@ -213,11 +213,11 @@
|
|||
<td>{owner}</td>
|
||||
<td>{group}</td>
|
||||
</tr>
|
||||
{/SnapshotStats.directory}
|
||||
{/SnapshottableDirectories}
|
||||
</table>
|
||||
</small>
|
||||
|
||||
<div class="page-header"><h1><small>Snapshotted directories: {@size key=SnapshotStats.snapshots}{/size}</small></div>
|
||||
<div class="page-header"><h1><small>Snapshotted directories: {@size key=Snapshots}{/size}</small></div>
|
||||
|
||||
<small>
|
||||
<table class="table">
|
||||
|
@ -228,13 +228,13 @@
|
|||
<th>Modification Time</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{#SnapshotStats.snapshots}
|
||||
{#Snapshots}
|
||||
<tr>
|
||||
<td>{snapshotID}</td>
|
||||
<td>{snapshotDirectory}</td>
|
||||
<td>{modificationTime|date_tostring}</td>
|
||||
</tr>
|
||||
{/SnapshotStats.snapshots}
|
||||
{/Snapshots}
|
||||
</table>
|
||||
</small>
|
||||
</script>
|
||||
|
|
|
@ -59,17 +59,20 @@ public class TestSnapshotStatsMXBean {
|
|||
ObjectName mxbeanName = new ObjectName(
|
||||
"Hadoop:service=NameNode,name=SnapshotInfo");
|
||||
|
||||
CompositeData statsbean =
|
||||
(CompositeData) mbs.getAttribute(mxbeanName, "SnapshotStats");
|
||||
int numDirectories = Array.getLength(statsbean.get("directory"));
|
||||
CompositeData[] directories =
|
||||
(CompositeData[]) mbs.getAttribute(
|
||||
mxbeanName, "SnapshottableDirectories");
|
||||
int numDirectories = Array.getLength(directories);
|
||||
assertEquals(sm.getNumSnapshottableDirs(), numDirectories);
|
||||
int numSnapshots = Array.getLength(statsbean.get("snapshots"));
|
||||
CompositeData[] snapshots =
|
||||
(CompositeData[]) mbs.getAttribute(mxbeanName, "Snapshots");
|
||||
int numSnapshots = Array.getLength(snapshots);
|
||||
assertEquals(sm.getNumSnapshots(), numSnapshots);
|
||||
|
||||
CompositeData directory = (CompositeData) Array.get(statsbean.get("directory"), 0);
|
||||
CompositeData snapshots = (CompositeData) Array.get(statsbean.get("snapshots"), 0);
|
||||
assertTrue(((String) directory.get("path")).contains(pathName));
|
||||
assertTrue(((String) snapshots.get("snapshotDirectory")).contains(pathName));
|
||||
CompositeData d = (CompositeData) Array.get(directories, 0);
|
||||
CompositeData s = (CompositeData) Array.get(snapshots, 0);
|
||||
assertTrue(((String) d.get("path")).contains(pathName));
|
||||
assertTrue(((String) s.get("snapshotDirectory")).contains(pathName));
|
||||
} finally {
|
||||
if (cluster != null) {
|
||||
cluster.shutdown();
|
||||
|
|
Loading…
Reference in New Issue