HDFS-8593. Calculation of effective layout version mishandles comparison to current layout version in storage. Contributed by Chris Nauroth.
This commit is contained in:
parent
eef7b50e23
commit
b8341f1cd8
|
@ -886,6 +886,9 @@ Release 2.8.0 - UNRELEASED
|
|||
|
||||
HDFS-8554. TestDatanodeLayoutUpgrade fails on Windows. (cnauroth)
|
||||
|
||||
HDFS-8593. Calculation of effective layout version mishandles comparison to
|
||||
current layout version in storage. (cnauroth)
|
||||
|
||||
Release 2.7.1 - UNRELEASED
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
|
|
@ -7004,10 +7004,17 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|||
* @return layout version in effect
|
||||
*/
|
||||
public int getEffectiveLayoutVersion() {
|
||||
if (isRollingUpgrade()) {
|
||||
int storageLV = fsImage.getStorage().getLayoutVersion();
|
||||
if (storageLV >=
|
||||
NameNodeLayoutVersion.MINIMUM_COMPATIBLE_LAYOUT_VERSION) {
|
||||
return getEffectiveLayoutVersion(isRollingUpgrade(),
|
||||
fsImage.getStorage().getLayoutVersion(),
|
||||
NameNodeLayoutVersion.MINIMUM_COMPATIBLE_LAYOUT_VERSION,
|
||||
NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static int getEffectiveLayoutVersion(boolean isRollingUpgrade, int storageLV,
|
||||
int minCompatLV, int currentLV) {
|
||||
if (isRollingUpgrade) {
|
||||
if (storageLV <= minCompatLV) {
|
||||
// The prior layout version satisfies the minimum compatible layout
|
||||
// version of the current software. Keep reporting the prior layout
|
||||
// as the effective one. Downgrade is possible.
|
||||
|
@ -7016,7 +7023,7 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|||
}
|
||||
// The current software cannot satisfy the layout version of the prior
|
||||
// software. Proceed with using the current layout version.
|
||||
return NameNodeLayoutVersion.CURRENT_LAYOUT_VERSION;
|
||||
return currentLV;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -213,4 +213,24 @@ public class TestFSNamesystem {
|
|||
fsn.imageLoadComplete();
|
||||
assertTrue(fsn.isImageLoaded());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetEffectiveLayoutVersion() {
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(true, -60, -61, -63));
|
||||
assertEquals(-61,
|
||||
FSNamesystem.getEffectiveLayoutVersion(true, -61, -61, -63));
|
||||
assertEquals(-62,
|
||||
FSNamesystem.getEffectiveLayoutVersion(true, -62, -61, -63));
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(true, -63, -61, -63));
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(false, -60, -61, -63));
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(false, -61, -61, -63));
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(false, -62, -61, -63));
|
||||
assertEquals(-63,
|
||||
FSNamesystem.getEffectiveLayoutVersion(false, -63, -61, -63));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue