/** * Tests to make sure a given layout version supports all the * features from the ancestor */ @Test public void testFeaturesFromAncestorSupported() { for (LayoutFeature f : Feature.values()) { validateFeatureList(f); } }
/** * Test to make sure NameNode.Feature support previous features */ @Test public void testNameNodeFeature() { final LayoutFeature first = NameNodeLayoutVersion.Feature.ROLLING_UPGRADE; assertTrue(NameNodeLayoutVersion.supports(LAST_NON_RESERVED_COMMON_FEATURE, first.getInfo().getLayoutVersion())); assertEquals(LAST_COMMON_FEATURE.getInfo().getLayoutVersion() - 1, first.getInfo().getLayoutVersion()); }
/** * Test to make sure DataNode.Feature support previous features */ @Test public void testDataNodeFeature() { final LayoutFeature first = DataNodeLayoutVersion.Feature.FIRST_LAYOUT; assertTrue(DataNodeLayoutVersion.supports(LAST_NON_RESERVED_COMMON_FEATURE, first.getInfo().getLayoutVersion())); assertEquals(LAST_COMMON_FEATURE.getInfo().getLayoutVersion() - 1, first.getInfo().getLayoutVersion()); }
/** * Given feature {@code f}, ensures the layout version of that feature * supports all the features supported by it's ancestor. */ private void validateFeatureList(LayoutFeature f) { final FeatureInfo info = f.getInfo(); int lv = info.getLayoutVersion(); int ancestorLV = info.getAncestorLayoutVersion(); SortedSet<LayoutFeature> ancestorSet = NameNodeLayoutVersion.getFeatures(ancestorLV); assertNotNull(ancestorSet); for (LayoutFeature feature : ancestorSet) { assertTrue("LV " + lv + " does nto support " + feature + " supported by the ancestor LV " + info.getAncestorLayoutVersion(), NameNodeLayoutVersion.supports(feature, lv)); } }
/** * Tests that NameNode features are listed in order of minimum compatible * layout version. It would be inconsistent to have features listed out of * order with respect to minimum compatible layout version, because it would * imply going back in time to change compatibility logic in a software release * that had already shipped. */ @Test public void testNameNodeFeatureMinimumCompatibleLayoutVersionAscending() { LayoutFeature prevF = null; for (LayoutFeature f : EnumSet.allOf(NameNodeLayoutVersion.Feature.class)) { if (prevF != null) { assertTrue(String.format("Features %s and %s not listed in order of " + "minimum compatible layout version.", prevF, f), f.getInfo().getMinimumCompatibleLayoutVersion() <= prevF.getInfo().getMinimumCompatibleLayoutVersion()); } else { prevF = f; } } }
/** * Tests that attempting to add a new NameNode feature out of order with * respect to minimum compatible layout version will fail fast. */ @Test(expected=AssertionError.class) public void testNameNodeFeatureMinimumCompatibleLayoutVersionOutOfOrder() { FeatureInfo ancestorF = LayoutVersion.Feature.RESERVED_REL2_4_0.getInfo(); LayoutFeature f = mock(LayoutFeature.class); when(f.getInfo()).thenReturn(new FeatureInfo( ancestorF.getLayoutVersion() - 1, ancestorF.getLayoutVersion(), ancestorF.getMinimumCompatibleLayoutVersion() + 1, "Invalid feature.", false)); Map<Integer, SortedSet<LayoutFeature>> features = new HashMap<>(); LayoutVersion.updateMap(features, LayoutVersion.Feature.values()); LayoutVersion.updateMap(features, new LayoutFeature[] { f }); }
public static SortedSet<LayoutFeature> getFeatures(int lv) { return FEATURES.get(lv); }
public static boolean supports(final LayoutFeature f, final int lv) { return LayoutVersion.supports(FEATURES, f, lv); }
public boolean versionSupportsFederation( Map<Integer, SortedSet<LayoutFeature>> map) { return LayoutVersion.supports(map, LayoutVersion.Feature.FEDERATION, layoutVersion); }
public Map<Integer, SortedSet<LayoutFeature>> getServiceLayoutFeatureMap() { return storageType == NodeType.DATA_NODE? DataNodeLayoutVersion.FEATURES : NameNodeLayoutVersion.FEATURES; }