Merge branch 'collectd-5.4' into collectd-5.5
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 6 Mar 2016 11:08:59 +0000 (12:08 +0100)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 6 Mar 2016 11:08:59 +0000 (12:08 +0100)
1  2 
src/utils_mount.c
src/zfs_arc.c

diff --combined src/utils_mount.c
   *   Niki W. Waibel <niki.waibel@gmx.net>
  **/
  
 -#if HAVE_CONFIG_H
 -# include "config.h"
 -#endif
 +#include "collectd.h"
 +#include "utils_mount.h"
 +
 +#include "common.h" /* sstrncpy() et alii */
 +#include "plugin.h" /* ERROR() macro */
  
 -#include "common.h"
  #if HAVE_XFS_XQM_H
  # include <xfs/xqm.h>
  #define XFS_SUPER_MAGIC_STR "XFSB"
  #define XFS_SUPER_MAGIC2_STR "BSFX"
  #endif
  
 -#include "plugin.h"
 -#include "utils_mount.h"
 -
  #if HAVE_GETVFSSTAT
  #  if HAVE_SYS_TYPES_H
  #    include <sys/types.h>
@@@ -429,16 -431,16 +429,16 @@@ static cu_mount_t *cu_mount_listmntent 
  #elif HAVE_GETVFSSTAT || HAVE_GETFSSTAT
  static cu_mount_t *cu_mount_getfsstat (void)
  {
- #if HAVE_GETVFSSTAT
- #  define STRUCT_STATFS struct statvfs
- #  define CMD_STATFS    getvfsstat
- #  define FLAGS_STATFS  ST_NOWAIT
- /* #endif HAVE_GETVFSSTAT */
- #elif HAVE_GETFSSTAT
+ #if HAVE_GETFSSTAT
  #  define STRUCT_STATFS struct statfs
  #  define CMD_STATFS    getfsstat
  #  define FLAGS_STATFS  MNT_NOWAIT
- #endif /* HAVE_GETFSSTAT */
+ /* #endif HAVE_GETFSSTAT */
+ #elif HAVE_GETVFSSTAT
+ #  define STRUCT_STATFS struct statvfs
+ #  define CMD_STATFS    getvfsstat
+ #  define FLAGS_STATFS  ST_NOWAIT
+ #endif /* HAVE_GETVFSSTAT */
  
        int bufsize;
        STRUCT_STATFS *buf;
diff --combined src/zfs_arc.c
@@@ -3,8 -3,6 +3,8 @@@
   * Copyright (C) 2009  Anthony Dewhurst
   * Copyright (C) 2012  Aurelien Rougemont
   * Copyright (C) 2013  Xin Li
 + * Copyright (C) 2014  Marc Fournier
 + * Copyright (C) 2014  Wilfried Goesgens
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the
@@@ -23,8 -21,6 +23,8 @@@
   *   Anthony Dewhurst <dewhurst at gmail>
   *   Aurelien Rougemont <beorn at gandi.net>
   *   Xin Li <delphij at FreeBSD.org>
 + *   Marc Fournier <marc.fournier at camptocamp.com>
 + *   Wilfried Goesgens <dothebart at citadel.org>
   **/
  
  #include "collectd.h"
   * Global variables
   */
  
 -#if !defined(__FreeBSD__)
 +#if defined(KERNEL_LINUX)
 +#include "utils_llist.h"
 +#define ZOL_ARCSTATS_FILE "/proc/spl/kstat/zfs/arcstats"
 +
 +typedef       llist_t kstat_t;
 +
 +static long long get_zfs_value(kstat_t *zfs_stats  __attribute__((unused)),
 +              char *name)
 +{
 +      llentry_t *e;
 +
 +      e = llist_search (zfs_stats, name);
 +      if (e == NULL)
 +      {
 +              ERROR ("zfs_arc plugin: `llist_search` failed for key: '%s'.", name);
 +              return (-1);
 +      }
 +
 +      return (*(long long int*)e->value);
 +}
 +
 +#elif !defined(__FreeBSD__) // Solaris
  extern kstat_ctl_t *kc;
  
  static long long get_zfs_value(kstat_t *ksp, char *name)
@@@ -64,7 -39,7 +64,7 @@@
  
        return (get_kstat_value(ksp, name));
  }
 -#else
 +#else // FreeBSD
  #include <sys/types.h>
  #include <sys/sysctl.h>
  
