dupecheck: Optimize CPU use slightly

This commit is contained in:
Heikki Hannikainen 2022-10-30 20:17:55 +02:00
parent 46b6947f1e
commit eb2c199a66
1 changed files with 30 additions and 19 deletions

View File

@ -95,7 +95,6 @@ static void global_pbuf_purger(const int all, int pbuf_lag, int pbuf_dupe_lag)
struct pbuf_t *pb, *pb2;
struct pbuf_t *freeset[2002];
int n, n1, n2, lag;
time_t lastage1 = 0, lastage2 = 0;
time_t expire2 = tick - pbuf_global_dupe_expiration;
time_t expire1 = tick - pbuf_global_expiration;
@ -107,13 +106,20 @@ static void global_pbuf_purger(const int all, int pbuf_lag, int pbuf_dupe_lag)
}
pb = pbuf_global;
#ifdef GLOBAL_PBUF_PURGER_STATS
time_t lastage1 = 0, lastage2 = 0;
if (pb)
lastage1 = pb->t;
#endif
n = 0;
n1 = 0;
while ( pbuf_global_count > pbuf_global_count_limit && pb ) {
#ifdef GLOBAL_PBUF_PURGER_STATS
lastage1 = pb->t;
#endif
if (pb->t >= expire1)
break; // stop at newer than expire1
@ -139,13 +145,16 @@ static void global_pbuf_purger(const int all, int pbuf_lag, int pbuf_dupe_lag)
}
pb = pbuf_global_dupe;
#ifdef GLOBAL_PBUF_PURGER_STATS
if (pb)
lastage2 = pb->t;
#endif
n = 0;
n2 = 0;
while ( pbuf_global_dupe_count > pbuf_global_dupe_count_limit && pb ) {
#ifdef GLOBAL_PBUF_PURGER_STATS
lastage2 = pb->t;
#endif
if (pb->t >= expire2)
break; // stop at newer than expire2
lag = pbuf_seqnum_lag(dupecheck_dupe_seqnum, pb->seqnum);
@ -169,15 +178,13 @@ static void global_pbuf_purger(const int all, int pbuf_lag, int pbuf_dupe_lag)
pbuf_free_many(freeset, n);
}
#ifdef GLOBAL_PBUF_PURGER_STATS
// debug printout time... map "undefined" lag values to zero.
//if (pbuf_lag == 2000000000) pbuf_lag = 0;
//if (pbuf_dupe_lag == 2000000000) pbuf_dupe_lag = 0;
if (pbuf_lag == 2000000000) pbuf_lag = 0;
if (pbuf_dupe_lag == 2000000000) pbuf_dupe_lag = 0;
if (lastage1 == 0) lastage1 = tick+2; // makes printout of "-2" (or "-1")
if (lastage2 == 0) lastage2 = tick+2;
/*
static int show_zeros = 1;
@ -194,7 +201,7 @@ static void global_pbuf_purger(const int all, int pbuf_lag, int pbuf_dupe_lag)
else
show_zeros = 1;
}
*/
#endif
}
@ -413,6 +420,7 @@ static int dupecheck_mangle_store(const char *addr, int addrlen, const char *dat
/********************************************/
/* remove spaces from the end of the packet */
// TODO: unnecessary tb1, we can just use ib for this. Skip the memcpy.
memcpy(tb1, ib, ilen);
tlen1 = ilen;
while (tlen1 > 0 && tb1[tlen1-1] == ' ')
@ -428,6 +436,7 @@ static int dupecheck_mangle_store(const char *addr, int addrlen, const char *dat
* tb2: 8th bit is cleared
* tb3: 8th bit replaced with a space
*/
// TODO: Check for DELs and low bytes in this loop, and skip those steps if none are found.
tlen1 = tlen2 = tlen3 = 0;
for (i = 0; i < ilen; i++) {
c = ib[i] & 0x7F;
@ -618,6 +627,7 @@ static int dupecheck_drain_worker(struct worker_t *w,
struct pbuf_t *pb, *pbnext;
int n = 0;
int me;
int pb_out_count_local = 0, pb_out_dupe_count_local = 0;
/* grab worker's list of packets */
if ((me = pthread_mutex_lock(&w->pbuf_incoming_mutex))) {
@ -635,16 +645,14 @@ static int dupecheck_drain_worker(struct worker_t *w,
//hlog(LOG_DEBUG, "Dupecheck got %d packets from worker %d; n=%d",
// c, w->id, dupecheck_seqnum);
// check that the first packet isn't very old, it indicates we're not doing well
if ((pb_list) && tick - pb_list->t > 10) {
hlog(LOG_ERR, "dupecheck: drain got packet %d aged %d sec from worker %d\n%*s",
pb_list->seqnum, tick - pb_list->t, w->id, pb_list->packet_len-2, pb_list->data);
}
for (pb = pb_list; (pb); pb = pbnext) {
if (pb->t > tick + 1) {
hlog(LOG_ERR, "dupecheck: drain got packet from future %d with t %d > tick %d, worker %d!\n%*s",
pb->seqnum, pb->t, tick, w->id, pb->packet_len-2, pb->data);
} else if (tick - pb->t > 10) {
hlog(LOG_ERR, "dupecheck: drain got packet %d aged %d sec from worker %d\n%*s",
pb->seqnum, tick - pb->t, w->id, pb->packet_len-2, pb->data);
}
int rc = dupecheck(pb);
pbnext = pb->next; // it may get modified below..
@ -664,18 +672,21 @@ static int dupecheck_drain_worker(struct worker_t *w,
*pb_out_prevp = &pb->next;
*pb_out_last = pb;
pb->seqnum = ++dupecheck_seqnum;
*pb_out_count = *pb_out_count + 1;
pb_out_count_local++;
} else {
// Duplicate
**pb_out_dupe_prevp = pb;
*pb_out_dupe_prevp = &pb->next;
*pb_out_dupe_last = pb;
pb->seqnum = ++dupecheck_dupe_seqnum;
*pb_out_dupe_count = *pb_out_dupe_count + 1;
pb_out_dupe_count_local++;
//hlog(LOG_DEBUG, "is duplicate");
}
n++;
}
*pb_out_count += pb_out_count_local;
*pb_out_dupe_count += pb_out_dupe_count_local;
return n;
}