src/utils_cache.c: Replace a left-over hard-coded default of "2" with "timeout_g".
[collectd.git] / src / utils_cache.c
index 91a60f0..aeb662d 100644 (file)
@@ -46,6 +46,7 @@ typedef struct cache_entry_s
         * (for purding old entries) */
        int interval;
        int state;
+       int hits;
 
        /*
         * +-----+-----+-----+-----+-----+-----+-----+-----+-----+----
@@ -174,7 +175,7 @@ static int uc_send_notification (const char *name)
   }
     
   /* Check if the entry has been updated in the meantime */
-  if ((n.time - ce->last_update) < (2 * ce->interval))
+  if ((n.time - ce->last_update) < (timeout_g * ce->interval))
   {
     ce->state = STATE_OKAY;
     pthread_mutex_unlock (&cache_lock);
@@ -318,7 +319,7 @@ int uc_check_timeout (void)
   while (c_avl_iterator_next (iter, (void *) &key, (void *) &ce) == 0)
   {
     /* If entry has not been updated, add to `keys' array */
-    if ((now - ce->last_update) >= (2 * ce->interval))
+    if ((now - ce->last_update) >= (timeout_g * ce->interval))
     {
       char **tmp;
 
@@ -362,6 +363,7 @@ int uc_check_timeout (void)
     {
       DEBUG ("uc_check_timeout: %s is missing but ``uninteresting''",
          keys[i]);
+      ce = NULL;
       status = c_avl_remove (cache_tree, keys[i],
          (void *) &key, (void *) &ce);
       if (status != 0)
@@ -370,7 +372,8 @@ int uc_check_timeout (void)
       }
       sfree (keys[i]);
       sfree (key);
-      cache_free (ce);
+      if (ce != NULL)
+        cache_free (ce);
       continue;
     }
 
@@ -611,16 +614,24 @@ int uc_get_rate_by_name (const char *name, gauge_t **ret_values, size_t *ret_val
   {
     assert (ce != NULL);
 
-    ret_num = ce->values_num;
-    ret = (gauge_t *) malloc (ret_num * sizeof (gauge_t));
-    if (ret == NULL)
+    /* remove missing values from getval */
+    if (ce->state == STATE_MISSING)
     {
-      ERROR ("utils_cache: uc_get_rate_by_name: malloc failed.");
       status = -1;
     }
     else
     {
-      memcpy (ret, ce->values_gauge, ret_num * sizeof (gauge_t));
+      ret_num = ce->values_num;
+      ret = (gauge_t *) malloc (ret_num * sizeof (gauge_t));
+      if (ret == NULL)
+      {
+        ERROR ("utils_cache: uc_get_rate_by_name: malloc failed.");
+        status = -1;
+      }
+      else
+      {
+        memcpy (ret, ce->values_gauge, ret_num * sizeof (gauge_t));
+      }
     }
   }
   else
@@ -693,6 +704,10 @@ int uc_get_names (char ***ret_names, time_t **ret_times, size_t *ret_number)
   {
     char **temp;
 
+    /* remove missing values when list values */
+    if (value->state == STATE_MISSING)
+      continue;
+
     if (ret_times != NULL)
     {
       time_t *tmp_times;
@@ -881,11 +896,88 @@ int uc_get_history (const data_set_t *ds, const value_list_t *vl,
   return (uc_get_history_by_name (name, ret_history, num_steps, num_ds));
 } /* int uc_get_history */
 
+int uc_get_hits (const data_set_t *ds, const value_list_t *vl)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = STATE_ERROR;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_get_hits */
+
+int uc_set_hits (const data_set_t *ds, const value_list_t *vl, int hits)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = -1;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+    ce->hits = hits;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_set_hits */
+
+int uc_inc_hits (const data_set_t *ds, const value_list_t *vl, int step)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = -1;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+    ce->hits = ret + step;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_inc_hits */
+
 /*
  * Meta data interface
  */
 /* XXX: This function will acquire `cache_lock' but will not free it! */
-static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */
+static meta_data_t *uc_get_meta (const value_list_t *vl) /* {{{ */
 {
   char name[6 * DATA_MAX_NAME_LEN];
   cache_entry_t *ce = NULL;
@@ -904,7 +996,6 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */
   if (status != 0)
   {
     pthread_mutex_unlock (&cache_lock);
-    NOTICE ("utils_cache: uc_get_meta: No such cache entry: %s", name);
     return (NULL);
   }
   assert (ce != NULL);
@@ -912,6 +1003,9 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */
   if (ce->meta == NULL)
     ce->meta = meta_data_create ();
 
+  if (ce->meta == NULL)
+    pthread_mutex_unlock (&cache_lock);
+
   return (ce->meta);
 } /* }}} meta_data_t *uc_get_meta */
 
@@ -926,10 +1020,10 @@ static meta_data_t *uc_get_meta (value_list_t *vl) /* {{{ */
   pthread_mutex_unlock (&cache_lock); \
   return (status); \
 }
-int uc_meta_data_exists (value_list_t *vl, const char *key)
+int uc_meta_data_exists (const value_list_t *vl, const char *key)
   UC_WRAP (meta_data_exists)
 
-int uc_meta_data_delete (value_list_t *vl, const char *key)
+int uc_meta_data_delete (const value_list_t *vl, const char *key)
   UC_WRAP (meta_data_delete)
 #undef UC_WRAP
 
@@ -944,44 +1038,44 @@ int uc_meta_data_delete (value_list_t *vl, const char *key)
   pthread_mutex_unlock (&cache_lock); \
   return (status); \
 }
-int uc_meta_data_add_string (value_list_t *vl,
+int uc_meta_data_add_string (const value_list_t *vl,
     const char *key,
     const char *value)
   UC_WRAP(meta_data_add_string)
-int uc_meta_data_add_signed_int (value_list_t *vl,
+int uc_meta_data_add_signed_int (const value_list_t *vl,
     const char *key,
     int64_t value)
   UC_WRAP(meta_data_add_signed_int)
-int uc_meta_data_add_unsigned_int (value_list_t *vl,
+int uc_meta_data_add_unsigned_int (const value_list_t *vl,
     const char *key,
     uint64_t value)
   UC_WRAP(meta_data_add_unsigned_int)
-int uc_meta_data_add_double (value_list_t *vl,
+int uc_meta_data_add_double (const value_list_t *vl,
     const char *key,
     double value)
   UC_WRAP(meta_data_add_double)
-int uc_meta_data_add_boolean (value_list_t *vl,
+int uc_meta_data_add_boolean (const value_list_t *vl,
     const char *key,
     _Bool value)
   UC_WRAP(meta_data_add_boolean)
 
-int uc_meta_data_get_string (value_list_t *vl,
+int uc_meta_data_get_string (const value_list_t *vl,
     const char *key,
     char **value)
   UC_WRAP(meta_data_get_string)
-int uc_meta_data_get_signed_int (value_list_t *vl,
+int uc_meta_data_get_signed_int (const value_list_t *vl,
     const char *key,
     int64_t *value)
   UC_WRAP(meta_data_get_signed_int)
-int uc_meta_data_get_unsigned_int (value_list_t *vl,
+int uc_meta_data_get_unsigned_int (const value_list_t *vl,
     const char *key,
     uint64_t *value)
   UC_WRAP(meta_data_get_unsigned_int)
-int uc_meta_data_get_double (value_list_t *vl,
+int uc_meta_data_get_double (const value_list_t *vl,
     const char *key,
     double *value)
   UC_WRAP(meta_data_get_double)
-int uc_meta_data_get_boolean (value_list_t *vl,
+int uc_meta_data_get_boolean (const value_list_t *vl,
     const char *key,
     _Bool *value)
   UC_WRAP(meta_data_get_boolean)