Program: 61109
Project: 61109
Buggy source:
/** 
 * Flushes the snapshot of the MemStore. If this store is not a mob store, flush the cells in the snapshot to store files of HBase. If the store is a mob one, the flusher flushes the MemStore into two places. One is the store files of HBase, the other is the mob files. <ol> <li>Cells that are not PUT type or have the delete mark will be directly flushed to HBase.</li> <li>If the size of a cell value is larger than a threshold, it'll be flushed to a mob file, another cell with the path of this file will be flushed to HBase.</li> <li>If the size of a cell value is smaller than or equal with a threshold, it'll be flushed to HBase directly.</li> </ol>
 */
@Override public List<Path> flushSnapshot(MemStoreSnapshot snapshot,long cacheFlushId,MonitoredTask status,ThroughputController throughputController) throws IOException {
  ArrayList<Path> result=new ArrayList<Path>();
  int cellsCount=snapshot.getCellsCount();
  if (cellsCount == 0)   return result;
  long smallestReadPoint=store.getSmallestReadPoint();
  InternalScanner scanner=createScanner(snapshot.getScanner(),smallestReadPoint);
  if (scanner == null) {
    return result;
  }
  StoreFileWriter writer;
  try {
synchronized (flushLock) {
      status.setStatus("String_Node_Str" + store + "String_Node_Str");
      writer=store.createWriterInTmp(cellsCount,store.getFamily().getCompression(),false,true,true);
      writer.setTimeRangeTracker(snapshot.getTimeRangeTracker());
      try {
        performMobFlush(snapshot,cacheFlushId,scanner,writer,status);
      }
  finally {
        finalizeWriter(writer,cacheFlushId,status);
      }
    }
  }
  finally {
    scanner.close();
  }
  LOG.info("String_Node_Str" + cacheFlushId + "String_Node_Str"+ StringUtils.TraditionalBinaryPrefix.long2String(snapshot.getSize(),"String_Node_Str",1)+ "String_Node_Str"+ writer.hasGeneralBloom()+ "String_Node_Str"+ writer.getPath());
  result.add(writer.getPath());
  return result;
}

Fixed version (ground truth):
/** 
 * Flushes the snapshot of the MemStore. If this store is not a mob store, flush the cells in the snapshot to store files of HBase. If the store is a mob one, the flusher flushes the MemStore into two places. One is the store files of HBase, the other is the mob files. <ol> <li>Cells that are not PUT type or have the delete mark will be directly flushed to HBase.</li> <li>If the size of a cell value is larger than a threshold, it'll be flushed to a mob file, another cell with the path of this file will be flushed to HBase.</li> <li>If the size of a cell value is smaller than or equal with a threshold, it'll be flushed to HBase directly.</li> </ol>
 */
@Override public List<Path> flushSnapshot(MemStoreSnapshot snapshot,long cacheFlushId,MonitoredTask status,ThroughputController throughputController) throws IOException {
  ArrayList<Path> result=new ArrayList<Path>();
  long cellsCount=snapshot.getCellsCount();
  if (cellsCount == 0)   return result;
  long smallestReadPoint=store.getSmallestReadPoint();
  InternalScanner scanner=createScanner(snapshot.getScanner(),smallestReadPoint);
  if (scanner == null) {
    return result;
  }
  StoreFileWriter writer;
  try {
synchronized (flushLock) {
      status.setStatus("String_Node_Str" + store + "String_Node_Str");
      writer=store.createWriterInTmp(cellsCount,store.getFamily().getCompression(),false,true,true,false,snapshot.getTimeRangeTracker());
      try {
        performMobFlush(snapshot,cacheFlushId,scanner,writer,status);
      }
  finally {
        finalizeWriter(writer,cacheFlushId,status);
      }
    }
  }
  finally {
    scanner.close();
  }
  LOG.info("String_Node_Str" + cacheFlushId + "String_Node_Str"+ StringUtils.TraditionalBinaryPrefix.long2String(snapshot.getSize(),"String_Node_Str",1)+ "String_Node_Str"+ writer.hasGeneralBloom()+ "String_Node_Str"+ writer.getPath());
  result.add(writer.getPath());
  return result;
}