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 01a8d5b900b..695641efd43 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/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 bda7abaca99..b30b2f8d0aa 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 @@ -386,6 +386,13 @@ public class EncryptionZoneManager { return new BatchedListEntries(zones, hasMore); } + /** + * @return number of encryption zones. + */ + public int getNumEncryptionZones() { + return encryptionZones.size(); + } + /** * @return Whether there has been any attempt to create an encryption zone in * the cluster at all. If not, it is safe to quickly return null when 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 10310106e41..cd1fe4b3497 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 @@ -4930,6 +4930,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 8e2fbddd7fb..2a05a945302 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 @@ -100,6 +100,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; @@ -123,6 +125,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; @@ -361,6 +364,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();