On 12.05.2009 15:31, Henri Gomez wrote: > I see you take a similar approach :)
Yes, but based on your analysis. > Could you attach the patch file ? Attached. > 2009/5/12 Rainer Jung <rainer.j...@kippdata.de>: >> Hi Henri, >> >> can you try the below patch? It replaces the global pool by a function >> local one, which is OK, because the resolver calls are not in the >> performance critical path (mostly startup initialization and >> reconfiguration). >> >> Why do you think, is it possible, that multiple threads will enter >> jk_resolve() in parallel? >> >> Regards, >> >> Rainer >> >> Index: jk_connect.c >> =================================================================== >> --- jk_connect.c (revision 763986) >> +++ jk_connect.c (working copy) >> @@ -35,7 +35,6 @@ >> #include "apr_errno.h" >> #include "apr_general.h" >> #include "apr_pools.h" >> -static apr_pool_t *jk_apr_pool = NULL; >> #endif >> >> #ifdef HAVE_SYS_FILIO_H >> @@ -342,17 +341,16 @@ >> #ifdef HAVE_APR >> apr_sockaddr_t *remote_sa, *temp_sa; >> char *remote_ipaddr; >> + apr_pool_t *jk_apr_pool = NULL; >> >> - if (!jk_apr_pool) { >> - if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != >> APR_SUCCESS) { >> - JK_TRACE_EXIT(l); >> - return JK_FALSE; >> - } >> + if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != >> APR_SUCCESS) { >> + JK_TRACE_EXIT(l); >> + return JK_FALSE; >> } >> - apr_pool_clear(jk_apr_pool); >> if (apr_sockaddr_info_get >> (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, >> jk_apr_pool) >> != APR_SUCCESS) { >> + apr_pool_destroy(jk_apr_pool); >> JK_TRACE_EXIT(l); >> return JK_FALSE; >> } >> @@ -367,12 +365,17 @@ >> if (NULL != temp_sa) >> remote_sa = temp_sa; >> else { >> + apr_pool_destroy(jk_apr_pool); >> JK_TRACE_EXIT(l); >> return JK_FALSE; >> } >> >> apr_sockaddr_ip_get(&remote_ipaddr, remote_sa); >> >> + /* No more use of data allocated from the jk_apr_pool >> + * APR pool below this line */ >> + apr_pool_destroy(jk_apr_pool); >> + >> laddr.s_addr = jk_inet_addr(remote_ipaddr); >> >> #else /* HAVE_APR */ >> >> >> On 12.05.2009 13:04, Henri Gomez wrote: >>> FYI. >>> >>> If I comment the apr_pool_clear() call, I didn't get the initialisation >>> error >>> >>> 2009/5/12 Henri Gomez <henri.go...@gmail.com>: >>>> Hi to all, >>>> >>>> I rebuild the mod_jk 1.2.28 on our i5/OS and Apache instance failed. >>>> >>>> Here is the stack trace : >>>> >>>> 00000009:259448 Stack: Library / Program Module Stmt >>>> Procedure >>>> 00000009:259488 Stack: QSYS / QCMD 455 : >>>> 00000009:259520 Stack: QHTTPSVR / QZHBMAIN ZHBMAIN 0 : >>>> _CXX_PEP__Fv >>>> 00000009:259552 Stack: QHTTPSVR / QZHBMAIN ZHBMAIN 18 : >>>> main >>>> 00000009:259576 Stack: QHTTPSVR / QZHBMAIN ZHBMAIN 234 : >>>> BigSwitch__FiPPc >>>> 00000009:259608 Stack: QHTTPSVR / QZSRHTTP QZSRMAIN 0 : >>>> _CXX_PEP__Fv >>>> 00000009:259640 Stack: QHTTPSVR / QZSRHTTP QZSRMAIN 2 : >>>> main >>>> 00000009:267440 Stack: QHTTPSVR / QZSRCORE MAIN 868 : >>>> apache_main >>>> 00000009:287992 Stack: QHTTPSVR / QZSRCORE HTTP_CONFI 5 : >>>> ap_run_post_config >>>> 00000009:288288 Stack: QHTTPSVR / MOD_JK1228 MOD_JK 60 : >>>> jk_post_config >>>> 00000009:288320 Stack: QHTTPSVR / MOD_JK1228 MOD_JK 35 : >>>> init_jk >>>> 00000009:288688 Stack: QHTTPSVR / MOD_JK1228 JK_WORKER 34 : >>>> wc_open >>>> 00000009:288720 Stack: QHTTPSVR / MOD_JK1228 JK_WORKER 9 : >>>> build_worker_map >>>> 00000009:296848 Stack: QHTTPSVR / MOD_JK1228 JK_WORKER 28 : >>>> wc_create_worker >>>> 00000009:298192 Stack: QHTTPSVR / MOD_JK1228 JK_AJP13_W 5 : >>>> validate >>>> 00000009:298208 Stack: QHTTPSVR / MOD_JK1228 JK_AJP_COM 29 : >>>> ajp_validate >>>> 00000009:298216 Stack: QHTTPSVR / MOD_JK1228 JK_CONNECT 19 : >>>> jk_resolve >>>> 00000009:316840 Stack: QHTTPSVR / QZSRAPR APR_POOLS 13 : >>>> apr_pool_clear >>>> 00000009:316864 Stack: QHTTPSVR / QZSRAPR APR_POOLS 8 : >>>> allocator_free >>>> 00000009:316880 Stack: QHTTPSVR / QZSRCORE MAIN 18 : >>>> Main_Excp_Handler >>>> 00000009:316888 Stack: QHTTPSVR / QZSRAPR OS400TRACE 7 : >>>> apr_dstack_CCSID >>>> 00000009:326912 Stack: QSYS / QP0ZCPA QP0ZUDBG 3 : >>>> Qp0zDumpStack >>>> 00000009:346808 Stack: QSYS / QP0ZSCPA QP0ZSDBG 2 : >>>> Qp0zSUDumpStack >>>> 00000009:346824 Stack: QSYS / QP0ZSCPA QP0ZSDBG 12 : >>>> Qp0zSUDumpTargetStack >>>> 00000009:346824 Stack: Completed >>>> 00000009:407280 apr_dump_trace(): dump for job >>>> 678302/QTMHHTTP/DAPSERVER >>>> TRCTCPAPP Output >>>> >>>> The problem appears in jk_resolve just after apr_pool_create. >>>> >>>> What happen if 2 threads goes in jk_resolve at the same time ? >>>> >>>> if (!jk_apr_pool) { >>>> if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != >>>> APR_SUCCESS) { >>>> JK_TRACE_EXIT(l); >>>> return JK_FALSE; >>>> } >>>> } >>>> apr_pool_clear(jk_apr_pool); >>>> if (apr_sockaddr_info_get >>>> (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, >>>> jk_apr_pool) >>>> != APR_SUCCESS) { >>>> JK_TRACE_EXIT(l); >>>> return JK_FALSE; >>>> }
Index: jk_connect.c =================================================================== --- jk_connect.c (revision 763986) +++ jk_connect.c (working copy) @@ -35,7 +35,6 @@ #include "apr_errno.h" #include "apr_general.h" #include "apr_pools.h" -static apr_pool_t *jk_apr_pool = NULL; #endif #ifdef HAVE_SYS_FILIO_H @@ -342,17 +341,16 @@ #ifdef HAVE_APR apr_sockaddr_t *remote_sa, *temp_sa; char *remote_ipaddr; + apr_pool_t *jk_apr_pool = NULL; - if (!jk_apr_pool) { - if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != APR_SUCCESS) { - JK_TRACE_EXIT(l); - return JK_FALSE; - } + if (apr_pool_create(&jk_apr_pool, (apr_pool_t *)pool) != APR_SUCCESS) { + JK_TRACE_EXIT(l); + return JK_FALSE; } - apr_pool_clear(jk_apr_pool); if (apr_sockaddr_info_get (&remote_sa, host, APR_UNSPEC, (apr_port_t) port, 0, jk_apr_pool) != APR_SUCCESS) { + apr_pool_destroy(jk_apr_pool); JK_TRACE_EXIT(l); return JK_FALSE; } @@ -367,12 +365,17 @@ if (NULL != temp_sa) remote_sa = temp_sa; else { + apr_pool_destroy(jk_apr_pool); JK_TRACE_EXIT(l); return JK_FALSE; } apr_sockaddr_ip_get(&remote_ipaddr, remote_sa); + /* No more use of data allocated from the jk_apr_pool + * APR pool below this line */ + apr_pool_destroy(jk_apr_pool); + laddr.s_addr = jk_inet_addr(remote_ipaddr); #else /* HAVE_APR */
--------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org