Hi all,

A second issue I would like to attack this weekend is the issue of atomic cache updates in mod_cache.

Right now today, two functions are provided to add and/or update a cache entry:

apr_status_t (*store_headers)(cache_handle_t *h, request_rec *r, cache_info *i); apr_status_t (*store_body)(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b);

The problem is that two possible cache update scenarios exist:

- Add response to cache: first, store_headers is called, followed by one or more calls to store_body until we see an EOS bucket to say we're done. - Freshen existing cached entity by updating headers only: store_headers is called only, and store_body is never called at all.

The store_headers implementation cannot know if mod_cache intends calling store_body at a future time, and so cannot make a safe decision as to whether to write the headers now, or delay the writing of headers until the body has been downloaded fully. I believe this issue may be the cause of some cache edge case problems I have seen recently.

What we're missing is a "commit" function, to say "mod_cache is now done, implementation, please make your cached entity available for others to use".

We could hack this by creating a "commit" function and then wiring it into a cleanup registered with r->pool, but the cleanup only runs when the request has been acknowledged by the client, which happens eons later (in computing terms). We're a cache, and our reason for existence is performance, we ideally want to commit our cached entity and make that entity available as soon as we receive the complete request from the backend, not when the response is finally eventually acknowledged by the client on the frontend and r->pool is destroyed.

I propose we add a dedicated function as follows, to indicate to the implementation "mod_cache has given you all the information you need, make it so":

apr_status_t (*commit_entity)(cache_handle_t *h, request_rec *r, cache_info *i);

This should remove all doubt in the implementation as when to make a cached entity available.

Regards,
Graham
--

Reply via email to