private void requestAppendEntries(){ if(this.peers.size() == 0){ this.commit(this.logStore.getFirstAvailableIndex() - 1); return; } for(PeerServer peer : this.peers.values()){ this.requestAppendEntries(peer); } }
private void requestAppendEntries(){ if(this.peers.size() == 0){ this.commit(this.logStore.getFirstAvailableIndex() - 1); return; } for(PeerServer peer : this.peers.values()){ this.requestAppendEntries(peer); } }
private void requestAppendEntries(){ if(this.peers.size() == 0){ this.commit(this.logStore.getFirstAvailableIndex() - 1); return; } for(PeerServer peer : this.peers.values()){ this.requestAppendEntries(peer); } }
private void commit(long targetIndex){ if(targetIndex > this.quickCommitIndex){ this.quickCommitIndex = targetIndex; // if this is a leader notify peers to commit as well // for peers that are free, send the request, otherwise, set pending commit flag for that peer if(this.role == ServerRole.Leader){ for(PeerServer peer : this.peers.values()){ if(!this.requestAppendEntries(peer)){ peer.setPendingCommit(); } } } } if(this.logStore.getFirstAvailableIndex() - 1 > this.state.getCommitIndex() && this.quickCommitIndex > this.state.getCommitIndex()){ this.commitingThread.moreToCommit(); } }
private void commit(long targetIndex){ if(targetIndex > this.quickCommitIndex){ this.quickCommitIndex = targetIndex; // if this is a leader notify peers to commit as well // for peers that are free, send the request, otherwise, set pending commit flag for that peer if(this.role == ServerRole.Leader){ for(PeerServer peer : this.peers.values()){ if(!this.requestAppendEntries(peer)){ peer.setPendingCommit(); } } } } if(this.logStore.getFirstAvailableIndex() - 1 > this.state.getCommitIndex() && this.quickCommitIndex > this.state.getCommitIndex()){ this.commitingThread.moreToCommit(); } }
private void commit(long targetIndex){ if(targetIndex > this.quickCommitIndex){ this.quickCommitIndex = targetIndex; // if this is a leader notify peers to commit as well // for peers that are free, send the request, otherwise, set pending commit flag for that peer if(this.role == ServerRole.Leader){ for(PeerServer peer : this.peers.values()){ if(!this.requestAppendEntries(peer)){ peer.setPendingCommit(); } } } } if(this.logStore.getFirstAvailableIndex() - 1 > this.state.getCommitIndex() && this.quickCommitIndex > this.state.getCommitIndex()){ this.commitingThread.moreToCommit(); } }
private synchronized void handleHeartbeatTimeout(PeerServer peer){ this.logger.debug("Heartbeat timeout for %d", peer.getId()); if(this.role == ServerRole.Leader){ this.requestAppendEntries(peer); synchronized(peer){ if(peer.isHeartbeatEnabled()){ // Schedule another heartbeat if heartbeat is still enabled peer.setHeartbeatTask(this.context.getScheduledExecutor().schedule(peer.getHeartbeartHandler(), peer.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS)); }else{ this.logger.debug("heartbeat is disabled for peer %d", peer.getId()); } } }else{ this.logger.info("Receive a heartbeat event for %d while no longer as a leader", peer.getId()); } }
private synchronized void handleHeartbeatTimeout(PeerServer peer){ this.logger.debug("Heartbeat timeout for %d", peer.getId()); if(this.role == ServerRole.Leader){ this.requestAppendEntries(peer); synchronized(peer){ if(peer.isHeartbeatEnabled()){ // Schedule another heartbeat if heartbeat is still enabled peer.setHeartbeatTask(this.context.getScheduledExecutor().schedule(peer.getHeartbeartHandler(), peer.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS)); }else{ this.logger.debug("heartbeat is disabled for peer %d", peer.getId()); } } }else{ this.logger.info("Receive a heartbeat event for %d while no longer as a leader", peer.getId()); } }
private synchronized void handleHeartbeatTimeout(PeerServer peer){ this.logger.debug("Heartbeat timeout for %d", peer.getId()); if(this.role == ServerRole.Leader){ this.requestAppendEntries(peer); synchronized(peer){ if(peer.isHeartbeatEnabled()){ // Schedule another heartbeat if heartbeat is still enabled peer.setHeartbeatTask(this.context.getScheduledExecutor().schedule(peer.getHeartbeartHandler(), peer.getCurrentHeartbeatInterval(), TimeUnit.MILLISECONDS)); }else{ this.logger.debug("heartbeat is disabled for peer %d", peer.getId()); } } }else{ this.logger.info("Receive a heartbeat event for %d while no longer as a leader", peer.getId()); } }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
private void removeServerFromCluster(int serverId){ ClusterConfiguration newConfig = new ClusterConfiguration(); newConfig.setLastLogIndex(this.config.getLogIndex()); newConfig.setLogIndex(this.logStore.getFirstAvailableIndex()); for(ClusterServer server: this.config.getServers()){ if(server.getId() != serverId){ newConfig.getServers().add(server); } } this.logger.info("removed a server from configuration and save the configuration to log store at %d", newConfig.getLogIndex()); this.configChanging = true; this.logStore.append(new LogEntry(this.state.getTerm(), newConfig.toBytes(), LogValueType.Configuration)); this.requestAppendEntries(); }
private void becomeLeader(){ this.stopElectionTimer(); this.role = ServerRole.Leader; this.leader = this.id; this.serverToJoin = null; for(PeerServer server : this.peers.values()){ server.setNextLogIndex(this.logStore.getFirstAvailableIndex()); server.setSnapshotInSync(null); server.setFree(); this.enableHeartbeatForPeer(server); } // if current config is not committed, try to commit it if(this.config.getLogIndex() == 0){ this.config.setLogIndex(this.logStore.getFirstAvailableIndex()); this.logStore.append(new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration)); this.logger.info("add initial configuration to log store"); this.configChanging = true; } this.requestAppendEntries(); }
private void becomeLeader(){ this.stopElectionTimer(); this.role = ServerRole.Leader; this.leader = this.id; this.serverToJoin = null; for(PeerServer server : this.peers.values()){ server.setNextLogIndex(this.logStore.getFirstAvailableIndex()); server.setSnapshotInSync(null); server.setFree(); this.enableHeartbeatForPeer(server); } // if current config is not committed, try to commit it if(this.config.getLogIndex() == 0){ this.config.setLogIndex(this.logStore.getFirstAvailableIndex()); this.logStore.append(new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration)); this.logger.info("add initial configuration to log store"); this.configChanging = true; } this.requestAppendEntries(); }
private void becomeLeader(){ this.stopElectionTimer(); this.role = ServerRole.Leader; this.leader = this.id; this.serverToJoin = null; for(PeerServer server : this.peers.values()){ server.setNextLogIndex(this.logStore.getFirstAvailableIndex()); server.setSnapshotInSync(null); server.setFree(); this.enableHeartbeatForPeer(server); } // if current config is not committed, try to commit it if(this.config.getLogIndex() == 0){ this.config.setLogIndex(this.logStore.getFirstAvailableIndex()); this.logStore.append(new LogEntry(this.state.getTerm(), this.config.toBytes(), LogValueType.Configuration)); this.logger.info("add initial configuration to log store"); this.configChanging = true; } this.requestAppendEntries(); }
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
this.logStore.append(configEntry); this.configChanging = true; this.requestAppendEntries(); return;
private RaftResponseMessage handleClientRequest(RaftRequestMessage request){ RaftResponseMessage response = new RaftResponseMessage(); response.setMessageType(RaftMessageType.AppendEntriesResponse); response.setSource(this.id); response.setDestination(this.leader); response.setTerm(this.state.getTerm()); long term; synchronized(this){ if(this.role != ServerRole.Leader){ response.setAccepted(false); return response; } term = this.state.getTerm(); } LogEntry[] logEntries = request.getLogEntries(); if(logEntries != null && logEntries.length > 0){ for(int i = 0; i < logEntries.length; ++i){ this.stateMachine.preCommit(this.logStore.append(new LogEntry(term, logEntries[i].getValue())), logEntries[i].getValue()); } } // Urgent commit, so that the commit will not depend on heartbeat this.requestAppendEntries(); response.setAccepted(true); response.setNextIndex(this.logStore.getFirstAvailableIndex()); return response; }
this.requestAppendEntries(peer);