diff --git a/hadoop-common-project/hadoop-common/src/site/markdown/Metrics.md b/hadoop-common-project/hadoop-common/src/site/markdown/Metrics.md index 14631f59736..5d3e5b08d33 100644 --- a/hadoop-common-project/hadoop-common/src/site/markdown/Metrics.md +++ b/hadoop-common-project/hadoop-common/src/site/markdown/Metrics.md @@ -215,6 +215,7 @@ Each metrics record contains tags such as HAState and Hostname as additional inf | `TotalLoad` | Current number of connections | | `SnapshottableDirectories` | Current number of snapshottable directories | | `Snapshots` | Current number of snapshots | +| `NumEncryptionZones` | Current number of encryption zones | | `BlocksTotal` | Current number of allocated blocks in the system | | `FilesTotal` | Current number of files and directories | | `PendingReplicationBlocks` | Current number of blocks pending to be replicated | diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 1cb74ee9596..6a9a4de0f02 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -391,6 +391,9 @@ Release 2.8.0 - UNRELEASED HDFS-7483. Display information per tier on the Namenode UI. (Benoy Antony and wheat9 via wheat9) + HDFS-8721. Add a metric for number of encryption zones. + (Rakesh R via cnauroth) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java index 3fe748d0eb9..7c3c8956189 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/EncryptionZoneManager.java @@ -360,4 +360,11 @@ public class EncryptionZoneManager { final boolean hasMore = (numResponses < tailMap.size()); return new BatchedListEntries(zones, hasMore); } + + /** + * @return number of encryption zones. + */ + public int getNumEncryptionZones() { + return encryptionZones.size(); + } } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index a1bbedd8375..277720895d7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -4072,6 +4072,12 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, return JSON.toString(info); } + @Override // FSNamesystemMBean + @Metric({ "NumEncryptionZones", "The number of encryption zones" }) + public int getNumEncryptionZones() { + return dir.ezManager.getNumEncryptionZones(); + } + int getNumberOfDatanodes(DatanodeReportType type) { readLock(); try { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java index b31b7b6b722..580cb780eb5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/metrics/FSNamesystemMBean.java @@ -184,4 +184,9 @@ public interface FSNamesystemMBean { * @return JSON string */ public String getTopUserOpCounts(); + + /** + * Return the number of encryption zones in the system. + */ + int getNumEncryptionZones(); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java index e0bd6f44cc8..567a70aa514 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestEncryptionZones.java @@ -97,6 +97,8 @@ import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; import static org.apache.hadoop.hdfs.DFSTestUtil.verifyFilesEqual; import static org.apache.hadoop.test.GenericTestUtils.assertExceptionContains; +import static org.apache.hadoop.test.MetricsAsserts.assertGauge; +import static org.apache.hadoop.test.MetricsAsserts.getMetrics; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -120,6 +122,7 @@ public class TestEncryptionZones { protected DistributedFileSystem fs; private File testRootDir; protected final String TEST_KEY = "test_key"; + private static final String NS_METRICS = "FSNamesystem"; protected FileSystemTestWrapper fsWrapper; protected FileContextTestWrapper fcWrapper; @@ -358,6 +361,9 @@ public class TestEncryptionZones { fs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE); cluster.restartNameNode(true); assertNumZones(numZones); + assertEquals("Unexpected number of encryption zones!", numZones, cluster + .getNamesystem().getNumEncryptionZones()); + assertGauge("NumEncryptionZones", numZones, getMetrics(NS_METRICS)); assertZonePresent(null, zone1.toString()); // Verify newly added ez is present after restarting the NameNode diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java index c044fb0cff1..fb3179a9e99 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSNamesystemMBean.java @@ -117,6 +117,11 @@ public class TestFSNamesystemMBean { "PendingDeletionBlocks"); assertNotNull(pendingDeletionBlocks); assertTrue(pendingDeletionBlocks instanceof Long); + + Object encryptionZones = mbs.getAttribute(mxbeanName, + "NumEncryptionZones"); + assertNotNull(encryptionZones); + assertTrue(encryptionZones instanceof Integer); } finally { if (cluster != null) { cluster.shutdown();