chenyang created HBASE-22324:
--------------------------------

             Summary: MemStoreMergerSegmentsIterator can not merge memstore 
segments when the seqId of cell greater than Integer.Max, as a result,  lossing 
some data
                 Key: HBASE-22324
                 URL: https://issues.apache.org/jira/browse/HBASE-22324
             Project: HBase
          Issue Type: Bug
    Affects Versions: 2.1.0, 2.2.0
            Reporter: chenyang


if your memstore type is CompactingMemStore,MemStoreMergerSegmentsIterator can 
not merge memstore segments when the seqId of cells greater than Integer.Max, 
as a result, lossing some data. the reason is that 
MemStoreMergerSegmentsIterator use Integer.Max as readPt when create Scanner,  
but the seqId of cell  may be greater than Integer.MAX_VALUE,  it`s type is 
long.   code as below:
{code:java}
public MemStoreMergerSegmentsIterator(List<ImmutableSegment> segments, 
CellComparator comparator,
    int compactionKVMax) throws IOException {
  super(compactionKVMax);
  // create the list of scanners to traverse over all the data
  // no dirty reads here as these are immutable segments
  AbstractMemStore.addToScanners(segments, Integer.MAX_VALUE, scanners); //bug, 
should use Long.MAX_VALUE
  heap = new KeyValueHeap(scanners, comparator);
}

SegmentScanner.java code as below
protected void updateCurrent() {
  Cell startKV = current;
  Cell next = null;

  try {
    while (iter.hasNext()) {
      next = iter.next();
      // here, if seqId>readPoint(Integer.MAX_VALUE), never read cell, as a 
result, lossing lots of cells
      if (next.getSequenceId() <= this.readPoint) {
        current = next;
        return;// skip irrelevant versions
      }
      if (stopSkippingKVsIfNextRow &&   // for backwardSeek() stay in the
          startKV != null &&        // boundaries of a single row
          segment.compareRows(next, startKV) > 0) {
        current = null;
        return;
      }
    } // end of while

    current = null; // nothing found
  } finally {
    if (next != null) {
      // in all cases, remember the last KV we iterated to, needed for reseek()
      last = next;
    }
  }
}{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to