problem with shared memory and directives for httpd
Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it #include httpd.h #include http_protocol.h #include http_config.h #include http_log.h #include sys/stat.h #include apr_shm.h typedef struct { apr_size_t counter; /* my counter */ } kcache_config_stat; typedef struct { int enabled; apr_shm_t *counters_shm; /* the APR shared segment object*/ kcache_config_stat *s;/*my stats*/ } kcache_config; void *create_server_conf(apr_pool_t *p, server_rec *s); static void register_hooks(apr_pool_t *pool); const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg); static const command_rec kcache_directives[] = { AP_INIT_TAKE1(KcacheEnabled, kcache_set_enabled, NULL, RSRC_CONF, KcacheEnabled must have Off or On value), { NULL } }; module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF, NULL, NULL, create_server_conf, NULL, kcache_directives, register_hooks }; /* * creating the server cfg */ void *create_server_conf(apr_pool_t *pool, server_rec *s) { kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config)); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,kcache:create_server_conf creo la configurazione); return cfg; } ; const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg) { /*~~~*/ kcache_config *conf = (kcache_config *) ap_get_module_config( cmd-server-module_config, kcache_module); /*~~~*/ if (conf) { if (!strcasecmp(arg, on)) conf-enabled = 1; else conf-enabled = 0; } return NULL; } /* * init child */ static void kcache_child_init(apr_pool_t *p, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,kcache:kcache_child_init imposto l'indirizzo della shared memory); kcache_config *scfg = ap_get_module_config(s-module_config, kcache_module); scfg-s = apr_shm_baseaddr_get(scfg-counters_shm); } /* * create the shm */ static int kcache_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,kcache:kcache_post_config creo la shared memory); kcache_config *scfg = ap_get_module_config(s-module_config, kcache_module); apr_shm_create(scfg-counters_shm, sizeof(*scfg-s), NULL, pconf); scfg-s = apr_shm_baseaddr_get(scfg-counters_shm); scfg-s-counter = 0; return DECLINED; } static int kcache_handler_translate_files(request_rec* r) { /*~~*/ kcache_config *config = (kcache_config *) ap_get_module_config( r-server-module_config, kcache_module); /*~~*/ if (!config-s) { ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, kcache_return_result invalid config-s); return DECLINED; } config-s-counter++; ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, config-s-counter=%APR_SIZE_T_FMT,config-s-counter); return DECLINED; } static void register_hooks(apr_pool_t* pool) { static const char *succ[] = { mod_proxy.c, mod_alias.c, mod_userdir.c, NULL }; ap_hook_child_init(kcache_child_init, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_post_config(kcache_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); ap_hook_translate_name(kcache_handler_translate_files, NULL, succ, APR_HOOK_REALLY_FIRST); }
RE: problem with shared memory and directives for httpd
You have no merge function defined for your server-level config structure (kcache_config). I would definitely try implementing that function. Otherwise, when apache goes to combine two levels of the config hierarchy together, the resulting combination is likely to just be an empty version of kcache_config, which sounds like it could be causing your problem. -Eric From: nik600 [mailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 10:05 AM To: modules-dev@httpd.apache.org Subject: problem with shared memory and directives for httpd Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it
Re: problem with shared memory and directives for httpd
Hi thanks for your reply. i've tried also with a merging function but i have the same behaviour. Attached the same example with also merge function. Maybe i'm doing something wrong in my merge function? 2014-12-04 16:33 GMT+01:00 Eric Johanson er...@valmarc.com: You have no merge function defined for your server-level config structure (kcache_config). I would definitely try implementing that function. Otherwise, when apache goes to combine two levels of the config hierarchy together, the resulting combination is likely to just be an empty version of kcache_config, which sounds like it could be causing your problem. -Eric From: nik600 [mailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 10:05 AM To: modules-dev@httpd.apache.org Subject: problem with shared memory and directives for httpd Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it #include httpd.h #include http_protocol.h #include http_config.h #include http_log.h #include sys/stat.h #include apr_shm.h typedef struct { apr_size_t counter; /* my counter */ } kcache_config_stat; typedef struct { int enabled; apr_shm_t *counters_shm; /* the APR shared segment object*/ kcache_config_stat *s;/*my stats*/ } kcache_config; void* merge_conf(apr_pool_t* pool, void* BASE, void* ADD); void *create_dir_conf(apr_pool_t *pool, char *context); void *create_server_conf(apr_pool_t *p, server_rec *s); static void register_hooks(apr_pool_t *pool); const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg); static const command_rec kcache_directives[] = { AP_INIT_TAKE1(KcacheEnabled, kcache_set_enabled, NULL, RSRC_CONF, KcacheEnabled must have Off or On value), { NULL } }; module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF, create_dir_conf, merge_conf, create_server_conf, merge_conf, kcache_directives, register_hooks }; void* merge_conf(apr_pool_t* pool, void* BASE, void* ADD) { kcache_config* base = (kcache_config *) BASE ; /* This is what was set in the parent context */ kcache_config* add = (kcache_config *) ADD ; /* This is what is set in the new context */ kcache_config* conf = (kcache_config *) create_server_conf(pool, NULL); /* This will be the merged configuration */ /* Merge configurations */ conf-enabled = ( add-enabled == 0 ) ? base-enabled : add-enabled ; conf-s=base-s; conf-counters_shm=base-counters_shm; return conf ; } void *create_dir_conf(apr_pool_t *pool, char *context) { kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config)); return cfg; } /* * creating the server cfg */ void *create_server_conf(apr_pool_t *pool, server_rec *s) { kcache_config *cfg = apr_pcalloc(pool, sizeof(kcache_config)); if(s!=NULL){ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,kcache:create_server_conf creo la configurazione); } return cfg; } ; const char *kcache_set_enabled(cmd_parms *cmd, void *cfg, const char *arg) { /*~~~*/ kcache_config *conf = (kcache_config *) ap_get_module_config( cmd-server-module_config, kcache_module); /*~~~*/ if (conf) { if (!strcasecmp(arg, on)) conf-enabled = 1; else conf-enabled = 0; } return NULL; } /* * init child */ static void kcache_child_init(apr_pool_t *p, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,kcache:kcache_child_init imposto l'indirizzo della shared memory); kcache_config *scfg = ap_get_module_config(s-module_config, kcache_module); scfg-s = apr_shm_baseaddr_get(scfg-counters_shm); } /* * create the shm */ static int kcache_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
RE: problem with shared memory and directives for httpd
Okay but why are you managing the kcache_config structure with both the per-directory AND the server-level functions? You should decide if your kcache_config is server-wide or if it is per-directory, and use only the appropriate functions. -Eric From: nik600 [mailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 11:15 AM To: modules-dev@httpd.apache.org Subject: Re: problem with shared memory and directives for httpd Hi thanks for your reply. i've tried also with a merging function but i have the same behaviour. Attached the same example with also merge function. Maybe i'm doing something wrong in my merge function? 2014-12-04 16:33 GMT+01:00 Eric Johanson er...@valmarc.commailto:er...@valmarc.com: You have no merge function defined for your server-level config structure (kcache_config). I would definitely try implementing that function. Otherwise, when apache goes to combine two levels of the config hierarchy together, the resulting combination is likely to just be an empty version of kcache_config, which sounds like it could be causing your problem. -Eric From: nik600 [mailto:nik...@gmail.commailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 10:05 AM To: modules-dev@httpd.apache.orgmailto:modules-dev@httpd.apache.org Subject: problem with shared memory and directives for httpd Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it
Re: problem with shared memory and directives for httpd
because i've tried with both or with only one. IE, if i use: module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF,NULL , NULL, create_server_conf, merge_conf, kcache_directives, register_hooks }; i have the same behaviour 2014-12-04 17:32 GMT+01:00 Eric Johanson er...@valmarc.com: Okay but why are you managing the kcache_config structure with both the per-directory AND the server-level functions? You should decide if your kcache_config is server-wide or if it is per-directory, and use only the appropriate functions. -Eric From: nik600 [mailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 11:15 AM To: modules-dev@httpd.apache.org Subject: Re: problem with shared memory and directives for httpd Hi thanks for your reply. i've tried also with a merging function but i have the same behaviour. Attached the same example with also merge function. Maybe i'm doing something wrong in my merge function? 2014-12-04 16:33 GMT+01:00 Eric Johanson er...@valmarc.commailto: er...@valmarc.com: You have no merge function defined for your server-level config structure (kcache_config). I would definitely try implementing that function. Otherwise, when apache goes to combine two levels of the config hierarchy together, the resulting combination is likely to just be an empty version of kcache_config, which sounds like it could be causing your problem. -Eric From: nik600 [mailto:nik...@gmail.commailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 10:05 AM To: modules-dev@httpd.apache.orgmailto:modules-dev@httpd.apache.org Subject: problem with shared memory and directives for httpd Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it
Re: problem with shared memory and directives for httpd
Hi, to not depend on where you declare : IfModule mod_kcache.c KcacheEnabled On /IfModule you need to iterate over the server_rec list in post_config and child_init hooks. Please see attached modifications (where only a server_config is used). Regards, Yann. On Thu, Dec 4, 2014 at 5:46 PM, nik600 nik...@gmail.com wrote: because i've tried with both or with only one. IE, if i use: module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF,NULL , NULL, create_server_conf, merge_conf, kcache_directives, register_hooks }; i have the same behaviour 2014-12-04 17:32 GMT+01:00 Eric Johanson er...@valmarc.com: Okay but why are you managing the kcache_config structure with both the per-directory AND the server-level functions? You should decide if your kcache_config is server-wide or if it is per-directory, and use only the appropriate functions. -Eric From: nik600 [mailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 11:15 AM To: modules-dev@httpd.apache.org Subject: Re: problem with shared memory and directives for httpd Hi thanks for your reply. i've tried also with a merging function but i have the same behaviour. Attached the same example with also merge function. Maybe i'm doing something wrong in my merge function? 2014-12-04 16:33 GMT+01:00 Eric Johanson er...@valmarc.commailto: er...@valmarc.com: You have no merge function defined for your server-level config structure (kcache_config). I would definitely try implementing that function. Otherwise, when apache goes to combine two levels of the config hierarchy together, the resulting combination is likely to just be an empty version of kcache_config, which sounds like it could be causing your problem. -Eric From: nik600 [mailto:nik...@gmail.commailto:nik...@gmail.com] Sent: Thursday, December 04, 2014 10:05 AM To: modules-dev@httpd.apache.orgmailto:modules-dev@httpd.apache.org Subject: problem with shared memory and directives for httpd Dear all i'm experiencing a problem with shared memory and i'm not able to figure it out. i've got a segment of shared memory in my module config and seen that if set some settings for the module in my configuration this memory isn't available in the request process. i've also attached an example (very simplified and without any mutex, just to show the case). i've noticed that if i have in my server configuration: IfModule mod_kcache.c KcacheEnabled On /IfModule The memory segment is not availabe: [Thu Dec 04 15:26:15 2014] [crit] [client 127.0.0.1] kcache_return_result invalid config-s But if i comment this directive: IfModule mod_kcache.c # KcacheEnabled On /IfModule The memory segment is available and gets updated: [Thu Dec 04 15:24:47 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=68 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=69 [Thu Dec 04 15:24:48 2014] [debug] src/mod_kcache.c(96): [client 127.0.0.1] config-s-counter=70 ... i've attached the full example (100 lines of code) I'll appreciate any help, thank all in advance -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it --- mod_kcache.c2014-12-04 22:39:18.356881323 +0100 +++ mod_kcache.new.c2014-12-04 22:49:16.804640988 +0100 @@ -10,7 +10,7 @@ typedef struct { } kcache_config_stat; typedef struct { - int enabled; + int enabled, enabled_set; apr_shm_t *counters_shm; /* the APR shared segment object*/ kcache_config_stat *s;/*my stats*/ } kcache_config; @@ -27,8 +27,15 @@ static const command_rec kcache_directiv kcache_set_enabled, NULL, RSRC_CONF, KcacheEnabled must have Off or On value), { NULL } }; -module AP_MODULE_DECLARE_DATA kcache_module = { STANDARD20_MODULE_STUFF, create_dir_conf, - merge_conf, create_server_conf, merge_conf, kcache_directives, register_hooks }; +module AP_MODULE_DECLARE_DATA kcache_module = { +STANDARD20_MODULE_STUFF, +NULL, /* no create_dir_conf */ +NULL, /* no merge_dir_conf */ +create_server_conf, +merge_conf, +kcache_directives, +register_hooks +}; void* merge_conf(apr_pool_t* pool, void* BASE, void* ADD) { kcache_config* base = (kcache_config *) BASE ; /* This is what was set in the parent context */ @@ -36,26 +43,18 @@ void* merge_conf(apr_pool_t* pool, void* kcache_config* conf = (kcache_config *) create_server_conf(pool, NULL); /* This will be the merged configuration */ /* Merge configurations */ -conf-enabled = ( add-enabled == 0 ) ? base-enabled : add-enabled ; -conf-s=base-s; -conf-counters_shm=base-counters_shm; +conf-enabled = ( add-enabled_set ) ? add-enabled : base-enabled; return conf ; } -void *create_dir_conf(apr_pool_t *pool, char
Re: problem with shared memory and directives for httpd
On Thu, Dec 4, 2014 at 10:52 PM, Yann Ylavic ylavic@gmail.com wrote: Please see attached modifications (where only a server_config is used). Note that I did not even test compile the chages, just a POC...
Re: problem with shared memory and directives for httpd
yes, now it works, thanks again! 2014-12-04 23:49 GMT+01:00 nik600 nik...@gmail.com: Thanks a lot! i've understand the logic... i'll try and let you know! 2014-12-04 23:43 GMT+01:00 Yann Ylavic ylavic@gmail.com: On Thu, Dec 4, 2014 at 10:52 PM, Yann Ylavic ylavic@gmail.com wrote: Please see attached modifications (where only a server_config is used). Note that I did not even test compile the chages, just a POC... -- /*/ nik600 http://www.kumbe.it -- /*/ nik600 http://www.kumbe.it