summaryrefslogtreecommitdiffstats
path: root/src/freebsd_getmntinfo.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2018-11-07 12:22:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2018-11-07 12:22:44 +0000
commit1e6c93250172946eeb38e94a92a1fd12c9d3011e (patch)
tree8ca5e16dfc7ad6b3bf2738ca0a48408a950f8f7e /src/freebsd_getmntinfo.c
parentUpdate watch file (diff)
downloadnetdata-1e6c93250172946eeb38e94a92a1fd12c9d3011e.tar.xz
netdata-1e6c93250172946eeb38e94a92a1fd12c9d3011e.zip
Merging upstream version 1.11.0+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/freebsd_getmntinfo.c')
-rw-r--r--src/freebsd_getmntinfo.c299
1 files changed, 0 insertions, 299 deletions
diff --git a/src/freebsd_getmntinfo.c b/src/freebsd_getmntinfo.c
deleted file mode 100644
index ea82b9fd1..000000000
--- a/src/freebsd_getmntinfo.c
+++ /dev/null
@@ -1,299 +0,0 @@
-#include "common.h"
-
-#include <sys/mount.h>
-
-struct mount_point {
- char *name;
- uint32_t hash;
- size_t len;
-
- // flags
- int configured;
- int enabled;
- int updated;
-
- int do_space;
- int do_inodes;
-
- size_t collected; // the number of times this has been collected
-
- // charts and dimensions
-
- RRDSET *st_space;
- RRDDIM *rd_space_used;
- RRDDIM *rd_space_avail;
- RRDDIM *rd_space_reserved;
-
- RRDSET *st_inodes;
- RRDDIM *rd_inodes_used;
- RRDDIM *rd_inodes_avail;
-
- struct mount_point *next;
-};
-
-static struct mount_point *mount_points_root = NULL, *mount_points_last_used = NULL;
-
-static size_t mount_points_added = 0, mount_points_found = 0;
-
-static void mount_point_free(struct mount_point *m) {
- if (likely(m->st_space))
- rrdset_is_obsolete(m->st_space);
- if (likely(m->st_inodes))
- rrdset_is_obsolete(m->st_inodes);
-
- mount_points_added--;
- freez(m->name);
- freez(m);
-}
-
-static void mount_points_cleanup() {
- if (likely(mount_points_found == mount_points_added)) return;
-
- struct mount_point *m = mount_points_root, *last = NULL;
- while(m) {
- if (unlikely(!m->updated)) {
- // info("Removing mount point '%s', linked after '%s'", m->name, last?last->name:"ROOT");
-
- if (mount_points_last_used == m)
- mount_points_last_used = last;
-
- struct mount_point *t = m;
-
- if (m == mount_points_root || !last)
- mount_points_root = m = m->next;
-
- else
- last->next = m = m->next;
-
- t->next = NULL;
- mount_point_free(t);
- }
- else {
- last = m;
- m->updated = 0;
- m = m->next;
- }
- }
-}
-
-static struct mount_point *get_mount_point(const char *name) {
- struct mount_point *m;
-
- uint32_t hash = simple_hash(name);
-
- // search it, from the last position to the end
- for(m = mount_points_last_used ; m ; m = m->next) {
- if (unlikely(hash == m->hash && !strcmp(name, m->name))) {
- mount_points_last_used = m->next;
- return m;
- }
- }
-
- // search it from the beginning to the last position we used
- for(m = mount_points_root ; m != mount_points_last_used ; m = m->next) {
- if (unlikely(hash == m->hash && !strcmp(name, m->name))) {
- mount_points_last_used = m->next;
- return m;
- }
- }
-
- // create a new one
- m = callocz(1, sizeof(struct mount_point));
- m->name = strdupz(name);
- m->hash = simple_hash(m->name);
- m->len = strlen(m->name);
- mount_points_added++;
-
- // link it to the end
- if (mount_points_root) {
- struct mount_point *e;
- for(e = mount_points_root; e->next ; e = e->next) ;
- e->next = m;
- }
- else
- mount_points_root = m;
-
- return m;
-}
-
-// --------------------------------------------------------------------------------------------------------------------
-// getmntinfo
-
-int do_getmntinfo(int update_every, usec_t dt) {
- (void)dt;
-
-#define DELAULT_EXCLUDED_PATHS "/proc/*"
-// taken from gnulib/mountlist.c and shortened to FreeBSD related fstypes
-#define DEFAULT_EXCLUDED_FILESYSTEMS "autofs procfs subfs devfs none"
-#define CONFIG_SECTION_GETMNTINFO "plugin:freebsd:getmntinfo"
-
- static int enable_new_mount_points = -1;
- static int do_space = -1, do_inodes = -1;
- static SIMPLE_PATTERN *excluded_mountpoints = NULL;
- static SIMPLE_PATTERN *excluded_filesystems = NULL;
-
- if (unlikely(enable_new_mount_points == -1)) {
- enable_new_mount_points = config_get_boolean_ondemand(CONFIG_SECTION_GETMNTINFO,
- "enable new mount points detected at runtime",
- CONFIG_BOOLEAN_AUTO);
-
- do_space = config_get_boolean_ondemand(CONFIG_SECTION_GETMNTINFO, "space usage for all disks", CONFIG_BOOLEAN_AUTO);
- do_inodes = config_get_boolean_ondemand(CONFIG_SECTION_GETMNTINFO, "inodes usage for all disks", CONFIG_BOOLEAN_AUTO);
-
- excluded_mountpoints = simple_pattern_create(
- config_get(CONFIG_SECTION_GETMNTINFO, "exclude space metrics on paths",
- DELAULT_EXCLUDED_PATHS)
- , NULL
- , SIMPLE_PATTERN_EXACT
- );
-
- excluded_filesystems = simple_pattern_create(
- config_get(CONFIG_SECTION_GETMNTINFO, "exclude space metrics on filesystems",
- DEFAULT_EXCLUDED_FILESYSTEMS)
- , NULL
- , SIMPLE_PATTERN_EXACT
- );
- }
-
- if (likely(do_space || do_inodes)) {
- struct statfs *mntbuf;
- int mntsize;
-
- // there is no mount info in sysctl MIBs
- if (unlikely(!(mntsize = getmntinfo(&mntbuf, MNT_NOWAIT)))) {
- error("FREEBSD: getmntinfo() failed");
- do_space = 0;
- error("DISABLED: disk_space.* charts");
- do_inodes = 0;
- error("DISABLED: disk_inodes.* charts");
- error("DISABLED: getmntinfo module");
- return 1;
- } else {
- int i;
-
- mount_points_found = 0;
-
- for (i = 0; i < mntsize; i++) {
- char title[4096 + 1];
-
- struct mount_point *m = get_mount_point(mntbuf[i].f_mntonname);
- m->updated = 1;
- mount_points_found++;
-
- if (unlikely(!m->configured)) {
- char var_name[4096 + 1];
-
- // this is the first time we see this filesystem
-
- // remember we configured it
- m->configured = 1;
-
- m->enabled = enable_new_mount_points;
-
- if (likely(m->enabled))
- m->enabled = !(simple_pattern_matches(excluded_mountpoints, mntbuf[i].f_mntonname)
- || simple_pattern_matches(excluded_filesystems, mntbuf[i].f_fstypename));
-
- snprintfz(var_name, 4096, "%s:%s", CONFIG_SECTION_GETMNTINFO, mntbuf[i].f_mntonname);
- m->enabled = config_get_boolean_ondemand(var_name, "enabled", m->enabled);
-
- if (unlikely(m->enabled == CONFIG_BOOLEAN_NO))
- continue;
-
- m->do_space = config_get_boolean_ondemand(var_name, "space usage", do_space);
- m->do_inodes = config_get_boolean_ondemand(var_name, "inodes usage", do_inodes);
- }
-
- if (unlikely(!m->enabled))
- continue;
-
- if (unlikely(mntbuf[i].f_flags & MNT_RDONLY && !m->collected))
- continue;
-
- // --------------------------------------------------------------------------
-
- int rendered = 0;
-
- if (m->do_space == CONFIG_BOOLEAN_YES || (m->do_space == CONFIG_BOOLEAN_AUTO && (mntbuf[i].f_blocks > 2))) {
- if (unlikely(!m->st_space)) {
- snprintfz(title, 4096, "Disk Space Usage for %s [%s]",
- mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
- m->st_space = rrdset_create_localhost("disk_space",
- mntbuf[i].f_mntonname,
- NULL,
- mntbuf[i].f_mntonname,
- "disk.space",
- title,
- "GB",
- "freebsd",
- "getmntinfo",
- 2023,
- update_every,
- RRDSET_TYPE_STACKED
- );
-
- m->rd_space_avail = rrddim_add(m->st_space, "avail", NULL,
- mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- m->rd_space_used = rrddim_add(m->st_space, "used", NULL,
- mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- m->rd_space_reserved = rrddim_add(m->st_space, "reserved_for_root", "reserved for root",
- mntbuf[i].f_bsize, GIGA_FACTOR, RRD_ALGORITHM_ABSOLUTE);
- } else
- rrdset_next(m->st_space);
-
- rrddim_set_by_pointer(m->st_space, m->rd_space_avail, (collected_number) mntbuf[i].f_bavail);
- rrddim_set_by_pointer(m->st_space, m->rd_space_used, (collected_number) (mntbuf[i].f_blocks -
- mntbuf[i].f_bfree));
- rrddim_set_by_pointer(m->st_space, m->rd_space_reserved, (collected_number) (mntbuf[i].f_bfree -
- mntbuf[i].f_bavail));
- rrdset_done(m->st_space);
-
- rendered++;
- }
-
- // --------------------------------------------------------------------------
-
- if (m->do_inodes == CONFIG_BOOLEAN_YES || (m->do_inodes == CONFIG_BOOLEAN_AUTO && (mntbuf[i].f_files > 1))) {
- if (unlikely(!m->st_inodes)) {
- snprintfz(title, 4096, "Disk Files (inodes) Usage for %s [%s]",
- mntbuf[i].f_mntonname, mntbuf[i].f_mntfromname);
- m->st_inodes = rrdset_create_localhost("disk_inodes",
- mntbuf[i].f_mntonname,
- NULL,
- mntbuf[i].f_mntonname,
- "disk.inodes",
- title,
- "Inodes",
- "freebsd",
- "getmntinfo",
- 2024,
- update_every,
- RRDSET_TYPE_STACKED
- );
-
- m->rd_inodes_avail = rrddim_add(m->st_inodes, "avail", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
- m->rd_inodes_used = rrddim_add(m->st_inodes, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
- } else
- rrdset_next(m->st_inodes);
-
- rrddim_set_by_pointer(m->st_inodes, m->rd_inodes_avail, (collected_number) mntbuf[i].f_ffree);
- rrddim_set_by_pointer(m->st_inodes, m->rd_inodes_used, (collected_number) (mntbuf[i].f_files -
- mntbuf[i].f_ffree));
- rrdset_done(m->st_inodes);
-
- rendered++;
- }
-
- if (likely(rendered))
- m->collected++;
- }
- }
- } else {
- error("DISABLED: getmntinfo module");
- return 1;
- }
-
- mount_points_cleanup();
-
- return 0;
-}