summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil McKee <neil.mckee@inmon.com>2010-02-11 15:06:11 -0800
committerBen Pfaff <blp@nicira.com>2010-02-12 12:12:23 -0800
commitda0603cf278a9f505dc2988602ec0071c771dd2e (patch)
tree978aa6d590a8407962a36937ff0aa22216c07f16
parent67a4917b07031b387beafaedce413b4207214059 (diff)
downloadopenvswitch-da0603cf278a9f505dc2988602ec0071c771dd2e.tar.gz
Allow sFlowCpInterval=0 to disable counter samples, and fix bug in sampler removal.
-rw-r--r--lib/sflow_poller.c27
-rw-r--r--lib/sflow_sampler.c7
2 files changed, 28 insertions, 6 deletions
diff --git a/lib/sflow_poller.c b/lib/sflow_poller.c
index ffd09d3c2..e7dc2b12f 100644
--- a/lib/sflow_poller.c
+++ b/lib/sflow_poller.c
@@ -68,10 +68,29 @@ u_int32_t sfl_poller_get_sFlowCpInterval(SFLPoller *poller) {
void sfl_poller_set_sFlowCpInterval(SFLPoller *poller, u_int32_t sFlowCpInterval) {
poller->sFlowCpInterval = sFlowCpInterval;
- /* Set the countersCountdown to be a randomly selected value between 1 and
- sFlowCpInterval. That way the counter polling would be desynchronised
- (on a 200-port switch, polling all the counters in one second could be harmful). */
- poller->countersCountdown = 1 + (random() % sFlowCpInterval);
+ if(sFlowCpInterval) {
+ /* Set the countersCountdown to be a randomly selected value between 1 and
+ sFlowCpInterval. That way the counter polling will be desynchronised
+ (on a 200-port switch, polling all the counters in one second could be harmful).
+ In a large network, even this might not be ideal if time-synchroniziation
+ between devices is close and counters are always polled on second boundaries. If
+ 1000 different devices all send an sFlow datagram on the same second boundary
+ it could result in an antisocial burst.
+ However when counter-samples are packed into the export datagram they do not
+ always result in that datagram being sent immediately. It is more likely that
+ a subsequent packet-sample will be the one that triggers the datagram to be sent.
+ The packet-sample events are not sychronized to any clock, so that results in
+ excellent desynchronization (http://blog.sflow.com/2009/05/measurement-traffic.html).
+ Another smoothing factor is that the tick() function called here is usually
+ driven from a fairly "soft" polling loop rather than a hard real-time event.
+ */
+ poller->countersCountdown = 1 + (random() % sFlowCpInterval);
+ }
+ else {
+ /* Setting sFlowCpInterval to 0 disables counter polling altogether. Thanks to
+ Andy Kitchingman for spotting this ommission. */
+ poller->countersCountdown = 0;
+ }
}
/*_________________---------------------------------__________________
diff --git a/lib/sflow_sampler.c b/lib/sflow_sampler.c
index 759b5a22c..c2b4556cf 100644
--- a/lib/sflow_sampler.c
+++ b/lib/sflow_sampler.c
@@ -16,14 +16,17 @@ void sfl_sampler_init(SFLSampler *sampler, SFLAgent *agent, SFLDataSource_instan
SFLDataSource_instance dsi = *pdsi;
/* preserve the *nxt pointer too, in case we are resetting this poller and it is
- already part of the agent's linked list (thanks to Matt Woodly for pointing this out) */
+ already part of the agent's linked list (thanks to Matt Woodly for pointing this out,
+ and to Andy Kitchingman for pointing out that it applies to the hash_nxt ptr too) */
SFLSampler *nxtPtr = sampler->nxt;
+ SFLSampler *hashPtr = sampler->hash_nxt;
/* clear everything */
memset(sampler, 0, sizeof(*sampler));
- /* restore the linked list ptr */
+ /* restore the linked list and hash-table ptr */
sampler->nxt = nxtPtr;
+ sampler->hash_nxt = hashPtr;
/* now copy in the parameters */
sampler->agent = agent;