From 22763cc211c7b825a9e8dd141661031dec3250cd Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Sat, 1 May 2010 16:14:48 +0200 Subject: [PATCH] df plugin: Make the "ReportReserved" behavior the default behavior. The "v5upgrade" target has been updated, too. --- src/df.c | 81 +++++++++++------------------------------- src/target_v5upgrade.c | 53 +++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 63 deletions(-) diff --git a/src/df.c b/src/df.c index 9185ba44..61d0c28c 100644 --- a/src/df.c +++ b/src/df.c @@ -61,7 +61,6 @@ static ignorelist_t *il_mountpoint = NULL; static ignorelist_t *il_fstype = NULL; static _Bool by_device = false; -static _Bool report_reserved = false; static _Bool report_inodes = false; static int df_init (void) @@ -123,11 +122,7 @@ static int df_config (const char *key, const char *value) } else if (strcasecmp (key, "ReportReserved") == 0) { - if (IS_TRUE (value)) - report_reserved = true; - else - report_reserved = false; - + /* Nop for backwards compatibility. */ return (0); } else if (strcasecmp (key, "ReportInodes") == 0) @@ -144,28 +139,6 @@ static int df_config (const char *key, const char *value) return (-1); } -static void df_submit_two (char *df_name, - const char *type, - gauge_t df_used, - gauge_t df_free) -{ - value_t values[2]; - value_list_t vl = VALUE_LIST_INIT; - - values[0].gauge = df_used; - values[1].gauge = df_free; - - vl.values = values; - vl.values_len = 2; - sstrncpy (vl.host, hostname_g, sizeof (vl.host)); - sstrncpy (vl.plugin, "df", sizeof (vl.plugin)); - sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance)); - sstrncpy (vl.type, type, sizeof (vl.type)); - sstrncpy (vl.type_instance, df_name, sizeof (vl.type_instance)); - - plugin_dispatch_values (&vl); -} /* void df_submit_two */ - __attribute__ ((nonnull(2))) static void df_submit_one (char *plugin_instance, const char *type, const char *type_instance, @@ -210,6 +183,9 @@ static int df_read (void) { unsigned long long blocksize; char disk_name[256]; + uint64_t blk_free; + uint64_t blk_reserved; + uint64_t blk_used; if (ignorelist_match (il_device, (mnt_ptr->spec_device != NULL) @@ -268,39 +244,22 @@ static int df_read (void) blocksize = BLOCKSIZE(statbuf); - if (report_reserved) - { - uint64_t blk_free; - uint64_t blk_reserved; - uint64_t blk_used; - - /* Sanity-check for the values in the struct */ - if (statbuf.f_bfree < statbuf.f_bavail) - statbuf.f_bfree = statbuf.f_bavail; - if (statbuf.f_blocks < statbuf.f_bfree) - statbuf.f_blocks = statbuf.f_bfree; - - blk_free = (uint64_t) statbuf.f_bavail; - blk_reserved = (uint64_t) (statbuf.f_bfree - statbuf.f_bavail); - blk_used = (uint64_t) (statbuf.f_blocks - statbuf.f_bfree); - - df_submit_one (disk_name, "df_complex", "free", - (gauge_t) (blk_free * blocksize)); - df_submit_one (disk_name, "df_complex", "reserved", - (gauge_t) (blk_reserved * blocksize)); - df_submit_one (disk_name, "df_complex", "used", - (gauge_t) (blk_used * blocksize)); - } - else /* compatibility code */ - { - gauge_t df_free; - gauge_t df_used; - - df_free = statbuf.f_bfree * blocksize; - df_used = (statbuf.f_blocks - statbuf.f_bfree) * blocksize; - - df_submit_two (disk_name, "df", df_used, df_free); - } + /* Sanity-check for the values in the struct */ + if (statbuf.f_bfree < statbuf.f_bavail) + statbuf.f_bfree = statbuf.f_bavail; + if (statbuf.f_blocks < statbuf.f_bfree) + statbuf.f_blocks = statbuf.f_bfree; + + blk_free = (uint64_t) statbuf.f_bavail; + blk_reserved = (uint64_t) (statbuf.f_bfree - statbuf.f_bavail); + blk_used = (uint64_t) (statbuf.f_blocks - statbuf.f_bfree); + + df_submit_one (disk_name, "df_complex", "free", + (gauge_t) (blk_free * blocksize)); + df_submit_one (disk_name, "df_complex", "reserved", + (gauge_t) (blk_reserved * blocksize)); + df_submit_one (disk_name, "df_complex", "used", + (gauge_t) (blk_used * blocksize)); /* inode handling */ if (report_inodes) diff --git a/src/target_v5upgrade.c b/src/target_v5upgrade.c index 9ae84b92..e7f05998 100644 --- a/src/target_v5upgrade.c +++ b/src/target_v5upgrade.c @@ -37,6 +37,52 @@ static void v5_swap_instances (value_list_t *vl) /* {{{ */ memcpy (vl->type_instance, tmp, sizeof (tmp)); } /* }}} void v5_swap_instances */ +/* + * Df type + * + * By default, the "df" plugin of version 4.* uses the "df" type and puts the + * mount point in the type instance. Detect this behavior and convert the type + * to "df_complex". This can be selected in versions 4.9 and 4.10 by setting + * the "ReportReserved" option of the "df" plugin. + */ +static int v5_df (const data_set_t *ds, value_list_t *vl) /* {{{ */ +{ + value_list_t new_vl; + value_t new_value; + + /* Can't upgrade if both instances have been set. */ + if ((vl->plugin_instance[0] != 0) + && (vl->type_instance[0] != 0)) + return (FC_TARGET_CONTINUE); + + /* Copy everything: Time, interval, host, ... */ + memcpy (&new_vl, vl, sizeof (new_vl)); + + /* Reset data we can't simply copy */ + new_vl.values = &new_value; + new_vl.values_len = 1; + new_vl.meta = NULL; + + /* Move the mount point name to the plugin instance */ + if (new_vl.plugin_instance[0] == 0) + v5_swap_instances (&new_vl); + + /* Change the type to "df_complex" */ + memcpy (new_vl.type, "df_complex", sizeof (new_vl.type)); + + /* Dispatch two new value lists instead of this one */ + new_vl.values[0].gauge = vl->values[0].gauge; + memcpy (new_vl.type_instance, "used", sizeof (new_vl.type_instance)); + plugin_dispatch_values (&new_vl); + + new_vl.values[0].gauge = vl->values[1].gauge; + memcpy (new_vl.type_instance, "free", sizeof (new_vl.type_instance)); + plugin_dispatch_values (&new_vl); + + /* Abort processing */ + return (FC_TARGET_STOP); +} /* }}} int v5_df */ + /* * Interface plugin * @@ -65,12 +111,15 @@ static int v5_create (const oconfig_item_t *ci, void **user_data) /* {{{ */ } /* }}} int v5_create */ static int v5_invoke (const data_set_t *ds, value_list_t *vl, /* {{{ */ - notification_meta_t __attribute__((unused)) **meta, void **user_data) + notification_meta_t __attribute__((unused)) **meta, + void __attribute__((unused)) **user_data) { if ((ds == NULL) || (vl == NULL) || (user_data == NULL)) return (-EINVAL); - if (strcmp ("interface", vl->plugin) == 0) + if (strcmp ("df", vl->type) == 0) + return (v5_df (ds, vl)); + else if (strcmp ("interface", vl->plugin) == 0) return (v5_interface (ds, vl)); return (FC_TARGET_CONTINUE); -- 2.30.2