Search squid archive

Re: [squid-users] Squid 2.5stable9-20050402 always restart (stmem.c error)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 4 Apr 2005, Henrik Nordstrom wrote:

On Sun, 3 Apr 2005, Henrik Nordstrom wrote:

Please file a bug report with this info.

Bug report no longer needed. I have reproduced and identified the problem and it is an direct effect of the 2GB patch.


Currently testing a small patch [attached] which rips out a bit of obsolete code no longer needed after the patch and which was causing the problem.

Was a little triggerhappy there. Don't use that patch (it's broken), instead wait for the 2GB patch to get corrected.


Regards
Henrik
? ChangeLog.cvs
? src/.enums.h.swp
Index: src/protos.h
===================================================================
RCS file: /server/cvs-server/squid/squid/src/protos.h,v
retrieving revision 1.420.2.31
diff -u -p -r1.420.2.31 protos.h
--- src/protos.h	30 Mar 2005 22:46:41 -0000	1.420.2.31
+++ src/protos.h	3 Apr 2005 23:00:13 -0000
@@ -1032,7 +1032,7 @@ extern void storeSwapInStart(store_clien
  */
 extern void storeSwapOut(StoreEntry * e);
 extern void storeSwapOutFileClose(StoreEntry * e);
-extern squid_off_t storeSwapOutMaintainMemObject(StoreEntry * e);
+extern int /* swapout_able */ storeSwapOutMaintainMemObject(StoreEntry * e);
 
 /*
  * store_client.c
Index: src/store_swapout.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/store_swapout.c,v
retrieving revision 1.85.2.6
diff -u -p -r1.85.2.6 store_swapout.c
--- src/store_swapout.c	27 Mar 2005 02:42:51 -0000	1.85.2.6
+++ src/store_swapout.c	3 Apr 2005 23:00:13 -0000
@@ -35,7 +35,6 @@
 
 #include "squid.h"
 
-static squid_off_t storeSwapOutObjectBytesOnDisk(const MemObject *);
 static void storeSwapOutStart(StoreEntry * e);
 static STIOCB storeSwapOutFileClosed;
 static STIOCB storeSwapOutFileNotify;
@@ -96,14 +95,13 @@ storeSwapOutFileNotify(void *data, int e
     e->swap_dirn = mem->swapout.sio->swap_dirn;
 }
 
-/* as sideeffect returns the on disk offset for use by storeSwapOut() */
-squid_off_t
+/* as sideeffect returns if the object can be cached */
+int
 storeSwapOutMaintainMemObject(StoreEntry * e)
 {
     MemObject *mem = e->mem_obj;
     squid_off_t lowest_offset;
     squid_off_t new_mem_lo;
-    squid_off_t on_disk = -1;
     int swapout_able = storeSwapOutAble(e);
 
     /* Don't pollute the disk with icons and other special entries */
@@ -135,33 +133,22 @@ storeSwapOutMaintainMemObject(StoreEntry
 	new_mem_lo = lowest_offset;
     else
 	new_mem_lo = mem->inmem_lo;
+    /* The -1 makes sure the page isn't freed until storeSwapOut has
+     * walked to the next page. (mem->swapout.memnode) */
+    if (swapout_able && mem->swapout.queue_offset - 1 < new_mem_lo)
+	new_mem_lo = mem->swapout.queue_offset - 1;
     if (new_mem_lo < mem->inmem_lo)
 	new_mem_lo = mem->inmem_lo;
-    if (swapout_able && e->swap_status != SWAPOUT_DONE) {
-	/*
-	 * We should only free up to what we know has been written
-	 * to disk, not what has been queued for writing.  Otherwise
-	 * there will be a chunk of the data which is not in memory
-	 * and is not yet on disk.
-	 * The -1 makes sure the page isn't freed until storeSwapOut has
-	 * walked to the next page. (mem->swapout.memnode)
-	 */
-	if ((on_disk = storeSwapOutObjectBytesOnDisk(mem)) - 1 < new_mem_lo)
-	    new_mem_lo = on_disk - 1;
-	if (new_mem_lo == -1)
-	    new_mem_lo = 0;	/* the above might become -1 */
-    }
     if (mem->inmem_lo != new_mem_lo)
 	mem->inmem_lo = stmemFreeDataUpto(&mem->data_hdr, new_mem_lo);
-
-    return on_disk;
+    return swapout_able;
 }
 
 void
 storeSwapOut(StoreEntry * e)
 {
     MemObject *mem = e->mem_obj;
-    squid_off_t on_disk;
+    int swapout_able;
     squid_off_t swapout_size;
     size_t swap_buf_len;
     if (mem == NULL)
@@ -208,7 +195,7 @@ storeSwapOut(StoreEntry * e)
 	debug(20, 5) ("storeSwapOut: Deferring starting swapping out\n");
 	return;
     }
-    on_disk = storeSwapOutMaintainMemObject(e);
+    swapout_able = storeSwapOutMaintainMemObject(e);
 #if SIZEOF_SQUID_OFF_T <= 4
     if (mem->inmem_hi > 0x7FFF0000) {
 	debug(20, 0) ("WARNING: preventing squid_off_t overflow for %s\n", storeUrl(e));
@@ -216,10 +203,8 @@ storeSwapOut(StoreEntry * e)
 	return;
     }
 #endif
-    if (on_disk < 0)
+    if (!swapout_able)
 	return;
-    if (e->swap_status == SWAPOUT_WRITING)
-	assert(mem->inmem_lo <= on_disk);
     debug(20, 7) ("storeSwapOut: swapout_size = %" PRINTF_OFF_T "\n",
 	swapout_size);
     if (swapout_size == 0) {
@@ -359,32 +344,6 @@ storeSwapOutFileClosed(void *data, int e
 }
 
 /*
- * How much of the object data is on the disk?
- */
-static squid_off_t
-storeSwapOutObjectBytesOnDisk(const MemObject * mem)
-{
-    /*
-     * NOTE: storeOffset() represents the disk file size,
-     * not the amount of object data on disk.
-     * 
-     * If we don't have at least 'swap_hdr_sz' bytes
-     * then none of the object data is on disk.
-     *
-     * This should still be safe if swap_hdr_sz == 0,
-     * meaning we haven't even opened the swapout file
-     * yet.
-     */
-    squid_off_t nwritten;
-    if (mem->swapout.sio == NULL)
-	return 0;
-    nwritten = storeOffset(mem->swapout.sio);
-    if (nwritten <= mem->swap_hdr_sz)
-	return 0;
-    return nwritten - mem->swap_hdr_sz;
-}
-
-/*
  * Is this entry a candidate for writing to disk?
  */
 static int

[Index of Archives]     [Linux Audio Users]     [Samba]     [Big List of Linux Books]     [Linux USB]     [Yosemite News]

  Powered by Linux