clientlog: refactor updating of record data
This commit is contained in:
parent
c5265f6070
commit
a4c89e5bbe
1 changed files with 51 additions and 59 deletions
110
clientlog.c
110
clientlog.c
|
@ -249,48 +249,6 @@ expand_hashtable(void)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
static int
|
|
||||||
update_rate(int rate, uint32_t now, uint32_t last_hit)
|
|
||||||
{
|
|
||||||
uint32_t interval;
|
|
||||||
int interval2;
|
|
||||||
|
|
||||||
interval = now - last_hit;
|
|
||||||
|
|
||||||
if (last_hit == INVALID_TS || (int32_t)interval < 0)
|
|
||||||
return rate;
|
|
||||||
|
|
||||||
/* Convert the interval to scaled and rounded log2 */
|
|
||||||
if (interval) {
|
|
||||||
interval += interval >> 1;
|
|
||||||
for (interval2 = -RATE_SCALE * TS_FRAC; interval2 < -MIN_RATE;
|
|
||||||
interval2 += RATE_SCALE) {
|
|
||||||
if (interval <= 1)
|
|
||||||
break;
|
|
||||||
interval >>= 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
interval2 = -RATE_SCALE * (TS_FRAC + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rate == INVALID_RATE)
|
|
||||||
return -interval2;
|
|
||||||
|
|
||||||
/* Update the rate in a rough approximation of exponential moving average */
|
|
||||||
if (rate < -interval2) {
|
|
||||||
rate++;
|
|
||||||
} else if (rate > -interval2) {
|
|
||||||
if (rate > RATE_SCALE * 5 / 2 - interval2)
|
|
||||||
rate = RATE_SCALE * 5 / 2 - interval2;
|
|
||||||
else
|
|
||||||
rate = (rate - interval2 - 1) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rate;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ================================================== */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CLG_Initialise(void)
|
CLG_Initialise(void)
|
||||||
{
|
{
|
||||||
|
@ -349,6 +307,53 @@ get_ts_from_timeval(struct timeval *tv)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_record(struct timeval *now, uint32_t *last_hit, uint32_t *hits, int8_t *rate)
|
||||||
|
{
|
||||||
|
uint32_t interval, now_ts, prev_hit;
|
||||||
|
int interval2;
|
||||||
|
|
||||||
|
now_ts = get_ts_from_timeval(now);
|
||||||
|
|
||||||
|
prev_hit = *last_hit;
|
||||||
|
*last_hit = now_ts;
|
||||||
|
(*hits)++;
|
||||||
|
|
||||||
|
interval = now_ts - prev_hit;
|
||||||
|
|
||||||
|
if (prev_hit == INVALID_TS || (int32_t)interval < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Convert the interval to scaled and rounded log2 */
|
||||||
|
if (interval) {
|
||||||
|
interval += interval >> 1;
|
||||||
|
for (interval2 = -RATE_SCALE * TS_FRAC; interval2 < -MIN_RATE;
|
||||||
|
interval2 += RATE_SCALE) {
|
||||||
|
if (interval <= 1)
|
||||||
|
break;
|
||||||
|
interval >>= 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
interval2 = -RATE_SCALE * (TS_FRAC + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the rate in a rough approximation of exponential moving average */
|
||||||
|
if (*rate == INVALID_RATE) {
|
||||||
|
*rate = -interval2;
|
||||||
|
} else {
|
||||||
|
if (*rate < -interval2) {
|
||||||
|
(*rate)++;
|
||||||
|
} else if (*rate > -interval2) {
|
||||||
|
if (*rate > RATE_SCALE * 5 / 2 - interval2)
|
||||||
|
*rate = RATE_SCALE * 5 / 2 - interval2;
|
||||||
|
else
|
||||||
|
*rate = (*rate - interval2 - 1) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
get_index(Record *record)
|
get_index(Record *record)
|
||||||
{
|
{
|
||||||
|
@ -361,7 +366,6 @@ int
|
||||||
CLG_LogNTPAccess(IPAddr *client, struct timeval *now)
|
CLG_LogNTPAccess(IPAddr *client, struct timeval *now)
|
||||||
{
|
{
|
||||||
Record *record;
|
Record *record;
|
||||||
uint32_t now_ts;
|
|
||||||
|
|
||||||
if (!active)
|
if (!active)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -370,18 +374,11 @@ CLG_LogNTPAccess(IPAddr *client, struct timeval *now)
|
||||||
if (record == NULL)
|
if (record == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
now_ts = get_ts_from_timeval(now);
|
|
||||||
|
|
||||||
/* Update one of the two rates depending on whether the previous request
|
/* Update one of the two rates depending on whether the previous request
|
||||||
of the client had a reply or it timed out */
|
of the client had a reply or it timed out */
|
||||||
if (record->flags & FLAG_NTP_DROPPED)
|
update_record(now, &record->last_ntp_hit, &record->ntp_hits,
|
||||||
record->ntp_timeout_rate = update_rate(record->ntp_timeout_rate,
|
record->flags & FLAG_NTP_DROPPED ?
|
||||||
now_ts, record->last_ntp_hit);
|
&record->ntp_timeout_rate : &record->ntp_rate);
|
||||||
else
|
|
||||||
record->ntp_rate = update_rate(record->ntp_rate, now_ts, record->last_ntp_hit);
|
|
||||||
|
|
||||||
record->ntp_hits++;
|
|
||||||
record->last_ntp_hit = now_ts;
|
|
||||||
|
|
||||||
DEBUG_LOG(LOGF_ClientLog, "NTP hits %"PRIu32" rate %d trate %d burst %d",
|
DEBUG_LOG(LOGF_ClientLog, "NTP hits %"PRIu32" rate %d trate %d burst %d",
|
||||||
record->ntp_hits, record->ntp_rate, record->ntp_timeout_rate,
|
record->ntp_hits, record->ntp_rate, record->ntp_timeout_rate,
|
||||||
|
@ -396,7 +393,6 @@ int
|
||||||
CLG_LogCommandAccess(IPAddr *client, struct timeval *now)
|
CLG_LogCommandAccess(IPAddr *client, struct timeval *now)
|
||||||
{
|
{
|
||||||
Record *record;
|
Record *record;
|
||||||
uint32_t now_ts;
|
|
||||||
|
|
||||||
if (!active)
|
if (!active)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -405,11 +401,7 @@ CLG_LogCommandAccess(IPAddr *client, struct timeval *now)
|
||||||
if (record == NULL)
|
if (record == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
now_ts = get_ts_from_timeval(now);
|
update_record(now, &record->last_cmd_hit, &record->cmd_hits, &record->cmd_rate);
|
||||||
|
|
||||||
record->cmd_rate = update_rate(record->cmd_rate, now_ts, record->last_cmd_hit);
|
|
||||||
record->cmd_hits++;
|
|
||||||
record->last_cmd_hit = now_ts;
|
|
||||||
|
|
||||||
DEBUG_LOG(LOGF_ClientLog, "Cmd hits %"PRIu32" rate %d burst %d",
|
DEBUG_LOG(LOGF_ClientLog, "Cmd hits %"PRIu32" rate %d burst %d",
|
||||||
record->cmd_hits, record->cmd_rate, record->cmd_burst);
|
record->cmd_hits, record->cmd_rate, record->cmd_burst);
|
||||||
|
|
Loading…
Reference in a new issue