Program: 87252
Project: 87252
Buggy source:
/** 
 * Do actions for the state we are now in.  Essentially, we're always one state ahead of the participants thus we process the result of a Collect in the BEGIN state which means we expect Last or OldRound and in SUCCESS state we expect ACCEPT or OLDROUND
 * @todo Increment round number via heartbeats every so often - see note below about jittering collects.
 */
private void process(){
switch (_state) {
case ABORT:
{
      assert(_queue.size() != 0);
      _logger.info(this + "String_Node_Str" + _event,new RuntimeException());
      _messages.clear();
      if (_membership != null)       _membership.dispose();
      while (_queue.size() > 0) {
        _al.signal(new Event(_event.getResult(),_event.getSeqNum(),_queue.remove(0),_al.getLastCollect().getNodeId()));
      }
      return;
    }
case EXIT:
{
    assert(_queue.size() != 0);
    _logger.info(this + "String_Node_Str" + _event);
    _messages.clear();
    _queue.remove(0);
    if (_membership != null)     _membership.dispose();
    if (_queue.size() > 0) {
      _logger.info(this + "String_Node_Str" + _queue.get(0));
      _state=SUBMITTED;
      process();
    }
 else {
      _heartbeatAlarm=new TimerTask(){
        public void run(){
          _logger.info(this + "String_Node_Str" + System.currentTimeMillis());
          submit(AcceptorLearner.HEARTBEAT);
        }
      }
;
      _watchdog.schedule(_heartbeatAlarm,calculateLeaderRefresh());
    }
    return;
  }
case SUBMITTED:
{
  assert(_queue.size() != 0);
  _tries=0;
  _membership=_detector.getMembers(this);
  _logger.info(this + "String_Node_Str" + _membership.getSize()+ "String_Node_Str");
  _state=COLLECT;
  process();
  break;
}
case COLLECT:
{
assert(_queue.size() != 0);
if (_heartbeatAlarm != null) {
  _heartbeatAlarm.cancel();
  _watchdog.purge();
}
Collect myLastCollect=_al.getLastCollect();
if (myLastCollect.isInitial()) {
  _logger.info(this + "String_Node_Str");
  _rndNumber=0;
}
 else {
  InetSocketAddress myOtherLeader=myLastCollect.getNodeId();
  boolean isUs=myOtherLeader.equals(_transport.getLocalAddress());
  if (!isUs) {
    _logger.info(this + "String_Node_Str");
    if (_detector.isLive(myOtherLeader)) {
      _logger.info(this + "String_Node_Str");
      error(Event.Reason.OTHER_LEADER,myOtherLeader);
      return;
    }
 else {
      _logger.info(this + "String_Node_Str");
      if (_rndNumber <= myLastCollect.getRndNumber())       _rndNumber=myLastCollect.getRndNumber() + 1;
    }
  }
 else {
    if (_lastSuccessfulRndNumber == myLastCollect.getRndNumber()) {
      _logger.info(this + "String_Node_Str");
      updateSeqNum();
      _state=BEGIN;
      process();
      return;
    }
  }
}
updateSeqNum();
_state=BEGIN;
emit(new Collect(_seqNum,_rndNumber,_transport.getLocalAddress()));
break;
}
case BEGIN:
{
assert(_queue.size() != 0);
long myMaxProposal=-1;
Proposal myValue=null;
for (PaxosMessage m : _messages) {
Last myLast=(Last)m;
if (!myLast.getConsolidatedValue().equals(LogStorage.NO_VALUE)) {
  if (myLast.getRndNumber() > myMaxProposal) {
    myValue=myLast.getConsolidatedValue();
    myMaxProposal=myLast.getRndNumber();
  }
}
}
if ((myValue != null) && (!myValue.equals(_queue.get(0)))) _queue.add(myValue);
_state=SUCCESS;
emit(new Begin(_seqNum,_rndNumber,_queue.get(0),_transport.getLocalAddress()));
break;
}
case SUCCESS:
{
assert(_queue.size() != 0);
if (_messages.size() >= _detector.getMajority()) {
emit(new Success(_seqNum,_rndNumber,_transport.getLocalAddress()));
cancelInteraction();
_lastSuccessfulRndNumber=_rndNumber;
successful(Event.Reason.DECISION);
}
 else {
emit(new Begin(_seqNum,_rndNumber,_queue.get(0),_transport.getLocalAddress()));
}
break;
}
default :
throw new RuntimeException("String_Node_Str" + _state);
}
}

