diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 66fd138cb0..abe699a397 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -737,6 +737,10 @@ Release 2.7.0 - UNRELEASED HADOOP-11327. BloomFilter#not() omits the last bit, resulting in an incorrect filter (Eric Payne via jlowe) + HADOOP-11466. FastByteComparisons: do not use UNSAFE_COMPARER on the SPARC + architecture because it is slower there (Suman Somasundar via Colin P. + McCabe) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java index 3f5881b2dd..a3fea3115c 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java @@ -24,6 +24,9 @@ import sun.misc.Unsafe; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.google.common.primitives.Longs; import com.google.common.primitives.UnsignedBytes; @@ -33,6 +36,7 @@ * class to be able to compare arrays that start at non-zero offsets. */ abstract class FastByteComparisons { + static final Log LOG = LogFactory.getLog(FastByteComparisons.class); /** * Lexicographically compare two byte arrays. @@ -71,6 +75,13 @@ private static class LexicographicalComparerHolder { * implementation if unable to do so. */ static Comparer getBestComparer() { + if (System.getProperty("os.arch").equals("sparc")) { + if (LOG.isTraceEnabled()) { + LOG.trace("Lexicographical comparer selected for " + + "byte aligned system architecture"); + } + return lexicographicalComparerJavaImpl(); + } try { Class theClass = Class.forName(UNSAFE_COMPARER_NAME); @@ -78,8 +89,16 @@ static Comparer getBestComparer() { @SuppressWarnings("unchecked") Comparer comparer = (Comparer) theClass.getEnumConstants()[0]; + if (LOG.isTraceEnabled()) { + LOG.trace("Unsafe comparer selected for " + + "byte unaligned system architecture"); + } return comparer; } catch (Throwable t) { // ensure we really catch *everything* + if (LOG.isTraceEnabled()) { + LOG.trace(t.getMessage()); + LOG.trace("Lexicographical comparer selected"); + } return lexicographicalComparerJavaImpl(); } } @@ -234,4 +253,4 @@ public int compareTo(byte[] buffer1, int offset1, int length1, } } } -} \ No newline at end of file +}