Uploaded image for project: 'IMPALA'
  1. IMPALA
  2. IMPALA-1699

HdfsPartition's compareTo() method breaks contract

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Critical
    • Resolution: Fixed
    • Impala 2.1
    • Impala 2.2
    • None

    Description

      During SHOW COLUMN STATS you might occasionally see:

      'ERROR: IllegalArgumentException: Comparison method violates its general contract!'

      The stack trace is:

      at java.util.ComparableTimSort.mergeHi(ComparableTimSort.java:835)
      	at java.util.ComparableTimSort.mergeAt(ComparableTimSort.java:453)
      	at java.util.ComparableTimSort.mergeForceCollapse(ComparableTimSort.java:392)
      	at java.util.ComparableTimSort.sort(ComparableTimSort.java:191)
      	at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
      	at java.util.Arrays.sort(Arrays.java:472)
      	at java.util.Collections.sort(Collections.java:155)
      	at com.cloudera.impala.catalog.HdfsTable.getTableStats(HdfsTable.java:1342)
      	at com.cloudera.impala.service.Frontend.getTableStats(Frontend.java:631)
      	at com.cloudera.impala.service.JniFrontend.getStats(JniFrontend.java:293)
      

      The culprit is HdfsPartition's compareTo() method.

      @Override
        public int compareTo(HdfsPartition o) {
          int sizeDiff = partitionKeyValues_.size() - o.getPartitionValues().size();
          if (sizeDiff != 0) return sizeDiff;
          for (int i = 0; i < partitionKeyValues_.size(); ++i) {
            int cmp = partitionKeyValues_.get(i).compareTo(o.getPartitionValues().get(i));
            if (cmp != 0) return cmp;
          }
          return 0;
        }
      

      Attachments

        Activity

          People

            jyu@cloudera.com Juan Yu
            henryr Henry Robinson
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: