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; }