/** * Computes pingable_mbrs (based on the current membership and the suspected members) and ping_dest * @param remove The member to be removed from pingable_mbrs */ @GuardedBy("lock") protected void computePingDest(Address remove) { if(remove != null) pingable_mbrs.remove(remove); else { pingable_mbrs.clear(); pingable_mbrs.addAll(members); pingable_mbrs.removeAll(bcast_task.getSuspectedMembers()); } Address old_ping_dest=ping_dest; ping_dest=getPingDest(pingable_mbrs); if(Util.different(old_ping_dest, ping_dest)) { num_tries.set(1); last_ack=System.nanoTime(); } }
if(hdr == null) { if(msg_counts_as_heartbeat) updateTimestamp(msg.getSrc()); return up_prot.up(msg); // message did not originate from FD layer, just pass up Address hb_sender=msg.getSrc(); log.trace("%s: received are-you-alive from %s, sending response", local_addr, hb_sender); sendHeartbeatResponse(hb_sender); break; // don't pass up ! updateTimestamp(hdr.from); break; log.warn("%s: I was suspected by %s; ignoring the SUSPECT message and sending back a HEARTBEAT_ACK", local_addr, msg.src()); sendHeartbeatResponse(msg.getSrc()); continue; computePingDest(mbr);
members.addAll(view.getMembers()); bcast_task.adjustSuspectedMembers(members); computePingDest(null); if(view.size() <= 1) stopMonitor(); else if(!isMonitorRunning()) startMonitor();
public void up(MessageBatch batch) { Collection<Message> msgs=batch.getMatchingMessages(id, true); boolean updated=false; if(msgs != null) { for(Message msg: msgs) { FdHeader hdr=msg.getHeader(id); // header is not null at this point if(hdr.type == FdHeader.HEARTBEAT_ACK) updated=true; else up(msg); // SUSPECT and HEARTBEAT } } if(updated || (msg_counts_as_heartbeat && batch.sender() != null)) updateTimestamp(batch.sender()); if(!batch.isEmpty()) up_prot.up(batch); }
if(log.isTraceEnabled()) log.trace("received are-you-alive from " + hb_sender + ", sending response"); sendHeartbeatResponse(hb_sender); shunInvalidHeartbeatSender(hb_sender); break; // don't pass up ! Address previewNextPingDest = (Address)getPingDest(pingable_mbrs); (previewNextPingDest != null && ping_dest == null) || (previewNextPingDest == null && ping_dest != null)) { stop(); ping_dest= previewNextPingDest; if(log.isDebugEnabled()) if(ping_dest != null) { try { startMonitor(); if(log.isTraceEnabled()) log.trace("and ping_dest is null, stop Monitor"); stop(); log.warn("I was suspected by " + msg.getSrc() + "; ignoring the SUSPECT " + "message and sending back a HEARTBEAT_ACK"); sendHeartbeatResponse(msg.getSrc()); continue; ping_dest=(Address)getPingDest(pingable_mbrs);
public Object down(Event evt) { switch(evt.getType()) { case Event.VIEW_CHANGE: down_prot.down(evt); stop(); synchronized(this) { View v=(View)evt.getArg(); members.clear(); members.addAll(v.getMembers()); bcast_task.adjustSuspectedMembers(members); pingable_mbrs.clear(); pingable_mbrs.addAll(members); ping_dest=(Address)getPingDest(pingable_mbrs); if(ping_dest != null) { try { startMonitor(); } catch(Exception ex) { if(log.isWarnEnabled()) log.warn("exception when calling startMonitor(): " + ex); } } } return null; case Event.UNSUSPECT: unsuspect((Address)evt.getArg()); return down_prot.down(evt); } return down_prot.down(evt); }
private void unsuspect(Address mbr) { bcast_task.removeSuspectedMember(mbr); pingable_mbrs.clear(); pingable_mbrs.addAll(members); pingable_mbrs.removeAll(bcast_task.getSuspectedMembers()); ping_dest=(Address)getPingDest(pingable_mbrs); if(ping_dest != null) { try { startMonitor(); } catch(Exception ex) { if(log.isWarnEnabled()) log.warn("exception when calling unsuspect(): " + ex); } } }
public void stop() { lock.lock(); try { ping_dest=null; stopMonitor(); } finally { lock.unlock(); } }
@ManagedOperation(description="Resumes checking for crashed members") public void startFailureDetection() { startMonitor(); }
public Object up(Event evt) { switch(evt.getType()) { case Event.CONFIG: if(bind_addr == null) { Map config=(Map)evt.getArg(); bind_addr=(InetAddress)config.get("bind_addr"); } break; } return super.up(evt); }
public String condition() { View view=sv.getView(); return "Membership is " + (view != null? view.size() : "n/a") + ", FD.Monitor running=" + fd.isMonitorRunning(); }
public void init() throws Exception { timer=getTransport().getTimer(); if(timer == null) throw new Exception("timer cannot be retrieved"); }
@GuardedBy("lock") protected void unsuspect(Address mbr) { lock.lock(); try { bcast_task.removeSuspectedMember(mbr); computePingDest(null); } finally { lock.unlock(); } }
public void trigger() throws Throwable { System.out.println(sv.getLocalAddress() + ": starting failure detection"); fd.startFailureDetection(); }
public void up(MessageBatch batch) { Collection<Message> msgs=batch.getMatchingMessages(id, true); boolean updated=false; if(msgs != null) { for(Message msg: msgs) { FdHeader hdr=msg.getHeader(id); // header is not null at this point if(hdr.type == FdHeader.HEARTBEAT_ACK) updated=true; else up(msg); // SUSPECT and HEARTBEAT } } if(updated || (msg_counts_as_heartbeat && batch.sender() != null)) updateTimestamp(batch.sender()); if(!batch.isEmpty()) up_prot.up(batch); }
@ManagedOperation(description="Stops checking for crashed members") public void stopFailureDetection() { stopMonitor(); }
@ManagedOperation(description="Resumes checking for crashed members") public void startFailureDetection() { startMonitor(); }
public boolean eval() { return sv.getView() != null && sv.getView().size() > 1 && !fd.isMonitorRunning(); }
public void init() throws Exception { timer=getTransport().getTimer(); if(timer == null) throw new Exception("timer cannot be retrieved"); }
@GuardedBy("lock") protected void unsuspect(Address mbr) { lock.lock(); try { bcast_task.removeSuspectedMember(mbr); computePingDest(null); } finally { lock.unlock(); } }