You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Graham Leggett <mi...@sharp.fm> on 2010/09/28 19:06:12 UTC
mod_disk_cache: intended change to file formats
Hi all,
I have two changes to the mod_disk_cache on-disk structure that I plan
to make, and to avoid gratuitous format version bumping, I plan to
make this format change in one go, and then apply each implementation
separately.
The changes are:
- Fix the problem that updates to an entry by mod_disk_cache aren't
atomic, without using locks.
To fix this, the inode and device numbers for the body file are
embedded in the header file, and when the header and body files are
read in, the ident so saved in the header is checked against the real
ident of the body (in a stat we're already doing anyway to get the
body size). When the check fails, we know that our attempt to read in
the header and open the body file have failed due to the race
condition, and we should try open the files again.
- Add flags to indicate whether the body is included, and whether
we've attempted to cache a HEAD request.
Sometimes, we are asked to cache responses that officially have no
body (eg 204 No Content), or potentially HEAD requests that should
have a body, but don't. In these cases, we end up saving a zero byte
body file, which takes up one extra inode. The flag indicates that no
body is included with this entry, and that mod_disk_cache shouldn't
look for one. This is useful when attempts are made to cache service
calls, where the result of the call is the result code, or when the
result of the call arrives in headers only.
The format change looks like this:
Index: modules/cache/mod_disk_cache.h
===================================================================
--- modules/cache/mod_disk_cache.h (revision 1002189)
+++ modules/cache/mod_disk_cache.h (working copy)
@@ -17,12 +17,14 @@
#ifndef MOD_DISK_CACHE_H
#define MOD_DISK_CACHE_H
+#include "apr_file_io.h"
+
/*
* include for mod_disk_cache: Disk Based HTTP 1.1 Cache.
*/
-#define VARY_FORMAT_VERSION 3
-#define DISK_FORMAT_VERSION 4
+#define VARY_FORMAT_VERSION 5
+#define DISK_FORMAT_VERSION 6
#define CACHE_HEADER_SUFFIX ".header"
#define CACHE_DATA_SUFFIX ".data"
@@ -49,6 +51,12 @@
apr_time_t expire;
apr_time_t request_time;
apr_time_t response_time;
+ /* The ident of the body file, so we can test the body matches
the header */
+ apr_ino_t inode;
+ apr_dev_t device;
+ /* Does this cached request have a body? */
+ int has_body;
+ int header_only;
} disk_cache_info_t;
typedef struct {
Regards,
Graham
--