/** * Test that the NN is considered to be out of resources only once all * redundant configured volumes are low on resources, or when any required * volume is low on resources. */ @Test public void testLowResourceVolumePolicy() throws IOException, URISyntaxException { Configuration conf = new Configuration(); File nameDir1 = new File(BASE_DIR, "name-dir1"); File nameDir2 = new File(BASE_DIR, "name-dir2"); nameDir1.mkdirs(); nameDir2.mkdirs(); conf.set(DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY, nameDir1.getAbsolutePath() + "," + nameDir2.getAbsolutePath()); conf.setInt(DFSConfigKeys.DFS_NAMENODE_CHECKED_VOLUMES_MINIMUM_KEY, 2); NameNodeResourceChecker nnrc = new NameNodeResourceChecker(conf); // For the purpose of this test, we need to force the name dirs to appear to // be on different volumes. Map<String, CheckedVolume> volumes = new HashMap<String, CheckedVolume>(); CheckedVolume volume1 = Mockito.mock(CheckedVolume.class); CheckedVolume volume2 = Mockito.mock(CheckedVolume.class); CheckedVolume volume3 = Mockito.mock(CheckedVolume.class); CheckedVolume volume4 = Mockito.mock(CheckedVolume.class); CheckedVolume volume5 = Mockito.mock(CheckedVolume.class); Mockito.when(volume1.isResourceAvailable()).thenReturn(true); Mockito.when(volume2.isResourceAvailable()).thenReturn(true); Mockito.when(volume3.isResourceAvailable()).thenReturn(true); Mockito.when(volume4.isResourceAvailable()).thenReturn(true); Mockito.when(volume5.isResourceAvailable()).thenReturn(true); // Make volumes 4 and 5 required. Mockito.when(volume4.isRequired()).thenReturn(true); Mockito.when(volume5.isRequired()).thenReturn(true); volumes.put("volume1", volume1); volumes.put("volume2", volume2); volumes.put("volume3", volume3); volumes.put("volume4", volume4); volumes.put("volume5", volume5); nnrc.setVolumes(volumes); // Initially all dirs have space. assertTrue(nnrc.hasAvailableDiskSpace()); // 1/3 redundant dir is low on space. Mockito.when(volume1.isResourceAvailable()).thenReturn(false); assertTrue(nnrc.hasAvailableDiskSpace()); // 2/3 redundant dirs are low on space. Mockito.when(volume2.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); // Lower the minimum number of redundant volumes that must be available. nnrc.setMinimumReduntdantVolumes(1); assertTrue(nnrc.hasAvailableDiskSpace()); // Just one required dir is low on space. Mockito.when(volume3.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); // Just the other required dir is low on space. Mockito.when(volume3.isResourceAvailable()).thenReturn(true); Mockito.when(volume4.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); }
/** * Test that the NN is considered to be out of resources only once all * redundant configured volumes are low on resources, or when any required * volume is low on resources. */ @Test public void testLowResourceVolumePolicy() throws IOException, URISyntaxException { Configuration conf = new Configuration(); File nameDir1 = new File(System.getProperty("test.build.data"), "name-dir1"); File nameDir2 = new File(System.getProperty("test.build.data"), "name-dir2"); nameDir1.mkdirs(); nameDir2.mkdirs(); conf.set(DFSConfigKeys.DFS_NAMENODE_EDITS_DIR_KEY, nameDir1.getAbsolutePath() + "," + nameDir2.getAbsolutePath()); conf.setInt(DFSConfigKeys.DFS_NAMENODE_CHECKED_VOLUMES_MINIMUM_KEY, 2); NameNodeResourceChecker nnrc = new NameNodeResourceChecker(conf); // For the purpose of this test, we need to force the name dirs to appear to // be on different volumes. Map<String, CheckedVolume> volumes = new HashMap<String, CheckedVolume>(); CheckedVolume volume1 = Mockito.mock(CheckedVolume.class); CheckedVolume volume2 = Mockito.mock(CheckedVolume.class); CheckedVolume volume3 = Mockito.mock(CheckedVolume.class); CheckedVolume volume4 = Mockito.mock(CheckedVolume.class); CheckedVolume volume5 = Mockito.mock(CheckedVolume.class); Mockito.when(volume1.isResourceAvailable()).thenReturn(true); Mockito.when(volume2.isResourceAvailable()).thenReturn(true); Mockito.when(volume3.isResourceAvailable()).thenReturn(true); Mockito.when(volume4.isResourceAvailable()).thenReturn(true); Mockito.when(volume5.isResourceAvailable()).thenReturn(true); // Make volumes 4 and 5 required. Mockito.when(volume4.isRequired()).thenReturn(true); Mockito.when(volume5.isRequired()).thenReturn(true); volumes.put("volume1", volume1); volumes.put("volume2", volume2); volumes.put("volume3", volume3); volumes.put("volume4", volume4); volumes.put("volume5", volume5); nnrc.setVolumes(volumes); // Initially all dirs have space. assertTrue(nnrc.hasAvailableDiskSpace()); // 1/3 redundant dir is low on space. Mockito.when(volume1.isResourceAvailable()).thenReturn(false); assertTrue(nnrc.hasAvailableDiskSpace()); // 2/3 redundant dirs are low on space. Mockito.when(volume2.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); // Lower the minimum number of redundant volumes that must be available. nnrc.setMinimumReduntdantVolumes(1); assertTrue(nnrc.hasAvailableDiskSpace()); // Just one required dir is low on space. Mockito.when(volume3.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); // Just the other required dir is low on space. Mockito.when(volume3.isResourceAvailable()).thenReturn(true); Mockito.when(volume4.isResourceAvailable()).thenReturn(false); assertFalse(nnrc.hasAvailableDiskSpace()); }