From: wessels <> Date: Fri, 6 Sep 1996 04:14:07 +0000 (+0000) Subject: Make storeGetMemSpace() call 'purge' for some objects and 'release' X-Git-Tag: SQUID_3_0_PRE1~5846 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=579a45cde642b80a5f75f7389eefb379a5d438de;p=thirdparty%2Fsquid.git Make storeGetMemSpace() call 'purge' for some objects and 'release' for others. --- diff --git a/src/store.cc b/src/store.cc index 63c665caf9..259d0828e6 100644 --- a/src/store.cc +++ b/src/store.cc @@ -1,6 +1,6 @@ /* - * $Id: store.cc,v 1.99 1996/09/05 19:03:48 wessels Exp $ + * $Id: store.cc,v 1.100 1996/09/05 22:14:07 wessels Exp $ * * DEBUG: section 20 Storeage Manager * AUTHOR: Harvest Derived @@ -259,7 +259,7 @@ static MemObject *new_MemObject() { MemObject *mem = get_free_mem_obj(); mem->reply = xcalloc(1, sizeof(struct _http_reply)); - meta_data.store_in_mem_objects++; + meta_data.mem_obj_count++; meta_data.misc += sizeof(struct _http_reply); debug(20, 3, "new_MemObject: returning %p\n", mem); return mem; @@ -297,7 +297,7 @@ static void destroy_MemObject(mem) mem->request = NULL; memset(mem, '\0', sizeof(MemObject)); put_free_mem_obj(mem); - meta_data.store_in_mem_objects--; + meta_data.mem_obj_count--; meta_data.misc -= sizeof(struct _http_reply); } @@ -327,7 +327,7 @@ static void destroy_StoreEntry(e) static mem_ptr new_MemObjectData() { debug(20, 3, "new_MemObjectData: calling memInit()\n"); - /* meta_data.hot_vm++; */ + meta_data.mem_data_count++; return memInit(); } @@ -343,7 +343,7 @@ static void destroy_MemObjectData(mem) if (mem->data) { mem->data->mem_free(mem->data); mem->data = NULL; - /* meta_data.hot_vm--; */ + meta_data.mem_data_count--; } mem->e_current_len = 0; } @@ -1836,6 +1836,7 @@ int storeGetMemSpace(size, check_vm_number) int list_count = 0; int n_expired = 0; int n_purged = 0; + int n_released = 0; int n_locked = 0; int i; static time_t last_warning = 0; @@ -1849,23 +1850,25 @@ int storeGetMemSpace(size, check_vm_number) return 0; debug(20, 2, "storeGetMemSpace: Starting...\n"); - list = xcalloc(meta_data.store_in_mem_objects, sizeof(ipcache_entry *)); + list = xcalloc(meta_data.mem_obj_count, sizeof(ipcache_entry *)); for (e = storeGetInMemFirst(); e; e = storeGetInMemNext()) { - if (list_count == meta_data.store_in_mem_objects) + if (list_count == meta_data.mem_obj_count) break; - if (!storeCheckPurgeMem(e)) { - n_locked++; - continue; - } if (storeCheckExpired(e)) { debug(20, 2, "storeGetMemSpace: Expired: %s\n", e->url); n_expired++; storeRelease(e); + } else if (storeCheckPurgeMem(e)) { + *(list + list_count) = e; + list_count++; + } else if (!storeEntryLocked(e)) { + *(list + list_count) = e; + list_count++; + } else { + n_locked++; continue; } debug(20, 3, "storeGetMemSpace: Adding '%s'\n", e->url); - *(list + list_count) = e; - list_count++; } #ifdef EXTRA_DEBUGGING debug(20, 5, "storeGetMemSpace: Current size: %7d bytes\n", store_mem_size); @@ -1881,40 +1884,42 @@ int storeGetMemSpace(size, check_vm_number) /* Kick LRU out until we have enough memory space */ for (i = 0; i < list_count; i++) { - if (meta_data.hot_vm > store_hotobj_low) { - storePurgeMem(*(list + i)); - n_purged++; - } else if ((store_mem_size + size) > store_mem_low) { - storePurgeMem(*(list + i)); - n_purged++; - } else - break; + if (meta_data.hot_vm < store_hotobj_low) + if (store_mem_size + size < store_mem_low) + break; + e = *(list + i); + if (storeCheckPurgeMem(e)) { + storePurgeMem(e); + n_purged++; + } else if (!storeEntryLocked(e)) { + storeRelease(e); + n_released++; + } else { + fatal_dump("storeGetMemSpace: Bad Entry in LRU list"); + } } - debug(20, 2, "storeGetMemSpace: After freeing size: %7d bytes\n", store_mem_size); - debug(20, 2, "storeGetMemSpace: Purged: %7d items\n", n_purged); + i = 3; if (meta_data.hot_vm > store_hotobj_high) { if (squid_curtime - last_warning > 600) { debug(20, 0, "WARNING: Over hot_vm object count (%d > %d)\n", meta_data.hot_vm, store_hotobj_high); - debug(20, 0, " : %d objects locked in memory\n", n_locked); - debug(20, 0, " : purged %d of %d candidates\n", - n_purged, - list_count); last_warning = squid_curtime; + i = 0; } - } else if ((store_mem_size + size) > store_mem_high) { + } else if (store_mem_size + size > store_mem_high) { if (squid_curtime - last_warning > 600) { debug(20, 0, "WARNING: Over store_mem high-water mark (%d > %d)\n", store_mem_size + size, store_mem_high); - debug(20, 0, " : %d objects locked in memory\n", n_locked); - debug(20, 0, " : released %d of %d candidates\n", - n_purged, - list_count); last_warning = squid_curtime; + i = 0; } } - debug(20, 2, "storeGetMemSpace: Done.\n"); + debug(20, i, "storeGetMemSpace stats:\n"); + debug(20, i, " %6d objects locked in memory\n", n_locked); + debug(20, i, " %6d LRU candidates\n", list_count); + debug(20, i, " %6d were purged\n", n_purged); + debug(20, i, " %6d were released\n", n_released); xfree(list); return 0; }