separate timers for flow mgr thread for normal and emerg mode. Signal flow mgr thread when in emerg mode

remotes/origin/master-1.2.x
Anoop Saldanha 14 years ago committed by Victor Julien
parent 5a63662766
commit 9917744707

@ -325,6 +325,7 @@ static Flow *FlowGetNew(Packet *p) {
"(ts.tv_sec: %"PRIuMAX", ts.tv_usec:%"PRIuMAX")", "(ts.tv_sec: %"PRIuMAX", ts.tv_usec:%"PRIuMAX")",
(uintmax_t)p->ts.tv_sec, (uintmax_t)p->ts.tv_usec); (uintmax_t)p->ts.tv_sec, (uintmax_t)p->ts.tv_usec);
flow_flags |= FLOW_EMERGENCY; /* XXX mutex this */ flow_flags |= FLOW_EMERGENCY; /* XXX mutex this */
SCCondSignal(&flow_manager_cond);
} }
SCLogDebug("We need to prune some flows with emerg bit (2)"); SCLogDebug("We need to prune some flows with emerg bit (2)");
@ -353,10 +354,6 @@ static Flow *FlowGetNew(Packet *p) {
/* flow has been recycled before it went into the spare queue */ /* flow has been recycled before it went into the spare queue */
/* flow is initialized (recylced) but *unlocked* */ /* flow is initialized (recylced) but *unlocked* */
/* Important event for flow system, let's ask for a refresh to flow
manager */
SCCondSignal(&flow_manager_cond);
} }
FlowIncrUsecnt(f); FlowIncrUsecnt(f);

@ -62,7 +62,10 @@
/* Run mode selected at suricata.c */ /* Run mode selected at suricata.c */
extern int run_mode; extern int run_mode;
#define FLOW_UPDATE_DELAY 2 #define FLOW_NORMAL_MODE_UPDATE_DELAY_SEC 2
#define FLOW_NORMAL_MODE_UPDATE_DELAY_NSEC 0
#define FLOW_EMERG_MODE_UPDATE_DELAY_SEC 0
#define FLOW_EMERG_MODE_UPDATE_DELAY_NSEC 10000000
#define NEW_FLOW_COUNT_COND 10 #define NEW_FLOW_COUNT_COND 10
/** /**
@ -124,14 +127,14 @@ void *FlowManagerThread(void *td)
{ {
ThreadVars *th_v = (ThreadVars *)td; ThreadVars *th_v = (ThreadVars *)td;
struct timeval ts; struct timeval ts;
struct timeval tsdiff;
uint32_t established_cnt = 0, new_cnt = 0, closing_cnt = 0, nowcnt; uint32_t established_cnt = 0, new_cnt = 0, closing_cnt = 0, nowcnt;
uint32_t sleeping = 0; uint32_t sleeping = 0;
int emerg = FALSE; int emerg = FALSE;
int prev_emerg = FALSE; int prev_emerg = FALSE;
uint32_t last_sec = 0; uint32_t last_sec = 0;
struct timespec cond_time; struct timespec cond_time;
int counter = 0; int flow_update_delay_sec = FLOW_NORMAL_MODE_UPDATE_DELAY_SEC;
int flow_update_delay_nsec = FLOW_NORMAL_MODE_UPDATE_DELAY_NSEC;
uint16_t flow_mgr_closing_cnt = SCPerfTVRegisterCounter("flow_mgr.closed_pruned", th_v, uint16_t flow_mgr_closing_cnt = SCPerfTVRegisterCounter("flow_mgr.closed_pruned", th_v,
SC_PERF_TYPE_UINT64, SC_PERF_TYPE_UINT64,
@ -174,9 +177,9 @@ void *FlowManagerThread(void *td)
{ {
TmThreadTestThreadUnPaused(th_v); TmThreadTestThreadUnPaused(th_v);
if ((counter > NEW_FLOW_COUNT_COND) || (flow_flags & FLOW_EMERGENCY)) { //if ((counter > NEW_FLOW_COUNT_COND) || (flow_flags & FLOW_EMERGENCY)) {
{
counter = 0; //counter = 0;
if (flow_flags & FLOW_EMERGENCY) { if (flow_flags & FLOW_EMERGENCY) {
emerg = TRUE; emerg = TRUE;
@ -257,6 +260,8 @@ void *FlowManagerThread(void *td)
flow_flags &= ~FLOW_EMERGENCY; flow_flags &= ~FLOW_EMERGENCY;
emerg = FALSE; emerg = FALSE;
prev_emerg = FALSE; prev_emerg = FALSE;
flow_update_delay_sec = FLOW_NORMAL_MODE_UPDATE_DELAY_SEC;
flow_update_delay_nsec = FLOW_NORMAL_MODE_UPDATE_DELAY_NSEC;
SCLogInfo("Flow emergency mode over, back to normal... unsetting" SCLogInfo("Flow emergency mode over, back to normal... unsetting"
" FLOW_EMERGENCY bit (ts.tv_sec: %"PRIuMAX", " " FLOW_EMERGENCY bit (ts.tv_sec: %"PRIuMAX", "
"ts.tv_usec:%"PRIuMAX") flow_spare_q status(): %"PRIu32 "ts.tv_usec:%"PRIuMAX") flow_spare_q status(): %"PRIu32
@ -264,6 +269,9 @@ void *FlowManagerThread(void *td)
(uintmax_t)ts.tv_usec, len * 100 / flow_config.prealloc); (uintmax_t)ts.tv_usec, len * 100 / flow_config.prealloc);
SCPerfCounterIncr(flow_emerg_mode_over, th_v->sc_perf_pca); SCPerfCounterIncr(flow_emerg_mode_over, th_v->sc_perf_pca);
} else {
flow_update_delay_sec = FLOW_EMERG_MODE_UPDATE_DELAY_SEC;
flow_update_delay_nsec = FLOW_EMERG_MODE_UPDATE_DELAY_NSEC;
} }
} }
} }
@ -276,13 +284,10 @@ void *FlowManagerThread(void *td)
#if 0 #if 0
if (run_mode != RUNMODE_PCAP_FILE) { if (run_mode != RUNMODE_PCAP_FILE) {
#endif #endif
cond_time.tv_sec = time(NULL) + FLOW_UPDATE_DELAY; cond_time.tv_sec = time(NULL) + flow_update_delay_sec;
cond_time.tv_nsec = 0; cond_time.tv_nsec = flow_update_delay_nsec;
SCMutexLock(&flow_manager_mutex); SCMutexLock(&flow_manager_mutex);
if (SCCondTimedwait(&flow_manager_cond, &flow_manager_mutex, &cond_time) == ETIMEDOUT) { SCCondTimedwait(&flow_manager_cond, &flow_manager_mutex, &cond_time);
counter = NEW_FLOW_COUNT_COND;
}
counter++;
SCMutexUnlock(&flow_manager_mutex); SCMutexUnlock(&flow_manager_mutex);
#if 0 #if 0
} else { } else {
@ -339,7 +344,7 @@ void FlowManagerThreadSpawn()
{ {
ThreadVars *tv_flowmgr = NULL; ThreadVars *tv_flowmgr = NULL;
SCCondInit(&flow_manager_cond, &flow_manager_mutex); SCCondInit(&flow_manager_cond, NULL);
tv_flowmgr = TmThreadCreateMgmtThread("FlowManagerThread", tv_flowmgr = TmThreadCreateMgmtThread("FlowManagerThread",
FlowManagerThread, 0); FlowManagerThread, 0);

Loading…
Cancel
Save