src/utils_threshold.c: Change the percentage code so it works with the DataSource...
authorFlorian Forster <octo@huhu.verplant.org>
Mon, 6 Jul 2009 16:57:54 +0000 (18:57 +0200)
committerFlorian Forster <octo@huhu.verplant.org>
Mon, 6 Jul 2009 16:57:54 +0000 (18:57 +0200)
The percentage code used to *always* check the first data source. With this
patch, the code honors the `DataSource' option again, checking only the
configured data sources if applicable.

src/utils_threshold.c

index d51789d..fa8c8f9 100644 (file)
@@ -769,36 +769,49 @@ static int ut_check_one_threshold (const data_set_t *ds,
   int ret = -1;
   int ds_index = -1;
   int i;
+  gauge_t values_copy[ds->ds_num];
 
-  if ((th->flags & UT_FLAG_PERCENTAGE) == UT_FLAG_PERCENTAGE)
-  {
+  memcpy (values_copy, values, sizeof (values_copy));
 
+  if ((th->flags & UT_FLAG_PERCENTAGE) != 0)
+  {
+    int num = 0;
     gauge_t sum=0.0;
-    gauge_t percentage;
 
+    if (ds->ds_num == 1)
+    {
+      WARNING ("ut_check_one_threshold: The %s type has only one data "
+          "source, but you have configured to check this as a percentage. "
+          "That doesn't make much sense, because the percentage will always "
+          "be 100%%!", ds->type);
+    }
+
+    /* Prepare `sum' and `num'. */
     for (i = 0; i < ds->ds_num; i++)
       if (!isnan (values[i]))
+      {
+        num++;
        sum += values[i];
+      }
 
-    if (sum == 0.0)
+    if ((num == 0) /* All data sources are undefined. */
+        || (sum == 0.0)) /* Sum is zero, cannot calculate percentage. */
     {
-      WARNING ("Values sum for percentage sums up to zero");
-      return(STATE_WARNING);
+      for (i = 0; i < ds->ds_num; i++)
+        values_copy[i] = NAN;
     }
-
-    percentage = 100.0 * values[0] / sum;
-
-    if (ret_ds_index != NULL)
-       *ret_ds_index = 0;
-
-    return ut_check_one_data_source (NULL, vl, th, &percentage, 0);
-  }
+    else /* We can actually calculate the percentage. */
+    {
+      for (i = 0; i < ds->ds_num; i++)
+        values_copy[i] = 100.0 * values[i] / sum;
+    }
+  } /* if (UT_FLAG_PERCENTAGE) */
 
   for (i = 0; i < ds->ds_num; i++)
   {
     int status;
 
-    status = ut_check_one_data_source (ds, vl, th, values, i);
+    status = ut_check_one_data_source (ds, vl, th, values_copy, i);
     if (ret < status)
     {
       ret = status;