Program: 130752
Project: 130752
Buggy source:
@Override public Void call() throws Exception {
  LOG.debug("String_Node_Str");
  try {
    while (true) {
      MessageTuple request=ackQueue.take();
      if (request == MessageTuple.REQUEST_OF_DEATH) {
        break;
      }
      Message msg=request.getMessage();
      String source=request.getServerId();
      if (msg.getType() == MessageType.ACK) {
        ZabMessage.Ack ack=request.getMessage().getAck();
        Zxid zxid=MessageBuilder.fromProtoZxid(ack.getZxid());
        LOG.debug("String_Node_Str",zxid,source);
        this.quorumSet.get(source).setLastAckedZxid(zxid);
        Zxid zxidCanCommit=null;
        if (this.pendingConfig != null) {
          zxidCanCommit=getCommittedZxid(this.pendingConfig);
          LOG.debug("String_Node_Str",zxidCanCommit);
          if (zxidCanCommit.compareTo(pendingConfig.getVersion()) >= 0) {
            LOG.debug("String_Node_Str" + "String_Node_Str",pendingConfig.getVersion());
            this.clusterConfig=this.pendingConfig;
            this.pendingConfig=null;
          }
 else {
            zxidCanCommit=null;
          }
        }
        if (zxidCanCommit == null) {
          zxidCanCommit=getCommittedZxid(this.clusterConfig);
          if (pendingConfig != null && zxidCanCommit.compareTo(pendingConfig.getVersion()) >= 0) {
            Zxid version=pendingConfig.getVersion();
            zxidCanCommit=new Zxid(version.getEpoch(),version.getXid() - 1);
          }
          LOG.debug("String_Node_Str",zxidCanCommit);
        }
        LOG.debug("String_Node_Str",zxidCanCommit);
        if (zxidCanCommit.compareTo(this.lastCommittedZxid) > 0) {
          LOG.debug("String_Node_Str",zxidCanCommit);
          Message commit=MessageBuilder.buildCommit(zxidCanCommit);
          for (          PeerHandler ph : quorumSet.values()) {
            ph.queueMessage(commit);
          }
          this.lastCommittedZxid=zxidCanCommit;
        }
      }
 else       if (msg.getType() == MessageType.JOIN || msg.getType() == MessageType.ACK_EPOCH) {
        PeerHandler ph=quorumSetOriginal.get(source);
        if (ph != null) {
          this.quorumSet.put(source,ph);
        }
        if (msg.getType() == MessageType.JOIN) {
          LOG.debug("String_Node_Str",request.getZxid(),source);
          if (pendingConfig != null) {
            LOG.error("String_Node_Str");
            throw new RuntimeException("String_Node_Str");
          }
          this.pendingConfig=this.clusterConfig.clone();
          this.pendingConfig.addPeer(source);
          this.pendingConfig.setVersion(request.getZxid());
        }
      }
 else       if (msg.getType() == MessageType.DISCONNECTED) {
        String peerId=msg.getDisconnected().getServerId();
        LOG.debug("String_Node_Str",peerId);
        this.quorumSet.remove(peerId);
      }
 else       if (msg.getType() == MessageType.REMOVE) {
        String serverId=msg.getRemove().getServerId();
        LOG.debug("String_Node_Str",request.getZxid(),serverId);
        if (pendingConfig != null) {
          LOG.error("String_Node_Str");
          throw new RuntimeException("String_Node_Str");
        }
        this.pendingConfig=this.clusterConfig.clone();
        this.pendingConfig.removePeer(serverId);
        this.pendingConfig.setVersion(request.getZxid());
      }
 else {
        LOG.warn("String_Node_Str");
      }
    }
  }
 catch (  RuntimeException e) {
    LOG.error("String_Node_Str",e);
    throw e;
  }
  LOG.debug("String_Node_Str");
  return null;
}

