Rehash NTP source table after removing source
This is needed to avoid breaking a probe sequence and losing another source. It is costly, but it's not expected to happen frequently.
This commit is contained in:
parent
40d82675bd
commit
5fb0a9d53b
1 changed files with 28 additions and 6 deletions
|
@ -295,19 +295,41 @@ NSR_AddUnresolvedSource(char *name, int port, NTP_Source_Type type, SourceParame
|
|||
NSR_Status
|
||||
NSR_RemoveSource(NTP_Remote_Address *remote_addr)
|
||||
{
|
||||
int slot, found;
|
||||
int i, slot, found;
|
||||
SourceRecord temp_records[N_RECORDS];
|
||||
|
||||
assert(initialised);
|
||||
|
||||
find_slot(remote_addr, &slot, &found);
|
||||
if (!found) {
|
||||
return NSR_NoSuchSource;
|
||||
} else {
|
||||
n_sources--;
|
||||
records[slot].remote_addr = NULL;
|
||||
NCR_DestroyInstance(records[slot].data);
|
||||
return NSR_Success;
|
||||
}
|
||||
|
||||
n_sources--;
|
||||
records[slot].remote_addr = NULL;
|
||||
NCR_DestroyInstance(records[slot].data);
|
||||
|
||||
/* Rehash the table to make sure there are no broken probe sequences.
|
||||
This is costly, but it's not expected to happen frequently. */
|
||||
|
||||
memcpy(temp_records, records, sizeof (records));
|
||||
|
||||
for (i = 0; i < N_RECORDS; i++) {
|
||||
records[i].remote_addr = NULL;
|
||||
}
|
||||
|
||||
for (i = 0; i < N_RECORDS; i++) {
|
||||
if (!temp_records[i].remote_addr)
|
||||
continue;
|
||||
|
||||
find_slot(temp_records[i].remote_addr, &slot, &found);
|
||||
assert(!found);
|
||||
|
||||
records[slot].remote_addr = temp_records[i].remote_addr;
|
||||
records[slot].data = temp_records[i].data;
|
||||
}
|
||||
|
||||
return NSR_Success;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
|
Loading…
Reference in a new issue