@@@ -172,81 -147,7 +172,81 @@@ static int za_read (void
        value_t  l2_io[2];
        kstat_t  *ksp   = NULL;
  
 -#if !defined(__FreeBSD__)
 +#if KERNEL_LINUX
 +      long long int *llvalues = NULL;
 +      char file_contents[1024 * 10];
 +      char *fields[3];
 +      int numfields;
 +      ssize_t len;
 +
 +      ksp = llist_create ();
 +      if (ksp == NULL)
 +      {
 +              ERROR ("zfs_arc plugin: `llist_create' failed.");
 +              return (-1);
 +      }
 +
 +      len = read_file_contents (ZOL_ARCSTATS_FILE, file_contents, sizeof(file_contents) - 1);
 +      if (len > 1)
 +      {
 +
 +              int i=0;
 +              char *pnl = file_contents;
 +              char *pnnl;
 +
 +              file_contents[len] = '\0';
 +
 +              while (pnl != NULL)
 +              {
 +                      pnl = strchr(pnl, '\n');
 +                      i++;
 +                      if (pnl && (*pnl != '\0'))
 +                              pnl++;
 +              }
 +
 +              if (i > 0)
 +              {
 +                      llentry_t *e;
 +                      llvalues = malloc(sizeof(long long int) * i);
 +                      if (llvalues == NULL)
 +                      {
 +                              ERROR ("zfs_arc plugin: `malloc' failed.");
 +                              llist_destroy (ksp);
 +                              return (-1);
 +                      }
 +                      int j = 0;
 +
 +                      pnl = file_contents;
 +                      while (pnl != NULL)
 +                      {
 +                              pnnl = strchr(pnl, '\n');
 +                              if (pnnl != NULL)
 +                                      *pnnl = '\0';
 +
 +                              numfields = strsplit (pnl, fields, 4);
 +                              if (numfields == 3)
 +                              {
 +                                      llvalues[j] = atoll (fields[2]);
 +
 +                                      e = llentry_create (fields[0], &llvalues[j]);
 +                                      if (e == NULL)
 +                                      {
 +                                              ERROR ("zfs_arc plugin: `llentry_create' failed.");
 +                                      }
 +                                      else
 +                                      {
 +                                              llist_append (ksp, e);
 +                                      }
 +                                      j++;
 +                              }
 +                              pnl = pnnl;
 +                              if (pnl != NULL)
 +                                      pnl ++;
 +                      }
 +              }
 +      }
 +
 +#elif !defined(__FreeBSD__) // Solaris
        get_kstat (&ksp, "zfs", 0, "arcstats");
        if (ksp == NULL)
        {
        za_read_derive (ksp, "deleted",  "cache_operation", "deleted");
  #if __FreeBSD__
        za_read_derive (ksp, "allocated","cache_operation", "allocated");
+ #if defined(__FreeBSD_version) && (__FreeBSD_version < 1002501)
+       /* stolen removed from sysctl kstat.zfs.misc.arcstats on FreeBSD 10.2+ */
        za_read_derive (ksp, "stolen",   "cache_operation", "stolen");
  #endif
+ #endif
  
        /* Issue indicators */
        za_read_derive (ksp, "mutex_miss", "mutex_operations", "miss");
        za_read_derive (ksp, "hash_collisions", "hash_collisions", "");
 -      
 +
        /* Evictions */
        za_read_derive (ksp, "evict_l2_cached",     "cache_eviction", "cached");
        za_read_derive (ksp, "evict_l2_eligible",   "cache_eviction", "eligible");
  
        za_submit ("io_octets", "L2", l2_io, /* num values = */ 2);
  
 +#if defined(KERNEL_LINUX)
 +      if (llvalues != NULL)
 +      {
 +              free(llvalues);
 +      }
 +      if (ksp != NULL)
 +      {
 +              llist_destroy (ksp);
 +      }
 +#endif
 +
        return (0);
  } /* int za_read */
  
  static int za_init (void) /* {{{ */
  {
 -#if !defined(__FreeBSD__)
 +#if !defined(__FreeBSD__) && !defined(KERNEL_LINUX) // Solaris
        /* kstats chain already opened by update_kstat (using *kc), verify everything went fine. */
        if (kc == NULL)
        {