Fixed version (ground truth):
/** 
 * Do actions for the state we are now in.  Essentially, we're always one state ahead of the participants thus we process the result of a Collect in the BEGIN state which means we expect Last or OldRound and in SUCCESS state we expect ACCEPT or OLDROUND
 * @todo Increment round number via heartbeats every so often - see note below about jittering collects.
 */
private void process(){
switch (_state) {
case ABORT:
{
      assert(_queue.size() != 0);
      _logger.info(this + "String_Node_Str" + _event,new RuntimeException());
      _messages.clear();
      if (_membership != null)       _membership.dispose();
      cancelInteraction();
      while (_queue.size() > 0) {
        _al.signal(new Event(_event.getResult(),_event.getSeqNum(),_queue.remove(0),_al.getLastCollect().getNodeId()));
      }
      return;
    }
case EXIT:
{
    assert(_queue.size() != 0);
    _logger.info(this + "String_Node_Str" + _event);
    _messages.clear();
    _queue.remove(0);
    if (_membership != null)     _membership.dispose();
    if (_queue.size() > 0) {
      _logger.info(this + "String_Node_Str" + _queue.get(0));
      _state=SUBMITTED;
      process();
    }
 else {
      _heartbeatAlarm=new TimerTask(){
        public void run(){
          _logger.info(this + "String_Node_Str" + System.currentTimeMillis());
          submit(AcceptorLearner.HEARTBEAT);
        }
      }
;
      _watchdog.schedule(_heartbeatAlarm,calculateLeaderRefresh());
    }
    return;
  }
case SUBMITTED:
{
  assert(_queue.size() != 0);
  _tries=0;
  _membership=_detector.getMembers(this);
  _logger.info(this + "String_Node_Str" + _membership.getSize()+ "String_Node_Str");
  _state=COLLECT;
  process();
  break;
}
case COLLECT:
{
assert(_queue.size() != 0);
if (_heartbeatAlarm != null) {
  _heartbeatAlarm.cancel();
  _watchdog.purge();
}
Collect myLastCollect=_al.getLastCollect();
if (myLastCollect.isInitial()) {
  _logger.info(this + "String_Node_Str");
  _rndNumber=0;
}
 else {
  InetSocketAddress myOtherLeader=myLastCollect.getNodeId();
  boolean isUs=myOtherLeader.equals(_transport.getLocalAddress());
  if (!isUs) {
    _logger.info(this + "String_Node_Str");
    if (_detector.isLive(myOtherLeader)) {
      _logger.info(this + "String_Node_Str");
      error(Event.Reason.OTHER_LEADER,myOtherLeader);
      return;
    }
 else {
      _logger.info(this + "String_Node_Str");
      if (_rndNumber <= myLastCollect.getRndNumber())       _rndNumber=myLastCollect.getRndNumber() + 1;
    }
  }
 else {
    if (_lastSuccessfulRndNumber == myLastCollect.getRndNumber()) {
      _logger.info(this + "String_Node_Str");
      updateSeqNum();
      _state=BEGIN;
      process();
      return;
    }
  }
}
updateSeqNum();
_state=BEGIN;
emit(new Collect(_seqNum,_rndNumber,_transport.getLocalAddress()));
break;
}
case BEGIN:
{
assert(_queue.size() != 0);
long myMaxProposal=-1;
Proposal myValue=null;
for (PaxosMessage m : _messages) {
Last myLast=(Last)m;
if (!myLast.getConsolidatedValue().equals(LogStorage.NO_VALUE)) {
  if (myLast.getRndNumber() > myMaxProposal) {
    myValue=myLast.getConsolidatedValue();
    myMaxProposal=myLast.getRndNumber();
  }
}
}
if ((myValue != null) && (!myValue.equals(_queue.get(0)))) _queue.add(myValue);
_state=SUCCESS;
emit(new Begin(_seqNum,_rndNumber,_queue.get(0),_transport.getLocalAddress()));
break;
}
case SUCCESS:
{
assert(_queue.size() != 0);
if (_messages.size() >= _detector.getMajority()) {
emit(new Success(_seqNum,_rndNumber,_transport.getLocalAddress()));
cancelInteraction();
_lastSuccessfulRndNumber=_rndNumber;
successful(Event.Reason.DECISION);
}
 else {
emit(new Begin(_seqNum,_rndNumber,_queue.get(0),_transport.getLocalAddress()));
}
break;
}
default :
throw new RuntimeException("String_Node_Str" + _state);
}
}