/** * 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 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 }); }
@Override public FeatureInfo getInfo() { return info; }
/** * NameNode feature that is added at layout version {@code ancestoryLV}. * @param lv new layout version with the addition of this feature * @param ancestorLV layout version from which the new lv is derived from. * @param description description of the feature * @param reserved true when this is a layout version reserved for previous * versions * @param features set of features that are to be enabled for this version */ Feature(final int lv, final int ancestorLV, final String description, boolean reserved, Feature... features) { info = new FeatureInfo(lv, ancestorLV, description, reserved, features); }
/** * DataNode feature that is added at layout version {@code ancestoryLV}. * @param lv new layout version with the addition of this feature * @param ancestorLV layout version from which the new lv is derived from. * @param description description of the feature * @param reserved true when this is a layout version reserved for previous * version * @param features set of features that are to be enabled for this version */ Feature(final int lv, final int ancestorLV, final String description, boolean reserved, Feature... features) { info = new FeatureInfo(lv, ancestorLV, description, reserved, features); }
/** * NameNode feature that is added at layout version {@code ancestoryLV}. * @param lv new layout version with the addition of this feature * @param ancestorLV layout version from which the new lv is derived from. * @param minCompatLV minimum compatible layout version * @param description description of the feature * @param reserved true when this is a layout version reserved for previous * versions * @param features set of features that are to be enabled for this version */ Feature(final int lv, final int ancestorLV, int minCompatLV, final String description, boolean reserved, Feature... features) { info = new FeatureInfo(lv, ancestorLV, minCompatLV, description, reserved, features); }