HDFS-3341, HADOOP-8340. SNAPSHOT build versions should compare as less than their eventual release. Contributed by Todd Lipcon.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1336459 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1ceecf2aa2
commit
b75f0187c8
@ -299,6 +299,9 @@ Release 2.0.0 - UNRELEASED
|
|||||||
HADOOP-8356. FileSystem service loading mechanism should print the FileSystem
|
HADOOP-8356. FileSystem service loading mechanism should print the FileSystem
|
||||||
impl it is failing to load (tucu)
|
impl it is failing to load (tucu)
|
||||||
|
|
||||||
|
HADOOP-8340. SNAPSHOT build versions should compare as less than their eventual
|
||||||
|
final release. (todd)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
BUG FIXES
|
BUG FIXES
|
||||||
|
@ -22,11 +22,20 @@
|
|||||||
|
|
||||||
import org.apache.hadoop.classification.InterfaceAudience;
|
import org.apache.hadoop.classification.InterfaceAudience;
|
||||||
|
|
||||||
|
import com.google.common.collect.ComparisonChain;
|
||||||
|
|
||||||
@InterfaceAudience.Private
|
@InterfaceAudience.Private
|
||||||
public abstract class VersionUtil {
|
public abstract class VersionUtil {
|
||||||
|
|
||||||
private static final Pattern COMPONENT_GROUPS = Pattern.compile("(\\d+)|(\\D+)");
|
private static final Pattern COMPONENT_GROUPS = Pattern.compile("(\\d+)|(\\D+)");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suffix added by maven for nightly builds and other snapshot releases.
|
||||||
|
* These releases are considered to precede the non-SNAPSHOT version
|
||||||
|
* with the same version number.
|
||||||
|
*/
|
||||||
|
private static final String SNAPSHOT_SUFFIX = "-SNAPSHOT";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function splits the two versions on "." and performs a
|
* This function splits the two versions on "." and performs a
|
||||||
* naturally-ordered comparison of the resulting components. For example, the
|
* naturally-ordered comparison of the resulting components. For example, the
|
||||||
@ -48,6 +57,11 @@ public abstract class VersionUtil {
|
|||||||
* between the two versions, then the version with fewer components is
|
* between the two versions, then the version with fewer components is
|
||||||
* considered to precede the version with more components.
|
* considered to precede the version with more components.
|
||||||
*
|
*
|
||||||
|
* In addition to the above rules, there is one special case: maven SNAPSHOT
|
||||||
|
* releases are considered to precede a non-SNAPSHOT release with an
|
||||||
|
* otherwise identical version number. For example, 2.0-SNAPSHOT precedes
|
||||||
|
* 2.0.
|
||||||
|
*
|
||||||
* This function returns a negative integer if version1 precedes version2, a
|
* This function returns a negative integer if version1 precedes version2, a
|
||||||
* positive integer if version2 precedes version1, and 0 if and only if the
|
* positive integer if version2 precedes version1, and 0 if and only if the
|
||||||
* two versions' components are identical in value and cardinality.
|
* two versions' components are identical in value and cardinality.
|
||||||
@ -61,6 +75,11 @@ public abstract class VersionUtil {
|
|||||||
* versions are equal.
|
* versions are equal.
|
||||||
*/
|
*/
|
||||||
public static int compareVersions(String version1, String version2) {
|
public static int compareVersions(String version1, String version2) {
|
||||||
|
boolean isSnapshot1 = version1.endsWith(SNAPSHOT_SUFFIX);
|
||||||
|
boolean isSnapshot2 = version2.endsWith(SNAPSHOT_SUFFIX);
|
||||||
|
version1 = stripSnapshotSuffix(version1);
|
||||||
|
version2 = stripSnapshotSuffix(version2);
|
||||||
|
|
||||||
String[] version1Parts = version1.split("\\.");
|
String[] version1Parts = version1.split("\\.");
|
||||||
String[] version2Parts = version2.split("\\.");
|
String[] version2Parts = version2.split("\\.");
|
||||||
|
|
||||||
@ -87,7 +106,19 @@ public static int compareVersions(String version1, String version2) {
|
|||||||
return component1.length() - component2.length();
|
return component1.length() - component2.length();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return version1Parts.length - version2Parts.length;
|
|
||||||
|
return ComparisonChain.start()
|
||||||
|
.compare(version1Parts.length, version2Parts.length)
|
||||||
|
.compare(isSnapshot2, isSnapshot1)
|
||||||
|
.result();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String stripSnapshotSuffix(String version) {
|
||||||
|
if (version.endsWith(SNAPSHOT_SUFFIX)) {
|
||||||
|
return version.substring(0, version.length() - SNAPSHOT_SUFFIX.length());
|
||||||
|
} else {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isNumeric(String s) {
|
private static boolean isNumeric(String s) {
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
import org.apache.hadoop.test.GenericTestUtils;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
public class TestVersionUtil {
|
public class TestVersionUtil {
|
||||||
@ -30,6 +29,8 @@ public void testCompareVersions() {
|
|||||||
assertEquals(0, VersionUtil.compareVersions("2.0.0", "2.0.0"));
|
assertEquals(0, VersionUtil.compareVersions("2.0.0", "2.0.0"));
|
||||||
assertEquals(0, VersionUtil.compareVersions("2.0.0a", "2.0.0a"));
|
assertEquals(0, VersionUtil.compareVersions("2.0.0a", "2.0.0a"));
|
||||||
assertEquals(0, VersionUtil.compareVersions("1", "1"));
|
assertEquals(0, VersionUtil.compareVersions("1", "1"));
|
||||||
|
assertEquals(0, VersionUtil.compareVersions(
|
||||||
|
"2.0.0-SNAPSHOT", "2.0.0-SNAPSHOT"));
|
||||||
|
|
||||||
// Assert that lower versions are lower, and higher versions are higher.
|
// Assert that lower versions are lower, and higher versions are higher.
|
||||||
assertExpectedValues("1", "2.0.0");
|
assertExpectedValues("1", "2.0.0");
|
||||||
@ -52,6 +53,13 @@ public void testCompareVersions() {
|
|||||||
assertExpectedValues("1.0.0a2", "1.0.0a10");
|
assertExpectedValues("1.0.0a2", "1.0.0a10");
|
||||||
assertExpectedValues("1.0", "1.a");
|
assertExpectedValues("1.0", "1.a");
|
||||||
assertExpectedValues("1.0", "1.a0");
|
assertExpectedValues("1.0", "1.a0");
|
||||||
|
|
||||||
|
// Snapshot builds precede their eventual releases.
|
||||||
|
assertExpectedValues("1.0-SNAPSHOT", "1.0");
|
||||||
|
assertExpectedValues("1.0", "1.0.0-SNAPSHOT");
|
||||||
|
assertExpectedValues("1.0.0-SNAPSHOT", "1.0.0");
|
||||||
|
assertExpectedValues("1.0.0", "1.0.1-SNAPSHOT");
|
||||||
|
assertExpectedValues("1.0.1-SNAPSHOT", "1.0.1");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertExpectedValues(String lower, String higher) {
|
private static void assertExpectedValues(String lower, String higher) {
|
||||||
|
@ -438,6 +438,9 @@ Release 2.0.0 - UNRELEASED
|
|||||||
HDFS-3390. DFSAdmin should print full stack traces of errors when DEBUG
|
HDFS-3390. DFSAdmin should print full stack traces of errors when DEBUG
|
||||||
logging is enabled. (atm)
|
logging is enabled. (atm)
|
||||||
|
|
||||||
|
HDFS-3341. Change minimum RPC versions to respective SNAPSHOTs instead of
|
||||||
|
final releases. (todd)
|
||||||
|
|
||||||
OPTIMIZATIONS
|
OPTIMIZATIONS
|
||||||
|
|
||||||
HDFS-3024. Improve performance of stringification in addStoredBlock (todd)
|
HDFS-3024. Improve performance of stringification in addStoredBlock (todd)
|
||||||
|
@ -145,7 +145,7 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
|
|||||||
public static final String DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_KEY = "dfs.namenode.num.extra.edits.retained";
|
public static final String DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_KEY = "dfs.namenode.num.extra.edits.retained";
|
||||||
public static final int DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_DEFAULT = 1000000; //1M
|
public static final int DFS_NAMENODE_NUM_EXTRA_EDITS_RETAINED_DEFAULT = 1000000; //1M
|
||||||
public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_KEY = "dfs.namenode.min.supported.datanode.version";
|
public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_KEY = "dfs.namenode.min.supported.datanode.version";
|
||||||
public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_DEFAULT = "3.0.0";
|
public static final String DFS_NAMENODE_MIN_SUPPORTED_DATANODE_VERSION_DEFAULT = "3.0.0-SNAPSHOT";
|
||||||
|
|
||||||
public static final String DFS_NAMENODE_EDITS_DIR_MINIMUM_KEY = "dfs.namenode.edits.dir.minimum";
|
public static final String DFS_NAMENODE_EDITS_DIR_MINIMUM_KEY = "dfs.namenode.edits.dir.minimum";
|
||||||
public static final int DFS_NAMENODE_EDITS_DIR_MINIMUM_DEFAULT = 1;
|
public static final int DFS_NAMENODE_EDITS_DIR_MINIMUM_DEFAULT = 1;
|
||||||
@ -263,7 +263,7 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
|
|||||||
public static final int DFS_DATANODE_IPC_DEFAULT_PORT = 50020;
|
public static final int DFS_DATANODE_IPC_DEFAULT_PORT = 50020;
|
||||||
public static final String DFS_DATANODE_IPC_ADDRESS_DEFAULT = "0.0.0.0" + DFS_DATANODE_IPC_DEFAULT_PORT;
|
public static final String DFS_DATANODE_IPC_ADDRESS_DEFAULT = "0.0.0.0" + DFS_DATANODE_IPC_DEFAULT_PORT;
|
||||||
public static final String DFS_DATANODE_MIN_SUPPORTED_NAMENODE_VERSION_KEY = "dfs.datanode.min.supported.namenode.version";
|
public static final String DFS_DATANODE_MIN_SUPPORTED_NAMENODE_VERSION_KEY = "dfs.datanode.min.supported.namenode.version";
|
||||||
public static final String DFS_DATANODE_MIN_SUPPORTED_NAMENODE_VERSION_DEFAULT = "3.0.0";
|
public static final String DFS_DATANODE_MIN_SUPPORTED_NAMENODE_VERSION_DEFAULT = "3.0.0-SNAPSHOT";
|
||||||
|
|
||||||
public static final String DFS_BLOCK_ACCESS_TOKEN_ENABLE_KEY = "dfs.block.access.token.enable";
|
public static final String DFS_BLOCK_ACCESS_TOKEN_ENABLE_KEY = "dfs.block.access.token.enable";
|
||||||
public static final boolean DFS_BLOCK_ACCESS_TOKEN_ENABLE_DEFAULT = false;
|
public static final boolean DFS_BLOCK_ACCESS_TOKEN_ENABLE_DEFAULT = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user