On Thu, Aug 01, 2002 at 08:52:49AM -0400, Bill Stoddard wrote:
> mod_mem_cache fomr HEAD should work. mod_disk_cache is still broken.
>
> Try a config like this:
>
> LoadModule cache_module modules/mod_cache.so
> <IfModule mod_cache.c>
> CacheOn On
> # CacheMaxExpire 2
> # CacheDefaultExpire 1
> LoadModule mem_cache_module modules/mod_mem_cache.so
> <IfModule mod_mem_cache.c>
> CacheEnable mem /
> MCacheSize 4096
> MCacheMaxObjectCount 100
> MCacheMinObjectSize 1
> MCacheMaxObjectSize 1000000
> # CacheDefaultExpire 1
> </IfModule>
> </IfModule>
Sweet -- that gave me a template to work with to make mod_disk_cache
work. I made disk_cache store the request headers so the Vary: parser
would have something to work with. I also through in the rest of the
times needed to calculate the expiration.
Also attached is the cache_storage.patch described earlier. Perhaps
someone up on mem-cache will be able to see if I should push this
functionality into mod_disk_cache.
> > -----Original Message-----
> > From: Eric Prud'hommeaux [mailto:[EMAIL PROTECTED]]
> > Sent: Thursday, August 01, 2002 1:06 AM
> > To: Apache HTTP server developers
> > Subject: apache 2 disk-cache SEGV
> >
> >
> > Has anybody seen --enable-disk-cache or --enable-mem-cache work under
> > apache 2? In my scenario:
> > --enable-maintainer-mode --with-mpm=prefork --enable-rewrite
> > --enable-expires --enable-speling --disable-auth --enable-headers
> > --enable-info --disable-userdir --enable-dav --enable-proxy
> > --enable-proxy-connect --enable-proxy-ftp --enable-proxy-http
> > --enable-file-cache --enable-cache --enable-disk-cache
> > --enable-mem-cache --no-create --no-recursion
> > --prefix=/usr/local/apache-2-clean
> > the cache context's filename is copied to r->filename
> > cache_url_handler (modules/experimental/mod_cache.c:192)
> > cache_read_entity_headers (modules/experimental/mod_cache.c:192)
> > cache_select_url which (modules/experimental/mod_cache.c:287)
> > r->filename = apr_pstrdup(r->pool, info->filename );
> > before the content_set filter sets it.
> > cache_in_filter (modules/experimental/mod_cache.c:732)
> > info->filename = apr_pstrdup(r->pool, r->filename );
> >
> > Can someone who has this working set breakpoints at cache_url_handler
> > and cache_in_filter and let me know if they see the same behavior?
> > The two are registered with
> > ap_hook_quick_handler(cache_url_handler, NULL, NULL, APR_HOOK_FIRST);
> > and
> > ap_register_output_filter("CACHE_IN",
> > cache_in_filter,
> > NULL,
> > AP_FTYPE_CONTENT_SET);
> > "CACHE_IN" is added to the request several places in cache_url_handler (a
> > bit too late) and in cache_conditional_filter, which is also added to the
> > request in cache_url_handler. From this it appears that the info->filename
> > will _always_ be copied to r->filename before it has been initialized.
> >
> > If you are replicating this problem, you will probably need to created
> > the disk cache directory /usr/local/apache-2-clean/proxy (in this case).
> > Otherwise, the cache is never written and so never read and so the code
> > path never arises.
> >
> > Since this is a cache re-use issue, you'll have to GET something twice
> > through the proxy in rapid enough succession that the cached copy
> > doesn't go stale.
> >
> > For now, I just cheesed around it with
> > +++ modules/experimental/mod_cache.c:287
> > + if (info->filename)
> > r->filename = apr_pstrdup(r->pool, info->filename );
> > but never having seen it work, I don't know what the intended path is.
> > --
> > -eric
> >
> > ([EMAIL PROTECTED])
> > Feel free to forward this message to any list for any purpose other than
> > email address distribution.
> >
--
-eric
([EMAIL PROTECTED])
Feel free to forward this message to any list for any purpose other than
email address distribution.
Index: httpd-2.0/modules/experimental/mod_disk_cache.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/mod_disk_cache.c,v
retrieving revision 1.36
diff -u -r1.36 mod_disk_cache.c
--- httpd-2.0/modules/experimental/mod_disk_cache.c 17 Jul 2002 14:52:36 -0000
1.36
+++ httpd-2.0/modules/experimental/mod_disk_cache.c 1 Aug 2002 21:50:11 -0000
@@ -237,7 +237,7 @@
if ((temp = strchr(&urlbuff[0], '\n')) != NULL) /* trim off new line character */
*temp = '\0'; /* overlay it with the null terminator */
- if (!apr_date_checkmask(urlbuff, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&")) {
+ if (!apr_date_checkmask(urlbuff, "&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&
+&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&")) {
return APR_EGENERAL;
}
@@ -246,6 +246,10 @@
info->expire = ap_cache_hex2usec(urlbuff + offset);
offset += (sizeof(info->expire)*2) + 1;
dobj->version = ap_cache_hex2usec(urlbuff + offset);
+ offset += (sizeof(info->expire)*2) + 1;
+ info->request_time = ap_cache_hex2usec(urlbuff + offset);
+ offset += (sizeof(info->expire)*2) + 1;
+ info->response_time = ap_cache_hex2usec(urlbuff + offset);
/* check that we have the same URL */
rv = apr_file_gets(&urlbuff[0], urllen, fd);
@@ -276,6 +280,8 @@
char dateHexS[sizeof(apr_time_t) * 2 + 1];
char expireHexS[sizeof(apr_time_t) * 2 + 1];
char verHexS[sizeof(apr_time_t) * 2 + 1];
+ char requestHexS[sizeof(apr_time_t) * 2 + 1];
+ char responseHexS[sizeof(apr_time_t) * 2 + 1];
cache_info *info = &(h->cache_obj->info);
disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
@@ -287,7 +293,9 @@
ap_cache_usec2hex(info->date, dateHexS);
ap_cache_usec2hex(info->expire, expireHexS);
ap_cache_usec2hex(dobj->version++, verHexS);
- buf = apr_pstrcat(r->pool, dateHexS, " ", expireHexS, " ", verHexS, "\n", NULL);
+ ap_cache_usec2hex(info->request_time, requestHexS);
+ ap_cache_usec2hex(info->response_time, responseHexS);
+ buf = apr_pstrcat(r->pool, dateHexS, " ", expireHexS, " ", verHexS, " ",
+requestHexS, " ", responseHexS, "\n", NULL);
amt = strlen(buf);
rc = apr_file_write(fd, buf, &amt);
if (rc != APR_SUCCESS) {
@@ -448,6 +456,7 @@
char urlbuff[1034];
int urllen = sizeof(urlbuff);
disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj;
+ apr_table_t * tmp;
/* This case should not happen... */
if (!dobj->fd || !dobj->hfd) {
@@ -462,7 +471,9 @@
/*
* Call routine to read the header lines/status line
*/
- ap_scan_script_header_err(r, dobj->hfd, NULL);
+ ap_scan_script_header_err(r, dobj->hfd, NULL); /* read headers into
+err_headers_out */
+ r->headers_out = r->err_headers_out; /* these are the real headers, not
+error headers */
+ rv = apr_file_gets(&urlbuff[0], urllen, dobj->hfd); /* Read status */
apr_table_setn(r->headers_out, "Content-Type",
ap_make_content_type(r, r->content_type));
@@ -486,6 +497,13 @@
r->status_line = apr_pstrdup(r->pool, urlbuff); /* Save status line
into request rec */
+ /*
+ * Call routine to read the header lines/status line
+ */
+ r->err_headers_out = h->req_hdrs; /* pick up request headers also in
+metadata file */
+ ap_scan_script_header_err(r, dobj->hfd, NULL);
+ r->err_headers_out = apr_table_make(r->pool, 20);
+
apr_file_close(dobj->hfd);
ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
@@ -585,6 +603,23 @@
buf = apr_pstrcat(r->pool, CRLF, NULL);
amt = strlen(buf);
apr_file_write(hfd, buf, &amt);
+
+ /* Dump the request headers so we can parse the Vary: header and check
+ the entries in potential cachable request against this request. */
+ if (r->headers_in) {
+ int i;
+ apr_table_entry_t *elts = (apr_table_entry_t *)
+apr_table_elts(r->headers_in)->elts;
+ for (i = 0; i < apr_table_elts(r->headers_in)->nelts; ++i) {
+ if (elts[i].key != NULL) {
+ buf = apr_pstrcat(r->pool, elts[i].key, ": ", elts[i].val, CRLF,
+NULL);
+ amt = strlen(buf);
+ apr_file_write(hfd, buf, &amt);
+ }
+ }
+ buf = apr_pstrcat(r->pool, CRLF, NULL);
+ amt = strlen(buf);
+ apr_file_write(hfd, buf, &amt);
+ }
apr_file_close(hfd); /* flush and close */
}
else {
Index: httpd-2.0/modules/experimental/cache_storage.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/modules/experimental/cache_storage.c,v
retrieving revision 1.25
diff -u -r1.25 cache_storage.c
--- httpd-2.0/modules/experimental/cache_storage.c 23 Jun 2002 06:10:00 -0000
1.25
+++ httpd-2.0/modules/experimental/cache_storage.c 1 Aug 2002 21:50:10 -0000
@@ -283,7 +283,8 @@
return rv;
}
- r->filename = apr_pstrdup(r->pool, info->filename );
+ if (info->filename)
+ r->filename = apr_pstrdup(r->pool, info->filename );
return APR_SUCCESS;
}