Un failure detector fornisce una stima del funzionamento di un processo, poiché non può essere preciso in un sistema asincrono, in cui i messaggi hanno tempi di consegna non definiti.
L'implementazione tipica di un failure detector prevede l'utilizzo di messaggi “heart beat” che periodicamente informano gli altri processi che compongono il sistema dello stato del processo che invia il messaggio. Ogni processo mantiene un timer per ciascuno degli altri processi, quando il timer scade per un processo, significa che non e' stato ricevuto il messaggio di “heart beat” da quel processo, che quindi e' considerato “suspected”, ossia probabilmente fallito.
Per aumentare la precisione della stima del failure detector si adopera un meccanismo di timeout adattativi, in base alle condizioni della rete di comunicazione. In questo modo si tenta di garantire che un processo non venga dichiarato suspected solo perché è la rete di comunicazione che sta subendo dei rallentamenti.

Un failure detector si compone dunque di due parti:
Monitor degli altri processi: verifica la ricezione dei messaggi dagli altri processi del sistema;
Segnalatore di presenza: invia periodicamente a tutti gli altri processi il messaggio di heart beat.
La realizzazione del failure detector si compone di vari passi. Il primo è certamente la definizione del sistema di comunicazione fra i processi. Si deve infatti definire non solo il protocollo di comunicazione, ma anche quali sono le assunzioni fatte sulla rete di comunicazione e i meccanismi di quest'ultima utilizzati. Nei prossimi paragrafi si analizzano queste tematiche.
Come detto in precedenza, è necessario fare alcune assunzioni sulla rete di comunicazione sottostante, in particolare, si assume che la rete sia basata sullo stack protocollare TCP/IP. Chiarito questo fondamentale punto, rimane da specificare il protocollo di trasporto che verrà adoperato per trasportare i messaggi del failure detector.
La scelta ricade su UDP per i seguenti motivi:
Tuttavia, UDP presenta degli svantaggi, fra cui l'assenza di affidabilità nella consegna dei pacchetti e nessuna garanzia sulla replicazione degli stessi. Queste sono problematiche che devono essere dunque gestite direttamente dal protocollo del failure detector.



In questo paragrafo si esaminano nel dettaglio il funzionamento del failure detector che intendiamo realizzare. Come abbiamo già precedentemente affermato, un FD (failure detector) deve avere due moduli per gestire da un lato l'invio del messaggio agli altri processi, dall'altro il controllo su quali processi sono sospetti di fallimento.





Per ogni processo viene impostato come timeout il valore di timeout impostato nel messaggio di ALIVE inviato da quel processo, corretto di un termine D, calcolato come media degli ultimi 5 ritardi di trasmissione. Il valore di D e' sempre positivo, quando si ha una riduzione del tempo di trasmissione, quindi, il delay viene impostato a 0 per il computo della media.
La media viene in ogni caso depurata del valore minimo e di quello massimo, per garantire maggiore precisione.
La realizzazione del failure detector segue l'impostazione indicata nei precedenti paragrafi, con la distinzione delle due parti: Liveness Communicator e Processes Monitor.

La precedente figura mostra l'organizzazione delle classi che realizzano il FD. La classe FailureDetector incapsula l'intero componente, offrendo l'interfaccia per accedere alle operazioni del FD. La classe si occupa anche di creare le istanze di LivenessCommunicator e ProcessesMonitor, che svolgono il ruolo specificato per gli omonimi componenti nel paragrafo sul design. Le operazioni per la comunicazione su rete sono demandate al FDPManager che realizza il protocollo FDP, adoperando i servizi del CommunicationChannel per accedere al canale di comunicazione fisico.
La gestione dei messaggi in arrivo e' fatta in multithreading, garantendo continua reattivita' al sistema.
La classe FailureDetector contiene diverse categorie di operazioni per offrire tutte le funzionalita' del FD in modo integrato:
Questa classe realizza l'intera istanziazione del modulo FD, occupandosi della corretta gestione delle risorse da questo utilizzate.
La classe LivenessCommunicator si occupa di inviare un messaggio ALIVE secondo il periodo specificato tramite il liveness timeout. La classe realizza un thread che periodicamente si abilita, invia il messaggio ALIVE tramite le funzioni messe a disposizione dalla classe FDPManager, e si autosospende per un tampo pari al liveness timeout, prima di rieseguire l'operazione.
I processi cui inviare il messaggio sono prelevati dal ProcessRepository.
La classe ProcessesMonitor controlla la liveness dei processi. Il ProcessMonitor e' in ascolto degli eventi generati dal FDPManager, in particolare, e' in ascolto della ricezione dei messaggi ALIVE.
Quando un messaggio ALIVE e' ricevuto per un processo p, si imposta il tempo entro il quale deve essere ricevuto un nuovo messaggio per quel processo, calcolandolo come somma di 4 addendi:
Questa somma fornisce un valore temporale entro il quale il prossimo ALIVE deve essere ricevuto. I processi sono organizzati dal ProcessesMonitor in una coda di priorita' ordinata in base a tali valori temporali, dal piu' prossimo al piu' remoto.
Il ProcessesMonitor sospende la sua esecuzione quando non ha operazioni da compiere, impostando il ProcessMonitorTimer per riattivare l'esecuzione del processo di monitoring, quando si raggiunge il timestamp del primo processo nella coda di priorita'. L'esecuzione puo' essere ripresa prima dello scadere di questo timer, all'arrivo di un messaggio di ALIVE, che comporta l'aggiornamento del valore di timestamp di uno dei processi nella coda di priorita', con conseguente riorganizzazione della stessa e reimpostazione del ProcessMonitorTimer.
Puo' essere utile specificare che la riattivazione del ProcessesMonitor da parte del timer avviene solo quando c'e' un processo sospetto di fallimento. In questo caso, viene generato un evento di SUSPECTED, che raggiunge la classe FailureDetector e da qui viene propagato a tutti i listener che si sono registrati per la notifica di tale evento.
Se opportunamente configurato il ProcessesMonitor puo' provvedere ad inserire automaticamente nel ProcessRepository i processi da cui riceve messaggi ALIVE, qualora questi non fossero presenti. Tale procedura viene detta autodiscovery.
La classe CommunicationChannel fornisce le funzionalita' per accedere al canale di comunicazione e, quindi, per inviare e ricevere messaggi.
La classe realizza un thread costantemente in ascolto per nuovi messaggi in arrivo sulla Socket adoperata per la comunicazione. All'arrivo di un messaggio, viene generato un thread FDPMessageHandler che compie le seguenti operazioni:
La gestione dei dettagli implementativi del protocollo, con il controllo degli ack timeout e' lasciata alla classe FDPManager che adopera le funzionalita' messe a disposizione dal CommunicationChannel.