Merge branch 'collectd-5.7' into collectd-5.8
authorPavel Rochnyack <pavel2000@ngs.ru>
Fri, 26 Oct 2018 15:06:35 +0000 (22:06 +0700)
committerPavel Rochnyack <pavel2000@ngs.ru>
Fri, 26 Oct 2018 15:06:35 +0000 (22:06 +0700)
Conflicts:
src/utils_mount.c

1  2 
src/utils_mount.c
src/zfs_arc.c

diff --combined src/utils_mount.c
@@@ -258,7 -258,7 +258,7 @@@ static void uuidcache_init(void) 
          * (This is useful, if the cdrom on /dev/hdc must not
          * be accessed.)
          */
 -        ssnprintf(device, sizeof(device), "%s/%s", DEVLABELDIR, ptname);
 +        snprintf(device, sizeof(device), "%s/%s", DEVLABELDIR, ptname);
          if (!get_label_uuid(device, &label, uuid)) {
            uuidcache_addentry(sstrdup(device), label, uuid);
          }
  
  static unsigned char fromhex(char c) {
    if (isdigit((int)c)) {
 -    return (c - '0');
 +    return c - '0';
    } else if (islower((int)c)) {
 -    return (c - 'a' + 10);
 +    return c - 'a' + 10;
    } else {
 -    return (c - 'A' + 10);
 +    return c - 'A' + 10;
    }
  }
  
@@@ -335,7 -335,7 +335,7 @@@ static char *get_device_name(const cha
    char *rc;
  
    if (optstr == NULL) {
 -    return (NULL);
 +    return NULL;
    } else if (strncmp(optstr, "UUID=", 5) == 0) {
      DEBUG("utils_mount: TODO: check UUID= code!");
      rc = get_spec_by_uuid(optstr + 5);
@@@ -401,7 -401,7 +401,7 @@@ static cu_mount_t *cu_mount_listmntent(
      last->next = NULL;
    } /* for(p = mntlist; p; p = p->next) */
  
 -  return (last);
 +  return last;
  } /* cu_mount_t *cu_mount_listmntent(void) */
  /* #endif HAVE_LISTMNTENT */
  
@@@ -435,11 -435,11 +435,11 @@@ static cu_mount_t *cu_mount_getfsstat(v
      DEBUG("utils_mount: getv?fsstat failed: %s",
            sstrerror(errno, errbuf, sizeof(errbuf)));
  #endif /* COLLECT_DEBUG */
 -    return (NULL);
 +    return NULL;
    }
  
    if ((buf = calloc(bufsize, sizeof(*buf))) == NULL)
 -    return (NULL);
 +    return NULL;
  
    /* The bufsize needs to be passed in bytes. Really. This is not in the
     * manpage.. -octo */
            sstrerror(errno, errbuf, sizeof(errbuf)));
  #endif /* COLLECT_DEBUG */
      free(buf);
 -    return (NULL);
 +    return NULL;
    }
  
    for (int i = 0; i < num; i++) {
  
    free(buf);
  
 -  return (first);
 +  return first;
  }
  /* #endif HAVE_GETVFSSTAT || HAVE_GETFSSTAT */
  
@@@ -498,7 -498,7 +498,7 @@@ static cu_mount_t *cu_mount_gen_getmnte
      char errbuf[1024];
      ERROR("fopen (%s): %s", COLLECTD_MNTTAB,
            sstrerror(errno, errbuf, sizeof(errbuf)));
 -    return (NULL);
 +    return NULL;
    }
  
    while (getmntent(fp, &mt) == 0) {
  
    fclose(fp);
  
 -  return (first);
 -}
 -/* #endif HAVE_{TWO,GEN,SUN}_GETMNTENT */
 +  return first;
 +} /* static cu_mount_t *cu_mount_gen_getmntent (void) */
 +  /* #endif HAVE_TWO_GETMNTENT || HAVE_GEN_GETMNTENT || HAVE_SUN_GETMNTENT */
  
  #elif HAVE_SEQ_GETMNTENT
  #warn "This version of `getmntent' hat not yet been implemented!"
@@@ -549,7 -549,7 +549,7 @@@ static cu_mount_t *cu_mount_getmntent(v
      char errbuf[1024];
      ERROR("setmntent (%s): %s", COLLECTD_MNTTAB,
            sstrerror(errno, errbuf, sizeof(errbuf)));
 -    return (NULL);
 +    return NULL;
    }
  
    while (getmntent_r(fp, &me, mntbuf, sizeof(mntbuf))) {
  
    endmntent(fp);
  
 -  DEBUG("utils_mount: return (0x%p)", (void *)first);
 +  DEBUG("utils_mount: return 0x%p", (void *)first);
  
 -  return (first);
 +  return first;
  } /* HAVE_GETMNTENT_R */
  
  #elif HAVE_ONE_GETMNTENT
