Ben Wyckoff wrote:
Thanks for the response Dumindu. I added the issue to Jira, and I'm moving
the discussion to the dev list because I think the issue is a bit more
complex.

For the record, I'm an experienced developer, and I've spent a considerable
amount of time in the past couple of years working on apache modules. I'm
relatively new to "web services" (but not web servers), but I hope I can
contribute meaningfully to the axis2c project.

There are a couple of related issues I think.

The axis2_post_config handler runs in the root apache process, but if I
understand correctly, services aren't loaded and initialized until they are
first referenced in the context of a child process. If that is the case, the
svc_skeleton_free operation should also happen in the context of the child
process, right? I recall seeing something in the archives about a fix to
prevent services from being loaded multiple times, but I don't know the
details.

A service is loaded on the first request, and will live there throughout the lifetime of the server. In other words, there is only one service instance in the description hierarchy.

Also, when I have worked wth apr_rmm in apache modules in the past, I have
used the child_init hook to call rmm_attach, and then a child pool cleanup
handler to call rmm_detach, according to the rmm docs. From what I've seen,
many modules fail to do that, and I believe it is "safe" because those
functions are a no-op. Furthermore, mod_axis2 doesn't call rmm_destroy.

In my particular scenario, I want to use a Transactional BerkeleyDB,
possibly with replication, which means that bdb needs to run in a single
process. I can control the httpd.conf to only create a single child, but I
need to make sure that my axis2c service that uses bdb is initialized and
freed in the same process so I can properly initialize and close my db.

Since the axis2 worker is created in the root process, it makes sense to
free that in the root process as well. I don't yet understand the inner
workings of the axis2 worker, but it seems to me that mod_axis2 could use
the child_init hook to register a child process pool cleanup handler to
notify the worker that a child is going away, and then the worker could (via
refcounting perhaps) free the appropriate service skeletons? There is still
an issue of handling the multiple-child-process general case - how does the
overall design address that situation?

Is your problems is bout sharing data across services? Or is it about how to initialize and un-initialize some data related to a service within a service lifetime?

Regards,
Samisa...

Regards,
-Ben

On Feb 20, 2008 1:40 AM, Ben Wyckoff <[EMAIL PROTECTED]> wrote:
<snip>
Has anyone else run into this issue? Is anyone trying to allocate resources
that have to be freed? (In particular, I'm opening a database, and I need to
properly close it - I can't just rely on the OS to free memory or close file
handles.)
</snip>

This seems to be a problem with mod_axis2. Although the memory
allocated with apr_pools will get free'd eventually without free
functions being called, in order to free up other resources, we need
to register relevant free functions to pool cleanup of a pool which
has resource's lifetime. Please add a jira issue.

The attached patch should solve this issue when shared memory is not
used. I'm not sure if it works when shared memory is used. Hope that
someone familiar with axis2c shared memory implementation will look
further into it.

Regards,
Dumindu.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to