dupecheck: Optimize CPU use slightly
This commit is contained in:
parent
46b6947f1e
commit
eb2c199a66
|
|
@ -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 *pb, *pb2;
|
||||||
struct pbuf_t *freeset[2002];
|
struct pbuf_t *freeset[2002];
|
||||||
int n, n1, n2, lag;
|
int n, n1, n2, lag;
|
||||||
time_t lastage1 = 0, lastage2 = 0;
|
|
||||||
|
|
||||||
time_t expire2 = tick - pbuf_global_dupe_expiration;
|
time_t expire2 = tick - pbuf_global_dupe_expiration;
|
||||||
time_t expire1 = tick - pbuf_global_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;
|
pb = pbuf_global;
|
||||||
|
|
||||||
|
#ifdef GLOBAL_PBUF_PURGER_STATS
|
||||||
|
time_t lastage1 = 0, lastage2 = 0;
|
||||||
if (pb)
|
if (pb)
|
||||||
lastage1 = pb->t;
|
lastage1 = pb->t;
|
||||||
|
#endif
|
||||||
|
|
||||||
n = 0;
|
n = 0;
|
||||||
n1 = 0;
|
n1 = 0;
|
||||||
while ( pbuf_global_count > pbuf_global_count_limit && pb ) {
|
while ( pbuf_global_count > pbuf_global_count_limit && pb ) {
|
||||||
|
|
||||||
|
#ifdef GLOBAL_PBUF_PURGER_STATS
|
||||||
lastage1 = pb->t;
|
lastage1 = pb->t;
|
||||||
|
#endif
|
||||||
if (pb->t >= expire1)
|
if (pb->t >= expire1)
|
||||||
break; // stop at newer than 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;
|
pb = pbuf_global_dupe;
|
||||||
|
#ifdef GLOBAL_PBUF_PURGER_STATS
|
||||||
if (pb)
|
if (pb)
|
||||||
lastage2 = pb->t;
|
lastage2 = pb->t;
|
||||||
|
#endif
|
||||||
n = 0;
|
n = 0;
|
||||||
n2 = 0;
|
n2 = 0;
|
||||||
while ( pbuf_global_dupe_count > pbuf_global_dupe_count_limit && pb ) {
|
while ( pbuf_global_dupe_count > pbuf_global_dupe_count_limit && pb ) {
|
||||||
|
#ifdef GLOBAL_PBUF_PURGER_STATS
|
||||||
lastage2 = pb->t;
|
lastage2 = pb->t;
|
||||||
|
#endif
|
||||||
if (pb->t >= expire2)
|
if (pb->t >= expire2)
|
||||||
break; // stop at newer than expire2
|
break; // stop at newer than expire2
|
||||||
lag = pbuf_seqnum_lag(dupecheck_dupe_seqnum, pb->seqnum);
|
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);
|
pbuf_free_many(freeset, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef GLOBAL_PBUF_PURGER_STATS
|
||||||
// debug printout time... map "undefined" lag values to zero.
|
// debug printout time... map "undefined" lag values to zero.
|
||||||
|
|
||||||
//if (pbuf_lag == 2000000000) pbuf_lag = 0;
|
if (pbuf_lag == 2000000000) pbuf_lag = 0;
|
||||||
//if (pbuf_dupe_lag == 2000000000) pbuf_dupe_lag = 0;
|
if (pbuf_dupe_lag == 2000000000) pbuf_dupe_lag = 0;
|
||||||
|
|
||||||
if (lastage1 == 0) lastage1 = tick+2; // makes printout of "-2" (or "-1")
|
if (lastage1 == 0) lastage1 = tick+2; // makes printout of "-2" (or "-1")
|
||||||
if (lastage2 == 0) lastage2 = tick+2;
|
if (lastage2 == 0) lastage2 = tick+2;
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
static int show_zeros = 1;
|
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
|
else
|
||||||
show_zeros = 1;
|
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 */
|
/* 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);
|
memcpy(tb1, ib, ilen);
|
||||||
tlen1 = ilen;
|
tlen1 = ilen;
|
||||||
while (tlen1 > 0 && tb1[tlen1-1] == ' ')
|
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
|
* tb2: 8th bit is cleared
|
||||||
* tb3: 8th bit replaced with a space
|
* 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;
|
tlen1 = tlen2 = tlen3 = 0;
|
||||||
for (i = 0; i < ilen; i++) {
|
for (i = 0; i < ilen; i++) {
|
||||||
c = ib[i] & 0x7F;
|
c = ib[i] & 0x7F;
|
||||||
|
|
@ -618,6 +627,7 @@ static int dupecheck_drain_worker(struct worker_t *w,
|
||||||
struct pbuf_t *pb, *pbnext;
|
struct pbuf_t *pb, *pbnext;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
int me;
|
int me;
|
||||||
|
int pb_out_count_local = 0, pb_out_dupe_count_local = 0;
|
||||||
|
|
||||||
/* grab worker's list of packets */
|
/* grab worker's list of packets */
|
||||||
if ((me = pthread_mutex_lock(&w->pbuf_incoming_mutex))) {
|
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",
|
//hlog(LOG_DEBUG, "Dupecheck got %d packets from worker %d; n=%d",
|
||||||
// c, w->id, dupecheck_seqnum);
|
// 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) {
|
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);
|
int rc = dupecheck(pb);
|
||||||
pbnext = pb->next; // it may get modified below..
|
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_prevp = &pb->next;
|
||||||
*pb_out_last = pb;
|
*pb_out_last = pb;
|
||||||
pb->seqnum = ++dupecheck_seqnum;
|
pb->seqnum = ++dupecheck_seqnum;
|
||||||
*pb_out_count = *pb_out_count + 1;
|
pb_out_count_local++;
|
||||||
} else {
|
} else {
|
||||||
// Duplicate
|
// Duplicate
|
||||||
**pb_out_dupe_prevp = pb;
|
**pb_out_dupe_prevp = pb;
|
||||||
*pb_out_dupe_prevp = &pb->next;
|
*pb_out_dupe_prevp = &pb->next;
|
||||||
*pb_out_dupe_last = pb;
|
*pb_out_dupe_last = pb;
|
||||||
pb->seqnum = ++dupecheck_dupe_seqnum;
|
pb->seqnum = ++dupecheck_dupe_seqnum;
|
||||||
*pb_out_dupe_count = *pb_out_dupe_count + 1;
|
pb_out_dupe_count_local++;
|
||||||
//hlog(LOG_DEBUG, "is duplicate");
|
//hlog(LOG_DEBUG, "is duplicate");
|
||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*pb_out_count += pb_out_count_local;
|
||||||
|
*pb_out_dupe_count += pb_out_dupe_count_local;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue