Program: 155177
Project: 155177
Buggy source:
synchronized void checkXids() throws IOException {
  Iterator<Xid> keyIterator=xidMap.keySet().iterator();
  LinkedList<Xid> xids=new LinkedList<Xid>();
  while (keyIterator.hasNext()) {
    xids.add(keyIterator.next());
  }
  Collections.sort(xids,new Comparator<Xid>(){
    public int compare(    Xid o1,    Xid o2){
      Integer id1=txOrderMap.get(o1);
      Integer id2=txOrderMap.get(o2);
      if (id1 == null && id2 == null) {
        return 0;
      }
      if (id1 == null) {
        return Integer.MAX_VALUE;
      }
      if (id2 == null) {
        return Integer.MIN_VALUE;
      }
      return id1 - id2;
    }
  }
);
  txOrderMap=null;
  Logger logger=Logger.getLogger(tf.getClass().getName());
  while (!xids.isEmpty()) {
    Xid xid=xids.removeFirst();
    XidStatus status=xidMap.get(xid);
    TransactionStatus txStatus=status.getTransactionStatus();
    XaTransaction xaTransaction=txStatus.getTransaction();
    int identifier=xaTransaction.getIdentifier();
    if (xaTransaction.isRecovered()) {
      if (txStatus.commitStarted()) {
        logger.info("String_Node_Str" + name + "String_Node_Str"+ identifier+ "String_Node_Str");
        log.doneInternal(identifier);
        xidMap.remove(xid);
        recoveredTxCount--;
      }
 else       if (!txStatus.prepared()) {
        logger.info("String_Node_Str" + name + "String_Node_Str"+ "String_Node_Str"+ identifier+ "String_Node_Str");
        log.doneInternal(xaTransaction.getIdentifier());
        xidMap.remove(xid);
        recoveredTxCount--;
      }
 else {
        logger.info("String_Node_Str" + name + "String_Node_Str"+ txStatus+ "String_Node_Str"+ identifier+ "String_Node_Str");
      }
    }
  }
  checkIfRecoveryComplete();
}

Fixed version (ground truth):
synchronized void checkXids() throws IOException {
  Iterator<Xid> keyIterator=xidMap.keySet().iterator();
  LinkedList<Xid> xids=new LinkedList<Xid>();
  while (keyIterator.hasNext()) {
    xids.add(keyIterator.next());
  }
  Collections.sort(xids,new Comparator<Xid>(){
    public int compare(    Xid o1,    Xid o2){
      Integer id1=txOrderMap.get(o1);
      Integer id2=txOrderMap.get(o2);
      if (id1 == null && id2 == null) {
        return 0;
      }
      if (id1 == null) {
        return Integer.MAX_VALUE;
      }
      if (id2 == null) {
        return Integer.MIN_VALUE;
      }
      return id1 - id2;
    }
  }
);
  txOrderMap=null;
  Logger logger=Logger.getLogger(tf.getClass().getName());
  while (!xids.isEmpty()) {
    Xid xid=xids.removeFirst();
    XidStatus status=xidMap.get(xid);
    TransactionStatus txStatus=status.getTransactionStatus();
    XaTransaction xaTransaction=txStatus.getTransaction();
    int identifier=xaTransaction.getIdentifier();
    if (xaTransaction.isRecovered()) {
      if (txStatus.commitStarted()) {
        logger.fine("String_Node_Str" + name + "String_Node_Str"+ identifier+ "String_Node_Str");
        log.doneInternal(identifier);
        xidMap.remove(xid);
        recoveredTxCount--;
      }
 else       if (!txStatus.prepared()) {
        logger.fine("String_Node_Str" + name + "String_Node_Str"+ "String_Node_Str"+ identifier+ "String_Node_Str");
        log.doneInternal(xaTransaction.getIdentifier());
        xidMap.remove(xid);
        recoveredTxCount--;
      }
 else {
        logger.fine("String_Node_Str" + name + "String_Node_Str"+ txStatus+ "String_Node_Str"+ identifier+ "String_Node_Str");
      }
    }
  }
  checkIfRecoveryComplete();
}