/*
- * $Id: cache_cf.cc,v 1.178 1997/04/25 20:15:31 wessels Exp $
+ * $Id: cache_cf.cc,v 1.179 1997/04/25 21:43:56 wessels Exp $
*
* DEBUG: section 3 Configuration File Parsing
* AUTHOR: Harvest Derived
#define DefaultMemMaxSize (8 << 20) /* 8 MB */
#define DefaultMemHighWaterMark 90 /* 90% */
#define DefaultMemLowWaterMark 75 /* 75% */
-#define DefaultSwapMaxSize (100 << 10) /* 100 MB (100*1024 kbytes) */
+#define DefaultSwapMaxSize 0
#define DefaultSwapHighWaterMark 95 /* 95% */
#define DefaultSwapLowWaterMark 90 /* 90% */
#define DefaultNetdbHigh 1000 /* counts, not percents */
/*
- * $Id: stat.cc,v 1.131 1997/04/25 20:15:33 wessels Exp $
+ * $Id: stat.cc,v 1.132 1997/04/25 21:43:58 wessels Exp $
*
* DEBUG: section 18 Cache Manager Statistics
* AUTHOR: Harvest Derived
statFiledescriptors(sentry);
} else if (strcmp(req, "netdb") == 0) {
netdbDump(sentry);
+ } else if (strcmp(req, "storedir") == 0) {
+ storeDirStats(sentry);
}
}
storeAppendPrintf(sentry, "{Cache information for %s:}\n",
appname);
- storeAppendPrintf(sentry, "{\tStorage Swap size:\t%d MB}\n",
- store_swap_size >> 10);
+ storeAppendPrintf(sentry, "{\tStorage Swap size:\t%d KB}\n",
+ store_swap_size);
storeAppendPrintf(sentry, "{\tStorage Mem size:\t%d KB}\n",
store_mem_size >> 10);
storeAppendPrintf(sentry, "{\tStorage LRU Expiration Age:\t%6.2f days}\n",
/*
- * $Id: store.cc,v 1.219 1997/04/25 20:15:34 wessels Exp $
+ * $Id: store.cc,v 1.220 1997/04/25 21:43:59 wessels Exp $
*
* DEBUG: section 20 Storeage Manager
* AUTHOR: Harvest Derived
debug(20, 6, "storeSwapOutHandle: store_swap_size = %dk\n", store_swap_size);
mem->swap_offset += mem->e_swap_buf_len;
/* round up */
- storeDirUpdateSwapSize(e->swap_file_number, mem->e_swap_buf_len);
+ storeDirUpdateSwapSize(e->swap_file_number, mem->e_swap_buf_len, 1);
if (mem->swap_offset >= e->object_len) {
/* swapping complete */
e->swap_status = SWAP_OK;
storeDoRebuildFromDisk(void *data)
{
struct storeRebuildState *RB = data;
- LOCAL_ARRAY(char, swapfile, MAXPATHLEN);
LOCAL_ARRAY(char, url, MAX_URL);
StoreEntry *e = NULL;
time_t expires;
if (RB->line_in[0] == '#')
continue;
url[0] = '\0';
- swapfile[0] = '\0';
sfileno = 0;
scan1 = 0;
scan2 = 0;
continue;
if (sfileno < 0)
continue;
- if (sfileno >= MAX_FILES_PER_DIR)
- continue;
- storeSwapFullPath(sfileno, swapfile);
+ sfileno = storeDirProperFileno(d->dirn, sfileno);
timestamp = (time_t) scan1;
expires = (time_t) scan2;
lastmod = (time_t) scan3;
continue;
}
/* update store_swap_size */
- storeDirUpdateSwapSize(sfileno, size);
+ storeDirUpdateSwapSize(sfileno, size, 1);
RB->objcount++;
e = storeAddDiskRestore(url,
sfileno,
if (e->swap_status == SWAP_OK && (e->swap_file_number > -1)) {
(void) safeunlink(storeSwapFullPath(e->swap_file_number, NULL), 1);
- storeDirUpdateSwapSize(e->swap_file_number, -(e->object_len));
+ storeDirUpdateSwapSize(e->swap_file_number, e->object_len, -1);
storeDirMapBitReset(e->swap_file_number);
e->swap_file_number = -1;
HTTPCacheInfo->proto_purgeobject(HTTPCacheInfo,
int i;
/* Calculate size of hash table (maximum currently 64k buckets). */
i = Config.Swap.maxSize / Config.Store.avgObjectSize;
- debug(20, 1, "Swap maxSize %d, estimated %d objects\n",
+ debug(20, 1, "Swap maxSize %d kB, estimated %d objects\n",
Config.Swap.maxSize, i);
i /= Config.Store.objectsPerBucket;
debug(20, 1, "Target number of buckets: %d\n", i);
int
storeMostFreeSwapDir(void)
{
- int most_free = 0;
- int this_free;
+ double least_used = 1.0;
+ double this_used;
int dirn = 0;
int i;
+ SwapDir *SD;
for (i = 0; i < ncache_dirs; i++) {
- this_free = SwapDirs[i].max_size - SwapDirs[i].cur_size;
-debug(20,0,"storeMostFreeSwapDir: most free = #%d with %d\n", dirn, most_free);
-debug(20,0,"storeMostFreeSwapDir: #%d has %d free\n", i, this_free);
- if (this_free <= most_free)
+ SD = &SwapDirs[i];
+ this_used = (double) SD->cur_size / SD->max_size;
+ if (this_used > least_used)
continue;
- if (SwapDirs[i].read_only)
+ if (SD->read_only)
continue;
- most_free = this_free;
+ least_used = this_used;
dirn = i;
}
-debug(20,0,"storeMostFreeSwapDir: most free = #%d with %d\n", dirn, most_free);
-debug(20,0,"storeMostFreeSwapDir: returning %d\n", dirn);
return dirn;
}
return swap_file_number >> SWAP_DIR_SHIFT;
}
+int
+storeDirProperFileno(int dirn, int fn)
+{
+ return (dirn << SWAP_DIR_SHIFT) | (fn & SWAP_FILE_MASK);
+}
+
void
storeDirSwapLog(const StoreEntry * e)
{
}
void
-storeDirUpdateSwapSize(int fn, size_t size)
+storeDirUpdateSwapSize(int fn, size_t size, int sign)
{
int dirn = (fn >> SWAP_DIR_SHIFT) % ncache_dirs;
- int k = ((size + 1023) >> 10);
+ int k = ((size + 1023) >> 10) * sign;
SwapDirs[dirn].cur_size += k;
store_swap_size += k;
}
+
+void
+storeDirStats(StoreEntry *sentry)
+{
+ int i;
+ SwapDir *SD;
+ storeAppendPrintf(sentry, "Store Directory Statistics:\n");
+ storeAppendPrintf(sentry, "Store Entries: %d\n", meta_data.store_entries);
+ storeAppendPrintf(sentry, "Store Swap Size: %d KB\n", store_swap_size);
+ for (i = 0; i<ncache_dirs; i++) {
+ SD = &SwapDirs[i];
+ storeAppendPrintf(sentry, "\n");
+ storeAppendPrintf(sentry, "Store Directory #%d: %s\n", i, SD->path);
+ storeAppendPrintf(sentry, "First level subdirectories: %d\n", SD->l1);
+ storeAppendPrintf(sentry, "Second level subdirectories: %d\n", SD->l2);
+ storeAppendPrintf(sentry, "Maximum Size: %d KB\n", SD->max_size);
+ storeAppendPrintf(sentry, "Current Size: %d KB\n", SD->cur_size);
+ storeAppendPrintf(sentry, "Percent Used: %0.2f%%\n",
+ 100.0 * SD->cur_size / SD->max_size);
+ }
+}