diff options
author | Ilya Mashchenko <ilya@netdata.cloud> | 2020-12-14 17:27:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-14 17:27:55 +0300 |
commit | 0f8175dd3060691394e263cdab01c8f940b1b5d3 (patch) | |
tree | 4b14cd6b7e6ba7797eeec4c74b4c4c35cdad4494 /libnetdata | |
parent | 7bfa8c8eba72a109d940b1fa5c7acaed9cd7a52c (diff) |
Kubernetes labels (#10107)
Co-authored-by: Markos Fountoulakis <markos.fountoulakis.senior@gmail.com>
Co-authored-by: Vladimir Kobal <vlad@prokk.net>
Diffstat (limited to 'libnetdata')
-rw-r--r-- | libnetdata/avl/avl.c | 16 | ||||
-rw-r--r-- | libnetdata/avl/avl.h | 3 | ||||
-rw-r--r-- | libnetdata/config/appconfig.c | 43 | ||||
-rw-r--r-- | libnetdata/config/appconfig.h | 2 |
4 files changed, 64 insertions, 0 deletions
diff --git a/libnetdata/avl/avl.c b/libnetdata/avl/avl.c index 15293740d4..5219851896 100644 --- a/libnetdata/avl/avl.c +++ b/libnetdata/avl/avl.c @@ -367,6 +367,22 @@ void avl_init_lock(avl_tree_lock *tree, int (*compar)(void * /*a*/, void * /*b*/ #endif /* AVL_WITHOUT_PTHREADS */ } +void avl_destroy_lock(avl_tree_lock *tree) { +#ifndef AVL_WITHOUT_PTHREADS + int lock; + +#ifdef AVL_LOCK_WITH_MUTEX + lock = pthread_mutex_destroy(&tree->mutex); +#else + lock = pthread_rwlock_destroy(&tree->rwlock); +#endif + + if(lock != 0) + fatal("Failed to destroy AVL mutex/rwlock, error: %d", lock); + +#endif /* AVL_WITHOUT_PTHREADS */ +} + avl *avl_search_lock(avl_tree_lock *tree, avl *item) { avl_read_lock(tree); avl *ret = avl_search(&tree->avl_tree, item); diff --git a/libnetdata/avl/avl.h b/libnetdata/avl/avl.h index a3e0f65667..32e3f27a8b 100644 --- a/libnetdata/avl/avl.h +++ b/libnetdata/avl/avl.h @@ -82,6 +82,9 @@ avl *avl_search(avl_tree_type *tree, avl *item); void avl_init_lock(avl_tree_lock *tree, int (*compar)(void *a, void *b)); void avl_init(avl_tree_type *tree, int (*compar)(void *a, void *b)); +/* Destroy the avl_tree_lock locks + */ +void avl_destroy_lock(avl_tree_lock *tree); int avl_traverse_lock(avl_tree_lock *tree, int (*callback)(void *entry, void *data), void *data); int avl_traverse(avl_tree_type *tree, int (*callback)(void *entry, void *data), void *data); diff --git a/libnetdata/config/appconfig.c b/libnetdata/config/appconfig.c index 70f9e4cda5..d9dcde71a5 100644 --- a/libnetdata/config/appconfig.c +++ b/libnetdata/config/appconfig.c @@ -189,6 +189,49 @@ static inline struct section *appconfig_section_create(struct config *root, cons return co; } +void appconfig_section_destroy_non_loaded(struct config *root, const char *section) +{ + struct section *co; + struct config_option *cv, *cv_next; + + debug(D_CONFIG, "Destroying section '%s'.", section); + + co = appconfig_section_find(root, section); + if(!co) { + error("Could not destroy section '%s'. Not found.", section); + return; + } + + config_section_wrlock(co); + for(cv = co->values; cv ; cv = cv->next) { + if (cv->flags & CONFIG_VALUE_LOADED) { + /* Do not destroy values that were loaded from the configuration files. */ + config_section_unlock(co); + return; + } + } + for(cv = co->values ; cv ; cv = cv_next) { + cv_next = cv->next; + if(unlikely(!appconfig_option_index_del(co, cv))) + error("Cannot remove config option '%s' from section '%s'.", cv->name, co->name); + freez(cv->value); + freez(cv->name); + freez(cv); + } + co->values = NULL; + config_section_unlock(co); + + if (unlikely(!appconfig_index_del(root, co))) { + error("Cannot remove section '%s' from config.", section); + return; + } + + avl_destroy_lock(&co->values_index); + freez(co->name); + pthread_mutex_destroy(&co->mutex); + freez(co); +} + // ---------------------------------------------------------------------------- // config name-value methods diff --git a/libnetdata/config/appconfig.h b/libnetdata/config/appconfig.h index df4adb41f1..9d02e4ada6 100644 --- a/libnetdata/config/appconfig.h +++ b/libnetdata/config/appconfig.h @@ -182,6 +182,8 @@ extern void appconfig_generate(struct config *root, BUFFER *wb, int only_changed extern int appconfig_section_compare(void *a, void *b); +extern void appconfig_section_destroy_non_loaded(struct config *root, const char *section); + extern int config_parse_duration(const char* string, int* result); extern struct section *appconfig_get_section(struct config *root, const char *name); |