From: Neil McKee <neil.mckee@inmon.com>
Date: Thu, 11 Feb 2010 23:06:11 +0000 (-0800)
Subject: Allow sFlowCpInterval=0 to disable counter samples, and fix bug in sampler removal.
X-Git-Tag: v0.99.2~24
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=da0603cf278a9f505dc2988602ec0071c771dd2e;p=sliver-openvswitch.git

Allow sFlowCpInterval=0 to disable counter samples, and fix bug in sampler removal.
---

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;