コード例 #1
0
  @Override
  public void handleAccepted(PaxosMessage proposal) {
    ensureSize(chosen, proposal.getInstanceNum() + 1); // Prevent NPE

    if (chosen.get(proposal.getInstanceNum()) != null)
      return; // Something has already been chosen so I dont care anymore.

    List<PaxosMessage> acceptedVotes = proposalAcceptedVotes.get(proposal.getInstanceNum());
    if (acceptedVotes == null) {
      acceptedVotes = new ArrayList<PaxosMessage>();
      acceptedVotes.add(proposal);
      proposalAcceptedVotes.put(proposal.getInstanceNum(), acceptedVotes);
    } else {
      for (PaxosMessage acceptedVote : acceptedVotes) {
        if (proposal.getProposerId() == acceptedVote.getProposerId())
          return; // This person is reaffirming their acceptance of this instances proposal.
      }
      acceptedVotes.add(proposal);
      proposalAcceptedVotes.put(proposal.getInstanceNum(), acceptedVotes);
    }
    // handle being chosen
    if (proposalAcceptedVotes.get(proposal.getInstanceNum()).size() >= serverSet.getQuorumSize()) {
      onChosen(proposal);
    }
  }
コード例 #2
0
 private void sendMessage(Serializable message, short serverId) {
   try {
     if (serverId == id) { // Sending to myself.
       messageReceived(null, message);
     } else {
       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
       ObjectSerializationOutputStream objectOutputStream =
           new ObjectSerializationOutputStream(byteArrayOutputStream);
       objectOutputStream.writeObject(message);
       objectOutputStream.flush();
       ByteBuffer payload = ByteBuffer.wrap(byteArrayOutputStream.toByteArray());
       channel.send(payload, serverSet.getServer(serverId));
     }
   } catch (IOException e) {
     System.out.println("Failed to send message");
     e
         .printStackTrace(); // To change body of catch statement use File | Settings | File
                             // Templates.
   } catch (Exception e) {
     e
         .printStackTrace(); // To change body of catch statement use File | Settings | File
                             // Templates.
   }
 }
コード例 #3
0
 private short getLeader() {
   return (short) (preparedFor % serverSet.getNumServers());
 }
コード例 #4
0
 private void sendAllMessage(PaxosMessage message) {
   for (short i = 0; i < serverSet.getNumServers(); i++) {
     sendMessage(message, i);
   }
 }
コード例 #5
0
 private boolean nodeIsLeader() {
   return id == getLeader() && prepareResponseFrom.size() >= serverSet.getQuorumSize();
 }