@@@ -600,7 -600,7 +600,7 @@@ static cu_mount_t *cu_mount_getmntent(v
      char errbuf[1024];
      ERROR("setmntent (%s): %s", COLLECTD_MNTTAB,
            sstrerror(errno, errbuf, sizeof(errbuf)));
 -    return (NULL);
 +    return NULL;
    }
  
    while ((me = getmntent(fp)) != NULL) {
  
    endmntent(fp);
  
 -  DEBUG("utils_mount: return (0x%p)", (void *)first);
 +  DEBUG("utils_mount: return 0x%p", (void *)first);
  
 -  return (first);
 +  return first;
  }
  #endif /* HAVE_ONE_GETMNTENT */
  
@@@ -647,7 -647,7 +647,7 @@@ cu_mount_t *cu_mount_getlist(cu_mount_
    cu_mount_t *last = NULL;
  
    if (list == NULL)
 -    return (NULL);
 +    return NULL;
  
    if (*list != NULL) {
      first = *list;
    new = cu_mount_gen_getmntent();
  #elif HAVE_SEQ_GETMNTENT
  #error "This version of `getmntent' hat not yet been implemented!"
+ #elif HAVE_GETMNTENT_R
+   new = cu_mount_getmntent();
  #elif HAVE_ONE_GETMNTENT
    new = cu_mount_getmntent();
  #else
    while ((last != NULL) && (last->next != NULL))
      last = last->next;
  
 -  return (last);
 +  return last;
  } /* cu_mount_t *cu_mount_getlist(cu_mount_t **list) */
  
  void cu_mount_freelist(cu_mount_t *list) {
diff --combined src/zfs_arc.c
  /*
   * Global variables
   */
 +static value_to_rate_state_t arc_hits_state;
 +static value_to_rate_state_t arc_misses_state;
 +static value_to_rate_state_t l2_hits_state;
 +static value_to_rate_state_t l2_misses_state;
  
  #if defined(KERNEL_LINUX)
  #include "utils_llist.h"
@@@ -79,11 -75,12 +79,11 @@@ static long long get_zfs_value(kstat_t 
  
    e = llist_search(ksp, key);
    if (e == NULL) {
 -    ERROR("zfs_arc plugin: `llist_search` failed for key: '%s'.", key);
 -    return (-1);
 +    return -1;
    }
  
    v = e->value;
 -  return ((long long)v->derive);
 +  return (long long)v->derive;
  }
  
  static void free_zfs_values(kstat_t *ksp) {
  }
  
  #elif defined(KERNEL_SOLARIS)
 +
 +#if HAVE_KSTAT_H
 +#include <kstat.h>
 +#endif
 +
  extern kstat_ctl_t *kc;
  
  static long long get_zfs_value(kstat_t *ksp, char *name) {
  
 -  return (get_kstat_value(ksp, name));
 +  return get_kstat_value(ksp, name);
  }
  #elif defined(KERNEL_FREEBSD)
  #include <sys/sysctl.h>
@@@ -127,13 -119,13 +127,13 @@@ static long long get_zfs_value(kstat_t 
    size_t valuelen = sizeof(value);
    int rv;
  
 -  ssnprintf(buffer, sizeof(buffer), "%s%s", zfs_arcstat, name);
 +  snprintf(buffer, sizeof(buffer), "%s%s", zfs_arcstat, name);
    rv = sysctlbyname(buffer, (void *)&value, &valuelen,
                      /* new value = */ NULL, /* new length = */ (size_t)0);
    if (rv == 0)
 -    return (value);
 +    return value;
  
 -  return (-1);
 +  return -1;
  }
  #endif
  
@@@ -160,26 -152,26 +160,26 @@@ static int za_read_derive(kstat_t *ksp
                            const char *type, const char *type_instance) {
    long long tmp = get_zfs_value(ksp, (char *)kstat_value);
    if (tmp == -1LL) {
 -    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
 -    return (-1);
 +    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
 +    return -1;
    }
  
    za_submit(type, type_instance, &(value_t){.derive = (derive_t)tmp},
              /* values_num = */ 1);
 -  return (0);
 +  return 0;
  }
  
  static int za_read_gauge(kstat_t *ksp, const char *kstat_value,
                           const char *type, const char *type_instance) {
    long long tmp = get_zfs_value(ksp, (char *)kstat_value);
    if (tmp == -1LL) {
 -    WARNING("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
 -    return (-1);
 +    DEBUG("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value);
 +    return -1;
    }
  
    za_submit(type, type_instance, &(value_t){.gauge = (gauge_t)tmp},
              /* values_num = */ 1);
 -  return (0);
 +  return 0;
  }
  
  static void za_submit_ratio(const char *type_instance, gauge_t hits,
@@@ -210,28 -202,33 +210,45 @@@ static int za_read(void) 
      char errbuf[1024];
      ERROR("zfs_arc plugin: Opening \"%s\" failed: %s", ZOL_ARCSTATS_FILE,
            sstrerror(errno, errbuf, sizeof(errbuf)));
 -    return (-1);
 +    return -1;
 +  }
 +
 +  /* Ignore the first two lines because they contain information about the rest
 +   * of the file.
 +   * See kstat_seq_show_headers module/spl/spl-kstat.c of the spl kernel module.
 +   */
 +  if ((fgets(buffer, sizeof(buffer), fh) == NULL) ||
 +      (fgets(buffer, sizeof(buffer), fh) == NULL)) {
 +    ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.",
 +          ZOL_ARCSTATS_FILE);
 +    fclose(fh);
 +    return -1;
    }
  
    ksp = llist_create();
    if (ksp == NULL) {
      ERROR("zfs_arc plugin: `llist_create' failed.");
      fclose(fh);
 -    return (-1);
 +    return -1;
    }
  
+   // Ignore the first two lines because they contain information about
+   // the rest of the file.
+   // See kstat_seq_show_headers module/spl/spl-kstat.c of the spl kernel
+   // module.
+   if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+     ERROR("zfs_arc plugin: \"%s\" does not contain a single line.",
+           ZOL_ARCSTATS_FILE);
+     fclose(fh);
+     return (-1);
+   }
+   if (fgets(buffer, sizeof(buffer), fh) == NULL) {
+     ERROR("zfs_arc plugin: \"%s\" does not contain at least two lines.",
+           ZOL_ARCSTATS_FILE);
+     fclose(fh);
+     return (-1);
+   }
    while (fgets(buffer, sizeof(buffer), fh) != NULL) {
      char *fields[3];
      value_t v;
    get_kstat(&ksp, "zfs", 0, "arcstats");
    if (ksp == NULL) {
      ERROR("zfs_arc plugin: Cannot find zfs:0:arcstats kstat.");
 -    return (-1);
 +    return -1;
    }
  #endif
  
    za_read_derive(ksp, "mru_hits", "cache_result", "mru-hit");
    za_read_derive(ksp, "mru_ghost_hits", "cache_result", "mru_ghost-hit");
  
 +  cdtime_t now = cdtime();
 +
    /* Ratios */
 -  arc_hits = (gauge_t)get_zfs_value(ksp, "hits");
 -  arc_misses = (gauge_t)get_zfs_value(ksp, "misses");
 -  l2_hits = (gauge_t)get_zfs_value(ksp, "l2_hits");
 -  l2_misses = (gauge_t)get_zfs_value(ksp, "l2_misses");
 +  if ((value_to_rate(&arc_hits, (value_t){.derive = get_zfs_value(ksp, "hits")},
 +                     DS_TYPE_DERIVE, now, &arc_hits_state) == 0) &&
 +      (value_to_rate(&arc_misses,
 +                     (value_t){.derive = get_zfs_value(ksp, "misses")},
 +                     DS_TYPE_DERIVE, now, &arc_misses_state) == 0)) {
 +    za_submit_ratio("arc", arc_hits, arc_misses);
 +  }
  
 -  za_submit_ratio("arc", arc_hits, arc_misses);
 -  za_submit_ratio("L2", l2_hits, l2_misses);
 +  if ((value_to_rate(&l2_hits,
 +                     (value_t){.derive = get_zfs_value(ksp, "l2_hits")},
 +                     DS_TYPE_DERIVE, now, &l2_hits_state) == 0) &&
 +      (value_to_rate(&l2_misses,
 +                     (value_t){.derive = get_zfs_value(ksp, "l2_misses")},
 +                     DS_TYPE_DERIVE, now, &l2_misses_state) == 0)) {
 +    za_submit_ratio("L2", l2_hits, l2_misses);
 +  }
  
    /* I/O */
    value_t l2_io[] = {
    free_zfs_values(ksp);
  #endif
  
 -  return (0);
 +  return 0;
  } /* int za_read */
  
  static int za_init(void) /* {{{ */
     * went fine. */
    if (kc == NULL) {
      ERROR("zfs_arc plugin: kstat chain control structure not available.");
 -    return (-1);
 +    return -1;
    }
  #endif
  
 -  return (0);
 +  return 0;
  } /* }}} int za_init */
  
  void module_register(void) {