----- Original Message ----- > From: "jchaloup" <jchal...@redhat.com> > To: libcg-devel@lists.sourceforge.net > Cc: jchal...@redhat.com, varek...@redhat.com > Sent: Wednesday, May 28, 2014 1:02:00 PM > Subject: [PATCH 1/4] config.c: loading templates from multiple files into one > template table > > This patch implements loading files from /etc/cgconfig.d/. It uses already > implemented functions. To hold list of files to be read for template > reloading, new static variable for this list (list of template files) has > been added to config.c. It is the same list as file list read with > cgconfigparser (cgconfig.c file), i.e. the same functions are called. > Because parser reads only one file, it is called for each file in template > file list. Thus initialization, resp. template duplication has to be called > before, resp. after each file parsing. Thus new functions has been > presented, thus modifying config.[h|c] api and libcgroup.map. Again parsing > more files for templates is analogy to parsing files for groups in > cgconfig.c. > > cgroup_load_cached_templates_from_file is a modification of > cgroup_reload_cached_templates and cgroup_init_templates_cache. Only for > loop and auxiliary variables added. > > Changelog: > if only CGCONFIG_CONF_FILE is used, > cgroup_[init|reload]_templates_cache are > used for back compatibility > file_index parameter description added for > cgroup_load_templates_cache_from_files > preceeded -> preceded type corrected > template_table_index variable value changed after succesfull realloc > -ECGOTHER is a negative number (see function description ...: function > description corrected > cgroup_[init|reload]_templates_cache_from_files functions removed, only > cgroup_load_templates_cache_from_files functions left > all macro definitions for string replaced by multiple cgroup_dbg call > missing *file_index set before return > > Signed-off-by: Jan Chaloupka <jchal...@redhat.com> > --- > include/libcgroup/config.h | 21 +++++ > src/config.c | 177 > +++++++++++++++++++++++++++++++++++++++++++- > src/libcgroup.map | 5 + > 3 files changed, 200 insertions(+), 3 deletions(-) > > diff --git a/include/libcgroup/config.h b/include/libcgroup/config.h > index 43568e1..9972e64 100644 > --- a/include/libcgroup/config.h > +++ b/include/libcgroup/config.h > @@ -84,11 +84,32 @@ int cgroup_init_templates_cache(char *pathname); > int cgroup_reload_cached_templates(char *pathname); > > /** > + * Load the templates cache from files. Before calling this function, > + * cgroup_templates_cache_set_source_files has to be called first. > + * @param file_index index of file which was unable to be parsed > + * @return 0 on success, > 0 on error > + */ > +int cgroup_load_templates_cache_from_files(int *file_index); > + > +/** > + * Setting source files of templates. This function has to be called before > + * any call of cgroup_load_templates_cache_from_files. > + * @param tmpl_files > + */ > +struct cgroup_string_list; > +void cgroup_templates_cache_set_source_files( > + struct cgroup_string_list *tmpl_files); > + > +/** > * Physically create a new control group in kernel, based on given control > * group template and configuration file. If given template is not set in > * configuration file, then the procedure works create the control group > * using cgroup_create_cgroup() function > * > + * Templates are loaded using > cgroup_[init|reload]_templates_cache_from_files please update the content here as well > + * function, which must be preceded by > cgroup_templates_cache_set_source_files > + * call. > + * > * The flags can alter the behavior of this function: > * CGFLAG_USE_TEMPLATE_CACHE: Use cached templates instead of > * parsing the config file > diff --git a/src/config.c b/src/config.c > index da2c0dd..2f250e4 100644 > --- a/src/config.c > +++ b/src/config.c > @@ -41,6 +41,8 @@ > #include <sys/stat.h> > #include <sys/types.h> > > +#include "tools/tools-common.h" > + > unsigned int MAX_CGROUPS = 64; /* NOTE: This value changes dynamically > */ > unsigned int MAX_TEMPLATES = 64; > /* NOTE: This value changes dynamically */ > @@ -89,6 +91,7 @@ static int config_template_table_index; > */ > static struct cgroup *template_table; > static int template_table_index; > +static struct cgroup_string_list *template_files; > > > /* > @@ -96,6 +99,9 @@ static int template_table_index; > */ > #define CGROUP_FILESYSTEM "cgroup" > > +#define TEMPLATE_ACTION_INIT 0 > +#define TEMPLATE_ACTION_RELOAD 1 > + what does this variables mean - they are not used > /* > * NOTE: All these functions return 1 on success > * and not 0 as is the library convention > @@ -1572,6 +1578,168 @@ int cgroup_init_templates_cache(char *pathname) > > } > > +/** > + * Setting source files of templates. This function has to be called before > + * any call of cgroup_load_templates_cache_from_files. > + * @param tmpl_files > + */ > +void cgroup_templates_cache_set_source_files( > + struct cgroup_string_list *tmpl_files) > +{ > + template_files = tmpl_files; > +} > + > +/** > + * Appending cgroup templates parsed by parser to template_table > + * @param offset number of templates already in the table > + */ > +int cgroup_add_cgroup_templates(int offset) > +{ > + int i, ti, ret; > + > + for (i = 0; i < config_template_table_index; i++) { > + ti = i + offset; > + ret = cgroup_copy_cgroup(&template_table[ti], > + &config_template_table[i]); > + if (ret) > + return ret; > + > + strcpy((template_table[ti]).name, > + (config_template_table[i]).name); > + template_table[ti].tasks_uid = > + config_template_table[i].tasks_uid; > + template_table[ti].tasks_gid = > + config_template_table[i].tasks_gid; > + template_table[ti].task_fperm = > + config_template_table[i].task_fperm; > + template_table[ti].control_uid = > + config_template_table[i].control_uid; > + template_table[ti].control_gid = > + config_template_table[i].control_gid; > + template_table[ti].control_fperm = > + config_template_table[i].control_fperm; > + template_table[ti].control_dperm = > + config_template_table[i].control_dperm; > + } > + > + return 0; > +} > + > +/** > + * Expand template table based on new number of parsed templates, i.e. > + * on value of config_template_table_index. > + * Change value of template_table_index. > + * @return 0 on success, < 0 on error > + */ > +int cgroup_expand_template_table(void) > +{ > + int i; > + > + template_table = realloc(template_table, > + (template_table_index + config_template_table_index) > + *sizeof(struct cgroup)); > + > + if (template_table == NULL) > + return -ECGOTHER; > + > + for (i = 0; i < config_template_table_index; i++) > + template_table[i + template_table_index].index = 0; > + > + template_table_index += config_template_table_index; > + > + return 0; > +} > + > +/** > + * Load the templates cache from files. Before calling this function, > + * cgroup_templates_cache_set_source_files has to be called first. > + * @param file_index index of file which was unable to be parsed > + * @return 0 on success, > 0 on error > + */ > +int cgroup_load_templates_cache_from_files(int *file_index) > +{ > + int ret; > + int i, j; > + int template_table_last_index; > + char *pathname; > + > + if (!template_files) { > + /* source files has not been set */ > + cgroup_dbg("Template source files have not been set\n"); > + ret = ECGOTHER; > + *file_index = -1; > + return ret; > + } > + because of cgroup_config_create_template_group and backward copatibility: here should be some test whether file list was set,. if it is not set plase add cconfig.conf there > + /* Back compatibility with old cgroup copy function */ > + if (template_files->count == 1 && > + strcmp(template_files->items[0], CGCONFIG_CONF_FILE) == 0) { > + > + if (template_table_index == 0) > + /* the rules cache is empty */ > + return cgroup_init_templates_cache( > + CGCONFIG_CONF_FILE); > + else > + /* cache is not empty */ > + return cgroup_reload_cached_templates( > + CGCONFIG_CONF_FILE); > + } > + > + if (template_table) { > + /* template structures have to be free */ > + for (i = 0; i < template_table_index; i++) > + cgroup_free_controllers(&template_table[i]); > + free(template_table); > + template_table = NULL; > + } > + template_table_index = 0; > + > + if ((config_template_table_index != 0) || (config_table_index != 0)) { > + /* config structures have to be clean before parsing */ > + cgroup_free_config(); > + } > + > + for (j = 0; j < template_files->count; j++) { > + pathname = template_files->items[j]; > + > + cgroup_dbg("Parsing templates from %s.\n", pathname); > + /* Attempt to read the configuration file > + * and cache the rules. */ > + ret = cgroup_parse_config(pathname); > + if (ret) { > + cgroup_dbg("Could not initialize rule cache, "); > + cgroup_dbg("error was: %d\n", ret); > + *file_index = j; > + return ret; > + } > + > + if (config_template_table_index > 0) { > + template_table_last_index = template_table_index; > + ret = cgroup_expand_template_table(); > + if (ret) { > + cgroup_dbg("Could not expand template table, "); > + cgroup_dbg("error was: %d\n", -ret); > + *file_index = j; > + return -ret; > + } > + > + /* copy template data to templates cache structures */ > + cgroup_dbg("Copying templates to template table "); > + cgroup_dbg("from %s.\n", pathname); > + ret = cgroup_add_cgroup_templates( > + template_table_last_index); > + if (ret) { > + cgroup_dbg("Unable to copy cgroup\n"); > + *file_index = j; > + return ret; > + } > + cgroup_dbg("Templates to template table copied\n"); > + } > + } > + > + return 0; > +} > + > /* > * Create a given cgroup, based on template configuration if it is present > * if the template is not present cgroup is creted using > cgroup_create_cgroup > @@ -1593,13 +1761,16 @@ int cgroup_config_create_template_group(struct cgroup > *cgroup, > * use CGCONFIG_CONF_FILE by default > */ > if (!(flags & CGFLAG_USE_TEMPLATE_CACHE)) { > + int fileindex; > if (template_table_index == 0) > /* the rules cache is empty */ > - ret = cgroup_init_templates_cache(CGCONFIG_CONF_FILE); > + ret = cgroup_load_templates_cache_from_files( > + &fileindex); > + > else > /* cache is not empty */ > - ret = cgroup_reload_cached_templates( > - CGCONFIG_CONF_FILE); > + ret = cgroup_load_templates_cache_from_files( > + &fileindex); > if (ret != 0) { > cgroup_dbg("Failed initialize templates cache.\n"); it should be useful to show which file was broken here (can that be done using fileindex?) > return ret; > diff --git a/src/libcgroup.map b/src/libcgroup.map > index b0c162c..f8b0fb9 100644 > --- a/src/libcgroup.map > +++ b/src/libcgroup.map > @@ -117,3 +117,8 @@ CGROUP_0.39 { > cgroup_log; > cgroup_parse_log_level_str; > } CGROUP_0.38; > + > +CGROUP_0.40 { > + cgroup_templates_cache_set_source_files; > + cgroup_load_templates_cache_from_files; > +} CGROUP_0.39; > >
------------------------------------------------------------------------------ HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions Find What Matters Most in Your Big Data with HPCC Systems Open Source. Fast. Scalable. Simple. Ideal for Dirty Data. Leverages Graph Analysis for Fast Processing & Easy Data Exploration http://p.sf.net/sfu/hpccsystems _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel