Hiya,
Here's my initial patch to make things slightly saner during cachedir
rebuilds.
Its resulted in a correct-looking rebuild from a cache w/ COSS+AUFS which
crashed during rebuild. I haven't contacted the owner of the bugzilla
entry to see if this patch fixes his particular problem but I do believe
they're the same.
Comments please! I'd like to commit a fix to this issue as soon as is possible.
Adrian
? fs/.deps
Index: protos.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/protos.h,v
retrieving revision 1.502
diff -u -r1.502 protos.h
--- protos.h 28 Jun 2006 10:31:57 -0000 1.502
+++ protos.h 2 Jul 2006 07:51:11 -0000
@@ -957,6 +957,7 @@
extern void storeRead(storeIOState *, char *, size_t, squid_off_t, STRCB *,
void *);
extern void storeWrite(storeIOState *, char *, size_t, FREE *);
extern void storeUnlink(StoreEntry *);
+extern void storeRecycle(StoreEntry *);
extern squid_off_t storeOffset(storeIOState *);
/*
Index: store_io.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/store_io.c,v
retrieving revision 1.15
diff -u -r1.15 store_io.c
--- store_io.c 27 May 2006 15:50:16 -0000 1.15
+++ store_io.c 2 Jul 2006 07:51:11 -0000
@@ -119,6 +119,13 @@
SD->obj.unlink(SD, e);
}
+void
+storeRecycle(StoreEntry *e)
+{
+ SwapDir *SD = INDEXSD(e->swap_dirn);
+ SD->obj.recycle(SD, e);
+}
+
squid_off_t
storeOffset(storeIOState * sio)
{
Index: structs.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/structs.h,v
retrieving revision 1.489
diff -u -r1.489 structs.h
--- structs.h 30 Jun 2006 21:23:05 -0000 1.489
+++ structs.h 2 Jul 2006 07:51:12 -0000
@@ -1748,6 +1748,7 @@
STOBJREAD *read;
STOBJWRITE *write;
STOBJUNLINK *unlink;
+ STOBJRECYCLE *recycle;
} obj;
struct {
STLOGOPEN *open;
Index: typedefs.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/typedefs.h,v
retrieving revision 1.147
diff -u -r1.147 typedefs.h
--- typedefs.h 4 Jun 2006 02:50:05 -0000 1.147
+++ typedefs.h 2 Jul 2006 07:51:13 -0000
@@ -310,6 +310,7 @@
typedef void STOBJREAD(SwapDir *, storeIOState *, char *, size_t, squid_off_t,
STRCB *, void *);
typedef void STOBJWRITE(SwapDir *, storeIOState *, char *, size_t,
squid_off_t, FREE *);
typedef void STOBJUNLINK(SwapDir *, StoreEntry *);
+typedef void STOBJRECYCLE(SwapDir *, StoreEntry *);
typedef void STLOGOPEN(SwapDir *);
typedef void STLOGCLOSE(SwapDir *);
Index: fs/aufs/store_asyncufs.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/aufs/store_asyncufs.h,v
retrieving revision 1.14
diff -u -r1.14 store_asyncufs.h
--- fs/aufs/store_asyncufs.h 19 May 2006 00:16:14 -0000 1.14
+++ fs/aufs/store_asyncufs.h 2 Jul 2006 07:51:13 -0000
@@ -79,5 +79,6 @@
extern STOBJREAD storeAufsRead;
extern STOBJWRITE storeAufsWrite;
extern STOBJUNLINK storeAufsUnlink;
+extern STOBJRECYCLE storeAufsRecycle;
#endif
Index: fs/aufs/store_dir_aufs.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/aufs/store_dir_aufs.c,v
retrieving revision 1.57
diff -u -r1.57 store_dir_aufs.c
--- fs/aufs/store_dir_aufs.c 4 Jun 2006 02:01:38 -0000 1.57
+++ fs/aufs/store_dir_aufs.c 2 Jul 2006 07:51:14 -0000
@@ -595,15 +595,7 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeAufsDirReplRemove(e);
- storeAufsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -683,16 +675,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeAufsDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeAufsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -763,15 +746,7 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeAufsDirReplRemove(e);
- storeAufsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -851,16 +826,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeAufsDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeAufsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -1921,6 +1887,7 @@
sd->obj.read = storeAufsRead;
sd->obj.write = storeAufsWrite;
sd->obj.unlink = storeAufsUnlink;
+ sd->obj.recycle = storeAufsRecycle;
sd->log.open = storeAufsDirOpenSwapLog;
sd->log.close = storeAufsDirCloseSwapLog;
sd->log.write = storeAufsDirSwapLog;
Index: fs/aufs/store_io_aufs.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/aufs/store_io_aufs.c,v
retrieving revision 1.31
diff -u -r1.31 store_io_aufs.c
--- fs/aufs/store_io_aufs.c 7 Jun 2006 22:55:45 -0000 1.31
+++ fs/aufs/store_io_aufs.c 2 Jul 2006 07:51:14 -0000
@@ -246,6 +246,23 @@
statCounter.syscalls.disk.unlinks++;
}
+void
+storeAufsRecycle(SwapDir *SD, StoreEntry *e)
+{
+ debug(79, 3) ("storeAufsUnlink: fileno %08X\n", e->swap_filen);
+
+ /* Release the object without releasing the underlying physical object */
+ storeExpireNow(e);
+ storeReleaseRequest(e);
+ if (e->swap_filen > -1) {
+ storeAufsDirReplRemove(e);
+ storeAufsDirMapBitReset(SD, e->swap_filen);
+ e->swap_filen = -1;
+ e->swap_dirn = -1;
+ }
+ storeRelease(e);
+}
+
/* === STATIC =========================================================== */
static int
Index: fs/coss/store_coss.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/coss/store_coss.h,v
retrieving revision 1.9
diff -u -r1.9 store_coss.h
--- fs/coss/store_coss.h 11 Jun 2006 20:59:09 -0000 1.9
+++ fs/coss/store_coss.h 2 Jul 2006 07:51:14 -0000
@@ -189,6 +189,7 @@
extern STOBJREAD storeCossRead;
extern STOBJWRITE storeCossWrite;
extern STOBJUNLINK storeCossUnlink;
+extern STOBJRECYCLE storeCossRecycle;
extern STSYNC storeCossSync;
extern void storeCossAdd(SwapDir * sd, StoreEntry * e, int curstripe);
Index: fs/coss/store_dir_coss.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/coss/store_dir_coss.c,v
retrieving revision 1.47
diff -u -r1.47 store_dir_coss.c
--- fs/coss/store_dir_coss.c 22 Jun 2006 22:05:00 -0000 1.47
+++ fs/coss/store_dir_coss.c 2 Jul 2006 07:51:15 -0000
@@ -693,6 +693,7 @@
sd->obj.read = storeCossRead;
sd->obj.write = storeCossWrite;
sd->obj.unlink = storeCossUnlink;
+ sd->obj.recycle = storeCossRecycle;
sd->log.open = storeCossDirOpenSwapLog;
sd->log.close = storeCossDirCloseSwapLog;
@@ -1191,13 +1192,10 @@
storeCoss_DeleteStoreEntry(RebuildState * rb, const cache_key * key,
StoreEntry * e)
{
assert(rb->counts.objcount >= 0);
+ /* XXX are these counters even correct, considering e could be a different
storedir? */
rb->counts.objcount--;
assert(e->swap_dirn >= 0);
- storeCossRemove(INDEXSD(e->swap_dirn), e);
- e->swap_filen = -1;
- storeExpireNow(e);
- storeReleaseRequest(e);
- storeRelease(e);
+ storeRecycle(e);
}
/*
Index: fs/coss/store_io_coss.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/coss/store_io_coss.c,v
retrieving revision 1.22
diff -u -r1.22 store_io_coss.c
--- fs/coss/store_io_coss.c 22 May 2006 10:56:16 -0000 1.22
+++ fs/coss/store_io_coss.c 2 Jul 2006 07:51:16 -0000
@@ -176,6 +176,14 @@
storeCossRemove(SD, e);
}
+void
+storeCossRecycle(SwapDir * SD, StoreEntry * e)
+{
+ debug(79, 3) ("storeCossRecycle: %s: offset %d\n", SD->path,
e->swap_filen);
+ storeCossUnlink(SD, e);
+}
+
+
storeIOState *
storeCossCreate(SwapDir * SD, StoreEntry * e, STFNCB * file_callback, STIOCB *
callback, void *callback_data)
Index: fs/diskd/store_dir_diskd.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/diskd/store_dir_diskd.c,v
retrieving revision 1.78
diff -u -r1.78 store_dir_diskd.c
--- fs/diskd/store_dir_diskd.c 4 Jun 2006 02:01:39 -0000 1.78
+++ fs/diskd/store_dir_diskd.c 2 Jul 2006 07:51:17 -0000
@@ -785,15 +785,7 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeDiskdDirReplRemove(e);
- storeDiskdDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -873,16 +865,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeDiskdDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeDiskdDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -978,15 +961,7 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeDiskdDirReplRemove(e);
- storeDiskdDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -1066,16 +1041,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeDiskdDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeDiskdDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -2256,6 +2222,7 @@
sd->obj.read = storeDiskdRead;
sd->obj.write = storeDiskdWrite;
sd->obj.unlink = storeDiskdUnlink;
+ sd->obj.recycle = storeDiskdRecycle;
sd->log.open = storeDiskdDirOpenSwapLog;
sd->log.close = storeDiskdDirCloseSwapLog;
sd->log.write = storeDiskdDirSwapLog;
Index: fs/diskd/store_diskd.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/diskd/store_diskd.h,v
retrieving revision 1.12
diff -u -r1.12 store_diskd.h
--- fs/diskd/store_diskd.h 25 May 2006 03:20:38 -0000 1.12
+++ fs/diskd/store_diskd.h 2 Jul 2006 07:51:17 -0000
@@ -111,6 +111,7 @@
extern STOBJREAD storeDiskdRead;
extern STOBJWRITE storeDiskdWrite;
extern STOBJUNLINK storeDiskdUnlink;
+extern STOBJRECYCLE storeDiskdRecycle;
#define SHMBUF_BLKSZ SM_PAGE_SIZE
Index: fs/diskd/store_io_diskd.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/diskd/store_io_diskd.c,v
retrieving revision 1.31
diff -u -r1.31 store_io_diskd.c
--- fs/diskd/store_io_diskd.c 7 Jun 2006 22:55:45 -0000 1.31
+++ fs/diskd/store_io_diskd.c 2 Jul 2006 07:51:17 -0000
@@ -299,6 +299,24 @@
diskd_stats.unlink.ops++;
}
+void
+storeDiskdRecycle(SwapDir *SD, StoreEntry *e)
+{
+ debug(79, 3) ("storeDiskdUnlink: fileno %08X\n", e->swap_filen);
+
+ /* Release the object without releasing the underlying physical object */
+ storeExpireNow(e);
+ storeReleaseRequest(e);
+ if (e->swap_filen > -1) {
+ storeDiskdDirReplRemove(e);
+ storeDiskdDirMapBitReset(SD, e->swap_filen);
+ e->swap_filen = -1;
+ e->swap_dirn = -1;
+ }
+ storeRelease(e);
+}
+
+
/* === STATIC =========================================================== */
@@ -454,7 +472,7 @@
storeDiskdIOCallback(storeIOState * sio, int errflag)
{
int valid = cbdataValid(sio->callback_data);
- debug(79, 3) ("storeUfsIOCallback: errflag=%d\n", errflag);
+ debug(79, 3) ("storeDiskdIOCallback: errflag=%d\n", errflag);
cbdataUnlock(sio->callback_data);
if (valid)
sio->callback(sio->callback_data, errflag, sio);
Index: fs/ufs/store_dir_ufs.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/ufs/store_dir_ufs.c,v
retrieving revision 1.57
diff -u -r1.57 store_dir_ufs.c
--- fs/ufs/store_dir_ufs.c 4 Jun 2006 02:01:40 -0000 1.57
+++ fs/ufs/store_dir_ufs.c 2 Jul 2006 07:51:18 -0000
@@ -605,15 +605,11 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeUfsDirReplRemove(e);
- storeUfsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
+ /*
+ * XXX considering we might've canceled an object from another
store;
+ * XXX what should happen with these stats?
+ */
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -693,16 +689,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeUfsDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeUfsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -773,15 +760,8 @@
* because adding to store_swap_size happens in
* the cleanup procedure.
*/
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeUfsDirReplRemove(e);
- storeUfsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
+ /* XXX are these counters valid since e could be from another
swapfs? */
rb->counts.objcount--;
rb->counts.cancelcount++;
}
@@ -861,16 +841,7 @@
} else if (e) {
/* key already exists, this swapfile not being used */
/* junk old, load new */
- storeExpireNow(e);
- storeReleaseRequest(e);
- if (e->swap_filen > -1) {
- storeUfsDirReplRemove(e);
- /* Make sure we don't actually unlink the file */
- storeUfsDirMapBitReset(SD, e->swap_filen);
- e->swap_filen = -1;
- e->swap_dirn = -1;
- }
- storeRelease(e);
+ storeRecycle(e);
rb->counts.dupcount++;
} else {
/* URL doesnt exist, swapfile not in use */
@@ -1952,6 +1923,7 @@
sd->obj.read = storeUfsRead;
sd->obj.write = storeUfsWrite;
sd->obj.unlink = storeUfsUnlink;
+ sd->obj.recycle = storeUfsRecycle;
sd->log.open = storeUfsDirOpenSwapLog;
sd->log.close = storeUfsDirCloseSwapLog;
sd->log.write = storeUfsDirSwapLog;
Index: fs/ufs/store_io_ufs.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/ufs/store_io_ufs.c,v
retrieving revision 1.14
diff -u -r1.14 store_io_ufs.c
--- fs/ufs/store_io_ufs.c 7 Jun 2006 22:55:45 -0000 1.14
+++ fs/ufs/store_io_ufs.c 2 Jul 2006 07:51:18 -0000
@@ -195,6 +195,23 @@
storeUfsDirUnlinkFile(SD, e->swap_filen);
}
+void
+storeUfsRecycle(SwapDir *SD, StoreEntry *e)
+{
+ debug(79, 3) ("storeUfsUnlink: fileno %08X\n", e->swap_filen);
+
+ /* Release the object without releasing the underlying physical object */
+ storeExpireNow(e);
+ storeReleaseRequest(e);
+ if (e->swap_filen > -1) {
+ storeUfsDirReplRemove(e);
+ storeUfsDirMapBitReset(SD, e->swap_filen);
+ e->swap_filen = -1;
+ e->swap_dirn = -1;
+ }
+ storeRelease(e);
+}
+
/* === STATIC =========================================================== */
static void
Index: fs/ufs/store_ufs.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/ufs/store_ufs.h,v
retrieving revision 1.4
diff -u -r1.4 store_ufs.h
--- fs/ufs/store_ufs.h 17 May 2005 16:56:43 -0000 1.4
+++ fs/ufs/store_ufs.h 2 Jul 2006 07:51:18 -0000
@@ -47,5 +47,6 @@
extern STOBJREAD storeUfsRead;
extern STOBJWRITE storeUfsWrite;
extern STOBJUNLINK storeUfsUnlink;
+extern STOBJRECYCLE storeUfsRecycle;
#endif