Allow selecting source only when last regression was successful
This commit is contained in:
parent
eec438a614
commit
98f79404d6
3 changed files with 20 additions and 21 deletions
15
sources.c
15
sources.c
|
@ -385,7 +385,6 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
{
|
{
|
||||||
int i, j, index;
|
int i, j, index;
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
int src_select_ok;
|
|
||||||
double src_offset, src_offset_sd, src_frequency, src_skew;
|
double src_offset, src_offset_sd, src_frequency, src_skew;
|
||||||
double src_accrued_dispersion;
|
double src_accrued_dispersion;
|
||||||
int n_endpoints, j1, j2;
|
int n_endpoints, j1, j2;
|
||||||
|
@ -397,7 +396,6 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
int min_distance_index;
|
int min_distance_index;
|
||||||
struct SelectInfo *si;
|
struct SelectInfo *si;
|
||||||
double total_root_dispersion;
|
double total_root_dispersion;
|
||||||
int n_reachable_sources;
|
|
||||||
|
|
||||||
NTP_Leap leap_status = LEAP_Normal;
|
NTP_Leap leap_status = LEAP_Normal;
|
||||||
|
|
||||||
|
@ -415,13 +413,11 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
|
|
||||||
/* Step 1 - build intervals about each source */
|
/* Step 1 - build intervals about each source */
|
||||||
n_endpoints = 0;
|
n_endpoints = 0;
|
||||||
n_reachable_sources = 0;
|
n_sel_sources = 0;
|
||||||
for (i=0; i<n_sources; i++) {
|
for (i=0; i<n_sources; i++) {
|
||||||
|
|
||||||
if (sources[i]->reachable && sources[i]->sel_option != SRC_SelectNoselect) {
|
if (sources[i]->reachable && sources[i]->sel_option != SRC_SelectNoselect) {
|
||||||
|
|
||||||
++n_reachable_sources;
|
|
||||||
|
|
||||||
si = &(sources[i]->sel_info);
|
si = &(sources[i]->sel_info);
|
||||||
SST_GetSelectionData(sources[i]->stats, &now,
|
SST_GetSelectionData(sources[i]->stats, &now,
|
||||||
&(si->stratum),
|
&(si->stratum),
|
||||||
|
@ -431,10 +427,6 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
&(si->variance),
|
&(si->variance),
|
||||||
&(si->select_ok));
|
&(si->select_ok));
|
||||||
|
|
||||||
/* Eventually this might be a flag indicating whether the get
|
|
||||||
selection data call was successful. For now it always is. */
|
|
||||||
src_select_ok = 1;
|
|
||||||
|
|
||||||
si->root_distance = si->root_dispersion + 0.5 * fabs(si->root_delay);
|
si->root_distance = si->root_dispersion + 0.5 * fabs(si->root_delay);
|
||||||
si->lo_limit = si->best_offset - si->root_distance;
|
si->lo_limit = si->best_offset - si->root_distance;
|
||||||
si->hi_limit = si->best_offset + si->root_distance;
|
si->hi_limit = si->best_offset + si->root_distance;
|
||||||
|
@ -446,7 +438,8 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
si->lo_limit, si->hi_limit);
|
si->lo_limit, si->hi_limit);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (src_select_ok) {
|
if (si->select_ok) {
|
||||||
|
++n_sel_sources;
|
||||||
|
|
||||||
sources[i]->status = SRC_OK; /* For now */
|
sources[i]->status = SRC_OK; /* For now */
|
||||||
|
|
||||||
|
@ -544,7 +537,7 @@ SRC_SelectSource(unsigned long match_addr)
|
||||||
best_depth, best_lo, best_hi);
|
best_depth, best_lo, best_hi);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (best_depth <= n_reachable_sources/2) {
|
if (best_depth <= n_sel_sources/2) {
|
||||||
/* Could not even get half the reachable sources to agree -
|
/* Could not even get half the reachable sources to agree -
|
||||||
clearly we can't synchronise.
|
clearly we can't synchronise.
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,9 @@ struct SST_Stats_Record {
|
||||||
/* The index of the newest sample */
|
/* The index of the newest sample */
|
||||||
int last_sample;
|
int last_sample;
|
||||||
|
|
||||||
|
/* Flag indicating whether last regression was successful */
|
||||||
|
int regression_ok;
|
||||||
|
|
||||||
/* The best individual sample that we are holding, in terms of the minimum
|
/* The best individual sample that we are holding, in terms of the minimum
|
||||||
root distance at the present time */
|
root distance at the present time */
|
||||||
int best_single_sample;
|
int best_single_sample;
|
||||||
|
@ -180,6 +183,7 @@ SST_CreateInstance(unsigned long refid, IPAddr *addr)
|
||||||
inst->n_samples = 0;
|
inst->n_samples = 0;
|
||||||
inst->runs_samples = 0;
|
inst->runs_samples = 0;
|
||||||
inst->last_sample = 0;
|
inst->last_sample = 0;
|
||||||
|
inst->regression_ok = 0;
|
||||||
inst->best_single_sample = 0;
|
inst->best_single_sample = 0;
|
||||||
inst->min_delay_sample = 0;
|
inst->min_delay_sample = 0;
|
||||||
inst->estimated_frequency = 0;
|
inst->estimated_frequency = 0;
|
||||||
|
@ -387,8 +391,6 @@ SST_DoNewRegression(SST_Stats inst)
|
||||||
double sd_weight, sd;
|
double sd_weight, sd;
|
||||||
double old_skew, old_freq, stress;
|
double old_skew, old_freq, stress;
|
||||||
|
|
||||||
int regression_ok;
|
|
||||||
|
|
||||||
convert_to_intervals(inst, times_back + inst->runs_samples);
|
convert_to_intervals(inst, times_back + inst->runs_samples);
|
||||||
|
|
||||||
if (inst->n_samples > 0) {
|
if (inst->n_samples > 0) {
|
||||||
|
@ -416,14 +418,14 @@ SST_DoNewRegression(SST_Stats inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
regression_ok = RGR_FindBestRegression(times_back + inst->runs_samples,
|
inst->regression_ok = RGR_FindBestRegression(times_back + inst->runs_samples,
|
||||||
offsets + inst->runs_samples, weights,
|
offsets + inst->runs_samples, weights,
|
||||||
inst->n_samples, inst->runs_samples,
|
inst->n_samples, inst->runs_samples,
|
||||||
&est_intercept, &est_slope, &est_var,
|
&est_intercept, &est_slope, &est_var,
|
||||||
&est_intercept_sd, &est_slope_sd,
|
&est_intercept_sd, &est_slope_sd,
|
||||||
&best_start, &nruns, °rees_of_freedom);
|
&best_start, &nruns, °rees_of_freedom);
|
||||||
|
|
||||||
if (regression_ok) {
|
if (inst->regression_ok) {
|
||||||
|
|
||||||
old_skew = inst->skew;
|
old_skew = inst->skew;
|
||||||
old_freq = inst->estimated_frequency;
|
old_freq = inst->estimated_frequency;
|
||||||
|
@ -536,12 +538,13 @@ SST_GetSelectionData(SST_Stats inst, struct timeval *now,
|
||||||
int *stratum,
|
int *stratum,
|
||||||
double *best_offset, double *best_root_delay,
|
double *best_offset, double *best_root_delay,
|
||||||
double *best_root_dispersion,
|
double *best_root_dispersion,
|
||||||
double *variance, int *average_ok)
|
double *variance, int *select_ok)
|
||||||
{
|
{
|
||||||
double average_offset;
|
double average_offset;
|
||||||
double sample_elapsed;
|
double sample_elapsed;
|
||||||
double elapsed;
|
double elapsed;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
int average_ok;
|
||||||
double peer_distance;
|
double peer_distance;
|
||||||
|
|
||||||
i = get_runsbuf_index(inst, inst->best_single_sample);
|
i = get_runsbuf_index(inst, inst->best_single_sample);
|
||||||
|
@ -558,17 +561,20 @@ SST_GetSelectionData(SST_Stats inst, struct timeval *now,
|
||||||
*best_root_delay = inst->root_delays[j];
|
*best_root_delay = inst->root_delays[j];
|
||||||
*best_root_dispersion = inst->root_dispersions[j] + sample_elapsed * inst->skew;
|
*best_root_dispersion = inst->root_dispersions[j] + sample_elapsed * inst->skew;
|
||||||
|
|
||||||
|
/* average_ok ignored for now */
|
||||||
average_offset = inst->estimated_offset + inst->estimated_frequency * elapsed;
|
average_offset = inst->estimated_offset + inst->estimated_frequency * elapsed;
|
||||||
if (fabs(average_offset - *best_offset) <= peer_distance) {
|
if (fabs(average_offset - *best_offset) <= peer_distance) {
|
||||||
*average_ok = 1;
|
average_ok = 1;
|
||||||
} else {
|
} else {
|
||||||
*average_ok = 0;
|
average_ok = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*select_ok = inst->regression_ok;
|
||||||
|
|
||||||
#ifdef TRACEON
|
#ifdef TRACEON
|
||||||
LOG(LOGS_INFO, LOGF_SourceStats, "n=%d off=%f del=%f dis=%f var=%f pdist=%f avoff=%f avok=%d",
|
LOG(LOGS_INFO, LOGF_SourceStats, "n=%d off=%f del=%f dis=%f var=%f pdist=%f avoff=%f avok=%d selok=%d",
|
||||||
inst->n_samples, *best_offset, *best_root_delay, *best_root_dispersion, *variance,
|
inst->n_samples, *best_offset, *best_root_delay, *best_root_dispersion, *variance,
|
||||||
peer_distance, average_offset, *average_ok);
|
peer_distance, average_offset, average_ok, *select_ok);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -89,7 +89,7 @@ SST_GetSelectionData(SST_Stats inst, struct timeval *now,
|
||||||
double *best_offset, double *best_root_delay,
|
double *best_offset, double *best_root_delay,
|
||||||
double *best_root_dispersion,
|
double *best_root_dispersion,
|
||||||
double *variance,
|
double *variance,
|
||||||
int *average_ok);
|
int *select_ok);
|
||||||
|
|
||||||
/* Get data needed when setting up tracking on this source */
|
/* Get data needed when setting up tracking on this source */
|
||||||
extern void
|
extern void
|
||||||
|
|
Loading…
Reference in a new issue