You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-issues@hadoop.apache.org by "Ayappan (JIRA)" <ji...@apache.org> on 2014/06/24 13:02:24 UTC

[jira] [Commented] (HADOOP-10744) LZ4 Compression fails to recognize PowerPC Little Endian Architecture

    [ https://issues.apache.org/jira/browse/HADOOP-10744?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14041968#comment-14041968 ] 

Ayappan commented on HADOOP-10744:
----------------------------------

The problem is due to the below lines of code in the lz4.c file (src/main/native/src/org/apache/hadoop/io/compress/lz4/lz4.c)

// Little Endian or Big Endian ?
// Overwrite the #define below if you know your architecture endianess
#if defined (__GLIBC__)
#  include <endian.h>
#  if (__BYTE_ORDER == __BIG_ENDIAN)
#     define LZ4_BIG_ENDIAN 1
#  endif
#elif (defined(__BIG_ENDIAN__) || defined(__BIG_ENDIAN) || defined(_BIG_ENDIAN)) && !(defined(__LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN))
#  define LZ4_BIG_ENDIAN 1
#elif defined(__sparc) || defined(__sparc__) \
   || defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \
   || defined(__hpux)  || defined(__hppa) \
   || defined(_MIPSEB) || defined(__s390__)
#  define LZ4_BIG_ENDIAN 1
#else
// Little Endian assumed. PDP Endian and other very rare endian format are unsupported.
#endif

The flow goes like this in Power little Endian system. __GLIB__ is not defined , it falls on next elif. The condition fails due to __LITTLE_ENDIAN__... flags, falls on next elif and here it get satisfied! and sets LZ4_BIG_ENDIAN. The thing is these flags __powerpc__, __ppc__, __PPC__ are also defined in PowerPC Little Endian Architecture.

There is a similar file called lz4hc.c which also has the same lines code and still it correctly recognizes Little Endian Architecture. The reason behind that is..there is a include <stdlib.h> which actually turns on the __GLIBC__ flag.
And since now the decision is based on BYTE_ORDER, it identifies whether it is Big Endian or Little Endian.

So lz4.c file should also have the "include <stdlib.h>" to make it work correctly in Power Little Endian Architecture


> LZ4 Compression fails to recognize PowerPC Little Endian Architecture
> ---------------------------------------------------------------------
>
>                 Key: HADOOP-10744
>                 URL: https://issues.apache.org/jira/browse/HADOOP-10744
>             Project: Hadoop Common
>          Issue Type: Test
>          Components: io, native
>    Affects Versions: 2.2.0, 2.3.0, 2.4.0
>         Environment: PowerPC Little Endian (ppc64le)
>            Reporter: Ayappan
>         Attachments: HADOOP-10744.patch
>
>
> Lz4 Compression fails to identify the PowerPC Little Endian Architecture. It recognizes it as Big Endian and several testcases( TestCompressorDecompressor, TestCodec, TestLz4CompressorDecompressor)  fails due to this.
> Running org.apache.hadoop.io.compress.TestCompressorDecompressor
> Tests run: 2, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 0.435 sec <<< FAILURE! - in org.apache.hadoop.io.compress.TestCompressorDecompressor
> testCompressorDecompressor(org.apache.hadoop.io.compress.TestCompressorDecompressor)  Time elapsed: 0.308 sec  <<< FAILURE!
> org.junit.internal.ArrayComparisonFailure: org.apache.hadoop.io.compress.lz4.Lz4Compressor_org.apache.hadoop.io.compress.lz4.Lz4Decompressor-  byte arrays not equals error !!!: arrays first differed at element [1428]; expected:<4> but was:<10>
>         at org.junit.internal.ComparisonCriteria.arrayEquals(ComparisonCriteria.java:50)
>         at org.junit.Assert.internalArrayEquals(Assert.java:473)
>         at org.junit.Assert.assertArrayEquals(Assert.java:294)
>         at org.apache.hadoop.io.compress.CompressDecompressTester$CompressionTestStrategy$2.assertCompression(CompressDecompressTester.java:325)
>         at org.apache.hadoop.io.compress.CompressDecompressTester.test(CompressDecompressTester.java:135)
>         at org.apache.hadoop.io.compress.TestCompressorDecompressor.testCompressorDecompressor(TestCompressorDecompressor.java:58)
> .......
> .......
> .....



--
This message was sent by Atlassian JIRA
(v6.2#6252)