From 34cfb0c1034a6b3289e9aca567fd2393126aa80a Mon Sep 17 00:00:00 2001 From: Thomas Guyot-Sionnest Date: Tue, 29 Jan 2008 08:54:48 +0000 Subject: Fix bugs and flaws in best offset server selection of check_ntp_time and (deprecated) check_ntp git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1909 f882894a-f735-0410-b71e-b25c423dba1c --- plugins/check_ntp.c | 68 +++++++++++++++++++++++++----------------------- plugins/check_ntp_time.c | 68 +++++++++++++++++++++++++----------------------- 2 files changed, 70 insertions(+), 66 deletions(-) (limited to 'plugins') diff --git a/plugins/check_ntp.c b/plugins/check_ntp.c index b474d9a8..2b3cc91d 100644 --- a/plugins/check_ntp.c +++ b/plugins/check_ntp.c @@ -302,50 +302,52 @@ void setup_request(ntp_message *p){ * this is done by filtering servers based on stratum, dispersion, and * finally round-trip delay. */ int best_offset_server(const ntp_server_results *slist, int nservers){ - int i=0, j=0, cserver=0, candidates[5], csize=0; + int i=0, cserver=0, best_server=-1; /* for each server */ for(cserver=0; cserveri; j--){ - candidates[j]=candidates[j-1]; + /* compare the server to the best one we've seen so far */ + /* does it have an equal or better stratum? */ + DBG(printf("comparing peer %d with peer %d\n", cserver, best_server)); + if(slist[cserver].stratum <= slist[best_server].stratum){ + DBG(printf("stratum for peer %d <= peer %d\n", cserver, best_server)); + /* does it have an equal or better dispersion? */ + if(slist[cserver].rtdisp <= slist[best_server].rtdisp){ + DBG(printf("dispersion for peer %d <= peer %d\n", cserver, best_server)); + /* does it have a better rtdelay? */ + if(slist[cserver].rtdelay < slist[best_server].rtdelay){ + DBG(printf("rtdelay for peer %d < peer %d\n", cserver, best_server)); + best_server = cserver; + DBG(printf("peer %d is now our best candidate\n", best_server)); + } } } - /* regardless, if they should be on the list... */ - if(i<5) { - candidates[i]=cserver; - if(csize<5) csize++; - /* otherwise discard the server */ - } else { - DBG(printf("discarding peer id %d\n", cserver)); - } } - if(csize>0) { - DBG(printf("best server selected: peer %d\n", candidates[0])); - return candidates[0]; + if(best_server >= 0) { + DBG(printf("best server selected: peer %d\n", best_server)); + return best_server; } else { DBG(printf("no peers meeting synchronization criteria :(\n")); return -1; diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c index 16e4c3c7..11a0eced 100644 --- a/plugins/check_ntp_time.c +++ b/plugins/check_ntp_time.c @@ -247,50 +247,52 @@ void setup_request(ntp_message *p){ * this is done by filtering servers based on stratum, dispersion, and * finally round-trip delay. */ int best_offset_server(const ntp_server_results *slist, int nservers){ - int i=0, j=0, cserver=0, candidates[5], csize=0; + int i=0, cserver=0, best_server=-1; /* for each server */ for(cserver=0; cserveri; j--){ - candidates[j]=candidates[j-1]; + /* compare the server to the best one we've seen so far */ + /* does it have an equal or better stratum? */ + DBG(printf("comparing peer %d with peer %d\n", cserver, best_server)); + if(slist[cserver].stratum <= slist[best_server].stratum){ + DBG(printf("stratum for peer %d <= peer %d\n", cserver, best_server)); + /* does it have an equal or better dispersion? */ + if(slist[cserver].rtdisp <= slist[best_server].rtdisp){ + DBG(printf("dispersion for peer %d <= peer %d\n", cserver, best_server)); + /* does it have a better rtdelay? */ + if(slist[cserver].rtdelay < slist[best_server].rtdelay){ + DBG(printf("rtdelay for peer %d < peer %d\n", cserver, best_server)); + best_server = cserver; + DBG(printf("peer %d is now our best candidate\n", best_server)); + } } } - /* regardless, if they should be on the list... */ - if(i<5) { - candidates[i]=cserver; - if(csize<5) csize++; - /* otherwise discard the server */ - } else { - DBG(printf("discarding peer id %d\n", cserver)); - } } - if(csize>0) { - DBG(printf("best server selected: peer %d\n", candidates[0])); - return candidates[0]; + if(best_server >= 0) { + DBG(printf("best server selected: peer %d\n", best_server)); + return best_server; } else { DBG(printf("no peers meeting synchronization criteria :(\n")); return -1; -- cgit v1.2.3-74-g34f1