Fixed version (ground truth):
@Override public Void call() throws Exception {
  LOG.debug("String_Node_Str");
  try {
    while (true) {
      MessageTuple request=ackQueue.take();
      if (request == MessageTuple.REQUEST_OF_DEATH) {
        break;
      }
      Message msg=request.getMessage();
      String source=request.getServerId();
      if (msg.getType() == MessageType.ACK) {
        ZabMessage.Ack ack=request.getMessage().getAck();
        Zxid zxid=MessageBuilder.fromProtoZxid(ack.getZxid());
        LOG.debug("String_Node_Str",zxid,source);
        this.quorumSet.get(source).setLastAckedZxid(zxid);
        Zxid zxidCanCommit=null;
        if (this.pendingConfig != null) {
          zxidCanCommit=getCommittedZxid(this.pendingConfig);
          LOG.debug("String_Node_Str",zxidCanCommit);
          if (zxidCanCommit.compareTo(pendingConfig.getVersion()) >= 0) {
            LOG.debug("String_Node_Str" + "String_Node_Str",pendingConfig.getVersion());
            this.clusterConfig=this.pendingConfig;
            this.pendingConfig=null;
          }
 else {
            zxidCanCommit=null;
          }
        }
        if (zxidCanCommit == null) {
          zxidCanCommit=getCommittedZxid(this.clusterConfig);
          if (pendingConfig != null && zxidCanCommit.compareTo(pendingConfig.getVersion()) >= 0) {
            Zxid version=pendingConfig.getVersion();
            if (version.getXid() == 0) {
              zxidCanCommit=lastCommittedZxid;
            }
 else {
              zxidCanCommit=new Zxid(version.getEpoch(),version.getXid() - 1);
            }
          }
          LOG.debug("String_Node_Str",zxidCanCommit);
        }
        LOG.debug("String_Node_Str",zxidCanCommit);
        if (zxidCanCommit.compareTo(this.lastCommittedZxid) > 0) {
          LOG.debug("String_Node_Str",zxidCanCommit);
          Message commit=MessageBuilder.buildCommit(zxidCanCommit);
          for (          PeerHandler ph : quorumSet.values()) {
            ph.queueMessage(commit);
          }
          this.lastCommittedZxid=zxidCanCommit;
        }
      }
 else       if (msg.getType() == MessageType.JOIN || msg.getType() == MessageType.ACK_EPOCH) {
        PeerHandler ph=quorumSetOriginal.get(source);
        if (ph != null) {
          this.quorumSet.put(source,ph);
        }
        if (msg.getType() == MessageType.JOIN) {
          LOG.debug("String_Node_Str",request.getZxid(),source);
          if (pendingConfig != null) {
            LOG.error("String_Node_Str");
            throw new RuntimeException("String_Node_Str");
          }
          this.pendingConfig=this.clusterConfig.clone();
          this.pendingConfig.addPeer(source);
          this.pendingConfig.setVersion(request.getZxid());
        }
      }
 else       if (msg.getType() == MessageType.DISCONNECTED) {
        String peerId=msg.getDisconnected().getServerId();
        LOG.debug("String_Node_Str",peerId);
        this.quorumSet.remove(peerId);
      }
 else       if (msg.getType() == MessageType.REMOVE) {
        String serverId=msg.getRemove().getServerId();
        LOG.debug("String_Node_Str",request.getZxid(),serverId);
        if (pendingConfig != null) {
          LOG.error("String_Node_Str");
          throw new RuntimeException("String_Node_Str");
        }
        this.pendingConfig=this.clusterConfig.clone();
        this.pendingConfig.removePeer(serverId);
        this.pendingConfig.setVersion(request.getZxid());
      }
 else {
        LOG.warn("String_Node_Str");
      }
    }
  }
 catch (  RuntimeException e) {
    LOG.error("String_Node_Str",e);
    throw e;
  }
  LOG.debug("String_Node_Str");
  return null;
}