/** * Returns the member with the specified id. * * @return null if the member id is not known. */ public Member getMember(int id) { for (Member m : members) { if (m.getMemberId() == id) { return m; } } return null; }
/** * Is leader boolean. * * @return the boolean */ public boolean isLeader() { return shard.getLocalMember().isLeader(); }
/** * Returns the list of non-local members. * * @return non-null list of non-local members. */ public List<Member> getRemoteMembers() { return members.stream().filter(m -> !m.isLocal()).collect(Collectors.toList()); }
try { logger .info("[{}] New leader {} elected.", gondola.getHostId(), roleChangeEvent.leader.getMemberId()); leaderFoundCondition.signalAll(); } finally { String appUri = Utils.getAppUri(config, config.getMember(roleChangeEvent.leader.getMemberId()).getHostId()); updateShardRoutingEntries(roleChangeEvent.shard.getShardId(), appUri); if (roleChangeEvent.leader.isLocal()) { CompletableFuture.runAsync(() -> { String shardId = roleChangeEvent.shard.getShardId(); trace("[{}-{}] Become leader on \"{}\", blocking all requests to the shard....", gondola.getHostId(), roleChangeEvent.leader.getMemberId(), shardId); lockManager.blockRequestOnShard(shardId); trace("[{}-{}] Wait until raft logs applied to storage...", gondola.getHostId(), roleChangeEvent.leader.getMemberId()); waitDrainRaftLogs(shardId); trace("[{}-{}] Raft logs are up-to-date, notify application is ready to serve...", gondola.getHostId(), roleChangeEvent.leader.getMemberId()); services.get(roleChangeEvent.shard.getShardId()).ready(); trace("[{}-{}] Ready for serving, unblocking the requests...", gondola.getHostId(), roleChangeEvent.leader.getMemberId()); long count = lockManager.unblockRequestOnShard(shardId); trace("[{}-{}] System is back to serving, unblocked {} requests ...", gondola.getHostId(), roleChangeEvent.leader.getMemberId(), count); }, singleThreadExecutor).exceptionally(throwable -> { logger.info("[{}-{}] Errors while executing leader change event. message={}",
InterruptedException { trace("[{}] shardId={} un-followed shardId={}", gondola.getHostId(), shardId, masterShardId); Member.SlaveStatus status = gondola.getShard(shardId).getLocalMember().getSlaveStatus(); if (status == null) { return; gondola.getShard(shardId).getLocalMember().setSlave(-1); } catch (GondolaException e) { throw new ShardManagerException(e); if (gondola.getShard(shardId).getLocalMember().getSlaveStatus() == null) { return true;
private Member.SlaveStatus getSlaveStatus(Shard shard) { try { return shard.getLocalMember().getSlaveStatus(); } catch (InterruptedException e) { throw new RuntimeException(e); } } }
Cluster(Gondola gondola, String clusterId) throws Exception { this.gondola = gondola; this.clusterId = clusterId; config = gondola.getConfig(); stats = gondola.getStats(); List<Config.ConfigMember> configMembers = config.getMembersInCluster(clusterId); List<Integer> peerIds = configMembers.stream() .filter(cm -> !cm.hostId.equals(gondola.getHostId())) .map(cm -> cm.memberId).collect(Collectors.toList()); // First create the local member, because it's needed when creating the remote members. for (int i = 0; i < configMembers.size(); i++) { Config.ConfigMember cm = configMembers.get(i); if (gondola.getHostId().equals(cm.hostId)) { // Local member boolean isPrimary = i == 0; cmember = new CoreMember(gondola, this, cm.memberId, peerIds, isPrimary); localMember = new Member(gondola, cmember, null); members.add(localMember); break; } } if (cmember == null) { throw new IllegalStateException(String.format("Host id %s not found in %d", config.getIdentifier())); } // Create list of peers for (Peer p : cmember.peers) { members.add(new Member(gondola, cmember, p)); } }
@POST @Path("/enable") public Map enable(@QueryParam("shardId") String shardId, @QueryParam("enable") boolean enable) { Map<Object, Object> result = new HashMap<>(); Member localMember = GondolaApplication.getRoutingFilter().getGondola().getShard(shardId).getLocalMember(); try { localMember.enable(enable); result.put("success", true); } catch (Exception e) { result.put("success", false); result.put("reason", e.getMessage()); } return result; }
private Map<Object, Object> getGondolaStatus(Gondola gondola, ChangeLogProcessor changeLogProcessor) throws InterruptedException { Map<Object, Object> shards = new LinkedHashMap<>(); for (Shard shard : gondola.getShardsOnHost()) { String shardId = shard.getShardId(); Map<Object, Object> shardMap = new LinkedHashMap<>(); shardMap.put("commitIndex", shard.getCommitIndex()); shardMap.put("savedIndex", shard.getLastSavedIndex()); shardMap.put("appliedIndex", changeLogProcessor.getAppliedIndex(shardId)); shardMap.put("slaveStatus", getSlaveStatus(shard)); shardMap.put("role", shard.getLocalRole()); shardMap.put("enabled", shard.getLocalMember().isEnabled()); shards.put(shardId, shardMap); } return shards; }
private boolean setSlave(String shardId, int memberId, long timeoutMs) throws InterruptedException, ShardManagerException { try { Member localMember = gondola.getShard(shardId).getLocalMember(); Member.SlaveStatus slaveStatus = localMember.getSlaveStatus(); if (slaveStatus != null && slaveStatus.masterId == memberId && slaveStatus.running) { return true; } localMember.setSlave(memberId); return Utils.pollingWithTimeout(() -> { Member.SlaveStatus status = gondola.getShard(shardId).getLocalMember().getSlaveStatus(); if (slaveOperational(status)) { trace("[{}] Successfully connect to leader node={}", gondola.getHostId(), memberId); return true; } trace("[{}] Slave status={} role={}", gondola.getHostId(), status, gondola.getShard(shardId).getLocalRole()); return false; }, timeoutMs / POLLING_TIMES, timeoutMs); } catch (Exception e) { throw new ShardManagerException(e); } }
private boolean waitLogApproach(String shardId, long timeoutMs, int logPosDiff) throws ShardManagerException, InterruptedException { Shard shard = gondola.getShard(shardId); try { return Utils.pollingWithTimeout(() -> { if (shard.getCommitIndex() != 0 && shard.getCommitIndex() - filter.getChangeLogProcessor().getAppliedIndex(shardId) <= logPosDiff) { return true; } Member.SlaveStatus slaveStatus = shard.getLocalMember().getSlaveStatus(); if (!slaveOperational(slaveStatus)) { throw new ShardManagerException(MASTER_IS_GONE); } trace("[{}] {} Log status={}, ci={}, si={}, ai={} targetDiff={}", gondola.getHostId(), shardId, slaveOperational(slaveStatus) ? "RUNNING" : "DOWN", shard.getCommitIndex(), getSavedIndex(shard), filter.getChangeLogProcessor().getAppliedIndex(shardId), logPosDiff); return false; }, timeoutMs / POLLING_TIMES, timeoutMs); } catch (ExecutionException e) { throw new ShardManagerException(e); } }
public Shard(Gondola gondola, String shardId) throws GondolaException { this.gondola = gondola; this.shardId = shardId; config = gondola.getConfig(); stats = gondola.getStats(); List<Config.ConfigMember> configMembers = config.getMembersInShard(shardId); List<Integer> peerIds = configMembers.stream() .filter(cm -> !cm.hostId.equals(gondola.getHostId())) .map(cm -> cm.memberId).collect(Collectors.toList()); // First create the local member, because it's needed when creating the remote members. for (int i = 0; i < configMembers.size(); i++) { Config.ConfigMember cm = configMembers.get(i); if (gondola.getHostId().equals(cm.hostId)) { // Local member boolean isPrimary = i == 0; cmember = new CoreMember(gondola, this, cm.memberId, peerIds, isPrimary); localMember = new Member(gondola, cmember, null); members.add(localMember); break; } } if (cmember == null) { throw new IllegalStateException(String.format("Host id %s not found in %d", config.getIdentifier())); } // Create list of peers for (Peer p : cmember.peers.values()) { members.add(new Member(gondola, cmember, p)); } }
/** * Returns the member with the specified id. * * @return null if the member id is not known. */ public Member getMember(int id) { for (Member m : members) { if (m.getMemberId() == id) { return m; } } return null; }
/** * Protected Methods. * * @param shardId the shard id * @return the boolean */ protected boolean isLeaderInShard(String shardId) { return gondola.getShard(shardId).getLocalMember().isLeader(); }
/** * Returns the list of non-local members. * * @return non-null list of members. */ public List<Member> getRemoteMembers() { return members.stream().filter(m -> !m.isLocal()).collect(Collectors.toList()); }
/** * Returns whether this member is a leader. * * @return true if this member is a leader. */ public boolean isLeader() { return getMemberId() == cmember.getLeaderId(); }
if (cluster.getLocalMember().isLeader()) { Command command = cluster.checkoutCommand(); bbuffer.clear();
if (leader.isLocal()) { trace("Processing this request"); request.setProperty("timer", processTimer.time());
/** * Returns the commit index for this cluster. */ public boolean isLeader() { return getMemberId() == cmember.getLeaderId(); }
Thread.sleep(5000); double avgLatency = 1.0 * waitTime.get() / requests.get(); if (cluster.getLocalMember().isLeader()) { logger.info(String.format("commits: %.2f/s latency: %.2f ms (%.2fms)", (requests.get() - start) / 5.0, avgLatency, latency.get()));