/** * Throws an exception if the file lock can't be acquired. */ void acquireFileLock() throws Exception { File file = new File(fileLockDir, String.format("gondola-lock-%s-%s", gondola.getHostId(), memberId)); FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); if (channel.tryLock() == null) { throw new IllegalStateException(String.format("Another process has the lock on %s", file)); } }
void save(int term, int votedFor) throws Exception { storage.saveVote(memberId, term, votedFor); if (storageTracing) { logger.info("[{}-{}] update(term={} votedFor={})", gondola.getHostId(), memberId, term, votedFor); } }
/** * Block request on shard. * * @param shardId the shard id */ public void blockRequestOnShard(String shardId) { trace("[{}] Block requests on shard : {}", gondola.getHostId(), shardId); shardLocks.putIfAbsent(shardId, new CountDownLatch(1)); }
/** * Block request on buckets. * * @param splitRange the split range */ public void blockRequestOnBuckets(Range<Integer> splitRange) { trace("[{}] Block requests on buckets : {}", gondola.getHostId(), splitRange); bucketLocks.putIfAbsent(splitRange, new CountDownLatch(1)); }
/** * Unblock request on buckets. * * @param splitRange the split range */ public void unblockRequestOnBuckets(Range<Integer> splitRange) { trace("[{}] Unblock requests on buckets : {}", gondola.getHostId(), splitRange); CountDownLatch lock = bucketLocks.remove(splitRange); if (lock != null) { lock.countDown(); } }
/** * Block all requests. */ public void blockRequest() { trace("[{}] Block all requests", gondola.getHostId()); globalLock = new CountDownLatch(1); }
void save(int term, int votedFor) throws GondolaException { storage.saveVote(memberId, term, votedFor); if (storageTracing) { logger.info("[{}-{}] update(term={} votedFor={})", gondola.getHostId(), memberId, term, votedFor); } }
private void writeStat(Integer memberId, ZookeeperStat zookeeperStat) { trace("[{}-{}] Update stat stat={}", gondola.getHostId(), memberId, zookeeperStat); try { client.setData().forPath(ZookeeperUtils.statPath(serviceName, memberId), objectMapper.writeValueAsBytes(zookeeperStat)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (Exception e) { logger.warn("[{}-{}] Write stat failed, reason={}", gondola.getHostId(), memberId, e.getMessage()); } }
public void becomeCandidate() throws Exception { logger.info("[{}-{}] Becomes CANDIDATE {}", gondola.getHostId(), memberId, isPrimary ? "(primary)" : ""); become(Role.CANDIDATE, -1); // Set timeout requestVoteTs = clock.now() + (long) ((Math.random() * requestVotePeriod)); }
/** * Instantiates a new Change log processor. * * @param gondola the gondola * @param services the routing services */ public ChangeLogProcessor(Gondola gondola, Map<String, RoutingService> services) { this.gondola = gondola; this.services = services; gondola.getConfig().getShardIds(gondola.getHostId()).forEach(this::createThread); }
private void updateRoutingTableIfNeeded(String shardId, Response proxiedResponse) { String appUri = proxiedResponse.getHeaderString(X_GONDOLA_LEADER_ADDRESS); if (appUri != null) { logger.info("[{}] New leader found, correct routing table with : shardId={}, appUrl={}", gondola.getHostId(), shardId, appUri); updateShardRoutingEntries(shardId, appUri); } }
/** * See Member.enable(). */ public void enable(boolean on) throws GondolaException { logger.info("[{}-{}] {}", gondola.getHostId(), memberId, on ? "Enabling" : "Disabling"); enabled = on; if (isLeader()) { becomeFollower(-1); } }
void checkHeartbeat() throws Exception { long late = clock.now() - electionTimeoutTs; if (late >= 0) { logger.info("[{}-{}] No heartbeat from {} in {}ms (timeout={}ms)", gondola.getHostId(), memberId, leaderId, electionTimeout + late, electionTimeout); becomeCandidate(); } }
public void becomeCandidate() throws GondolaException { logger.info("[{}-{}] Becomes CANDIDATE{} {}", gondola.getHostId(), memberId, masterId >= 0 ? "-SLAVE" : "", isPrimary ? "(primary)" : ""); removeSlaves(); become(Role.CANDIDATE, -1); // Set time to send prevote prevoteTs = clock.now() + (long) ((Math.random() * prevotePeriod)); }
public void becomeFollower(int leaderId) throws Exception { logger.info("[{}-{}] Becomes FOLLOWER of {} {}", gondola.getHostId(), memberId, leaderId, isPrimary ? "(primary)" : ""); become(Role.FOLLOWER, leaderId); // To avoid the case where this member becomes a candidate and an RV is received for the current term if (votedFor == -1 && leaderId != -1) { storage.saveVote(memberId, currentTerm, leaderId); } // Set timeout electionTimeoutTs = clock.now() + electionTimeout; }
public RoutingService(Gondola gondola, String shardId) { this.gondola = gondola; shard = gondola.getShard(shardId); hostId = gondola.getHostId(); this.shardId = shardId; memberId = shard.getLocalMember().getMemberId(); commitTimer = GondolaApplication.MyMetricsServletContextListener.METRIC_REGISTRY.timer("LogWriter"); }
public ChangeLogProcessorThread(String shardId) { setName("ChangeLogProcessor"); this.shardId = shardId; this.hostId = gondola.getHostId(); this.memberId = gondola.getShard(shardId).getLocalMember().getMemberId(); this.changeLogConsumer = services.get(shardId).provideChangeLogConsumer(); }
Sender() { setName("PeerSender-" + cmember.memberId + "-" + peerId); setDaemon(true); excLogger = new ExceptionLogger(gondola) .setMessage(eMsg -> { return String.format("[%s-%d] Failed to send to %d: %s", gondola.getHostId(), cmember.memberId, peerId, eMsg); }) .setNoStackTracePattern("Socket closed|.*Read end dead.*|Broken pipe"); }
Receiver() { setName("PeerReceiver-" + cmember.memberId + "-" + peerId); setDaemon(true); excLogger = new ExceptionLogger(gondola) .setMessage(eMsg -> { return String.format("[%s-%d] Failed to receive from %d: %s", gondola.getHostId(), cmember.memberId, peerId, eMsg); }) .setNoStackTracePattern("Socket closed|Read timed out|Connection reset|.*Write end dead.*"); }
public SocketChannel(Gondola gondola, int memberId, int toMemberId) { this.gondola = gondola; this.memberId = memberId; this.peerId = toMemberId; gondola.getConfig().registerForUpdates(this); logger.info("[{}-{}] Creating connection to {}", gondola.getHostId(), memberId, toMemberId); inetSocketAddress = gondola.getConfig().getAddressForMember(peerId); reconnect(); }