This patch is generated from the dtd branch of dsa in squid Wed Sep 29 00:01:41 2004 GMT See http://devel.squid-cache.org/ Index: squid/include/version.h diff -u squid/include/version.h:1.3.4.6.2.2 squid/include/version.h:1.3.4.7 --- squid/include/version.h:1.3.4.6.2.2 Wed Aug 14 04:27:28 2002 +++ squid/include/version.h Wed Aug 14 04:20:35 2002 @@ -8,5 +8,5 @@ #endif #ifndef SQUID_RELEASE_TIME -#define SQUID_RELEASE_TIME 1016582072 +#define SQUID_RELEASE_TIME squid_curtime #endif Index: squid/lib/Array.c diff -u squid/lib/Array.c:1.3.4.1.8.1 squid/lib/Array.c:1.3.4.1.10.2 --- squid/lib/Array.c:1.3.4.1.8.1 Wed Aug 14 03:15:30 2002 +++ squid/lib/Array.c Mon Dec 23 13:21:46 2002 @@ -107,10 +107,11 @@ { int i,j; assert(a); - assert(a->count > 0); + if (a->count == 0) return; /* do nothing, when nothing in array */ for (i = 0; i < a->count; ++i) if (a->items[i] == obj) break; + if (i == a->count) return; /* not found */ --a->count; for (j = i; j < a->count; ++j) a->items[j] = a->items[j+1]; Index: squid/src/HttpReply.c diff -u squid/src/HttpReply.c:1.3.4.3 squid/src/HttpReply.c:1.3.4.3.10.2 --- squid/src/HttpReply.c:1.3.4.3 Mon Jan 15 14:49:17 2001 +++ squid/src/HttpReply.c Wed Mar 10 22:02:57 2004 @@ -344,6 +344,13 @@ rep->content_type = StringNull; rep->cache_control = httpHeaderGetCc(hdr); rep->content_range = httpHeaderGetContRange(hdr); +#ifdef DTD + str = base64_decode(httpHeaderGetStr(hdr, HDR_CONTENT_MD5)); + if (str) + stringLimitInit(&rep->content_md5, str, MD5_DIGEST_CHARS); + else + rep->content_md5 = StringNull; +#endif rep->keep_alive = httpMsgIsPersistent(rep->sline.version, &rep->header); /* be sure to set expires after date and cache-control */ rep->expires = httpReplyHdrExpirationTime(rep); Index: squid/src/Makefile.in diff -u squid/src/Makefile.in:1.3.4.4.4.1 squid/src/Makefile.in:1.3.4.4.6.1.2.1 --- squid/src/Makefile.in:1.3.4.4.4.1 Wed Aug 14 03:15:31 2002 +++ squid/src/Makefile.in Mon Dec 23 20:58:04 2002 @@ -76,6 +76,7 @@ SHELL = /bin/sh INCLUDE = -I. -I../include -I$(top_srcdir)/include +DEFINES = -DDSA -DDTD CFLAGS = $(AC_CFLAGS) $(INCLUDE) $(DEFINES) SQUID_LIBS = -L../lib $(CRYPTLIB) $(REGEXLIB) @SQUID_PTHREAD_LIB@ \ $(SNMPLIB) $(MALLOCLIB) -lmiscutil $(XTRA_LIBS) @@ -147,7 +148,6 @@ neighbors.o \ net_db.o \ Packer.o \ - payload.o \ pconn.o \ peer_digest.o \ peer_select.o \ Index: squid/src/asn.c diff -u squid/src/asn.c:1.4.2.2.8.2 squid/src/asn.c:1.4.2.3.2.1 --- squid/src/asn.c:1.4.2.2.8.2 Wed Aug 14 04:27:28 2002 +++ squid/src/asn.c Fri Nov 15 01:10:31 2002 @@ -62,7 +62,11 @@ }; struct _ASState { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif store_client *sc; request_t *request; int as_number; @@ -187,7 +191,11 @@ asnCacheStart(int as) { LOCAL_ARRAY(char, asres, 4096); +#ifdef DSA + InstanceEntry *e; +#else StoreEntry *e; +#endif request_t *req; ASState *asState = xcalloc(1, sizeof(ASState)); cbdataAdd(asState, cbdataXfree, 0); @@ -197,19 +205,34 @@ req = urlParse(METHOD_GET, asres); assert(NULL != req); asState->request = requestLink(req); +#ifdef DSA + if ((e = instanceGetPublic(asres, METHOD_GET)) == NULL) { + e = instanceCreateEntry(asres, asres, null_request_flags, METHOD_GET); + asState->sc = storeClientListAdd(e->p, asState); +#else if ((e = storeGetPublic(asres, METHOD_GET)) == NULL) { e = storeCreateEntry(asres, asres, null_request_flags, METHOD_GET); asState->sc = storeClientListAdd(e, asState); +#endif fwdStart(-1, e, asState->request); } else { - payloadLockObject(e->p); +#ifdef DSA + storeLockObject(e->p); + asState->sc = storeClientListAdd(e->p, asState); +#else + storeLockObject(e); asState->sc = storeClientListAdd(e, asState); +#endif } asState->entry = e; asState->seen = 0; asState->offset = 0; storeClientCopy(asState->sc, +#ifdef DSA + e->p, +#else e, +#endif asState->seen, asState->offset, 4096, @@ -222,7 +245,11 @@ asHandleReply(void *data, char *buf, ssize_t size) { ASState *asState = data; +#ifdef DSA + StoreEntry *e = asState->entry->p; +#else StoreEntry *e = asState->entry; +#endif char *s; char *t; debug(53, 3) ("asHandleReply: Called with size=%d\n", size); @@ -231,7 +258,7 @@ asStateFree(asState); return; } - if (size == 0 && e->p->mem_obj->inmem_hi > 0) { + if (size == 0 && e->mem_obj->inmem_hi > 0) { memFree(buf, MEM_4K_BUF); asStateFree(asState); return; @@ -240,7 +267,7 @@ memFree(buf, MEM_4K_BUF); asStateFree(asState); return; - } else if (HTTP_OK != e->p->mem_obj->reply->sline.status) { + } else if (HTTP_OK != e->mem_obj->reply->sline.status) { debug(53, 1) ("WARNING: AS %d whois request failed\n", asState->as_number); memFree(buf, MEM_4K_BUF); @@ -269,7 +296,11 @@ debug(53, 3) ("asState->seen = %d, asState->offset = %d\n", asState->seen, asState->offset); if (e->store_status == STORE_PENDING) { +#ifdef DSA debug(53, 3) ("asHandleReply: store_status == STORE_PENDING: %s\n", storeUrl(e)); +#else + debug(53, 3) ("asHandleReply: store_status == STORE_PENDING: %s\n", storeUrl(e)); +#endif storeClientCopy(asState->sc, e, asState->seen, @@ -278,7 +309,7 @@ buf, asHandleReply, asState); - } else if (asState->seen < e->p->mem_obj->inmem_hi) { + } else if (asState->seen < e->mem_obj->inmem_hi) { debug(53, 3) ("asHandleReply: asState->seen < e->mem_obj->inmem_hi %s\n", storeUrl(e)); storeClientCopy(asState->sc, e, @@ -299,9 +330,15 @@ asStateFree(void *data) { ASState *asState = data; +#ifdef DSA + debug(53, 3) ("asnStateFree: %s\n", storeUrl(asState->entry->p)); + storeUnregister(asState->sc, asState->entry->p, asState); + storeUnlockObject(asState->entry->p); +#else debug(53, 3) ("asnStateFree: %s\n", storeUrl(asState->entry)); storeUnregister(asState->sc, asState->entry, asState); - payloadUnlockObject(asState->entry->p); + storeUnlockObject(asState->entry); +#endif requestUnlink(asState->request); cbdataFree(asState); } Index: squid/src/cache_manager.c diff -u squid/src/cache_manager.c:1.3.4.3.8.1 squid/src/cache_manager.c:1.3.4.3.10.1 --- squid/src/cache_manager.c:1.3.4.3.8.1 Wed Aug 14 03:15:31 2002 +++ squid/src/cache_manager.c Fri Nov 15 01:10:32 2002 @@ -38,7 +38,11 @@ #define MGR_PASSWD_SZ 128 typedef struct { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif char *action; char *user_name; char *passwd; @@ -187,26 +191,45 @@ safe_free(mgr->action); safe_free(mgr->user_name); safe_free(mgr->passwd); - payloadUnlockObject(mgr->entry->p); +#ifdef DSA + storeUnlockObject(mgr->entry->p); +#else + storeUnlockObject(mgr->entry); +#endif xfree(mgr); } void +#ifdef DSA +cachemgrStart(int fd, request_t * request, InstanceEntry * entry) +#else cachemgrStart(int fd, request_t * request, StoreEntry * entry) +#endif { cachemgrStateData *mgr = NULL; ErrorState *err = NULL; action_table *a; +#ifdef DSA + debug(16, 3) ("objectcacheStart: '%s'\n", storeUrl(entry->p)); + if ((mgr = cachemgrParseUrl(storeUrl(entry->p))) == NULL) { + err = errorCon(ERR_INVALID_URL, HTTP_NOT_FOUND); + err->url = xstrdup(storeUrl(entry->p)); +#else debug(16, 3) ("objectcacheStart: '%s'\n", storeUrl(entry)); if ((mgr = cachemgrParseUrl(storeUrl(entry))) == NULL) { err = errorCon(ERR_INVALID_URL, HTTP_NOT_FOUND); err->url = xstrdup(storeUrl(entry)); +#endif errorAppendEntry(entry, err); entry->expires = squid_curtime; return; } mgr->entry = entry; - payloadLockObject(entry->p); +#ifdef DSA + storeLockObject(entry->p); +#else + storeLockObject(entry); +#endif entry->expires = squid_curtime; debug(16, 5) ("CACHEMGR: %s requesting '%s'\n", fd_table[fd].ipaddr, mgr->action); @@ -236,11 +259,19 @@ */ httpHeaderPutAuth(&rep->header, "Basic", mgr->action); /* move info to the mem_obj->reply */ +#ifdef DSA httpReplyAbsorb(entry->p->mem_obj->reply, rep); /* store the reply */ - httpReplySwapOut(entry->p->mem_obj->reply, entry); + httpReplySwapOut(entry->p->mem_obj->reply, entry->p); entry->expires = squid_curtime; - storeComplete(entry); + storeComplete(entry->p); +#else + httpReplyAbsorb(entry->e->mem_obj->reply, rep); + /* store the reply */ + httpReplySwapOut(entry->e->mem_obj->reply, entry); + entry->expires = squid_curtime; + storeComplete(entry->e); +#endif cachemgrStateFree(mgr); return; } @@ -251,10 +282,18 @@ a = cachemgrFindAction(mgr->action); assert(a != NULL); if (a->flags.atomic) +#ifdef DSA + storeBuffer(entry->p); +#else storeBuffer(entry); +#endif { http_version_t version; +#ifdef DSA HttpReply *rep = entry->p->mem_obj->reply; +#else + HttpReply *rep = entry->mem_obj->reply; +#endif /* prove there are no previous reply headers around */ assert(0 == rep->sline.status); httpBuildVersion(&version, 1, 0); @@ -266,12 +305,23 @@ -1, /* C-Len */ squid_curtime, /* LMT */ squid_curtime); +#ifdef DSA + httpReplySwapOut(rep, entry->p); +#else httpReplySwapOut(rep, entry); +#endif } +#ifdef DSA + a->handler(entry->p); + if (a->flags.atomic) { + storeBufferFlush(entry->p); + storeComplete(entry->p); +#else a->handler(entry); if (a->flags.atomic) { storeBufferFlush(entry); storeComplete(entry); +#endif } cachemgrStateFree(mgr); } Index: squid/src/client_side.c diff -u squid/src/client_side.c:1.5.2.8.2.2 squid/src/client_side.c:1.5.2.9.2.11.2.10 --- squid/src/client_side.c:1.5.2.8.2.2 Wed Aug 14 04:27:28 2002 +++ squid/src/client_side.c Wed Mar 10 22:02:57 2004 @@ -94,7 +94,14 @@ static void clientCheckNoCache(clientHttpRequest *); static void clientCheckNoCacheDone(int answer, void *data); static STCB clientHandleIMSReply; +#ifdef DTD +static STCB clientHandleHEADReply; +#endif +#ifdef DSA +static int clientGetsOldEntry(InstanceEntry * new, InstanceEntry * old, request_t * request); +#else static int clientGetsOldEntry(StoreEntry * new, StoreEntry * old, request_t * request); +#endif static int checkAccelOnly(clientHttpRequest *); #if USE_IDENT static IDCB clientIdentDone; @@ -117,6 +124,147 @@ static int clientReplyBodyTooLarge(int clen); static int clientRequestBodyTooLarge(int clen); +#ifdef DTD +static void +clientHandleHEADReply(void *data, char *buf, ssize_t size) +{ + clientHttpRequest *http = data; + StoreEntry *entry = http->entry ? http->entry->p : NULL; + MemObject *mem; + const char *url = storeUrl(entry); + http_status status; + debug(33, 3) ("clientHandleHEADReply: %s, %d bytes\n", url, (int) size); + if (entry == NULL) { + memFree(buf, MEM_CLIENT_SOCK_BUF); + return; + } + if (size < 0 && !EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + memFree(buf, MEM_CLIENT_SOCK_BUF); + return; + } + mem = entry->mem_obj; + status = mem->reply->sline.status; + if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { + debug(33, 3) ("clientHandleHEADReply: ABORTED '%s'\n", url); + /* We have an existing entry, but failed to validate it */ + /* Its okay to send the old one anyway */ + http->log_type = LOG_TCP_REFRESH_FAIL_HIT; + storeUnregister(http->sc, entry, http); + storeUnlockObject(entry); + http->entry = http->old_entry; + entry = http->entry ? http->entry->p : NULL; + http->sc = http->old_sc; + } else if (STORE_PENDING == entry->store_status && 0 == status) { + debug(33, 3) ("clientHandleHEADReply: Incomplete headers for '%s'\n", url); + if (size >= CLIENT_SOCK_SZ) { + /* will not get any bigger than that */ + debug(33, 3) ("clientHandleHEADReply: Reply is too large '%s', using old entry\n", url); + /* use old entry, this repeats the code abovez */ + http->log_type = LOG_TCP_REFRESH_FAIL_HIT; + storeUnregister(http->sc, entry, http); + storeUnlockObject(entry); + http->entry = http->old_entry; + entry = http->entry ? http->entry->p : NULL; + http->sc = http->old_sc; + /* continue */ + } else { + storeClientCopy(http->sc, entry, + http->out.offset + size, + http->out.offset, + CLIENT_SOCK_SZ, + buf, + clientHandleHEADReply, + http); + return; + } + } else { + MemObject * mem = entry->mem_obj; + /* now we got the HEAD reply, see what we get in Content-MD5 */ + if (strLen(mem->reply->content_md5) == MD5_DIGEST_CHARS) { + StoreEntry * p = storeGet(strBuf(mem->reply->content_md5)); + if (p && storeValidToSend(p)) { /* DTD hit */ +#if 0 + int unlink_request = 0; + + if (http->old_entry->p->mem_obj->request == NULL) { + http->old_entry->p->mem_obj->request = requestLink(mem->request); + unlink_request = 1; + } +#endif + EBIT_SET(http->entry->p->flags, ENTRY_FWD_HDR_WAIT); + storeTimestampsSet(http->old_entry); + http->old_entry->lastmod = http->entry->lastmod; +// arrayDelete(http->entry->p->instances, http->entry); + storeUnregister(http->sc, http->entry->p, http); + http->sc = http->old_sc; + storeUnlockObject(http->entry->p); + http->entry = http->old_entry; + http->entry->timestamp = squid_curtime; +#if 0 + if (unlink_request) { + requestUnlink(http->entry->p->mem_obj->request); + http->entry->p->mem_obj->request = NULL; + } +#endif + http->old_entry = NULL; + http->old_sc = NULL; + /* set the StoreEntry for DTD to the parameters of the + * StoreEntry in cache */ +// storeUnregister(http->sc, http->entry->p, http); + EBIT_CLR(http->entry->flags, ENTRY_DISPATCHED); + if (http->entry->p->hash.key) { + storeKeyFree(http->entry->p->hash.key); + http->entry->p->hash.key = NULL; + } + http->entry->p->hash.key = storeKeyDup(strBuf(mem->reply->content_md5)); + storeAddInstanceEntry(p, http->entry); + EBIT_CLR(http->entry->p->flags, KEY_PRIVATE); + EBIT_SET(http->entry->p->flags, ENTRY_FWD_HDR_WAIT); + http->entry->p->flags = p->flags; + http->entry->p->mem_obj->object_sz = -1; + http->entry->p->swap_file_sz = p->swap_file_sz; + http->entry->p->swap_filen = p->swap_filen; + http->entry->p->swap_dirn = p->swap_dirn; + http->entry->p->store_status = STORE_OK; + http->entry->p->swap_status = SWAPOUT_DONE; + http->request->method = METHOD_GET; + http->sc->type = STORE_DISK_CLIENT; + http->out.offset = 0; + p->lastref = http->entry->p->lastref; + p->refcount += http->entry->p->refcount; + + /* this section copies from clientProcessRequest */ +// storeLockObject(http->entry->p); + storeCreateMemObject(http->entry->p, http->uri, http->log_uri); +// http->sc = storeClientListAdd(http->entry->p, http); + http->log_type = LOG_TCP_HIT; + + storeClientCopy(http->sc, http->entry->p, + http->out.offset, + http->out.offset, + CLIENT_SOCK_SZ, + memAllocate(MEM_CLIENT_SOCK_BUF), + clientCacheHit, + http); + } + else { /* DTD miss */ + if (entry->hash.key) { + storeKeyFree(entry->hash.key); + entry->hash.key = NULL; + } + entry->hash.key = storeKeyDup(strBuf(mem->reply->content_md5)); + EBIT_CLR(entry->flags, KEY_PRIVATE); +assert(entry->hash.key); + storeClientCopy(http->sc, http->entry->p, mem->inmem_hi, 0, CLIENT_SOCK_SZ, memAllocate(MEM_CLIENT_SOCK_BUF), clientSendMoreData, http); + } + } + else { /* Invalid or missing Content-MD5 tag, a cache miss */ + storeClientCopy(http->sc, http->entry->p, mem->inmem_hi, 0, CLIENT_SOCK_SZ, memAllocate(MEM_CLIENT_SOCK_BUF), clientSendMoreData, http); + } + } +} +#endif + static int checkAccelOnly(clientHttpRequest * http) { @@ -191,6 +339,30 @@ EBIT_TEST(r->cache_control->mask, CC_ONLY_IF_CACHED); } +#ifdef DSA +InstanceEntry * +clientCreateStoreEntry(clientHttpRequest * h, method_t m, request_flags flags) +{ + InstanceEntry *e; + /* + * For erroneous requests, we might not have a h->request, + * so make a fake one. + */ + if (h->request == NULL) + h->request = requestLink(requestCreate(m, PROTO_NONE, null_string)); + e = instanceCreateEntry(h->uri, h->log_uri, flags, m); + h->sc = storeClientListAdd(e->p, h); +#if DELAY_POOLS + delaySetStoreClient(h->sc, delayClient(h->request)); +#endif +#ifdef DTD + if (h->request->method != METHOD_GET || h->request->flags.ims || h->request->flags.refresh || h->request->flags.nocache || !h->request->flags.cachable) +#endif + storeClientCopy(h->sc, e->p, 0, 0, CLIENT_SOCK_SZ, + memAllocate(MEM_CLIENT_SOCK_BUF), clientSendMoreData, h); + return e; +} +#else StoreEntry * clientCreateStoreEntry(clientHttpRequest * h, method_t m, request_flags flags) { @@ -202,7 +374,6 @@ if (h->request == NULL) h->request = requestLink(requestCreate(m, PROTO_NONE, null_string)); e = storeCreateEntry(h->uri, h->log_uri, flags, m); - /* initialize PayloadEntry */ h->sc = storeClientListAdd(e, h); #if DELAY_POOLS delaySetStoreClient(h->sc, delayClient(h->request)); @@ -211,6 +382,7 @@ memAllocate(MEM_CLIENT_SOCK_BUF), clientSendMoreData, h); return e; } +#endif void clientAccessCheckDone(int answer, void *data) @@ -345,7 +517,11 @@ { clientHttpRequest *http = data; char *url = http->uri; +#ifdef DSA + InstanceEntry *entry = NULL; +#else StoreEntry *entry = NULL; +#endif debug(33, 3) ("clientProcessExpired: '%s'\n", http->uri); assert(http->entry->lastmod >= 0); /* @@ -366,12 +542,21 @@ * freed from memory before we need to access it. */ assert(http->sc->callback_data == http); +#ifdef DSA + entry = instanceCreateEntry(url, + http->log_uri, + http->request->flags, + http->request->method); + /* NOTE, don't call storeLockObject(), storeCreateEntry() does it */ + http->sc = storeClientListAdd(entry->p, http); +#else entry = storeCreateEntry(url, http->log_uri, - http->request->flags, + http->request->flags, http->request->method); /* NOTE, don't call storeLockObject(), storeCreateEntry() does it */ http->sc = storeClientListAdd(entry, http); +#endif #if DELAY_POOLS /* delay_id is already set on original store client */ delaySetStoreClient(http->sc, delayClient(http->request)); @@ -382,9 +567,15 @@ http->out.offset = 0; fwdStart(http->conn->fd, http->entry, http->request); /* Register with storage manager to receive updates when data comes in. */ +#ifdef DSA + if (EBIT_TEST(entry->p->flags, ENTRY_ABORTED)) + debug(33, 0) ("clientProcessExpired: found ENTRY_ABORTED object\n"); + storeClientCopy(http->sc, entry->p, +#else if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) debug(33, 0) ("clientProcessExpired: found ENTRY_ABORTED object\n"); storeClientCopy(http->sc, entry, +#endif http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -394,9 +585,15 @@ } static int -clientGetsOldEntry(StoreEntry * new_entry, StoreEntry * old_entry, request_t * request) +#ifdef DSA +clientGetsOldEntry(InstanceEntry * new_entry, InstanceEntry * old_entry, request_t * request) { const http_status status = new_entry->p->mem_obj->reply->sline.status; +#else +clientGetsOldEntry(StoreEntry * new_entry, StoreEntry * old_entry, request_t * request) +{ + const http_status status = new_entry->mem_obj->reply->sline.status; +#endif if (0 == status) { debug(33, 5) ("clientGetsOldEntry: YES, broken HTTP reply\n"); return 1; @@ -435,11 +632,19 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) { clientHttpRequest *http = data; +#ifdef DSA + InstanceEntry *entry = http->entry; + MemObject *mem; + const char *url = storeUrl(entry->p); + int unlink_request = 0; + InstanceEntry *oldentry; +#else StoreEntry *entry = http->entry; MemObject *mem; const char *url = storeUrl(entry); int unlink_request = 0; StoreEntry *oldentry; +#endif int recopy = 1; http_status status; debug(33, 3) ("clientHandleIMSReply: %s, %d bytes\n", url, (int) size); @@ -447,35 +652,62 @@ memFree(buf, MEM_CLIENT_SOCK_BUF); return; } +#ifdef DSA + if (size < 0 && !EBIT_TEST(entry->p->flags, ENTRY_ABORTED)) { +#else if (size < 0 && !EBIT_TEST(entry->flags, ENTRY_ABORTED)) { +#endif memFree(buf, MEM_CLIENT_SOCK_BUF); return; } +#ifdef DSA mem = entry->p->mem_obj; status = mem->reply->sline.status; + if (EBIT_TEST(entry->p->flags, ENTRY_ABORTED)) { +#else + mem = entry->mem_obj; + status = mem->reply->sline.status; if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { +#endif debug(33, 3) ("clientHandleIMSReply: ABORTED '%s'\n", url); /* We have an existing entry, but failed to validate it */ /* Its okay to send the old one anyway */ http->log_type = LOG_TCP_REFRESH_FAIL_HIT; +#ifdef DSA + storeUnregister(http->sc, entry->p, http); + storeUnlockObject(entry->p); + entry = http->entry = http->old_entry; + http->sc = http->old_sc; + } else if (STORE_PENDING == entry->p->store_status && 0 == status) { +#else storeUnregister(http->sc, entry, http); - payloadUnlockObject(entry->p); + storeUnlockObject(entry); entry = http->entry = http->old_entry; http->sc = http->old_sc; } else if (STORE_PENDING == entry->store_status && 0 == status) { +#endif debug(33, 3) ("clientHandleIMSReply: Incomplete headers for '%s'\n", url); if (size >= CLIENT_SOCK_SZ) { /* will not get any bigger than that */ debug(33, 3) ("clientHandleIMSReply: Reply is too large '%s', using old entry\n", url); /* use old entry, this repeats the code abovez */ http->log_type = LOG_TCP_REFRESH_FAIL_HIT; +#ifdef DSA + storeUnregister(http->sc, entry->p, http); + storeUnlockObject(entry->p); +#else storeUnregister(http->sc, entry, http); - payloadUnlockObject(entry->p); + storeUnlockObject(entry); +#endif entry = http->entry = http->old_entry; http->sc = http->old_sc; /* continue */ } else { +#ifdef DSA + storeClientCopy(http->sc, entry->p, +#else storeClientCopy(http->sc, entry, +#endif http->out.offset + size, http->out.offset, CLIENT_SOCK_SZ, @@ -490,46 +722,79 @@ * headers have been loaded from disk. */ oldentry = http->old_entry; http->log_type = LOG_TCP_REFRESH_HIT; +#ifdef DSA if (oldentry->p->mem_obj->request == NULL) { oldentry->p->mem_obj->request = requestLink(mem->request); +#else + if (oldentry->mem_obj->request == NULL) { + oldentry->mem_obj->request = requestLink(mem->request); +#endif unlink_request = 1; } /* Don't memcpy() the whole reply structure here. For example, * www.thegist.com (Netscape/1.13) returns a content-length for * 304's which seems to be the length of the 304 HEADERS!!! and * not the body they refer to. */ +#ifdef DSA httpReplyUpdateOnNotModified(oldentry->p->mem_obj->reply, mem->reply); storeTimestampsSet(oldentry); + storeUnregister(http->sc, entry->p, http); + http->sc = http->old_sc; + storeUnlockObject(entry->p); +#else + httpReplyUpdateOnNotModified(oldentry->mem_obj->reply, mem->reply); + storeTimestampsSet(oldentry); storeUnregister(http->sc, entry, http); http->sc = http->old_sc; - payloadUnlockObject(entry->p); + storeUnlockObject(entry); +#endif entry = http->entry = oldentry; entry->timestamp = squid_curtime; if (unlink_request) { +#ifdef DSA requestUnlink(entry->p->mem_obj->request); entry->p->mem_obj->request = NULL; +#else + requestUnlink(entry->mem_obj->request); + entry->mem_obj->request = NULL; +#endif } } else { /* the client can handle this reply, whatever it is */ http->log_type = LOG_TCP_REFRESH_MISS; if (HTTP_NOT_MODIFIED == mem->reply->sline.status) { +#ifdef DSA httpReplyUpdateOnNotModified(http->old_entry->p->mem_obj->reply, mem->reply); storeTimestampsSet(http->old_entry); http->log_type = LOG_TCP_REFRESH_HIT; } - else { /* REFRESH_MISS, remove StoreEntry from PayloadEntry */ - payloadRemoveStoreEntry(http->old_entry->p, http->old_entry); - } + else + storeRemoveInstanceEntry(http->old_entry->p, http->old_entry); + storeUnregister(http->old_sc, http->old_entry->p, http); + storeUnlockObject(http->old_entry->p); +#else + httpReplyUpdateOnNotModified(http->old_entry->mem_obj->reply, + mem->reply); + storeTimestampsSet(http->old_entry); + http->log_type = LOG_TCP_REFRESH_HIT; + } storeUnregister(http->old_sc, http->old_entry, http); - payloadUnlockObject(http->old_entry->p); + storeUnlockObject(http->old_entry); +#endif recopy = 0; } http->old_entry = NULL; /* done with old_entry */ http->old_sc = NULL; +#ifdef DSA + assert(!EBIT_TEST(entry->p->flags, ENTRY_ABORTED)); + if (recopy) { + storeClientCopy(http->sc, entry->p, +#else assert(!EBIT_TEST(entry->flags, ENTRY_ABORTED)); if (recopy) { storeClientCopy(http->sc, entry, +#endif http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -542,12 +807,24 @@ } int +#ifdef DSA +modifiedSince(InstanceEntry * entry, request_t * request) +#else modifiedSince(StoreEntry * entry, request_t * request) +#endif { int object_length; +#ifdef DSA MemObject *mem = entry->p->mem_obj; +#else + MemObject *mem = entry->mem_obj; +#endif time_t mod_time = entry->lastmod; +#ifdef DSA + debug(33, 3) ("modifiedSince: '%s'\n", storeUrl(entry->p)); +#else debug(33, 3) ("modifiedSince: '%s'\n", storeUrl(entry)); +#endif if (mod_time < 0) mod_time = entry->timestamp; debug(33, 3) ("modifiedSince: mod_time = %d\n", (int) mod_time); @@ -556,7 +833,11 @@ /* Find size of the object */ object_length = mem->reply->content_length; if (object_length < 0) +#ifdef DSA + object_length = contentLen(entry->p); +#else object_length = contentLen(entry); +#endif if (mod_time > request->ims) { debug(33, 3) ("--> YES: entry newer than client\n"); return 1; @@ -578,7 +859,11 @@ void clientPurgeRequest(clientHttpRequest * http) { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif ErrorState *err = NULL; HttpReply *r; http_status status; @@ -596,26 +881,58 @@ http->log_type = LOG_TCP_MISS; /* Release both IP and object cache entries */ ipcacheInvalidate(http->request->host); +#ifdef DSA + if ((entry = instanceGetPublic(http->uri, METHOD_GET)) == NULL) { + status = HTTP_NOT_FOUND; + } else { + instanceRelease(entry); +#else if ((entry = storeGetPublic(http->uri, METHOD_GET)) == NULL) { status = HTTP_NOT_FOUND; } else { storeRelease(entry); +#endif status = HTTP_OK; } debug(33, 4) ("clientPurgeRequest: Not modified '%s'\n", +#ifdef DSA + storeUrl(entry->p)); +#else storeUrl(entry)); +#endif /* * Make a new entry to hold the reply to be written * to the client. */ http->entry = clientCreateStoreEntry(http, http->request->method, null_request_flags); +#ifdef DSA httpReplyReset(r = http->entry->p->mem_obj->reply); httpBuildVersion(&version, 1, 0); httpReplySetHeaders(r, version, status, NULL, NULL, 0, 0, -1); + httpReplySwapOut(r, http->entry->p); + storeComplete(http->entry->p); +#else + httpReplyReset(r = http->entry->mem_obj->reply); + httpBuildVersion(&version, 1, 0); + httpReplySetHeaders(r, version, status, NULL, NULL, 0, 0, -1); httpReplySwapOut(r, http->entry); storeComplete(http->entry); +#endif } +#ifdef DSA +int +checkNegativeHit(InstanceEntry * e) +{ + if (!EBIT_TEST(e->flags, ENTRY_NEGCACHED)) + return 0; + if (e->expires <= squid_curtime) + return 0; + if (e->p->store_status != STORE_OK) + return 0; + return 1; +} +#else int checkNegativeHit(StoreEntry * e) { @@ -627,6 +944,7 @@ return 0; return 1; } +#endif void clientUpdateCounters(clientHttpRequest * http) @@ -698,10 +1016,18 @@ clientHttpRequest *http = data; clientHttpRequest **H; ConnStateData *conn = http->conn; +#ifdef DSA + InstanceEntry *e; +#else StoreEntry *e; +#endif request_t *request = http->request; MemObject *mem = NULL; +#ifdef DSA + debug(33, 3) ("httpRequestFree: %s\n", storeUrl(http->entry->p)); +#else debug(33, 3) ("httpRequestFree: %s\n", storeUrl(http->entry)); +#endif if (!clientCheckTransferDone(http)) { #if MYSTERIOUS_CODE /* @@ -712,15 +1038,25 @@ if ((e = http->entry)) { http->entry = NULL; storeUnregister(http->sc, e, http); - payloadUnlockObject(e); + storeUnlockObject(e); } #endif +#ifdef DSA + if (http->entry && http->entry->p && http->entry->p->ping_status == PING_WAITING) + storeReleaseRequest(http->entry->p); +#else if (http->entry && http->entry->ping_status == PING_WAITING) storeReleaseRequest(http->entry); +#endif } assert(http->log_type < LOG_TYPE_MAX); - if (http->entry) +#ifdef DSA + if (http->entry && http->entry->p) mem = http->entry->p->mem_obj; +#else + if (http->entry) + mem = http->entry->mem_obj; +#endif if (http->out.size || http->log_type) { http->al.icp.opcode = ICP_INVALID; http->al.url = http->log_uri; @@ -765,18 +1101,64 @@ safe_free(http->redirect.location); stringClean(&http->range_iter.boundary); if ((e = http->entry)) { +#ifdef DSA + /* ymc: + * In this version, StoreEntry is the argument + * for most store.c functions. That means + * when there is a MISS and the StoreEntry + * created for the connection between + * proxy and server will remain attached + * to the InstanceEntry until the end of that + * connection. Sometimes, when we already + * have this StoreEntry in cache (ie web object + * of the same Content Digest is in the cache) + * We will have to replace the link from + * our InstanceEntry to that old StoreEntry + * That's exactly what we are doing here. + */ + if (!EBIT_TEST(e->p->flags, ENTRY_FWD_HDR_WAIT)) { + StoreEntry * p = NULL; + StoreEntry * op = http->entry->p; + p = storeGet(op->hash.key); + http->entry = NULL; + if (p == op) storeLockObject(p); + storeUnregister(http->sc, e->p, http); + if (p && p != op && storeValidToSend(p) && !EBIT_TEST(e->flags, RELEASE_REQUEST)) { + arrayDelete(op->instances, e); + storeSetPublicKey(e); +#ifdef DTD + e->p->swap_file_sz = -1; + e->p->swap_filen = -1; + e->p->swap_dirn = -1; + e->p = p; + storeLockObject(p); +#else + e->p = p; +#endif + } + } + http->sc = NULL; + storeUnlockObject(e->p); +#else http->entry = NULL; storeUnregister(http->sc, e, http); http->sc = NULL; - payloadUnlockObject(e->p); + storeUnlockObject(e); +#endif } /* old_entry might still be set if we didn't yet get the reply * code in clientHandleIMSReply() */ if ((e = http->old_entry)) { http->old_entry = NULL; +#ifdef DSA + storeUnregister(http->old_sc, e->p, http); + http->old_sc = NULL; + storeUnlockObject(e->p); +#else storeUnregister(http->old_sc, e, http); http->old_sc = NULL; - payloadUnlockObject(e->p); + storeUnlockObject(e); +#endif } requestUnlink(http->request); assert(http != http->next); @@ -1097,14 +1479,22 @@ const HttpHdrRangeSpec *spec; MemBuf mb; +#ifdef DSA assert(http->entry->p->mem_obj); +#else + assert(http->entry->mem_obj); +#endif memBufDefInit(&mb); while ((spec = httpHdrRangeGetSpec(http->request->range, &pos))) { /* account for headers for this range */ memBufReset(&mb); +#ifdef DSA clientPackRangeHdr(http->entry->p->mem_obj->reply, +#else + clientPackRangeHdr(http->entry->mem_obj->reply, +#endif spec, http->range_iter.boundary, &mb); clen += mb.size; @@ -1141,7 +1531,11 @@ range_err = "origin server does ranges"; else if (rep->content_length < 0) range_err = "unknown length"; +#ifdef DSA else if (rep->content_length != http->entry->p->mem_obj->reply->content_length) +#else + else if (rep->content_length != http->entry->mem_obj->reply->content_length) +#endif range_err = "INCONSISTENT length"; /* a bug? */ else if (httpHeaderHas(&http->request->header, HDR_IF_RANGE) && !clientIfRangeMatch(http, rep)) range_err = "If-Range match failed"; @@ -1299,7 +1693,7 @@ * debugger [hdr->entries.count-1]. */ httpHeaderPutStr(hdr, HDR_X_REQUEST_URI, - http->entry->p->mem_obj->url ? http->entry->p->mem_obj->url : http->uri); + http->entry->mem_obj->url ? http->entry->mem_obj->url : http->uri); #endif } @@ -1341,7 +1735,11 @@ clientCacheHit(void *data, char *buf, ssize_t size) { clientHttpRequest *http = data; +#ifdef DSA + InstanceEntry *e = http->entry; +#else StoreEntry *e = http->entry; +#endif MemObject *mem; request_t *r = http->request; debug(33, 3) ("clientCacheHit: %s, %d bytes\n", http->uri, (int) size); @@ -1354,24 +1752,41 @@ memFree(buf, MEM_CLIENT_SOCK_BUF); debug(33, 3) ("clientCacheHit: swapin failure for %s\n", http->uri); http->log_type = LOG_TCP_SWAPFAIL_MISS; +#ifdef DSA + if ((e = http->entry) && e->p) { + http->entry = NULL; + storeUnregister(http->sc, e->p, http); + http->sc = NULL; + storeUnlockObject(e->p); +#else if ((e = http->entry)) { http->entry = NULL; storeUnregister(http->sc, e, http); http->sc = NULL; - payloadUnlockObject(e->p); + storeUnlockObject(e); +#endif } clientProcessMiss(http); return; } assert(size > 0); +#ifdef DSA mem = e->p->mem_obj; + assert(!EBIT_TEST(e->p->flags, ENTRY_ABORTED)); +#else + mem = e->mem_obj; assert(!EBIT_TEST(e->flags, ENTRY_ABORTED)); +#endif if (mem->reply->sline.status == 0) { /* * we don't have full reply headers yet; either wait for more or * punt to clientProcessMiss. */ - if (e->p->mem_status == IN_MEMORY || e->store_status == STORE_OK) { +#ifdef DSA + if (e->p->mem_status == IN_MEMORY || e->p->store_status == STORE_OK) { +#else + if (e->mem_status == IN_MEMORY || e->store_status == STORE_OK) { +#endif memFree(buf, MEM_CLIENT_SOCK_BUF); clientProcessMiss(http); } else if (size == CLIENT_SOCK_SZ && http->out.offset == 0) { @@ -1379,7 +1794,11 @@ clientProcessMiss(http); } else { debug(33, 3) ("clientCacheHit: waiting for HTTP reply headers\n"); +#ifdef DSA + storeClientCopy(http->sc, e->p, +#else storeClientCopy(http->sc, e, +#endif http->out.offset + size, http->out.offset, CLIENT_SOCK_SZ, @@ -1402,7 +1821,11 @@ * request. We cannot validate a cached object for a HEAD * request, nor can we return 304. */ +#ifdef DSA if (e->p->mem_status == IN_MEMORY) +#else + if (e->mem_status == IN_MEMORY) +#endif http->log_type = LOG_TCP_MEM_HIT; clientSendMoreData(data, buf, size); } else if (refreshCheckHTTP(e, r) && !http->flags.internal) { @@ -1463,12 +1886,21 @@ clientSendMoreData(data, buf, size); } else { time_t timestamp = e->timestamp; +#ifdef DSA MemBuf mb = httpPacked304Reply(e->p->mem_obj->reply); http->log_type = LOG_TCP_IMS_HIT; memFree(buf, MEM_CLIENT_SOCK_BUF); + storeUnregister(http->sc, e->p, http); + http->sc = NULL; + storeUnlockObject(e->p); +#else + MemBuf mb = httpPacked304Reply(e->mem_obj->reply); + http->log_type = LOG_TCP_IMS_HIT; + memFree(buf, MEM_CLIENT_SOCK_BUF); storeUnregister(http->sc, e, http); http->sc = NULL; - payloadUnlockObject(e->p); + storeUnlockObject(e); +#endif e = clientCreateStoreEntry(http, http->request->method, null_request_flags); /* * Copy timestamp from the original entry so the 304 @@ -1476,16 +1908,27 @@ */ e->timestamp = timestamp; http->entry = e; +#ifdef DSA httpReplyParse(e->p->mem_obj->reply, mb.buf, mb.size); + storeAppend(e->p, mb.buf, mb.size); + memBufClean(&mb); + storeComplete(e->p); +#else + httpReplyParse(e->mem_obj->reply, mb.buf, mb.size); storeAppend(e, mb.buf, mb.size); memBufClean(&mb); storeComplete(e); +#endif } } else { /* * plain ol' cache hit */ +#ifdef DSA if (e->p->mem_status == IN_MEMORY) +#else + if (e->mem_status == IN_MEMORY) +#endif http->log_type = LOG_TCP_MEM_HIT; else if (Config.onoff.offline) http->log_type = LOG_TCP_OFFLINE_HIT; @@ -1554,9 +1997,15 @@ * multi-range */ if (http->request->range->specs.count > 1 && i->debt_size == i->spec->length) { +#ifdef DSA assert(http->entry->p->mem_obj); clientPackRangeHdr( http->entry->p->mem_obj->reply, /* original reply */ +#else + assert(http->entry->mem_obj); + clientPackRangeHdr( + http->entry->mem_obj->reply, /* original reply */ +#endif i->spec, /* current range */ i->boundary, /* boundary, the same for all */ mb @@ -1688,7 +2137,11 @@ clientSendMoreData(void *data, char *buf, ssize_t size) { clientHttpRequest *http = data; +#ifdef DSA + StoreEntry *entry = http->entry ? http->entry->p : NULL; +#else StoreEntry *entry = http->entry; +#endif ConnStateData *conn = http->conn; int fd = conn->fd; HttpReply *rep = NULL; @@ -1737,9 +2190,15 @@ if (rep && clientReplyBodyTooLarge(rep->content_length)) { ErrorState *err = errorCon(ERR_TOO_BIG, HTTP_FORBIDDEN); err->request = requestLink(http->request); +#ifdef DSA + storeUnregister(http->sc, http->entry->p, http); + http->sc = NULL; + storeUnlockObject(http->entry->p); +#else storeUnregister(http->sc, http->entry, http); http->sc = NULL; - payloadUnlockObject(http->entry->p); + storeUnlockObject(http->entry); +#endif http->entry = clientCreateStoreEntry(http, http->request->method, null_request_flags); errorAppendEntry(http->entry, err); @@ -1873,7 +2332,11 @@ /* * Note, the FD may be closed at this point. */ +#ifdef DSA + } else if ((entry = http->entry->p) == NULL) { +#else } else if ((entry = http->entry) == NULL) { +#endif /* * this request is in progress, maybe doing an ACL or a redirect, * execution will resume after the operation completes. @@ -1900,7 +2363,11 @@ clientWriteComplete(int fd, char *bufnotused, size_t size, int errflag, void *data) { clientHttpRequest *http = data; +#ifdef DSA + StoreEntry *entry = http->entry ? http->entry->p : NULL; +#else StoreEntry *entry = http->entry; +#endif int done; http->out.size += size; debug(33, 5) ("clientWriteComplete: FD %d, sz %d, err %d, off %d, len %d\n", @@ -1922,7 +2389,7 @@ } else if ((done = clientCheckTransferDone(http)) != 0 || size == 0) { debug(33, 5) ("clientWriteComplete: FD %d transfer is DONE\n", fd); /* We're finished case */ - if (httpReplyBodySize(http->request->method, entry->p->mem_obj->reply) < 0) { + if (httpReplyBodySize(http->request->method, entry->mem_obj->reply) < 0) { debug(33, 5) ("clientWriteComplete: closing, content_length < 0\n"); comm_close(fd); } else if (!done) { @@ -1944,6 +2411,9 @@ * storage manager. */ if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) debug(33, 0) ("clientWriteComplete 2: ENTRY_ABORTED\n"); +#ifdef DTD + if (http->sc->entry != entry) http->sc->entry = entry; +#endif storeClientCopy(http->sc, entry, http->out.offset, http->out.offset, @@ -1972,10 +2442,17 @@ err = errorCon(ERR_ONLY_IF_CACHED_MISS, HTTP_GATEWAY_TIMEOUT); err->request = requestLink(r); err->src_addr = http->conn->peer.sin_addr; +#ifdef DSA + if (http->entry) { + storeUnregister(http->sc, http->entry->p, http); + http->sc = NULL; + storeUnlockObject(http->entry->p); +#else if (http->entry) { storeUnregister(http->sc, http->entry, http); http->sc = NULL; - payloadUnlockObject(http->entry->p); + storeUnlockObject(http->entry); +#endif } http->entry = clientCreateStoreEntry(http, r->method, null_request_flags); errorAppendEntry(http->entry, err); @@ -2005,8 +2482,8 @@ * if the part we want is already cached. If so, we don't * force a miss. */ - assert(NULL != entry->p->mem_obj); - if (httpHdrRangeFirstOffset(range) <= entry->p->mem_obj->inmem_hi) + assert(NULL != entry->mem_obj); + if (httpHdrRangeFirstOffset(range) <= entry->mem_obj->inmem_hi) return 0; /* * Even though we have a PENDING copy of the object, we @@ -2021,11 +2498,31 @@ clientProcessRequest2(clientHttpRequest * http) { request_t *r = http->request; +#ifdef DSA + InstanceEntry *e; + e = http->entry = instanceGetPublic(http->uri, r->method); + /* + if (e && e->p == NULL) { + EBIT_CLR(e->flags, ENTRY_CACHABLE); + instanceRelease(e); + e = http->entry = NULL; + } + if (e && e->p && e->p->hash.key == NULL) { + EBIT_CLR(e->flags, ENTRY_CACHABLE); + instanceRelease(e); + e = http->entry = NULL; + } + */ + if (r->method == METHOD_HEAD && e == NULL) { + /* We can generate a HEAD reply from a cached GET object */ + e = http->entry = instanceGetPublic(http->uri, METHOD_GET); +#else StoreEntry *e; e = http->entry = storeGetPublic(http->uri, r->method); if (r->method == METHOD_HEAD && e == NULL) { /* We can generate a HEAD reply from a cached GET object */ e = http->entry = storeGetPublic(http->uri, METHOD_GET); +#endif } /* Release negatively cached IP-cache entries on reload */ if (r->flags.nocache) @@ -2064,10 +2561,17 @@ return LOG_TCP_HIT; } #if HTTP_VIOLATIONS +#ifdef DSA + if (e->p->store_status == STORE_PENDING) { + if (r->flags.nocache || r->flags.nocache_hack) { + debug(33, 3) ("Clearing no-cache for STORE_PENDING request\n\t%s\n", + storeUrl(e->p)); +#else if (e->store_status == STORE_PENDING) { if (r->flags.nocache || r->flags.nocache_hack) { debug(33, 3) ("Clearing no-cache for STORE_PENDING request\n\t%s\n", storeUrl(e)); +#endif r->flags.nocache = 0; r->flags.nocache_hack = 0; } @@ -2091,7 +2595,11 @@ debug(33, 3) ("clientProcessRequest2: complex range MISS\n"); http->entry = NULL; return LOG_TCP_MISS; +#ifdef DSA + } else if (clientCheckRangeForceMiss(e->p, r->range)) { +#else } else if (clientCheckRangeForceMiss(e, r->range)) { +#endif debug(33, 3) ("clientProcessRequest2: forcing miss due to range_offset_limit\n"); http->entry = NULL; return LOG_TCP_MISS; @@ -2122,16 +2630,28 @@ } else if (r->method == METHOD_TRACE) { if (r->max_forwards == 0) { http->entry = clientCreateStoreEntry(http, r->method, null_request_flags); +#ifdef DSA + storeReleaseRequest(http->entry->p); + storeBuffer(http->entry->p); +#else storeReleaseRequest(http->entry); storeBuffer(http->entry); +#endif rep = httpReplyCreate(); httpBuildVersion(&version, 1, 0); httpReplySetHeaders(rep, version, HTTP_OK, NULL, "text/plain", httpRequestPrefixLen(r), 0, squid_curtime); +#ifdef DSA + httpReplySwapOut(rep, http->entry->p); + httpReplyDestroy(rep); + httpRequestSwapOut(r, http->entry->p); + storeComplete(http->entry->p); +#else httpReplySwapOut(rep, http->entry); httpReplyDestroy(rep); httpRequestSwapOut(r, http->entry); storeComplete(http->entry); +#endif return; } /* yes, continue */ @@ -2150,15 +2670,27 @@ log_tags[http->log_type], http->uri); http->out.offset = 0; +#ifdef DSA + if (NULL != http->entry && NULL != http->entry->p) { + storeLockObject(http->entry->p); + storeCreateMemObject(http->entry->p, http->uri, http->log_uri); + http->entry->p->mem_obj->method = r->method; + http->sc = storeClientListAdd(http->entry->p, http); +#else if (NULL != http->entry) { - payloadLockObject(http->entry->p); + storeLockObject(http->entry); storeCreateMemObject(http->entry, http->uri, http->log_uri); - http->entry->p->mem_obj->method = r->method; + http->entry->mem_obj->method = r->method; http->sc = storeClientListAdd(http->entry, http); +#endif #if DELAY_POOLS delaySetStoreClient(http->sc, delayClient(r)); #endif +#ifdef DSA + storeClientCopy(http->sc, http->entry->p, +#else storeClientCopy(http->sc, http->entry, +#endif http->out.offset, http->out.offset, CLIENT_SOCK_SZ, @@ -2190,11 +2722,19 @@ if (EBIT_TEST(http->entry->flags, ENTRY_SPECIAL)) { debug(33, 0) ("clientProcessMiss: miss on a special object (%s).\n", url); debug(33, 0) ("\tlog_type = %s\n", log_tags[http->log_type]); +#ifdef DSA + storeEntryDump(http->entry->p, 1); + } + storeUnregister(http->sc, http->entry->p, http); + http->sc = NULL; + storeUnlockObject(http->entry->p); +#else storeEntryDump(http->entry, 1); } storeUnregister(http->sc, http->entry, http); http->sc = NULL; - payloadUnlockObject(http->entry->p); + storeUnlockObject(http->entry); +#endif http->entry = NULL; } if (clientOnlyIfCached(http)) { @@ -2220,15 +2760,46 @@ #if LOG_TCP_REDIRECTS http->log_type = LOG_TCP_REDIRECT; #endif +#ifdef DSA + storeReleaseRequest(http->entry->p); + httpRedirectReply(rep, http->redirect.status, http->redirect.location); + httpReplySwapOut(rep, http->entry->p); + httpReplyDestroy(rep); + storeComplete(http->entry->p); +#else storeReleaseRequest(http->entry); httpRedirectReply(rep, http->redirect.status, http->redirect.location); httpReplySwapOut(rep, http->entry); httpReplyDestroy(rep); storeComplete(http->entry); +#endif return; } if (http->flags.internal) r->protocol = PROTO_INTERNAL; +#ifdef DTD + if (http->request->method == METHOD_GET && !http->request->flags.ims && !http->request->flags.refresh && !http->request->flags.nocache && http->request->flags.cachable) { + http->request->flags.was_get = 1; + http->old_entry = http->entry; + http->old_sc = http->sc; + http->entry = instanceCreateEntry(url, http->log_uri, http->request->flags, http->request->method); + http->request->method = METHOD_HEAD; + http->sc = storeClientListAdd(http->entry->p, http); + http->request->lastmod = http->old_entry->lastmod; + http->out.offset = 0; + fwdStart(http->conn->fd, http->entry, r); + if (EBIT_TEST(http->entry->p->flags, ENTRY_ABORTED)) + debug(33, 0) ("clientProcessMiss: found ENTRY_ABORTED object\n"); + storeClientCopy(http->sc, http->entry->p, + http->out.offset, + http->out.offset, + CLIENT_SOCK_SZ, + memAllocate(MEM_CLIENT_SOCK_BUF), + clientHandleHEADReply, + http); + } + else +#endif fwdStart(http->conn->fd, http->entry, r); } @@ -2933,7 +3504,11 @@ clientCheckTransferDone(clientHttpRequest * http) { int sending = SENDING_BODY; +#ifdef DSA + StoreEntry *entry = http->entry->p; +#else StoreEntry *entry = http->entry; +#endif MemObject *mem; http_reply *reply; int sendlen; @@ -2945,7 +3520,6 @@ */ if (http->flags.done_copying) return 1; - if (entry->p->mem_obj == NULL) return 1; /* * Handle STORE_OK objects. * objectLen(entry) will be set proprely. @@ -2959,7 +3533,7 @@ /* * Now, handle STORE_PENDING objects */ - mem = entry->p->mem_obj; + mem = entry->mem_obj; assert(mem != NULL); assert(http->request != NULL); reply = mem->reply; @@ -3000,8 +3574,13 @@ static int clientGotNotEnough(clientHttpRequest * http) { +#ifdef DSA int cl = httpReplyBodySize(http->request->method, http->entry->p->mem_obj->reply); int hs = http->entry->p->mem_obj->reply->hdr_sz; +#else + int cl = httpReplyBodySize(http->request->method, http->entry->mem_obj->reply); + int hs = http->entry->mem_obj->reply->hdr_sz; +#endif assert(cl >= 0); if (http->out.offset < cl + hs) return 1; Index: squid/src/defines.h diff -u squid/src/defines.h:1.3.4.2.8.1 squid/src/defines.h:1.3.4.2.10.1 --- squid/src/defines.h:1.3.4.2.8.1 Wed Aug 14 03:15:32 2002 +++ squid/src/defines.h Sun Nov 17 21:05:57 2002 @@ -201,9 +201,12 @@ #define SwapMetaType(x) (char)x[0] #define SwapMetaSize(x) &x[sizeof(char)] #define SwapMetaData(x) &x[STORE_META_TLD_START] -#define STORE_HDR_METASIZE (3*sizeof(time_t)+sizeof(u_short)) -#define PAYLOAD_HDR_METASIZE (sizeof(time_t)+2*sizeof(u_short)+sizeof(size_t)) - +#ifdef DSA +#define STORE_HDR_METASIZE (sizeof(time_t)+2*sizeof(u_short)+sizeof(size_t)) +#define INSTANCE_HDR_METASIZE (3*sizeof(time_t)+sizeof(u_short)) +#else +#define STORE_HDR_METASIZE (4*sizeof(time_t)+2*sizeof(u_short)+sizeof(size_t)) +#endif #define STORE_ENTRY_WITH_MEMOBJ 1 #define STORE_ENTRY_WITHOUT_MEMOBJ 0 Index: squid/src/disk.c diff -u squid/src/disk.c:1.4.4.1.8.1 squid/src/disk.c:1.4.4.1.10.1 --- squid/src/disk.c:1.4.4.1.8.1 Wed Aug 14 03:15:32 2002 +++ squid/src/disk.c Fri Nov 15 21:53:26 2002 @@ -60,8 +60,10 @@ file_open(const char *path, int mode) { int fd; -// if (mode & O_WRONLY) -// mode |= O_APPEND; +#ifndef DSA + if (mode & O_WRONLY) + mode |= O_APPEND; +#endif mode |= SQUID_NONBLOCK; errno = 0; fd = open(path, mode, 0644); @@ -190,10 +192,14 @@ debug(6, 3) ("diskHandleWrite: FD %d writing %d bytes\n", fd, (int) (fdd->write_q->len - fdd->write_q->buf_offset)); errno = 0; - if (fdd->write_q->file_offset != -1) - len = lseek(fd, fdd->write_q->file_offset, SEEK_END); + if (fdd->write_q->file_offset != -1) +#ifdef DSA + lseek(fd, fdd->write_q->file_offset, SEEK_END); else - len = lseek(fd, 0, SEEK_END); + lseek(fd, 0, SEEK_END); +#else + lseek(fd, fdd->write_q->file_offset, SEEK_SET); +#endif len = write(fd, fdd->write_q->buf + fdd->write_q->buf_offset, fdd->write_q->len - fdd->write_q->buf_offset); Index: squid/src/enums.h diff -u squid/src/enums.h:1.5.2.2.6.2 squid/src/enums.h:1.5.2.3.2.3 --- squid/src/enums.h:1.5.2.2.6.2 Wed Aug 14 04:27:28 2002 +++ squid/src/enums.h Sun Dec 8 22:35:02 2002 @@ -487,6 +487,25 @@ ENTRY_DONT_LOG /* hack for gross 'Pump' entries */ }; +#if 0 +typedef enum { + S_ENTRY_SPECIAL, + S_ENTRY_REVALIDATE, + S_DELAY_SENDING, + S_RELEASE_REQUEST, + S_REFRESH_REQUEST, + S_ENTRY_CACHABLE, + S_ENTRY_DISPATCHED, + S_KEY_PRIVATE, /* SET when we haven't finalized our MD5 */ + S_ENTRY_FWD_HDR_WAIT, + S_ENTRY_NEGCACHED, + S_ENTRY_VALIDATED, + S_ENTRY_BAD_LENGTH, + S_ENTRY_ABORTED, + S_ENTRY_DONT_LOG /* hack for gross 'Pump' entries */ +} store_flags; +#endif + typedef enum { ACCESS_DENIED, ACCESS_ALLOWED, @@ -577,7 +596,6 @@ MEM_NETDBENTRY, MEM_NET_DB_NAME, MEM_NET_DB_PEER, - MEM_PAYLOADENTRY, MEM_PEER, #if USE_CACHE_DIGESTS MEM_PEER_DIGEST, @@ -595,6 +613,9 @@ MEM_STATCOUNTERS, MEM_STMEM_BUF, MEM_STOREENTRY, +#ifdef DSA + MEM_INSTANCEENTRY, +#endif MEM_STORE_CLIENT, MEM_SWAPDIR, MEM_USHORTLIST, Index: squid/src/errorpage.c diff -u squid/src/errorpage.c:1.4.2.3.8.1 squid/src/errorpage.c:1.4.2.3.10.3 --- squid/src/errorpage.c:1.4.2.3.8.1 Wed Aug 14 03:15:32 2002 +++ squid/src/errorpage.c Sun Dec 8 22:35:02 2002 @@ -258,10 +258,16 @@ * for an error. */ void +#ifdef DSA +errorAppendEntry(InstanceEntry * e, ErrorState * err) +{ + StoreEntry * entry = e->p; +#else errorAppendEntry(StoreEntry * entry, ErrorState * err) { +#endif HttpReply *rep; - MemObject *mem = entry->p->mem_obj; + MemObject *mem = entry->mem_obj; assert(mem != NULL); assert(mem->inmem_hi == 0); if (entry->store_status != STORE_PENDING) { @@ -275,7 +281,7 @@ errorStateFree(err); return; } - payloadLockObject(entry->p); + storeLockObject(entry); storeBuffer(entry); rep = errorBuildReply(err); /* Add authentication header */ @@ -301,9 +307,14 @@ EBIT_CLR(entry->flags, ENTRY_FWD_HDR_WAIT); storeBufferFlush(entry); storeComplete(entry); +#ifdef DSA + storeNegativeCache(e); + storeReleaseRequest(e->p); +#else storeNegativeCache(entry); storeReleaseRequest(entry); - payloadUnlockObject(entry->p); +#endif + storeUnlockObject(entry); errorStateFree(err); } Index: squid/src/forward.c diff -u squid/src/forward.c:1.4.4.1.8.1 squid/src/forward.c:1.4.4.1.10.5.2.5 --- squid/src/forward.c:1.4.4.1.8.1 Wed Aug 14 03:15:32 2002 +++ squid/src/forward.c Wed Mar 10 22:02:57 2004 @@ -17,8 +17,10 @@ * incorporates software developed and/or copyrighted by other * sources; see the CREDITS file for full details. * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * This program is free software; you can redistribute it and/or +modify + * it under the terms of the GNU General Public License as published +by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * @@ -29,7 +31,8 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, +USA. * */ @@ -51,7 +54,8 @@ static STABH fwdAbort; #define MAX_FWD_STATS_IDX 9 -static int FwdReplyCodes[MAX_FWD_STATS_IDX + 1][HTTP_INVALID_HEADER + 1]; +static int FwdReplyCodes[MAX_FWD_STATS_IDX + 1][HTTP_INVALID_HEADER + +1]; #if WIP_FWD_LOG static void fwdLog(FwdState * fwdState); @@ -69,20 +73,32 @@ static void fwdStateFree(FwdState * fwdState) { +#ifdef DTD + const char *host; + unsigned short port; +#endif +#ifdef DSA + StoreEntry *e = fwdState->entry->p; +#else StoreEntry *e = fwdState->entry; +#endif int sfd; debug(17, 3) ("fwdStateFree: %p\n", fwdState); - assert(e->p->mem_obj != NULL); + assert(e->mem_obj); #if URL_CHECKSUM_DEBUG - assert(e->p->mem_obj->chksum == url_checksum(e->p->mem_obj->url)); + assert(e->mem_obj->chksum == url_checksum(e->mem_obj->url)); #endif #if WIP_FWD_LOG fwdLog(fwdState); #endif if (e->store_status == STORE_PENDING) { - if (e->p->mem_obj->inmem_hi == 0) { + if (e->mem_obj->inmem_hi == 0) { assert(fwdState->err); +#ifdef DSA + errorAppendEntry(fwdState->entry, fwdState->err); +#else errorAppendEntry(e, fwdState->err); +#endif fwdState->err = NULL; } else { EBIT_CLR(e->flags, ENTRY_FWD_HDR_WAIT); @@ -93,19 +109,46 @@ if (storePendingNClients(e) > 0) assert(!EBIT_TEST(e->flags, ENTRY_FWD_HDR_WAIT)); fwdServersFree(&fwdState->servers); +#ifdef DTD + host = fwdState->request->host; + port = fwdState->request->port; +#endif requestUnlink(fwdState->request); fwdState->request = NULL; if (fwdState->err) errorStateFree(fwdState->err); +#ifdef DTD + if (fwdState->entry && !EBIT_TEST(fwdState->entry->p->flags, +ENTRY_FWD_HDR_WAIT) && !EBIT_TEST(fwdState->entry->flags, RELEASE_REQUEST)) +{ + StoreEntry * p = NULL; + StoreEntry * op = fwdState->entry->p; + p = storeGet(op->hash.key); + if (p == op) storeLockObject(p); + if (p && p != op && storeValidToSend(p)) { + arrayDelete(op->instances, fwdState->entry); + fwdState->entry->p->swap_file_sz = -1; + fwdState->entry->p->swap_filen = -1; + fwdState->entry->p->swap_dirn = -1; + fwdState->entry->p = p; + storeSetPublicKey(fwdState->entry); + storeLockObject(p); + } + } +#endif storeUnregisterAbort(e); - payloadUnlockObject(e->p); + storeUnlockObject(e); fwdState->entry = NULL; sfd = fwdState->server_fd; if (sfd > -1) { comm_remove_close_handler(sfd, fwdServerClosed, fwdState); fwdState->server_fd = -1; debug(17, 3) ("fwdStateFree: closing FD %d\n", sfd); +#ifdef DTD + pconnPush(sfd, host, port); +#else comm_close(sfd); +#endif } cbdataFree(fwdState); } @@ -113,9 +156,15 @@ static int fwdCheckRetry(FwdState * fwdState) { - if (fwdState->entry->store_status != STORE_PENDING) +#ifdef DSA + if (fwdState->entry->p->store_status != STORE_PENDING) return 0; if (fwdState->entry->p->mem_obj->inmem_hi > 0) +#else + if (fwdState->entry->store_status != STORE_PENDING) + return 0; + if (fwdState->entry->mem_obj->inmem_hi > 0) +#endif return 0; if (fwdState->n_tries > 10) return 0; @@ -133,7 +182,13 @@ fwdServerClosed(int fd, void *data) { FwdState *fwdState = data; - debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, storeUrl(fwdState->entry)); +#ifdef DSA + debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, +storeUrl(fwdState->entry->p)); +#else + debug(17, 2) ("fwdServerClosed: FD %d %s\n", fd, +storeUrl(fwdState->entry)); +#endif assert(fwdState->server_fd == fd); fwdState->server_fd = -1; if (fwdCheckRetry(fwdState)) { @@ -206,14 +261,26 @@ peerConnectFailed(fs->peer); comm_close(server_fd); } else { - debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, storeUrl(fwdState->entry)); +#ifdef DSA + debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, +storeUrl(fwdState->entry->p)); +#else + debug(17, 3) ("fwdConnectDone: FD %d: '%s'\n", server_fd, +storeUrl(fwdState->entry)); +#endif if (fs->peer) - hierarchyNote(&fwdState->request->hier, fs->code, fs->peer->host); + hierarchyNote(&fwdState->request->hier, fs->code, +fs->peer->host); else if (Config.onoff.log_ip_on_direct) - hierarchyNote(&fwdState->request->hier, fs->code, fd_table[server_fd].ipaddr); + hierarchyNote(&fwdState->request->hier, fs->code, +fd_table[server_fd].ipaddr); else hierarchyNote(&fwdState->request->hier, fs->code, request->host); +#ifdef DSA + fd_note(server_fd, storeUrl(fwdState->entry->p)); +#else fd_note(server_fd, storeUrl(fwdState->entry)); +#endif fd_table[server_fd].uses++; if (fs->peer) peerConnectSucceded(fs->peer); @@ -226,11 +293,16 @@ fwdConnectTimeout(int fd, void *data) { FwdState *fwdState = data; +#ifdef DSA + StoreEntry *entry = fwdState->entry->p; +#else StoreEntry *entry = fwdState->entry; +#endif ErrorState *err; - debug(17, 2) ("fwdConnectTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); + debug(17, 2) ("fwdConnectTimeout: FD %d: '%s'\n", fd, +storeUrl(entry)); assert(fd == fwdState->server_fd); - if (entry->p->mem_obj->inmem_hi == 0) { + if (entry->mem_obj->inmem_hi == 0) { err = errorCon(ERR_CONNECT_FAIL, HTTP_GATEWAY_TIMEOUT); err->request = requestLink(fwdState->request); err->xerrno = ETIMEDOUT; @@ -249,7 +321,11 @@ fwdConnectStart(void *data) { FwdState *fwdState = data; +#ifdef DSA + const char *url = storeUrl(fwdState->entry->p); +#else const char *url = storeUrl(fwdState->entry); +#endif int fd; ErrorState *err; FwdServer *fs = fwdState->servers; @@ -283,7 +359,7 @@ return; } #if URL_CHECKSUM_DEBUG - assert(fwdState->entry->p->mem_obj->chksum == url_checksum(url)); + assert(fwdState->entry->mem_obj->chksum == url_checksum(url)); #endif fd = comm_open(SOCK_STREAM, 0, @@ -314,7 +390,13 @@ fwdStartComplete(FwdServer * servers, void *data) { FwdState *fwdState = data; - debug(17, 3) ("fwdStartComplete: %s\n", storeUrl(fwdState->entry)); +#ifdef DSA + debug(17, 3) ("fwdStartComplete: %s\n", +storeUrl(fwdState->entry->p)); +#else + debug(17, 3) ("fwdStartComplete: %s\n", +storeUrl(fwdState->entry)); +#endif if (servers != NULL) { fwdState->servers = servers; fwdConnectStart(fwdState); @@ -327,7 +409,11 @@ fwdStartFail(FwdState * fwdState) { ErrorState *err; +#ifdef DSA + debug(17, 3) ("fwdStartFail: %s\n", storeUrl(fwdState->entry->p)); +#else debug(17, 3) ("fwdStartFail: %s\n", storeUrl(fwdState->entry)); +#endif err = errorCon(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE); err->request = requestLink(fwdState->request); err->xerrno = errno; @@ -340,7 +426,11 @@ { peer *p; request_t *request = fwdState->request; +#ifdef DSA + StoreEntry *entry = fwdState->entry->p; +#else StoreEntry *entry = fwdState->entry; +#endif ErrorState *err; debug(17, 3) ("fwdDispatch: FD %d: Fetching '%s %s'\n", fwdState->client_fd, @@ -348,11 +438,16 @@ storeUrl(entry)); /*assert(!EBIT_TEST(entry->flags, ENTRY_DISPATCHED)); */ assert(entry->ping_status != PING_WAITING); - assert(entry->p->lock_count); + assert(entry->lock_count); +#ifdef DSA + EBIT_SET(fwdState->entry->flags, ENTRY_DISPATCHED); +#else EBIT_SET(entry->flags, ENTRY_DISPATCHED); +#endif netdbPingSite(request->host); /* - * Assert that server_fd is set. This is to guarantee that fwdState + * Assert that server_fd is set. This is to guarantee that +fwdState * is attached to something and will be deallocated when server_fd * is closed. */ @@ -409,15 +504,26 @@ static int fwdReforward(FwdState * fwdState) { +#ifdef DSA + StoreEntry *e = fwdState->entry->p; +#else StoreEntry *e = fwdState->entry; +#endif FwdServer *fs = fwdState->servers; http_status s; assert(e->store_status == STORE_PENDING); - assert(e->p->mem_obj); + assert(e->mem_obj); #if URL_CHECKSUM_DEBUG - assert(e->p->mem_obj->chksum == url_checksum(e->p->mem_obj->url)); + assert(e->mem_obj->chksum == url_checksum(e->mem_obj->url)); #endif debug(17, 3) ("fwdReforward: %s?\n", storeUrl(e)); +#ifdef DTD + if (fwdState->entry->p->mem_obj->swapout.sio == NULL && +fwdState->request->flags.was_get == 1 && fwdState->request->method == +METHOD_HEAD) { + return 1; + } +#endif if (!EBIT_TEST(e->flags, ENTRY_FWD_HDR_WAIT)) { debug(17, 3) ("fwdReforward: No, ENTRY_FWD_HDR_WAIT isn't set\n"); return 0; @@ -434,7 +540,7 @@ debug(17, 3) ("fwdReforward: No forward-servers left\n"); return 0; } - s = e->p->mem_obj->reply->sline.status; + s = e->mem_obj->reply->sline.status; debug(17, 3) ("fwdReforward: status %d\n", (int) s); return fwdReforwardableStatus(s); } @@ -452,7 +558,11 @@ } void +#ifdef DSA +fwdStart(int fd, InstanceEntry * e, request_t * r) +#else fwdStart(int fd, StoreEntry * e, request_t * r) +#endif { FwdState *fwdState; aclCheck_t ch; @@ -465,7 +575,8 @@ */ if (r->client_addr.s_addr != no_addr.s_addr) { /* - * Check if this host is allowed to fetch MISSES from us (miss_access) + * Check if this host is allowed to fetch MISSES from us +(miss_access) */ memset(&ch, '\0', sizeof(aclCheck_t)); ch.src_addr = r->client_addr; @@ -481,11 +592,17 @@ return; } } - debug(17, 3) ("fwdStart: '%s'\n", storeUrl(e)); +#ifdef DSA + debug(17, 3) ("fwdStart: '%s'\n", storeUrl(e->p)); e->p->mem_obj->request = requestLink(r); e->p->mem_obj->fd = fd; +#else + debug(17, 3) ("fwdStart: '%s'\n", storeUrl(e)); + e->mem_obj->request = requestLink(r); + e->mem_obj->fd = fd; +#endif #if URL_CHECKSUM_DEBUG - assert(e->p->mem_obj->chksum == url_checksum(e->p->mem_obj->url)); + assert(e->mem_obj->chksum == url_checksum(e->mem_obj->url)); #endif if (shutting_down) { /* more yuck */ @@ -517,9 +634,15 @@ fwdState->server_fd = -1; fwdState->request = requestLink(r); fwdState->start = squid_curtime; - payloadLockObject(e->p); +#ifdef DSA + storeLockObject(e->p); + EBIT_SET(e->p->flags, ENTRY_FWD_HDR_WAIT); + storeRegisterAbort(e->p, fwdAbort, fwdState); +#else + storeLockObject(e); EBIT_SET(e->flags, ENTRY_FWD_HDR_WAIT); storeRegisterAbort(e, fwdAbort, fwdState); +#endif peerSelect(r, e, fwdStartComplete, fwdState); } @@ -527,12 +650,12 @@ fwdCheckDeferRead(int fd, void *data) { StoreEntry *e = data; - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; int rc = 0; if (mem == NULL) return 0; #if URL_CHECKSUM_DEBUG - assert(e->p->mem_obj->chksum == url_checksum(e->p->mem_obj->url)); + assert(e->mem_obj->chksum == url_checksum(e->mem_obj->url)); #endif #if DELAY_POOLS if (fd < 0) @@ -552,7 +675,8 @@ #endif if (EBIT_TEST(e->flags, ENTRY_FWD_HDR_WAIT)) return rc; - if (mem->inmem_hi - storeLowestMemReaderOffset(e) < READ_AHEAD_GAP) + if (mem->inmem_hi - storeLowestMemReaderOffset(e) < +READ_AHEAD_GAP) return rc; return 1; } @@ -560,11 +684,19 @@ void fwdFail(FwdState * fwdState, ErrorState * errorState) { +#ifdef DSA + assert(EBIT_TEST(fwdState->entry->p->flags, ENTRY_FWD_HDR_WAIT)); +#else assert(EBIT_TEST(fwdState->entry->flags, ENTRY_FWD_HDR_WAIT)); +#endif debug(17, 3) ("fwdFail: %s \"%s\"\n\t%s\n", err_type_str[errorState->type], httpStatusString(errorState->http_status), +#ifdef DSA + storeUrl(fwdState->entry->p)); +#else storeUrl(fwdState->entry)); +#endif if (fwdState->err) errorStateFree(fwdState->err); fwdState->err = errorState; @@ -577,7 +709,11 @@ fwdAbort(void *data) { FwdState *fwdState = data; +#ifdef DSA + debug(17, 2) ("fwdAbort: %s\n", storeUrl(fwdState->entry->p)); +#else debug(17, 2) ("fwdAbort: %s\n", storeUrl(fwdState->entry)); +#endif fwdStateFree(fwdState); } @@ -587,7 +723,12 @@ void fwdUnregister(int fd, FwdState * fwdState) { +#ifdef DSA + debug(17, 3) ("fwdUnregister: %s\n", +storeUrl(fwdState->entry->p)); +#else debug(17, 3) ("fwdUnregister: %s\n", storeUrl(fwdState->entry)); +#endif assert(fd = fwdState->server_fd); assert(fd > -1); comm_remove_close_handler(fd, fwdServerClosed, fwdState); @@ -603,25 +744,37 @@ void fwdComplete(FwdState * fwdState) { +#ifdef DSA + StoreEntry *e = fwdState->entry->p; +#else StoreEntry *e = fwdState->entry; +#endif assert(e->store_status == STORE_PENDING); debug(17, 3) ("fwdComplete: %s\n\tstatus %d\n", storeUrl(e), - e->p->mem_obj->reply->sline.status); + e->mem_obj->reply->sline.status); #if URL_CHECKSUM_DEBUG - assert(e->p->mem_obj->chksum == url_checksum(e->p->mem_obj->url)); + assert(e->mem_obj->chksum == url_checksum(e->mem_obj->url)); #endif - fwdLogReplyStatus(fwdState->n_tries, e->p->mem_obj->reply->sline.status); + fwdLogReplyStatus(fwdState->n_tries, +e->mem_obj->reply->sline.status); if (fwdReforward(fwdState)) { debug(17, 3) ("fwdComplete: re-forwarding %d %s\n", - e->p->mem_obj->reply->sline.status, + e->mem_obj->reply->sline.status, storeUrl(e)); if (fwdState->server_fd > -1) fwdUnregister(fwdState->server_fd, fwdState); +#ifdef DTD + if (fwdState->request->flags.was_get == 1) { + fwdState->request->method = METHOD_GET; + fwdState->request->flags.was_get = 0; + fwdState->request->flags.hierarchical = 1; + } +#endif storeEntryReset(e); fwdStartComplete(fwdState->servers, fwdState); } else { debug(17, 3) ("fwdComplete: not re-forwarding status %d\n", - e->p->mem_obj->reply->sline.status); + e->mem_obj->reply->sline.status); EBIT_CLR(e->flags, ENTRY_FWD_HDR_WAIT); storeComplete(e); /* Index: squid/src/ftp.c diff -u squid/src/ftp.c:1.4.2.6.2.2 squid/src/ftp.c:1.4.2.7.2.4 --- squid/src/ftp.c:1.4.2.6.2.2 Wed Aug 14 04:27:28 2002 +++ squid/src/ftp.c Sun Dec 15 02:29:41 2002 @@ -81,7 +81,11 @@ }; typedef struct _Ftpdata { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif request_t *request; char user[MAX_URL]; char password[MAX_URL]; @@ -265,9 +269,15 @@ FtpStateData *ftpState = data; if (ftpState == NULL) return; +#ifdef DSA + debug(9, 3) ("ftpStateFree: %s\n", storeUrl(ftpState->entry->p)); + storeUnregisterAbort(ftpState->entry->p); + storeUnlockObject(ftpState->entry->p); +#else debug(9, 3) ("ftpStateFree: %s\n", storeUrl(ftpState->entry)); storeUnregisterAbort(ftpState->entry); - payloadUnlockObject(ftpState->entry->p); + storeUnlockObject(ftpState->entry); +#endif if (ftpState->reply_hdr) { memFree(ftpState->reply_hdr, MEM_8K_BUF); /* this seems unnecessary, but people report SEGV's @@ -335,8 +345,13 @@ ftpTimeout(int fd, void *data) { FtpStateData *ftpState = data; +#ifdef DSA + InstanceEntry *entry = ftpState->entry; + debug(9, 4) ("ftpTimeout: FD %d: '%s'\n", fd, storeUrl(entry->p)); +#else StoreEntry *entry = ftpState->entry; debug(9, 4) ("ftpTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); +#endif if (SENT_PASV == ftpState->state && fd == ftpState->data.fd) { /* stupid ftp.netscape.com */ ftpState->fwd->flags.dont_retry = 0; @@ -350,7 +365,11 @@ static void ftpListingStart(FtpStateData * ftpState) { +#ifdef DSA + StoreEntry *e = ftpState->entry->p; +#else StoreEntry *e = ftpState->entry; +#endif wordlist *w; char *dirup; int i, j, k; @@ -414,7 +433,11 @@ static void ftpListingFinish(FtpStateData * ftpState) { +#ifdef DSA + StoreEntry *e = ftpState->entry->p; +#else StoreEntry *e = ftpState->entry; +#endif storeBuffer(e); storeAppendPrintf(e, "\n"); if (ftpState->flags.listformat_unknown && !ftpState->flags.tried_nlst) { @@ -803,7 +826,11 @@ char *t; size_t linelen; size_t usable; +#ifdef DSA + StoreEntry *e = ftpState->entry->p; +#else StoreEntry *e = ftpState->entry; +#endif int len = ftpState->data.offset; /* * We need a NULL-terminated buffer for scanning, ick @@ -880,8 +907,12 @@ int len; int j; int bin; +#ifdef DSA + StoreEntry *entry = ftpState->entry->p; +#else StoreEntry *entry = ftpState->entry; - MemObject *mem = entry->p->mem_obj; +#endif + MemObject *mem = entry->mem_obj; size_t read_sz; #if DELAY_POOLS delay_id delay_id = delayMostBytesAllowed(mem); @@ -1053,20 +1084,29 @@ ftpStart(FwdState * fwd) { request_t *request = fwd->request; - StoreEntry *entry = fwd->entry; int fd = fwd->server_fd; LOCAL_ARRAY(char, realm, 8192); +#ifdef DSA + StoreEntry *entry = fwd->entry->p; + InstanceEntry *pe = NULL; +#else + StoreEntry *entry = fwd->entry; + StoreEntry *pe = NULL; +#endif const char *url = storeUrl(entry); FtpStateData *ftpState = xcalloc(1, sizeof(FtpStateData)); HttpReply *reply; - StoreEntry *pe = NULL; const cache_key *key = NULL; cbdataAdd(ftpState, cbdataXfree, 0); debug(9, 3) ("ftpStart: '%s'\n", url); statCounter.server.all.requests++; statCounter.server.ftp.requests++; - payloadLockObject(entry->p); + storeLockObject(entry); +#ifdef DSA + ftpState->entry = fwd->entry; +#else ftpState->entry = entry; +#endif ftpState->request = requestLink(request); ftpState->ctrl.fd = fd; ftpState->data.fd = -1; @@ -1092,11 +1132,16 @@ ftpState->user, request->port); } /* eject any old cached object */ - key = storeKeyPublic(entry->p->mem_obj->url, entry->p->mem_obj->method); + key = storeKeyPublic(entry->mem_obj->url, entry->mem_obj->method); +#ifdef DSA + if ((pe = instanceGet(key)) != NULL) + storeRelease(pe->p); +#else if ((pe = storeGet(key)) != NULL) storeRelease(pe); +#endif /* create reply */ - reply = entry->p->mem_obj->reply; + reply = entry->mem_obj->reply; assert(reply != NULL); /* create appropriate reply */ ftpAuthRequired(reply, request, realm); @@ -1253,7 +1298,11 @@ ftpReadControlReply(int fd, void *data) { FtpStateData *ftpState = data; +#ifdef DSA + StoreEntry *entry = ftpState->entry->p; +#else StoreEntry *entry = ftpState->entry; +#endif int len; debug(9, 5) ("ftpReadControlReply\n"); if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { @@ -1674,7 +1723,11 @@ * ftpReadControlReply() and before here, probably when * trying to write to the client. */ +#ifdef DSA + if (!EBIT_TEST(ftpState->entry->p->flags, ENTRY_ABORTED)) +#else if (!EBIT_TEST(ftpState->entry->flags, ENTRY_ABORTED)) +#endif fwdComplete(ftpState->fwd); ftpSendQuit(ftpState); return; @@ -1706,7 +1759,11 @@ addr.sin_addr, 0, COMM_NONBLOCKING, +#ifdef DSA + storeUrl(ftpState->entry->p)); +#else storeUrl(ftpState->entry)); +#endif debug(9, 3) ("ftpSendPasv: Unconnected data socket created on FD %d\n", fd); if (fd < 0) { ftpFail(ftpState); @@ -1851,7 +1908,11 @@ addr.sin_addr, port, COMM_NONBLOCKING | (fallback ? COMM_REUSEADDR : 0), +#ifdef DSA + storeUrl(ftpState->entry->p)); +#else storeUrl(ftpState->entry)); +#endif debug(9, 3) ("ftpOpenListenSocket: Unconnected data socket created on FD %d\n", fd); if (fd < 0) { debug(9, 0) ("ftpOpenListenSocket: comm_open failed\n"); @@ -1914,8 +1975,11 @@ FtpStateData *ftpState = data; struct sockaddr_in my_peer, me; debug(9, 3) ("ftpAcceptDataConnection\n"); - +#ifdef DSA + if (EBIT_TEST(ftpState->entry->p->flags, ENTRY_ABORTED)) { +#else if (EBIT_TEST(ftpState->entry->flags, ENTRY_ABORTED)) { +#endif comm_close(ftpState->ctrl.fd); return; } @@ -2354,8 +2418,12 @@ static void ftpFailed(FtpStateData * ftpState, err_type error) { +#ifdef DSA + StoreEntry *entry = ftpState->entry->p; +#else StoreEntry *entry = ftpState->entry; - if (entry->p->mem_obj->inmem_hi == 0) +#endif + if (entry->mem_obj->inmem_hi == 0) ftpFailedErrorMessage(ftpState, error); if (ftpState->data.fd > -1) { comm_close(ftpState->data.fd); @@ -2470,7 +2538,11 @@ http_status http_code; err_type err_code = ERR_NONE; debug(9, 5) ("ftpSendReply: %s, code %d\n", +#ifdef DSA + storeUrl(ftpState->entry->p), code); +#else storeUrl(ftpState->entry), code); +#endif if (cbdataValid(ftpState)) debug(9, 5) ("ftpSendReply: ftpState (%p) is valid!\n", ftpState); if (code == 226) { @@ -2496,7 +2568,11 @@ else err->ftp.reply = xstrdup(""); errorAppendEntry(ftpState->entry, err); +#ifdef DSA + storeBufferFlush(ftpState->entry->p); +#else storeBufferFlush(ftpState->entry); +#endif ftpSendQuit(ftpState); } @@ -2508,14 +2584,19 @@ String urlpath = ftpState->request->urlpath; const char *filename = NULL; const char *t = NULL; +#ifdef DSA + StoreEntry *e = ftpState->entry->p; + InstanceEntry *pe = NULL; +#else StoreEntry *e = ftpState->entry; StoreEntry *pe = NULL; - http_reply *reply = e->p->mem_obj->reply; +#endif + http_reply *reply = e->mem_obj->reply; http_version_t version; if (ftpState->flags.http_header_sent) return; ftpState->flags.http_header_sent = 1; - assert(e->p->mem_obj->inmem_hi == 0); + assert(e->mem_obj->inmem_hi == 0); EBIT_CLR(e->flags, ENTRY_FWD_HDR_WAIT); filename = (t = strRChr(urlpath, '/')) ? t + 1 : strBuf(urlpath); if (ftpState->flags.isdir) { @@ -2558,21 +2639,38 @@ httpHeaderPutStr(&reply->header, HDR_CONTENT_ENCODING, mime_enc); httpReplySwapOut(reply, e); storeBufferFlush(e); - reply->hdr_sz = e->p->mem_obj->inmem_hi; + reply->hdr_sz = e->mem_obj->inmem_hi; +#ifdef DSA + storeTimestampsSet(ftpState->entry); +#else storeTimestampsSet(e); +#endif if (ftpState->flags.authenticated) { /* * Authenticated requests can't be cached. Eject any old cached * object */ - pe = storeGetPublic(e->p->mem_obj->url, e->p->mem_obj->method); +#ifdef DSA + pe = instanceGetPublic(e->mem_obj->url, e->mem_obj->method); + if (pe) + instanceRelease(pe); + instanceRelease(ftpState->entry); +#else + pe = storeGetPublic(e->mem_obj->url, e->mem_obj->method); if (pe) storeRelease(pe); storeRelease(e); +#endif } else if (EBIT_TEST(e->flags, ENTRY_CACHABLE) && !ftpState->restarted_offset) { +#ifdef DSA + storeSetPublicKey(ftpState->entry); + } else { + instanceRelease(ftpState->entry); +#else storeSetPublicKey(e); } else { storeRelease(e); +#endif } } Index: squid/src/globals.h diff -u squid/src/globals.h:1.4.2.2.8.1 squid/src/globals.h:1.4.2.2.10.1 --- squid/src/globals.h:1.4.2.2.8.1 Wed Aug 14 03:15:33 2002 +++ squid/src/globals.h Fri Nov 15 01:10:34 2002 @@ -125,8 +125,9 @@ extern double current_dtime; extern int store_hash_buckets; /* 0 */ extern hash_table *store_table; /* NULL */ -extern int payload_hash_buckets; /* 0 */ -extern hash_table *payload_table; /* NULL */ +#ifdef DSA +extern hash_table *instance_table; /* NULL */ +#endif extern dlink_list ClientActiveRequests; extern const String StringNull; /* { 0, 0, NULL } */ extern const MemBuf MemBufNull; /* MemBufNULL */ @@ -148,7 +149,7 @@ extern int store_open_disk_fd; /* 0 */ extern const char *SwapDirType[]; extern storefs_entry_t *storefs_list; /* NULL */ -extern payloadrepl_entry_t *payloadrepl_list; /* NULL */ +extern storerepl_entry_t *storerepl_list; /* NULL */ extern int store_swap_low; /* 0 */ extern int store_swap_high; /* 0 */ extern int store_pages_max; /* 0 */ Index: squid/src/gopher.c diff -u squid/src/gopher.c:1.4.2.2.8.2 squid/src/gopher.c:1.4.2.3.2.2 --- squid/src/gopher.c:1.4.2.2.8.2 Wed Aug 14 04:27:28 2002 +++ squid/src/gopher.c Sun Dec 8 11:26:50 2002 @@ -67,7 +67,11 @@ #define MAX_CSO_RESULT 1024 typedef struct gopher_ds { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif enum { NORMAL, HTML_DIR, @@ -111,8 +115,13 @@ GopherStateData *gopherState = data; if (gopherState == NULL) return; +#ifdef DSA + if (gopherState->entry && gopherState->entry->p) { + storeUnlockObject(gopherState->entry->p); +#else if (gopherState->entry) { - payloadUnlockObject(gopherState->entry->p); + storeUnlockObject(gopherState->entry); +#endif } if (gopherState->req) { requestUnlink(gopherState->req); @@ -187,7 +196,11 @@ } memBufPrintf(&mb, "\r\n"); EBIT_CLR(gopherState->entry->flags, ENTRY_FWD_HDR_WAIT); +#ifdef DSA + storeAppend(gopherState->entry->p, mb.buf, mb.size); +#else storeAppend(gopherState->entry, mb.buf, mb.size); +#endif memBufClean(&mb); } @@ -242,7 +255,11 @@ gopherEndHTML(GopherStateData * gopherState) { if (!gopherState->data_in) +#ifdef DSA + storeAppendPrintf(gopherState->entry->p, +#else storeAppendPrintf(gopherState->entry, +#endif "Server Return Nothing.\n" "

Server Return Nothing.

\n"); } @@ -270,9 +287,11 @@ memset(tmpbuf, '\0', TEMP_BUF_SIZE); memset(line, '\0', TEMP_BUF_SIZE); - +#ifdef DSA + entry = gopherState->entry->p; +#else entry = gopherState->entry; - +#endif if (gopherState->conversion == HTML_INDEX_PAGE) { char *html_url = html_quote(storeUrl(entry)); storeAppendPrintf(entry, @@ -576,10 +595,14 @@ gopherTimeout(int fd, void *data) { GopherStateData *gopherState = data; +#ifdef DSA + StoreEntry *entry = gopherState->entry->p; +#else StoreEntry *entry = gopherState->entry; +#endif debug(10, 4) ("gopherTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); if (entry->store_status == STORE_PENDING) { - if (entry->p->mem_obj->inmem_hi == 0) { + if (entry->mem_obj->inmem_hi == 0) { fwdFail(gopherState->fwdState, errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); } @@ -593,14 +616,18 @@ gopherReadReply(int fd, void *data) { GopherStateData *gopherState = data; +#ifdef DSA + StoreEntry *entry = gopherState->entry->p; +#else StoreEntry *entry = gopherState->entry; +#endif char *buf = NULL; int len; int clen; int bin; size_t read_sz; #if DELAY_POOLS - delay_id delay_id = delayMostBytesAllowed(entry->p->mem_obj); + delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); #endif if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { comm_close(fd); @@ -635,29 +662,41 @@ debug(50, 1) ("gopherReadReply: error reading: %s\n", xstrerror()); if (ignoreErrno(errno)) { commSetSelect(fd, COMM_SELECT_READ, gopherReadReply, data, 0); - } else if (entry->p->mem_obj->inmem_hi == 0) { + } else if (entry->mem_obj->inmem_hi == 0) { ErrorState *err; err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; err->url = xstrdup(storeUrl(entry)); +#ifdef DSA + errorAppendEntry(gopherState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); } else { comm_close(fd); } - } else if (len == 0 && entry->p->mem_obj->inmem_hi == 0) { + } else if (len == 0 && entry->mem_obj->inmem_hi == 0) { ErrorState *err; err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; err->url = xstrdup(gopherState->request); +#ifdef DSA + errorAppendEntry(gopherState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); } else if (len == 0) { /* Connection closed; retrieval done. */ /* flush the rest of data in temp buf if there is one. */ if (gopherState->conversion != NORMAL) gopherEndHTML(data); +#ifdef DSA + storeTimestampsSet(gopherState->entry); +#else storeTimestampsSet(entry); +#endif storeBufferFlush(entry); fwdComplete(gopherState->fwdState); comm_close(fd); @@ -682,7 +721,11 @@ gopherSendComplete(int fd, char *buf, size_t size, int errflag, void *data) { GopherStateData *gopherState = (GopherStateData *) data; +#ifdef DSA + StoreEntry *entry = gopherState->entry->p; +#else StoreEntry *entry = gopherState->entry; +#endif debug(10, 5) ("gopherSendComplete: FD %d size: %d errflag: %d\n", fd, size, errflag); if (size > 0) { @@ -697,7 +740,11 @@ err->host = xstrdup(gopherState->req->host); err->port = gopherState->req->port; err->url = xstrdup(storeUrl(entry)); +#ifdef DSA + errorAppendEntry(gopherState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); if (buf) memFree(buf, MEM_4K_BUF); /* Allocated by gopherSendRequest. */ @@ -766,7 +813,11 @@ gopherSendComplete, data, memFree4K); +#ifdef DSA + if (EBIT_TEST(gopherState->entry->p->flags, ENTRY_CACHABLE)) +#else if (EBIT_TEST(gopherState->entry->flags, ENTRY_CACHABLE)) +#endif storeSetPublicKey(gopherState->entry); /* Make it public */ } @@ -774,10 +825,18 @@ gopherStart(FwdState * fwdState) { int fd = fwdState->server_fd; +#ifdef DSA + StoreEntry *entry = fwdState->entry->p; +#else StoreEntry *entry = fwdState->entry; +#endif GopherStateData *gopherState = CreateGopherStateData(); - payloadLockObject(entry->p); + storeLockObject(entry); +#ifdef DSA + gopherState->entry = fwdState->entry; +#else gopherState->entry = entry; +#endif gopherState->fwdState = fwdState; debug(10, 3) ("gopherStart: %s\n", storeUrl(entry)); statCounter.server.all.requests++; Index: squid/src/http.c diff -u squid/src/http.c:1.4.4.3.2.2 squid/src/http.c:1.4.4.4.2.8.2.4 --- squid/src/http.c:1.4.4.3.2.2 Wed Aug 14 04:27:28 2002 +++ squid/src/http.c Wed Mar 10 22:02:57 2004 @@ -50,11 +50,19 @@ static void httpSendRequest(HttpStateData *); static PF httpStateFree; static PF httpTimeout; +#ifdef DSA +static void httpCacheNegatively(InstanceEntry *); +static void httpMakePrivate(InstanceEntry *); +static void httpMakePublic(InstanceEntry *); +static int httpCachableReply(HttpStateData *); +static void httpMaybeRemovePublic(InstanceEntry *, http_status); +#else static void httpCacheNegatively(StoreEntry *); static void httpMakePrivate(StoreEntry *); static void httpMakePublic(StoreEntry *); static int httpCachableReply(HttpStateData *); static void httpMaybeRemovePublic(StoreEntry *, http_status); +#endif static void httpStateFree(int fd, void *data) @@ -65,7 +73,11 @@ #endif if (httpState == NULL) return; - payloadUnlockObject(httpState->entry->p); +#ifdef DSA + storeUnlockObject(httpState->entry->p); +#else + storeUnlockObject(httpState->entry); +#endif if (httpState->reply_hdr) { memFree(httpState->reply_hdr, MEM_8K_BUF); httpState->reply_hdr = NULL; @@ -91,10 +103,14 @@ httpTimeout(int fd, void *data) { HttpStateData *httpState = data; +#ifdef DSA + StoreEntry *entry = httpState->entry->p; +#else StoreEntry *entry = httpState->entry; +#endif debug(11, 4) ("httpTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); if (entry->store_status == STORE_PENDING) { - if (entry->p->mem_obj->inmem_hi == 0) { + if (entry->mem_obj->inmem_hi == 0) { fwdFail(httpState->fwd, errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); } @@ -104,36 +120,68 @@ /* This object can be cached for a long time */ static void +#ifdef DSA +httpMakePublic(InstanceEntry * entry) +{ +#ifdef DTD + if (!EBIT_TEST(entry->flags, RELEASE_REQUEST) && EBIT_TEST(entry->p->flags, ENTRY_CACHABLE)) +#else + if (EBIT_TEST(entry->p->flags, ENTRY_CACHABLE)) +#endif +#else httpMakePublic(StoreEntry * entry) { if (EBIT_TEST(entry->flags, ENTRY_CACHABLE)) +#endif storeSetPublicKey(entry); } /* This object should never be cached at all */ static void +#ifdef DSA +httpMakePrivate(InstanceEntry * entry) +{ + storeExpireNow(entry); + storeReleaseRequest(entry->p); /* delete object when not used */ +#else httpMakePrivate(StoreEntry * entry) { storeExpireNow(entry); storeReleaseRequest(entry); /* delete object when not used */ +#endif /* storeReleaseRequest clears ENTRY_CACHABLE flag */ } /* This object may be negatively cached */ static void +#ifdef DSA +httpCacheNegatively(InstanceEntry * entry) +{ + storeNegativeCache(entry); + if (EBIT_TEST(entry->p->flags, ENTRY_CACHABLE)) +#else httpCacheNegatively(StoreEntry * entry) { storeNegativeCache(entry); if (EBIT_TEST(entry->flags, ENTRY_CACHABLE)) +#endif storeSetPublicKey(entry); } static void +#ifdef DSA +httpMaybeRemovePublic(InstanceEntry * e, http_status status) +#else httpMaybeRemovePublic(StoreEntry * e, http_status status) +#endif { int remove = 0; int forbidden = 0; +#ifdef DSA + InstanceEntry *pe; +#else StoreEntry *pe; +#endif if (!EBIT_TEST(e->flags, KEY_PRIVATE)) return; switch (status) { @@ -167,22 +215,39 @@ } if (!remove && !forbidden) return; +#ifdef DSA assert(e->p->mem_obj); - if ((pe = storeGetPublic(e->p->mem_obj->url, e->p->mem_obj->method)) != NULL) { + if ((pe = instanceGetPublic(e->p->mem_obj->url, e->p->mem_obj->method)) != NULL) { + assert(e != pe); + instanceRelease(pe); +#else + assert(e->mem_obj); + if ((pe = storeGetPublic(e->mem_obj->url, e->mem_obj->method)) != NULL) { assert(e != pe); storeRelease(pe); +#endif } /* * Also remove any cached HEAD response in case the object has * changed. */ - if ((pe = storeGetPublic(e->p->mem_obj->url, METHOD_HEAD)) != NULL) { +#ifdef DSA + if ((pe = instanceGetPublic(e->p->mem_obj->url, METHOD_HEAD)) != NULL) { + assert(e != pe); + instanceRelease(pe); +#else + if ((pe = storeGetPublic(e->mem_obj->url, METHOD_HEAD)) != NULL) { assert(e != pe); storeRelease(pe); +#endif } if (forbidden) return; +#ifdef DSA switch (e->p->mem_obj->method) { +#else + switch (e->mem_obj->method) { +#endif case METHOD_PUT: case METHOD_DELETE: case METHOD_PROPPATCH: @@ -194,9 +259,15 @@ * Remove any cached GET object if it is beleived that the * object may have changed as a result of other methods */ - if ((pe = storeGetPublic(e->p->mem_obj->url, METHOD_GET)) != NULL) { +#ifdef DSA + if ((pe = instanceGetPublic(e->p->mem_obj->url, METHOD_GET)) != NULL) { + assert(e != pe); + instanceRelease(pe); +#else + if ((pe = storeGetPublic(e->mem_obj->url, METHOD_GET)) != NULL) { assert(e != pe); storeRelease(pe); +#endif } break; } @@ -205,7 +276,11 @@ static int httpCachableReply(HttpStateData * httpState) { +#ifdef DSA HttpReply *rep = httpState->entry->p->mem_obj->reply; +#else + HttpReply *rep = httpState->entry->mem_obj->reply; +#endif HttpHeader *hdr = &rep->header; const int cc_mask = (rep->cache_control) ? rep->cache_control->mask : 0; const char *v; @@ -247,7 +322,11 @@ if ((v = httpHeaderGetStr(hdr, HDR_CONTENT_TYPE))) if (!strncasecmp(v, "multipart/x-mixed-replace", 25)) return 0; +#ifdef DSA switch (httpState->entry->p->mem_obj->reply->sline.status) { +#else + switch (httpState->entry->mem_obj->reply->sline.status) { +#endif /* Responses that are cacheable */ case HTTP_OK: case HTTP_NON_AUTHORITATIVE_INFORMATION: @@ -319,10 +398,18 @@ httpProcessReplyHeader(HttpStateData * httpState, const char *buf, int size) { char *t = NULL; +#ifdef DSA + InstanceEntry *entry = httpState->entry; +#else StoreEntry *entry = httpState->entry; +#endif int room; size_t hdr_len; +#ifdef DSA HttpReply *reply = entry->p->mem_obj->reply; +#else + HttpReply *reply = entry->mem_obj->reply; +#endif Ctx ctx; debug(11, 3) ("httpProcessReplyHeader: key '%s'\n", storeKeyText(entry->hash.key)); @@ -352,7 +439,11 @@ *t = '\0'; httpState->reply_hdr_state++; assert(httpState->reply_hdr_state == 1); +#ifdef DSA ctx = ctx_enter(entry->p->mem_obj->url); +#else + ctx = ctx_enter(entry->mem_obj->url); +#endif httpState->reply_hdr_state++; debug(11, 9) ("GOT HTTP REPLY HDR:\n---------\n%s\n----------\n", httpState->reply_hdr); @@ -406,7 +497,11 @@ httpPconnTransferDone(HttpStateData * httpState) { /* return 1 if we got the last of the data on a persistent connection */ +#ifdef DSA MemObject *mem = httpState->entry->p->mem_obj; +#else + MemObject *mem = httpState->entry->mem_obj; +#endif HttpReply *reply = mem->reply; int clen; debug(11, 3) ("httpPconnTransferDone: FD %d\n", httpState->fd); @@ -457,7 +552,11 @@ { HttpStateData *httpState = data; LOCAL_ARRAY(char, buf, SQUID_TCP_SO_RCVBUF); +#ifdef DSA + StoreEntry *entry = httpState->entry->p; +#else StoreEntry *entry = httpState->entry; +#endif const request_t *request = httpState->request; int len; int bin; @@ -470,7 +569,7 @@ if (delayIsNoDelay(fd)) delay_id = 0; else - delay_id = delayMostBytesAllowed(entry->p->mem_obj); + delay_id = delayMostBytesAllowed(entry->mem_obj); #endif if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { comm_close(fd); @@ -513,7 +612,7 @@ fd, xstrerror()); if (ignoreErrno(errno)) { commSetSelect(fd, COMM_SELECT_READ, httpReadReply, httpState, 0); - } else if (entry->p->mem_obj->inmem_hi == 0) { + } else if (entry->mem_obj->inmem_hi == 0) { ErrorState *err; err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->request = requestLink((request_t *) request); @@ -523,7 +622,7 @@ } else { comm_close(fd); } - } else if (len == 0 && entry->p->mem_obj->inmem_hi == 0) { + } else if (len == 0 && entry->mem_obj->inmem_hi == 0) { ErrorState *err; err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; @@ -532,9 +631,22 @@ httpState->eof = 1; comm_close(fd); } else if (len == 0) { - /* ymc: Finalize MD5 digest */ - MD5Final(entry->p->hash.key, &entry->p->ctx); - storeWrite(entry->p->mem_obj->swapout.sio, entry->p->hash.key, MD5_DIGEST_CHARS, 10-entry->p->mem_obj->swapout.queue_offset-entry->p->mem_obj->swap_hdr_sz, NULL); +#ifdef DSA + /* Finalize MD5 digest */ + if (EBIT_TEST(entry->flags, KEY_PRIVATE)) { + cache_key key[MD5_DIGEST_CHARS]; + MD5Final(key, &entry->ctx); + if (entry->hash.key) { + storeKeyFree(entry->hash.key); + entry->hash.key = NULL; + } + entry->hash.key = storeKeyDup(key); + EBIT_CLR(entry->flags, KEY_PRIVATE); +// storeAddInstanceEntry(entry, httpState->entry); + if (entry->mem_obj->swapout.sio) + storeWrite(entry->mem_obj->swapout.sio, entry->hash.key, MD5_DIGEST_CHARS, 10-entry->mem_obj->swapout.queue_offset-entry->mem_obj->swap_hdr_sz, NULL); + } +#endif /* Connection closed; retrieval done. */ httpState->eof = 1; if (httpState->reply_hdr_state < 2) @@ -551,7 +663,7 @@ if (httpState->reply_hdr_state < 2) { httpProcessReplyHeader(httpState, buf, len); if (httpState->reply_hdr_state == 2) { - http_status s = entry->p->mem_obj->reply->sline.status; + http_status s = entry->mem_obj->reply->sline.status; #if WIP_FWD_LOG fwdStatus(httpState->fwd, s); #endif @@ -563,11 +675,15 @@ EBIT_CLR(entry->flags, ENTRY_FWD_HDR_WAIT); } } +#ifdef DSA /* ymc: Update the MD5 digest, skip the header */ - if (entry->p->mem_obj->inmem_hi >= entry->p->mem_obj->reply->hdr_sz) - MD5Update(&entry->p->ctx, buf, len); - else if (len - entry->p->mem_obj->reply->hdr_sz > 0) - MD5Update(&entry->p->ctx, buf + entry->p->mem_obj->reply->hdr_sz, len - entry->p->mem_obj->reply->hdr_sz); + if (EBIT_TEST(entry->flags, KEY_PRIVATE)) { + if (entry->mem_obj->inmem_hi >= entry->mem_obj->reply->hdr_sz) + MD5Update(&entry->ctx, buf, len); + else if (len - entry->mem_obj->reply->hdr_sz > 0) + MD5Update(&entry->ctx, buf + entry->mem_obj->reply->hdr_sz, len - entry->mem_obj->reply->hdr_sz); + } +#endif storeAppend(entry, buf, len); if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { /* @@ -577,9 +693,22 @@ */ (void) 0; } else if (httpPconnTransferDone(httpState)) { - /* ymc: Finalize MD5 digest */ - MD5Final(entry->p->hash.key, &entry->p->ctx); - storeWrite(entry->p->mem_obj->swapout.sio, entry->p->hash.key, MD5_DIGEST_CHARS, 10-entry->p->mem_obj->swapout.queue_offset-entry->p->mem_obj->swap_hdr_sz, NULL); +#ifdef DSA + /* Finalize MD5 digest */ + if (EBIT_TEST(entry->flags, KEY_PRIVATE)) { + cache_key key[MD5_DIGEST_CHARS]; + MD5Final(key, &entry->ctx); + if (entry->hash.key) { + storeKeyFree(entry->hash.key); + entry->hash.key = NULL; + } + entry->hash.key = storeKeyDup(key); + EBIT_CLR(entry->flags, KEY_PRIVATE); +// storeAddInstanceEntry(entry, httpState->entry); + if (entry->mem_obj->swapout.sio) + storeWrite(entry->mem_obj->swapout.sio, entry->hash.key, MD5_DIGEST_CHARS, 10-entry->mem_obj->swapout.queue_offset-entry->mem_obj->swap_hdr_sz, NULL); + } +#endif /* yes we have to clear all these! */ commSetDefer(fd, NULL, NULL); commSetTimeout(fd, -1, NULL, NULL); @@ -606,12 +735,16 @@ httpSendComplete(int fd, char *bufnotused, size_t size, int errflag, void *data) { HttpStateData *httpState = data; +#ifdef DSA + StoreEntry *entry = httpState->entry->p; +#else StoreEntry *entry = httpState->entry; +#endif ErrorState *err; debug(11, 5) ("httpSendComplete: FD %d: size %d: errflag %d.\n", fd, size, errflag); #if URL_CHECKSUM_DEBUG - assert(entry->p->mem_obj->chksum == url_checksum(entry->p->mem_obj->url)); + assert(entry->mem_obj->chksum == url_checksum(entry->mem_obj->url)); #endif if (size > 0) { fd_bytes(fd, size, FD_WRITE); @@ -624,7 +757,11 @@ err = errorCon(ERR_WRITE_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; err->request = requestLink(httpState->orig_request); +#ifdef DSA + errorAppendEntry(httpState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); return; } else { @@ -861,7 +998,11 @@ { MemBuf mb; request_t *req = httpState->request; +#ifdef DSA + StoreEntry *entry = httpState->entry->p; +#else StoreEntry *entry = httpState->entry; +#endif int cfd; peer *p = httpState->peer; CWCB *sendHeaderDone; @@ -875,10 +1016,10 @@ if (!opt_forwarded_for) cfd = -1; - else if (entry->p->mem_obj == NULL) + else if (entry->mem_obj == NULL) cfd = -1; else - cfd = entry->p->mem_obj->fd; + cfd = entry->mem_obj->fd; assert(-1 == cfd || FD_SOCKET == fd_table[cfd].type); if (p != NULL) httpState->flags.proxying = 1; @@ -917,9 +1058,17 @@ request_t *orig_req = fwd->request; debug(11, 3) ("httpStart: \"%s %s\"\n", RequestMethodStr[orig_req->method], +#ifdef DSA + storeUrl(fwd->entry->p)); +#else storeUrl(fwd->entry)); +#endif cbdataAdd(httpState, memFree, MEM_HTTP_STATE_DATA); - payloadLockObject(fwd->entry->p); +#ifdef DSA + storeLockObject(fwd->entry->p); +#else + storeLockObject(fwd->entry); +#endif httpState->fwd = fwd; httpState->entry = fwd->entry; httpState->fd = fd; @@ -927,7 +1076,11 @@ httpState->peer = fwd->servers->peer; /* might be NULL */ if (httpState->peer) { proxy_req = requestCreate(orig_req->method, +#ifdef DSA + PROTO_NONE, storeUrl(httpState->entry->p)); +#else PROTO_NONE, storeUrl(httpState->entry)); +#endif xstrncpy(proxy_req->host, httpState->peer->host, SQUIDHOSTNAMELEN); proxy_req->port = httpState->peer->http_port; proxy_req->flags = orig_req->flags; @@ -941,7 +1094,11 @@ * for example, the request to this neighbor fails. */ if (httpState->peer->options.proxy_only) +#ifdef DSA + storeReleaseRequest(httpState->entry->p); +#else storeReleaseRequest(httpState->entry); +#endif #if DELAY_POOLS assert(delayIsNoDelay(fd) == 0); if (httpState->peer->options.no_delay) @@ -969,7 +1126,11 @@ httpSendRequestEntry(int fd, char *bufnotused, size_t size, int errflag, void *data) { HttpStateData *httpState = data; +#ifdef DSA + StoreEntry *entry = httpState->entry->p; +#else StoreEntry *entry = httpState->entry; +#endif ErrorState *err; debug(11, 5) ("httpSendRequestEntry: FD %d: size %d: errflag %d.\n", fd, size, errflag); @@ -984,7 +1145,11 @@ err = errorCon(ERR_WRITE_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; err->request = requestLink(httpState->orig_request); +#ifdef DSA + errorAppendEntry(httpState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); return; } @@ -999,7 +1164,11 @@ httpSendRequestEntryDone(int fd, char *bufnotused, size_t size, int errflag, void *data) { HttpStateData *httpState = data; +#ifdef DSA + InstanceEntry *entry = httpState->entry; +#else StoreEntry *entry = httpState->entry; +#endif ErrorState *err; aclCheck_t ch; debug(11, 5) ("httpSendRequestEntryDone: FD %d: size %d: errflag %d.\n", Index: squid/src/icp_v2.c diff -u squid/src/icp_v2.c:1.3.4.1 squid/src/icp_v2.c:1.3.4.1.8.1 --- squid/src/icp_v2.c:1.3.4.1 Mon Jan 15 14:49:19 2001 +++ squid/src/icp_v2.c Fri Nov 15 01:10:34 2002 @@ -169,11 +169,20 @@ { if (e == NULL) return 0; +#ifdef DSA + /* these changes are WRONG!!! Just want to make it compiles... -ymc */ + if (!storeEntryValidToSend((InstanceEntry *) e)) +#else if (!storeEntryValidToSend(e)) +#endif return 0; if (Config.onoff.icp_hit_stale) return 1; +#ifdef DSA + if (refreshCheckICP((InstanceEntry *) e, request)) +#else if (refreshCheckICP(e, request)) +#endif return 0; return 1; } Index: squid/src/internal.c diff -u squid/src/internal.c:1.3.4.3.8.1 squid/src/internal.c:1.3.4.3.10.1 --- squid/src/internal.c:1.3.4.3.8.1 Wed Aug 14 03:15:33 2002 +++ squid/src/internal.c Fri Nov 15 01:10:34 2002 @@ -40,8 +40,14 @@ * return HTTP_NOT_FOUND for others */ void +#ifdef DSA +internalStart(request_t * request, InstanceEntry * e) +{ + StoreEntry * entry = e->p; +#else internalStart(request_t * request, StoreEntry * entry) { +#endif ErrorState *err; const char *upath = strBuf(request->urlpath); http_version_t version; @@ -56,7 +62,7 @@ const char *msgbuf = "This cache does not suport Cache Digests.\n"; #endif httpBuildVersion(&version, 1, 0); - httpReplySetHeaders(entry->p->mem_obj->reply, + httpReplySetHeaders(entry->mem_obj->reply, version, HTTP_NOT_FOUND, "Not Found", @@ -64,7 +70,7 @@ strlen(msgbuf), squid_curtime, -2); - httpReplySwapOut(entry->p->mem_obj->reply, entry); + httpReplySwapOut(entry->mem_obj->reply, entry); storeAppend(entry, msgbuf, strlen(msgbuf)); storeComplete(entry); } else { @@ -72,7 +78,11 @@ request, (ObjPackMethod) & httpRequestPack); err = errorCon(ERR_INVALID_REQ, HTTP_NOT_FOUND); err->request = requestLink(request); +#ifdef DSA + errorAppendEntry(e, err); +#else errorAppendEntry(entry, err); +#endif } } Index: squid/src/mem.c diff -u squid/src/mem.c:1.3.4.1.8.1 squid/src/mem.c:1.3.4.1.10.1 --- squid/src/mem.c:1.3.4.1.8.1 Wed Aug 14 03:15:33 2002 +++ squid/src/mem.c Fri Nov 15 01:10:34 2002 @@ -255,7 +255,6 @@ memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0); memDataInit(MEM_NET_DB_NAME, "net_db_name", sizeof(net_db_name), 0); memDataInit(MEM_NET_DB_PEER, "net_db_peer", sizeof(net_db_peer), 0); - memDataInit(MEM_PAYLOADENTRY, "PayloadEntry", sizeof(PayloadEntry), 0); memDataInit(MEM_PEER, "peer", sizeof(peer), 0); #if USE_CACHE_DIGESTS memDataInit(MEM_PEER_DIGEST, "PeerDigest", sizeof(PeerDigest), 0); @@ -278,6 +277,9 @@ memDataInit(MEM_STMEM_BUF, "Store Mem Buffer", SM_PAGE_SIZE, Config.memMaxSize / SM_PAGE_SIZE); memDataInit(MEM_STOREENTRY, "StoreEntry", sizeof(StoreEntry), 0); +#ifdef DSA + memDataInit(MEM_INSTANCEENTRY, "InstanceEntry", sizeof(InstanceEntry), 0); +#endif memDataInit(MEM_STORE_CLIENT, "store_client", sizeof(store_client), 0); memDataInit(MEM_SWAPDIR, "SwapDir", sizeof(SwapDir), 0); memDataInit(MEM_USHORTLIST, "ushort_list", sizeof(ushortlist), 0); Index: squid/src/mime.c diff -u squid/src/mime.c:1.3.4.3.8.1 squid/src/mime.c:1.3.4.3.10.5 --- squid/src/mime.c:1.3.4.3.8.1 Wed Aug 14 03:15:33 2002 +++ squid/src/mime.c Sun Dec 22 16:13:28 2002 @@ -387,13 +387,17 @@ static void mimeLoadIconFile(const char *icon) { - cache_key digest[MD5_DIGEST_CHARS]; - PayloadEntry * p = NULL; int fd; int n; request_flags flags; struct stat sb; +#ifdef DSA + InstanceEntry *e; + StoreEntry * p = NULL; + cache_key digest[MD5_DIGEST_CHARS]; +#else StoreEntry *e; +#endif LOCAL_ARRAY(char, path, MAXPATHLEN); LOCAL_ARRAY(char, url, MAX_URL); char *buf; @@ -404,7 +408,11 @@ fatal("Unknown icon format while reading mime.conf\n"); buf = internalLocalUri("/squid-internal-static/icons/", icon); xstrncpy(url, buf, MAX_URL); +#ifdef DSA + if (instanceGetPublic(url, METHOD_GET)) +#else if (storeGetPublic(url, METHOD_GET)) +#endif return; snprintf(path, MAXPATHLEN, "%s/%s", Config.icons.directory, icon); fd = file_open(path, O_RDONLY | O_BINARY); @@ -418,46 +426,77 @@ } flags = null_request_flags; flags.cachable = 1; - e = storeCreateEntry(url, url, flags, METHOD_GET); +#ifdef DSA + e = instanceCreateEntry(url, +#else + e = storeCreateEntry(url, +#endif + url, + flags, + METHOD_GET); assert(e != NULL); storeSetPublicKey(e); - storeBuffer(e); +#ifdef DSA + storeBuffer(e->p); e->p->mem_obj->request = requestLink(urlParse(METHOD_GET, url)); httpReplyReset(reply = e->p->mem_obj->reply); +#else + storeBuffer(e); + e->mem_obj->request = requestLink(urlParse(METHOD_GET, url)); + httpReplyReset(reply = e->mem_obj->reply); +#endif httpBuildVersion(&version, 1, 0); httpReplySetHeaders(reply, version, HTTP_OK, NULL, type, (int) sb.st_size, sb.st_mtime, -1); reply->cache_control = httpHdrCcCreate(); httpHdrCcSetMaxAge(reply->cache_control, 86400); httpHeaderPutCc(&reply->header, reply->cache_control); - httpReplySwapOut(reply, e); +#ifdef DSA + httpReplySwapOut(reply, e->p); reply->hdr_sz = e->p->mem_obj->inmem_hi; /* yuk */ +#else + httpReplySwapOut(reply, e); + reply->hdr_sz = e->mem_obj->inmem_hi; /* yuk */ +#endif /* read the file into the buffer and append it to store */ buf = memAllocate(MEM_4K_BUF); +#ifdef DSA while ((n = read(fd, buf, 4096)) > 0) { MD5Update(&e->p->ctx, buf, n); - storeAppend(e, buf, n); + storeAppend(e->p, buf, n); } MD5Final(digest, &e->p->ctx); - p = payloadGet(digest); + p = storeGet(digest); if (p == NULL) { - payloadHashInsert(e->p, digest); + EBIT_CLR(e->p->flags, KEY_PRIVATE); + e->p->hash.key = storeKeyDup(digest); +// storeHashInsert(e->p); EBIT_SET(e->flags, ENTRY_SPECIAL); - storeBufferFlush(e); - storeComplete(e); + EBIT_SET(e->p->flags, ENTRY_SPECIAL); + storeBufferFlush(e->p); + storeComplete(e->p); } else { EBIT_SET(e->flags, ENTRY_SPECIAL); - storeBufferFlush(e); - storeComplete(e); - storeUnlink(e); - payloadRelease(e->p); + EBIT_SET(e->p->flags, ENTRY_SPECIAL); + storeBufferFlush(e->p); + storeComplete(e->p); + storeUnlink(e->p); + storeRelease(e->p); e->p = p; } - payloadAddStoreEntry(e->p, e); +#else + while ((n = read(fd, buf, 4096)) > 0) + storeAppend(e, buf, n); +#endif file_close(fd); +#ifndef DSA + EBIT_SET(e->flags, ENTRY_SPECIAL); + storeBufferFlush(e); + storeComplete(e); storeTimestampsSet(e); debug(25, 3) ("Loaded icon %s\n", url); - payloadUnlockObject(e->p); + storeUnlockObject(e); +#endif memFree(buf, MEM_4K_BUF); } Index: squid/src/neighbors.c diff -u squid/src/neighbors.c:1.5.2.4.2.1 squid/src/neighbors.c:1.5.2.4.4.4 --- squid/src/neighbors.c:1.5.2.4.2.1 Wed Aug 14 03:15:33 2002 +++ squid/src/neighbors.c Sun Dec 8 22:35:02 2002 @@ -404,7 +404,7 @@ int *timeout) { const char *url = storeUrl(entry); - MemObject *mem = entry->p->mem_obj; + MemObject *mem = entry->mem_obj; peer *p = NULL; int i; int reqnum = 0; @@ -419,7 +419,7 @@ return 0; if (theOutIcpConnection < 0) fatal("neighborsUdpPing: There is no ICP socket!"); - assert(entry->p->swap_status == SWAPOUT_NONE); + assert(entry->swap_status == SWAPOUT_NONE); mem->start_ping = current_time; mem->ping_reply_callback = callback; mem->ircb_data = callback_data; @@ -786,7 +786,7 @@ debug(15, 6) ("neighborsUdpAck: opcode %d '%s'\n", (int) opcode, storeKeyText(key)); if (NULL != (entry = storeGet(key))) - mem = entry->p->mem_obj; + mem = entry->mem_obj; if ((p = whichPeer(from))) neighborAlive(p, mem, header); if (opcode > ICP_END) @@ -802,14 +802,18 @@ return; } /* check if someone is already fetching it */ +#ifdef DSA + if (EBIT_TEST(entry->mem_obj->e->flags, ENTRY_DISPATCHED)) { +#else if (EBIT_TEST(entry->flags, ENTRY_DISPATCHED)) { +#endif debug(15, 3) ("neighborsUdpAck: '%s' already being fetched.\n", storeKeyText(key)); neighborCountIgnored(p); return; } if (mem == NULL) { - debug(15, 2) ("Ignoring %s for missing p->mem_obj: %s\n", + debug(15, 2) ("Ignoring %s for missing mem_obj: %s\n", opcode_d, storeKeyText(key)); neighborCountIgnored(p); return; @@ -820,7 +824,7 @@ neighborCountIgnored(p); return; } - if (entry->p->lock_count == 0) { + if (entry->lock_count == 0) { debug(12, 1) ("neighborsUdpAck: '%s' has no locks\n", storeKeyText(key)); neighborCountIgnored(p); @@ -1116,7 +1120,11 @@ { peer *p = data; ps_state *psstate = xcalloc(1, sizeof(ps_state)); +#ifdef DSA + InstanceEntry *fake; +#else StoreEntry *fake; +#endif MemObject *mem; icp_common_t *query; int reqnum; @@ -1124,14 +1132,22 @@ assert(p->type == PEER_MULTICAST); p->mcast.flags.count_event_pending = 0; snprintf(url, MAX_URL, "http://%s/", inet_ntoa(p->in_addr.sin_addr)); +#ifdef DSA + fake = instanceCreateEntry(url, url, null_request_flags, METHOD_GET); +#else fake = storeCreateEntry(url, url, null_request_flags, METHOD_GET); +#endif psstate->request = requestLink(urlParse(METHOD_GET, url)); psstate->entry = fake; psstate->callback = NULL; psstate->callback_data = p; psstate->ping.start = current_time; cbdataAdd(psstate, cbdataXfree, 0); +#ifdef DSA mem = fake->p->mem_obj; +#else + mem = fake->mem_obj; +#endif mem->request = requestLink(psstate->request); mem->start_ping = current_time; mem->ping_reply_callback = peerCountHandleIcpReply; @@ -1145,7 +1161,11 @@ query, LOG_ICP_QUERY, 0); +#ifdef DSA + fake->p->ping_status = PING_WAITING; +#else fake->ping_status = PING_WAITING; +#endif eventAdd("peerCountMcastPeersDone", peerCountMcastPeersDone, psstate, @@ -1159,7 +1179,11 @@ { ps_state *psstate = data; peer *p = psstate->callback_data; +#ifdef DSA + StoreEntry *fake = psstate->entry->p; +#else StoreEntry *fake = psstate->entry; +#endif p->mcast.flags.counting = 0; p->mcast.avg_n_members = doubleAverage(p->mcast.avg_n_members, (double) psstate->ping.n_recv, @@ -1172,10 +1196,10 @@ p->stats.rtt); p->mcast.n_replies_expected = (int) p->mcast.avg_n_members; EBIT_SET(fake->flags, ENTRY_ABORTED); - requestUnlink(fake->p->mem_obj->request); - fake->p->mem_obj->request = NULL; + requestUnlink(fake->mem_obj->request); + fake->mem_obj->request = NULL; storeReleaseRequest(fake); - payloadUnlockObject(fake->p); + storeUnlockObject(fake); requestUnlink(psstate->request); cbdataFree(psstate); } @@ -1184,8 +1208,12 @@ peerCountHandleIcpReply(peer * p, peer_t type, protocol_t proto, void *hdrnotused, void *data) { ps_state *psstate = data; +#ifdef DSA + StoreEntry *fake = psstate->entry->p; +#else StoreEntry *fake = psstate->entry; - MemObject *mem = fake->p->mem_obj; +#endif + MemObject *mem = fake->mem_obj; int rtt = tvSubMsec(mem->start_ping, current_time); assert(proto == PROTO_ICP); assert(fake); @@ -1329,7 +1357,7 @@ debug(15, 6) ("neighborsHtcpReply: %s %s\n", htcp->hit ? "HIT" : "MISS", storeKeyText(key)); if (NULL != (e = storeGet(key))) - mem = e->p->mem_obj; + mem = e->mem_obj; if ((p = whichPeer(from))) neighborAliveHtcp(p, mem, htcp); /* Does the entry exist? */ @@ -1340,14 +1368,18 @@ return; } /* check if someone is already fetching it */ +#ifdef DSA + if (EBIT_TEST(e->mem_obj->e->flags, ENTRY_DISPATCHED)) { +#else if (EBIT_TEST(e->flags, ENTRY_DISPATCHED)) { +#endif debug(15, 3) ("neighborsUdpAck: '%s' already being fetched.\n", storeKeyText(key)); neighborCountIgnored(p); return; } if (mem == NULL) { - debug(15, 2) ("Ignoring reply for missing p->mem_obj: %s\n", + debug(15, 2) ("Ignoring reply for missing mem_obj: %s\n", storeKeyText(key)); neighborCountIgnored(p); return; Index: squid/src/net_db.c diff -u squid/src/net_db.c:1.5.4.3.8.1 squid/src/net_db.c:1.5.4.3 --- squid/src/net_db.c:1.5.4.3.8.1 Wed Aug 14 03:15:34 2002 +++ squid/src/net_db.c Mon Jan 15 14:49:19 2001 @@ -555,7 +555,7 @@ /* skip reply headers */ if ((hdr_sz = headersEnd(p, size))) { debug(38, 5) ("netdbExchangeHandleReply: hdr_sz = %d\n", hdr_sz); - rep = ex->e->p->mem_obj->reply; + rep = ex->e->mem_obj->reply; if (0 == rep->sline.status) httpReplyParse(rep, buf, hdr_sz); debug(38, 3) ("netdbExchangeHandleReply: reply status %d\n", @@ -627,8 +627,8 @@ debug(38, 3) ("netdbExchangeHandleReply: STORE_PENDING\n"); storeClientCopy(ex->sc, ex->e, ex->seen, ex->used, ex->buf_sz, ex->buf, netdbExchangeHandleReply, ex); - } else if (ex->seen < ex->e->p->mem_obj->inmem_hi) { - debug(38, 3) ("netdbExchangeHandleReply: ex->e->p->mem_obj->inmem_hi\n"); + } else if (ex->seen < ex->e->mem_obj->inmem_hi) { + debug(38, 3) ("netdbExchangeHandleReply: ex->e->mem_obj->inmem_hi\n"); storeClientCopy(ex->sc, ex->e, ex->seen, ex->used, ex->buf_sz, ex->buf, netdbExchangeHandleReply, ex); } else { @@ -918,7 +918,7 @@ void netdbBinaryExchange(StoreEntry * s) { - http_reply *reply = s->p->mem_obj->reply; + http_reply *reply = s->mem_obj->reply; http_version_t version; #if USE_ICMP netdbEntry *n; Index: squid/src/peer_digest.c diff -u squid/src/peer_digest.c:1.3.4.1.6.1 squid/src/peer_digest.c:1.3.4.1.8.1 --- squid/src/peer_digest.c:1.3.4.1.6.1 Wed Aug 14 03:15:34 2002 +++ squid/src/peer_digest.c Sun Dec 8 19:53:28 2002 @@ -310,8 +310,8 @@ old_e = fetch->old_entry = storeGet(key); if (old_e) { debug(72, 5) ("peerDigestRequest: found old entry\n"); - payloadLockObject(old_e->p); - payloadCreateMemObject(old_e->p, url, url); + storeLockObject(old_e); + storeCreateMemObject(old_e, url, url); fetch->old_sc = storeClientListAdd(old_e, fetch); } e = fetch->entry = storeCreateEntry(url, url, req->flags, req->method); @@ -547,7 +547,11 @@ reason = "swap failure"; else if (!fetch->entry) reason = "swap aborted?!"; +#ifdef DSA + else if (EBIT_TEST(fetch->entry->p->flags, ENTRY_ABORTED)) +#else else if (EBIT_TEST(fetch->entry->flags, ENTRY_ABORTED)) +#endif reason = "swap aborted"; } /* continue checking (maybe-successful eof case) */ Index: squid/src/peer_select.c diff -u squid/src/peer_select.c:1.3.4.2.6.1 squid/src/peer_select.c:1.3.4.2.8.1 --- squid/src/peer_select.c:1.3.4.2.6.1 Wed Aug 14 03:15:34 2002 +++ squid/src/peer_select.c Fri Nov 15 01:10:35 2002 @@ -102,8 +102,13 @@ requestUnlink(psstate->request); psstate->request = NULL; if (psstate->entry) { +#ifdef DSA + assert(psstate->entry->p->ping_status != PING_WAITING); + storeUnlockObject(psstate->entry->p); +#else assert(psstate->entry->ping_status != PING_WAITING); - payloadUnlockObject(psstate->entry->p); + storeUnlockObject(psstate->entry); +#endif psstate->entry = NULL; } cbdataFree(psstate); @@ -130,13 +135,22 @@ void peerSelect(request_t * request, +#ifdef DSA + InstanceEntry * entry, +#else StoreEntry * entry, +#endif PSC * callback, void *callback_data) { ps_state *psstate = memAllocate(MEM_PS_STATE); +#ifdef DSA + if (entry && entry->p) + debug(44, 3) ("peerSelect: %s\n", storeUrl(entry->p)); +#else if (entry) debug(44, 3) ("peerSelect: %s\n", storeUrl(entry)); +#endif else debug(44, 3) ("peerSelect: %s\n", RequestMethodStr[request->method]); cbdataAdd(psstate, memFree, MEM_PS_STATE); @@ -148,8 +162,13 @@ #if USE_CACHE_DIGESTS request->hier.peer_select_start = current_time; #endif +#ifdef DSA + if (psstate->entry && psstate->entry->p) + storeLockObject(psstate->entry->p); +#else if (psstate->entry) - payloadLockObject(psstate->entry->p); + storeLockObject(psstate->entry); +#endif cbdataLock(callback_data); peerSelectFoo(psstate); } @@ -177,7 +196,11 @@ static void peerSelectCallback(ps_state * psstate) { +#ifdef DSA + StoreEntry *entry = psstate->entry->p; +#else StoreEntry *entry = psstate->entry; +#endif FwdServer *fs = psstate->servers; void *data = psstate->callback_data; if (entry) { @@ -235,7 +258,11 @@ static void peerSelectFoo(ps_state * ps) { +#ifdef DSA + StoreEntry *entry = ps->entry->p; +#else StoreEntry *entry = ps->entry; +#endif request_t *request = ps->request; debug(44, 3) ("peerSelectFoo: '%s %s'\n", RequestMethodStr[request->method], @@ -316,7 +343,11 @@ static void peerGetSomeNeighbor(ps_state * ps) { +#ifdef DSA + StoreEntry *entry = ps->entry->p; +#else StoreEntry *entry = ps->entry; +#endif request_t *request = ps->request; peer *p; hier_code code = HIER_NONE; @@ -382,7 +413,11 @@ request_t *request = ps->request; peer *p = NULL; hier_code code = HIER_NONE; +#ifdef DSA + assert(ps->entry->p->ping_status == PING_WAITING); +#else assert(ps->entry->ping_status == PING_WAITING); +#endif assert(ps->direct != DIRECT_YES); if (peerCheckNetdbDirect(ps)) { code = CLOSEST_DIRECT; @@ -489,7 +524,11 @@ peerPingTimeout(void *data) { ps_state *psstate = data; +#ifdef DSA + StoreEntry *entry = psstate->entry->p; +#else StoreEntry *entry = psstate->entry; +#endif if (entry) debug(44, 3) ("peerPingTimeout: '%s'\n", storeUrl(entry)); if (!cbdataValid(psstate->callback_data)) { @@ -548,7 +587,11 @@ icp_opcode op = header->opcode; debug(44, 3) ("peerHandleIcpReply: %s %s\n", icp_opcode_str[op], +#ifdef DSA + storeUrl(psstate->entry->p)); +#else storeUrl(psstate->entry)); +#endif #if USE_CACHE_DIGESTS && 0 /* do cd lookup to count false misses */ if (p && request) Index: squid/src/protos.h diff -u squid/src/protos.h:1.4.4.8.2.2 squid/src/protos.h:1.4.4.9.2.4.2.1 --- squid/src/protos.h:1.4.4.8.2.2 Wed Aug 14 04:27:28 2002 +++ squid/src/protos.h Wed Mar 10 22:02:57 2004 @@ -109,13 +109,19 @@ extern void clientAccessCheck(void *); extern void clientAccessCheckDone(int, void *); -extern int modifiedSince(StoreEntry *, request_t *); extern char *clientConstructTraceEcho(clientHttpRequest *); extern void clientPurgeRequest(clientHttpRequest *); -extern int checkNegativeHit(StoreEntry *); extern void clientHttpConnectionsOpen(void); extern void clientHttpConnectionsClose(void); +#ifdef DSA +extern int checkNegativeHit(InstanceEntry *); +extern int modifiedSince(InstanceEntry *, request_t *); +extern InstanceEntry *clientCreateStoreEntry(clientHttpRequest *, method_t, request_flags); +#else +extern int checkNegativeHit(StoreEntry *); +extern int modifiedSince(StoreEntry *, request_t *); extern StoreEntry *clientCreateStoreEntry(clientHttpRequest *, method_t, request_flags); +#endif extern int isTcpHit(log_type); extern int commSetNonBlocking(int fd); @@ -663,12 +669,19 @@ extern void netdbExchangeUpdatePeer(struct in_addr, peer *, double, double); extern peer *netdbClosestParent(request_t *); extern void netdbHostData(const char *host, int *samp, int *rtt, int *hops); - +#ifdef DSA +extern void cachemgrStart(int fd, request_t * request, InstanceEntry * entry); +#else extern void cachemgrStart(int fd, request_t * request, StoreEntry * entry); +#endif extern void cachemgrRegister(const char *, const char *, OBJH *, int, int); extern void cachemgrInit(void); +#ifdef DSA +extern void peerSelect(request_t *, InstanceEntry *, PSC *, void *data); +#else extern void peerSelect(request_t *, StoreEntry *, PSC *, void *data); +#endif extern void peerSelectInit(void); /* peer_digest.c */ @@ -678,7 +691,11 @@ extern void peerDigestStatsReport(const PeerDigest * pd, StoreEntry * e); /* forward.c */ +#ifdef DSA +extern void fwdStart(int, InstanceEntry *, request_t *); +#else extern void fwdStart(int, StoreEntry *, request_t *); +#endif extern DEFER fwdCheckDeferRead; extern void fwdFail(FwdState *, ErrorState *); extern void fwdUnregister(int fd, FwdState *); @@ -692,7 +709,11 @@ extern void fwdStatus(FwdState *, http_status); #endif +#ifdef DSA +extern void urnStart(request_t *, InstanceEntry *); +#else extern void urnStart(request_t *, StoreEntry *); +#endif extern void redirectStart(clientHttpRequest *, RH *, void *); extern void redirectInit(void); @@ -703,11 +724,19 @@ extern void authenticateShutdown(void); extern void refreshAddToList(const char *, int, time_t, int, time_t); +#ifdef DSA +extern int refreshIsCachable(const InstanceEntry *); +extern int refreshCheckHTTP(const InstanceEntry *, request_t *); +extern int refreshCheckICP(const InstanceEntry *, request_t *); +extern int refreshCheckHTCP(const InstanceEntry *, request_t *); +extern int refreshCheckDigest(const InstanceEntry *, time_t delta); +#else extern int refreshIsCachable(const StoreEntry *); extern int refreshCheckHTTP(const StoreEntry *, request_t *); extern int refreshCheckICP(const StoreEntry *, request_t *); extern int refreshCheckHTCP(const StoreEntry *, request_t *); extern int refreshCheckDigest(const StoreEntry *, time_t delta); +#endif extern time_t getMaxAge(const char *url); extern void refreshInit(void); @@ -805,63 +834,72 @@ /* ----------------------------------------------------------------- */ /* - * payload.c - */ -extern PayloadEntry * new_PayloadEntry(); -extern void payloadAddStoreEntry(PayloadEntry *, StoreEntry *); -extern void payloadRemoveStoreEntry(PayloadEntry *, StoreEntry *); -extern void payloadHashInsert(PayloadEntry *, const cache_key *); -extern void payloadReplAdd(char *, REMOVALPOLICYCREATE *); -extern void payloadLockObject(PayloadEntry *); -extern int payloadUnlockObject(PayloadEntry *); -extern PayloadEntry * payloadGet(const cache_key *); -extern PayloadEntry * payloadCreateEntry(); -extern void payloadMaintainSwapSpace(void *); -extern void payloadInit(); -extern void payloadFreeMemory(); -extern void payloadEntryDump(); -extern int payloadEntryLocked(const PayloadEntry *); -extern void payloadRelease(PayloadEntry *); -extern void payloadSetMemStatus(PayloadEntry *, int); - -/* ----------------------------------------------------------------- */ - -/* * store.c */ -extern StoreEntry *new_StoreEntry(int, const char *, const char *); -extern void storeCreateMemObject(StoreEntry *, const char *, const char *); extern StoreEntry *storeGet(const cache_key *); -extern StoreEntry *storeGetPublic(const char *, const method_t); +extern StoreEntry *storeGetPublic(const char *uri, const method_t method); +#ifdef DSA +extern void storeAddInstanceEntry(StoreEntry *, InstanceEntry *); +extern void storeRemoveInstanceEntry(StoreEntry *, InstanceEntry *); +extern InstanceEntry *new_InstanceEntry(int, const char *, const char *); +extern InstanceEntry *instanceCreateEntry(const char *, const char *, request_flags, method_t); +extern StoreEntry *new_StoreEntry(); +extern InstanceEntry *instanceGet(const cache_key *); +extern InstanceEntry *instanceGetPublic(const char *uri, const method_t method); +extern InstanceEntry *instanceCreateEntry(const char *, const char *, request_flags, method_t); +extern tlv * instanceSwapMetaBuild(InstanceEntry *); +extern StoreEntry *storeCreateEntry(); +extern void storeSetPublicKey(InstanceEntry *); +#else +extern StoreEntry *new_StoreEntry(int, const char *, const char *); extern StoreEntry *storeCreateEntry(const char *, const char *, request_flags, method_t); extern void storeSetPublicKey(StoreEntry *); +#endif +extern void storeAbort(StoreEntry *); extern void storeComplete(StoreEntry *); extern void storeInit(void); extern int storeClientWaiting(const StoreEntry *); -extern void storeAbort(StoreEntry *); extern void storeAppend(StoreEntry *, const char *, int); +extern void storeLockObject(StoreEntry *); +#ifdef DSA +extern void instanceRelease(InstanceEntry *); +extern void instanceReleaseRequest(InstanceEntry *); +#endif extern void storeRelease(StoreEntry *); +extern void storeReleaseRequest(StoreEntry *); +extern int storeUnlockObject(StoreEntry *); extern int storePendingNClients(const StoreEntry *); extern EVH storeMaintainSwapSpace; -extern void storeExpireNow(StoreEntry *); -extern void storeReleaseRequest(StoreEntry *); extern off_t storeLowestMemReaderOffset(const StoreEntry *); extern void storeConfigure(void); -extern void storeNegativeCache(StoreEntry *); extern void storeFreeMemory(void); extern int expiresMoreThan(time_t, time_t); extern void InvokeHandlers(StoreEntry *); +#ifdef DTD +int storeValidToSend(StoreEntry *); +#endif +#ifdef DSA +extern void instanceHashInsert(InstanceEntry * e, const cache_key *); +extern void storeExpireNow(InstanceEntry *); +extern void storeNegativeCache(InstanceEntry *); +extern int storeEntryValidToSend(InstanceEntry *); +extern void storeTimestampsSet(InstanceEntry *); +#else +extern void storeExpireNow(StoreEntry *); +extern void storeNegativeCache(StoreEntry *); extern int storeEntryValidToSend(StoreEntry *); extern void storeTimestampsSet(StoreEntry *); +#endif extern void storeRegisterAbort(StoreEntry * e, STABH * cb, void *); extern void storeUnregisterAbort(StoreEntry * e); extern void storeMemObjectDump(MemObject * mem); extern void storeEntryDump(const StoreEntry * e, int debug_lvl); extern const char *storeUrl(const StoreEntry *); +extern void storeCreateMemObject(StoreEntry *, const char *, const char *); extern void storeCopyNotModifiedReplyHeaders(MemObject * O, MemObject * N); extern void storeBuffer(StoreEntry *); extern void storeBufferFlush(StoreEntry *); -extern void storeHashInsert(StoreEntry * e, const cache_key *); +extern void storeSetMemStatus(StoreEntry * e, int); #if STDC_HEADERS extern void storeAppendPrintf(StoreEntry *, const char *,...); #else @@ -869,7 +907,13 @@ #endif extern void storeAppendVPrintf(StoreEntry *, const char *, va_list ap); extern int storeCheckCachable(StoreEntry * e); +#ifdef DSA +extern void storeSetPrivateKey(InstanceEntry *); +extern void storeHashInsert(StoreEntry * e); +#else extern void storeSetPrivateKey(StoreEntry *); +extern void storeHashInsert(StoreEntry * e, const cache_key *); +#endif extern int objectLen(const StoreEntry * e); extern int contentLen(const StoreEntry * e); extern HttpReply *storeEntryReply(StoreEntry *); @@ -880,6 +924,7 @@ extern void storeFsInit(void); extern void storeFsDone(void); extern void storeFsAdd(char *, STSETUP *); +extern void storeReplAdd(char *, REMOVALPOLICYCREATE *); /* store_modules.c */ extern void storeFsSetup(void); @@ -949,12 +994,12 @@ extern void storeDirDiskFull(sdirno); extern void storeDirInit(void); extern void storeDirOpenSwapLogs(void); -extern void storeDirSwapLog(const PayloadEntry *, int op); +extern void storeDirSwapLog(const StoreEntry *, int op); extern void storeDirUpdateSwapSize(SwapDir *, size_t size, int sign); extern void storeDirSync(void); extern void storeDirCallback(void); -extern void storeDirLRUDelete(PayloadEntry *); -extern void storeDirLRUAdd(PayloadEntry *); +extern void storeDirLRUDelete(StoreEntry *); +extern void storeDirLRUAdd(StoreEntry *); extern int storeDirGetBlkSize(const char *path, int *blksize); extern int storeDirGetUFSStats(const char *, int *, int *, int *, int *); @@ -962,7 +1007,6 @@ * store_swapmeta.c */ extern char *storeSwapMetaPack(tlv * tlv_list, int *length); -extern tlv *storeInstanceSwapMetaBuild(StoreEntry * e); extern tlv *storeSwapMetaBuild(StoreEntry * e); extern tlv *storeSwapMetaUnpack(const char *buf, int *hdrlen); extern void storeSwapTLVFree(tlv * n); @@ -1079,7 +1123,11 @@ extern void errorClean(void); extern HttpReply *errorBuildReply(ErrorState * err); extern void errorSend(int fd, ErrorState *); +#ifdef DSA +extern void errorAppendEntry(InstanceEntry *, ErrorState *); +#else extern void errorAppendEntry(StoreEntry *, ErrorState *); +#endif extern void errorStateFree(ErrorState * err); extern int errorReservePageId(const char *page_name); extern ErrorState *errorCon(err_type type, http_status); @@ -1161,7 +1209,11 @@ extern void cacheDigestGuessStatsReport(const cd_guess_stats * stats, StoreEntry * sentry, const char *label); extern void cacheDigestReport(CacheDigest * cd, const char *label, StoreEntry * e); +#ifdef DSA +extern void internalStart(request_t *, InstanceEntry *); +#else extern void internalStart(request_t *, StoreEntry *); +#endif extern int internalCheck(const char *urlpath); extern int internalStaticCheck(const char *urlpath); extern char *internalLocalUri(const char *dir, const char *name); Index: squid/src/pump.c diff -u squid/src/pump.c:1.4.4.1.8.1 squid/src/pump.c:1.4.4.1.10.3 --- squid/src/pump.c:1.4.4.1.8.1 Wed Aug 14 03:15:35 2002 +++ squid/src/pump.c Sun Dec 8 22:35:02 2002 @@ -71,8 +71,13 @@ flags.nocache = 1; snprintf(new_key, MAX_URL + 5, "%s|Pump", uri); cbdataAdd(p, memFree, MEM_PUMP_STATE_DATA); +#ifdef DSA + p->request_entry = instanceCreateEntry(new_key, new_key, flags, r->method); + p->sc = storeClientListAdd(p->request_entry->p, p); +#else p->request_entry = storeCreateEntry(new_key, new_key, flags, r->method); p->sc = storeClientListAdd(p->request_entry, p); +#endif EBIT_SET(p->request_entry->flags, ENTRY_DONT_LOG); #if DELAY_POOLS delaySetStoreClient(p->sc, delayClient(r)); @@ -117,25 +122,41 @@ p->callback = callback; p->cbdata = cbdata; cbdataLock(p->cbdata); - payloadLockObject(p->reply_entry->p); +#ifdef DSA + storeLockObject(p->reply_entry->p); +#else + storeLockObject(p->reply_entry); +#endif comm_add_close_handler(p->s_fd, pumpServerClosed, p); /* * see if part of the body is in the request */ if (p->rcvd < p->req->content_length && r->body_sz > 0) { +#ifdef DSA + assert(p->request_entry->p->store_status == STORE_PENDING); +#else assert(p->request_entry->store_status == STORE_PENDING); +#endif assert(r->body != NULL); assert(r->body_sz <= p->req->content_length); copy_sz = XMIN(r->body_sz, p->req->content_length); debug(61, 3) ("pumpStart: Appending %d bytes from r->body\n", copy_sz); +#ifdef DSA + storeAppend(p->request_entry->p, r->body, copy_sz); +#else storeAppend(p->request_entry, r->body, copy_sz); +#endif p->rcvd = copy_sz; } /* * Do we need to read more data from the client? */ if (p->rcvd < p->req->content_length) { +#ifdef DSA + assert(p->request_entry->p->store_status == STORE_PENDING); +#else assert(p->request_entry->store_status == STORE_PENDING); +#endif commSetSelect(p->c_fd, COMM_SELECT_READ, pumpReadFromClient, p, 0); commSetTimeout(p->c_fd, Config.Timeout.read, pumpTimeout, p); commSetDefer(p->c_fd, pumpReadDefer, p); @@ -144,7 +165,11 @@ if (p->sent == p->req->content_length) { pumpServerCopyComplete(p->s_fd, NULL, 0, DISK_OK, p); } else { +#ifdef DSA + storeClientCopy(p->sc, p->request_entry->p, p->sent, p->sent, 4096, +#else storeClientCopy(p->sc, p->request_entry, p->sent, p->sent, 4096, +#endif memAllocate(MEM_4K_BUF), pumpServerCopy, p); } @@ -184,7 +209,11 @@ pumpClose(p); return; } +#ifdef DSA + if (EBIT_TEST(p->request_entry->p->flags, ENTRY_ABORTED)) { +#else if (EBIT_TEST(p->request_entry->flags, ENTRY_ABORTED)) { +#endif debug(61, 5) ("pumpServerCopyComplete: ENTRY_ABORTED\n"); pumpClose(p); return; @@ -192,7 +221,11 @@ p->sent += size; assert(p->sent <= p->req->content_length); if (p->sent < p->req->content_length) { +#ifdef DSA + storeClientCopy(p->sc, p->request_entry->p, p->sent, p->sent, 4096, +#else storeClientCopy(p->sc, p->request_entry, p->sent, p->sent, 4096, +#endif memAllocate(MEM_4K_BUF), pumpServerCopy, p); return; @@ -207,7 +240,11 @@ if (cbdataValid(p->cbdata)) p->callback(sfd, NULL, p->sent, 0, p->cbdata); cbdataUnlock(p->cbdata); - payloadUnlockObject(p->reply_entry->p); +#ifdef DSA + storeUnlockObject(p->reply_entry->p); +#else + storeUnlockObject(p->reply_entry); +#endif p->reply_entry = NULL; /* * and now we don't care about the client side either @@ -222,7 +259,11 @@ pumpReadFromClient(int fd, void *data) { PumpStateData *p = data; +#ifdef DSA + StoreEntry *req = p->request_entry->p; +#else StoreEntry *req = p->request_entry; +#endif LOCAL_ARRAY(char, buf, SQUID_TCP_SO_RCVBUF); int bytes_to_read = XMIN(p->req->content_length - p->rcvd, SQUID_TCP_SO_RCVBUF); int len = 0; @@ -249,7 +290,7 @@ pumpClose(p); } return; - } else if (req->p->mem_obj->inmem_hi == 0) { + } else if (req->mem_obj->inmem_hi == 0) { debug(61, 2) ("pumpReadFromClient: FD %d: failed.\n", fd); pumpClose(p); return; @@ -298,8 +339,13 @@ pumpClose(void *data) { PumpStateData *p = data; +#ifdef DSA + StoreEntry *req = p->request_entry->p; + StoreEntry *rep = p->reply_entry->p; +#else StoreEntry *req = p->request_entry; StoreEntry *rep = p->reply_entry; +#endif cbdataLock(p); debug(61, 3) ("pumpClose: %p Server FD %d, Client FD %d\n", p, p->s_fd, p->c_fd); @@ -330,8 +376,13 @@ { PumpStateData *p = NULL; PumpStateData *q = NULL; +#ifdef DSA + InstanceEntry *req; + InstanceEntry *rep; +#else StoreEntry *req; StoreEntry *rep; +#endif debug(61, 3) ("pumpFree: FD %d, releasing %p!\n", fd, data); for (p = pump_head; p && p != data; q = p, p = p->next); if (p == NULL) { @@ -347,13 +398,22 @@ req = p->request_entry; rep = p->reply_entry; if (req != NULL) { +#ifdef DSA + storeUnregister(p->sc, req->p, p); + storeUnlockObject(req->p); +#else storeUnregister(p->sc, req, p); - payloadUnlockObject(req->p); + storeUnlockObject(req); +#endif p->request_entry = NULL; } if (rep != NULL) { debug(61, 3) ("pumpFree: did the server-side FD (%d) get closed?\n", p->s_fd); - payloadUnlockObject(rep->p); +#ifdef DSA + storeUnlockObject(rep->p); +#else + storeUnlockObject(rep); +#endif p->reply_entry = NULL; } requestUnlink(p->req); @@ -410,7 +470,11 @@ debug(61, 3) ("pumpRestart: NO: Can't find pumpState!\n"); return 0; } +#ifdef DSA mem = p->request_entry->p->mem_obj; +#else + mem = p->request_entry->mem_obj; +#endif if (mem == NULL) { debug(61, 3) ("pumpRestart: NO: request_entry->mem_obj == NULL!\n"); return 0; Index: squid/src/refresh.c diff -u squid/src/refresh.c:1.5.2.2.2.1 squid/src/refresh.c:1.5.2.2.4.1 --- squid/src/refresh.c:1.5.2.2.2.1 Wed Aug 14 03:15:35 2002 +++ squid/src/refresh.c Fri Nov 15 01:10:36 2002 @@ -102,7 +102,11 @@ static const refresh_t *refreshLimits(const char *); static const refresh_t *refreshUncompiledPattern(const char *); static OBJH refreshStats; +#ifdef DSA +static int refreshStaleness(const InstanceEntry *, time_t, time_t, const refresh_t *, stale_flags *); +#else static int refreshStaleness(const StoreEntry *, time_t, time_t, const refresh_t *, stale_flags *); +#endif static refresh_t DefaultRefresh; @@ -143,7 +147,11 @@ * times. */ static int +#ifdef DSA +refreshStaleness(const InstanceEntry * entry, time_t check_time, time_t age, const refresh_t * R, stale_flags * sf) +#else refreshStaleness(const StoreEntry * entry, time_t check_time, time_t age, const refresh_t * R, stale_flags * sf) +#endif { /* * Check for an explicit expiration time. @@ -209,7 +217,11 @@ * note: request maybe null (e.g. for cache digests build) */ static int +#ifdef DSA +refreshCheck(const InstanceEntry * entry, request_t * request, time_t delta) +#else refreshCheck(const StoreEntry * entry, request_t * request, time_t delta) +#endif { const refresh_t *R; const char *uri = NULL; @@ -217,8 +229,13 @@ time_t check_time = squid_curtime + delta; int staleness; stale_flags sf; +#ifdef DSA if (entry->p->mem_obj) uri = entry->p->mem_obj->url; +#else + if (entry->mem_obj) + uri = entry->mem_obj->url; +#endif else if (request) uri = urlCanonical(request); @@ -319,11 +336,15 @@ } int +#ifdef DSA +refreshIsCachable(const InstanceEntry * entry) +#else refreshIsCachable(const StoreEntry * entry) +#endif { /* * Don't look at the request to avoid no-cache and other nuisances. - * the object should have a p->mem_obj so the URL will be found there. + * the object should have a mem_obj so the URL will be found there. * 60 seconds delta, to avoid objects which expire almost * immediately, and which can't be refreshed. */ @@ -336,13 +357,23 @@ if (entry->lastmod < 0) /* Last modified is needed to do a refresh */ return 0; +#ifdef DSA if (entry->p->mem_obj == NULL) - /* no p->mem_obj? */ + /* no mem_obj? */ return 1; if (entry->p->mem_obj->reply == NULL) /* no reply? */ return 1; if (entry->p->mem_obj->reply->content_length == 0) +#else + if (entry->mem_obj == NULL) + /* no mem_obj? */ + return 1; + if (entry->mem_obj->reply == NULL) + /* no reply? */ + return 1; + if (entry->mem_obj->reply->content_length == 0) +#endif /* No use refreshing (caching?) 0 byte objects */ return 0; /* This seems to be refreshable. Cache it */ @@ -353,7 +384,11 @@ * refreshCheck() function above */ int +#ifdef DSA +refreshCheckHTTP(const InstanceEntry * entry, request_t * request) +#else refreshCheckHTTP(const StoreEntry * entry, request_t * request) +#endif { int reason = refreshCheck(entry, request, 0); refreshCounts[rcHTTP].total++; @@ -362,7 +397,11 @@ } int +#ifdef DSA +refreshCheckICP(const InstanceEntry * entry, request_t * request) +#else refreshCheckICP(const StoreEntry * entry, request_t * request) +#endif { int reason = refreshCheck(entry, request, 30); refreshCounts[rcICP].total++; @@ -372,7 +411,11 @@ #if USE_HTCP int +#ifdef DSA +refreshCheckHTCP(const InstanceEntry * entry, request_t * request) +#else refreshCheckHTCP(const StoreEntry * entry, request_t * request) +#endif { int reason = refreshCheck(entry, request, 10); refreshCounts[rcHTCP].total++; @@ -386,7 +429,7 @@ refreshCheckDigest(const StoreEntry * entry, time_t delta) { int reason = refreshCheck(entry, - entry->p->mem_obj ? entry->p->mem_obj->request : NULL, + entry->mem_obj ? entry->mem_obj->request : NULL, delta); refreshCounts[rcCDigest].total++; refreshCounts[rcCDigest].status[reason]++; Index: squid/src/repl_modules.sh diff -u squid/src/repl_modules.sh:1.2.124.1 squid/src/repl_modules.sh:1.2 --- squid/src/repl_modules.sh:1.2.124.1 Wed Aug 14 03:15:35 2002 +++ squid/src/repl_modules.sh Sat Oct 21 08:16:13 2000 @@ -10,6 +10,6 @@ echo "void storeReplSetup(void)" echo "{" for module in "$@"; do - echo " payloadReplAdd(\"$module\", createRemovalPolicy_${module});" + echo " storeReplAdd(\"$module\", createRemovalPolicy_${module});" done echo "}" Index: squid/src/stat.c diff -u squid/src/stat.c:1.4.4.2.2.1 squid/src/stat.c:1.4.4.2.4.1 --- squid/src/stat.c:1.4.4.2.2.1 Wed Aug 14 03:15:35 2002 +++ squid/src/stat.c Fri Nov 15 01:10:36 2002 @@ -194,9 +194,10 @@ describeStatuses(const StoreEntry * entry) { LOCAL_ARRAY(char, buf, 256); - snprintf(buf, 256, "%-13s %-13s %-12s", + snprintf(buf, 256, "%-13s %-13s %-12s %-12s", storeStatusStr[entry->store_status], - memStatusStr[entry->p->mem_status], + memStatusStr[entry->mem_status], + swapStatusStr[entry->swap_status], pingStatusStr[entry->ping_status]); return buf; } @@ -243,17 +244,20 @@ describeTimestamps(const StoreEntry * entry) { LOCAL_ARRAY(char, buf, 256); - snprintf(buf, 256, "LV:%-9d LM:%-9d EX:%-9d", +#ifndef DSA + snprintf(buf, 256, "LV:%-9d LU:%-9d LM:%-9d EX:%-9d", (int) entry->timestamp, + (int) entry->lastref, (int) entry->lastmod, (int) entry->expires); +#endif return buf; } static void statStoreEntry(StoreEntry * s, StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; int i; struct _store_client *sc; dlink_node *node; @@ -264,12 +268,12 @@ storeAppendPrintf(s, "\t%s\n", describeStatuses(e)); storeAppendPrintf(s, "\t%s\n", storeEntryFlags(e)); storeAppendPrintf(s, "\t%s\n", describeTimestamps(e)); - storeAppendPrintf(s, "\t%d locks, %d clients\n", - (int) e->p->lock_count, - storePendingNClients(e)); -// (int) e->refcount); -// storeAppendPrintf(s, "\tSwap Dir %d, File %#08X\n", -// e->swap_dirn, e->swap_filen); + storeAppendPrintf(s, "\t%d locks, %d clients, %d refs\n", + (int) e->lock_count, + storePendingNClients(e), + (int) e->refcount); + storeAppendPrintf(s, "\tSwap Dir %d, File %#08X\n", + e->swap_dirn, e->swap_filen); if (mem != NULL) { storeAppendPrintf(s, "\tinmem_lo: %d\n", (int) mem->inmem_lo); storeAppendPrintf(s, "\tinmem_hi: %d\n", (int) mem->inmem_hi); @@ -312,11 +316,11 @@ hash_link *link_next = NULL; if (state->bucket >= store_hash_buckets) { storeComplete(state->sentry); - payloadUnlockObject(state->sentry->p); + storeUnlockObject(state->sentry); cbdataFree(state); return; } else if (EBIT_TEST(state->sentry->flags, ENTRY_ABORTED)) { - payloadUnlockObject(state->sentry->p); + storeUnlockObject(state->sentry); cbdataFree(state); return; } else if (fwdCheckDeferRead(-1, state->sentry)) { @@ -344,7 +348,7 @@ StatObjectsState *state = xcalloc(1, sizeof(*state)); state->sentry = sentry; state->filter = filter; - payloadLockObject(sentry->p); + storeLockObject(sentry); cbdataAdd(state, cbdataXfree, 0); eventAdd("statObjects", statObjects, state, 0.0, 1); } @@ -358,7 +362,7 @@ static int statObjectsVmFilter(const StoreEntry * e) { - return e->p->mem_obj ? 1 : 0; + return e->mem_obj ? 1 : 0; } static void @@ -371,9 +375,9 @@ static int statObjectsOpenfdFilter(const StoreEntry * e) { - if (e->p->mem_obj == NULL) + if (e->mem_obj == NULL) return 0; - if (e->p->mem_obj->swapout.sio == NULL) + if (e->mem_obj->swapout.sio == NULL) return 0; return 1; } @@ -1422,9 +1426,17 @@ storeAppendPrintf(s, "out.offset %d, out.size %d\n", http->out.offset, http->out.size); storeAppendPrintf(s, "req_sz %d\n", http->req_sz); +#ifdef DSA + e = http->entry->p; +#else e = http->entry; +#endif storeAppendPrintf(s, "entry %p/%s\n", e, e ? storeKeyText(e->hash.key) : "N/A"); +#ifdef DSA + e = http->old_entry->p; +#else e = http->old_entry; +#endif storeAppendPrintf(s, "old_entry %p/%s\n", e, e ? storeKeyText(e->hash.key) : "N/A"); storeAppendPrintf(s, "start %d.%06d (%f seconds ago)\n", http->start.tv_sec, http->start.tv_usec, Index: squid/src/store.c diff -u squid/src/store.c:1.4.4.5.4.1 squid/src/store.c:1.4.4.5.6.16.2.3 --- squid/src/store.c:1.4.4.5.4.1 Wed Aug 14 03:15:35 2002 +++ squid/src/store.c Wed Mar 10 22:02:58 2004 @@ -73,15 +73,31 @@ extern OBJH storeIOStats; +#ifdef DSA +static void instanceHashDelete(InstanceEntry *); +static FREE destroy_InstanceEntry; +#endif /* * local function prototypes */ static int storeEntryValidLength(const StoreEntry *); +static void storeGetMemSpace(int); static void storeHashDelete(StoreEntry *); +static MemObject *new_MemObject(const char *, const char *); +static void destroy_MemObject(StoreEntry *); static FREE destroy_StoreEntry; +static void storePurgeMem(StoreEntry *); +static void storeEntryReferenced(StoreEntry *); +static void storeEntryDereferenced(StoreEntry *); static int getKeyCounter(void); -static MemObject * new_MemObject(const char *, const char *); +static int storeKeepInMemory(const StoreEntry *); static OBJH storeCheckCachableStats; +static EVH storeLateRelease; + +/* + * local variables + */ +static Stack LateReleaseStack; #if URL_CHECKSUM_DEBUG unsigned int @@ -98,27 +114,220 @@ } #endif +static MemObject * +new_MemObject(const char *url, const char *log_url) +{ + MemObject *mem = memAllocate(MEM_MEMOBJECT); + mem->reply = httpReplyCreate(); + mem->url = xstrdup(url); +#if URL_CHECKSUM_DEBUG + mem->chksum = url_checksum(mem->url); +#endif + mem->log_url = xstrdup(log_url); + mem->object_sz = -1; + mem->fd = -1; + /* XXX account log_url */ + debug(20, 3) ("new_MemObject: returning %p\n", mem); + return mem; +} + +#ifdef DSA void -storeCreateMemObject(StoreEntry * e, const char *url, const char *log_url) +storeReleaseRequest(StoreEntry * e) +{ + int i; + if (EBIT_TEST(e->flags, RELEASE_REQUEST)) + return; + debug(20, 3) ("storeReleaseRequest: '%s'\n", storeKeyText(e->hash.key)); + EBIT_SET(e->flags, RELEASE_REQUEST); + /* + * Clear cachable flag here because we might get called before + * anyone else even looks at the cachability flag. Also, this + * prevents httpMakePublic from really setting a public key. + */ + EBIT_CLR(e->flags, ENTRY_CACHABLE); +// if (e->mem_obj && e->mem_obj->e) +// instanceReleaseRequest(e->mem_obj->e); + for (i = 0; i < e->instances->count; ++i) + instanceReleaseRequest(e->instances->items[i]); +} + +/* release an object from a cache */ +void +storeRelease(StoreEntry * e) { - if (e->p->mem_obj) + int i; +// assert(p->instances); +/* + if (EBIT_TEST(p->flags, KEY_PRIVATE)) + assert(p->hash.key == NULL); + else + */ +#ifdef DTD + /* just memFree bogus StoreEntry */ + if (e->flags == 0) { + memFree(e, MEM_STOREENTRY); return; - e->p->mem_obj = new_MemObject(url, log_url); + } +#endif + if (!EBIT_TEST(e->flags, KEY_PRIVATE)) + assert(e->hash.key); + debug(20, 3) ("storeRelease: Releasing: '%s'\n", storeKeyText(e->hash.key)); + /* If, for any reason we can't discard this object because of an + * outstanding request, mark it for pending release */ + if (storeEntryLocked(e)) { + debug(20, 3) ("payloadRelease: Only setting RELEASE_REQUEST bit\n"); + storeReleaseRequest(e); + return; + } + if (store_dirs_rebuilding && e->swap_filen > -1) { + if (e->swap_filen > -1) { + /* + * Fake a call to storeLockObject(). When rebuilding is done, + * we'll just call storeUnlockObject() on these. + */ + e->lock_count++; + EBIT_SET(e->flags, RELEASE_REQUEST); + stackPush(&LateReleaseStack, e); + return; + } else { + for (i = 0; i < e->instances->count; ++i) + instanceRelease(e->instances->items[i]); + arrayDestroy(e->instances); + e->instances = NULL; + destroy_StoreEntry(e); + } + } + for (i = 0; i < e->instances->count; ++i) + instanceRelease(e->instances->items[i]); + arrayDestroy(e->instances); + e->instances = NULL; + storeLog(STORE_LOG_RELEASE, e); + if (e->swap_filen > -1) { + storeUnlink(e); + if (e->swap_status == SWAPOUT_DONE) + if (EBIT_TEST(e->flags, ENTRY_VALIDATED)) + storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->swap_dirn], e->swap_file_sz, -1); + if (!EBIT_TEST(e->flags, KEY_PRIVATE)) + storeDirSwapLog(e, SWAP_LOG_DEL); + } + storeSetMemStatus(e, NOT_IN_MEMORY); + destroy_StoreEntry(e); +} + +void +instanceHashInsert(InstanceEntry * e, const cache_key * key) +{ + debug(20, 3) ("storeHashInsert: Inserting Entry %p key '%s'\n", + e, storeKeyText(key)); + e->hash.key = storeKeyDup(key); + hash_join(instance_table, &e->hash); +} + +static void +instanceHashDelete(InstanceEntry * e) +{ + hash_remove_link(instance_table, &e->hash); + storeKeyFree(e->hash.key); + e->hash.key = NULL; +} + +InstanceEntry * +new_InstanceEntry(int mem_obj_flag, const char *url, const char *log_url) +{ + InstanceEntry *e = NULL; + e = memAllocate(MEM_INSTANCEENTRY); + if (mem_obj_flag) { + e->p = storeCreateEntry(); + e->p->mem_obj = new_MemObject(url, log_url); + e->p->mem_obj->e = e; + } + debug(20, 3) ("new_InstanceEntry: returning %p\n", e); + e->expires = e->lastmod = e->timestamp = -1; + return e; } +InstanceEntry * +instanceCreateEntry(const char * url, const char * log_url, request_flags flags, method_t method) +{ + InstanceEntry *e = NULL; + + e = new_InstanceEntry(STORE_ENTRY_WITH_MEMOBJ, url, log_url); + e->p->mem_obj->method = method; + if (neighbors_do_private_keys || !flags.hierarchical) + storeSetPrivateKey(e); + else + storeSetPublicKey(e); + if (e->p != NULL && !EBIT_TEST(e->p->flags, KEY_PRIVATE)) + storeAddInstanceEntry(e->p, e); + if (flags.cachable) { + EBIT_CLR(e->flags, RELEASE_REQUEST); + EBIT_CLR(e->p->flags, RELEASE_REQUEST); + } else { + EBIT_CLR(e->flags, ENTRY_CACHABLE); + EBIT_CLR(e->p->flags, ENTRY_CACHABLE); + storeReleaseRequest(e->p); + } + e->timestamp = -1; /* set in storeTimestampsSet() */ + EBIT_SET(e->flags, ENTRY_VALIDATED); + return e; +} + +InstanceEntry * +instanceGet(const cache_key * key) +{ + debug(20, 3) ("storeGet: looking up %s\n", storeKeyText(key)); + return (InstanceEntry *) hash_lookup(instance_table, key); +} + +InstanceEntry * +instanceGetPublic(const char *uri, const method_t method) +{ + return instanceGet(storeKeyPublic(uri, method)); +} +#else StoreEntry * new_StoreEntry(int mem_obj_flag, const char *url, const char *log_url) { StoreEntry *e = NULL; e = memAllocate(MEM_STOREENTRY); - if (mem_obj_flag) { - e->p = payloadCreateEntry(); - e->p->mem_obj = new_MemObject(url, log_url); - } + if (mem_obj_flag) + e->mem_obj = new_MemObject(url, log_url); debug(20, 3) ("new_StoreEntry: returning %p\n", e); - e->expires = e->lastmod = e->timestamp = -1; + e->expires = e->lastmod = e->lastref = e->timestamp = -1; + e->swap_filen = -1; + e->swap_dirn = -1; return e; } +#endif + +static void +destroy_MemObject(StoreEntry * e) +{ + MemObject *mem = e->mem_obj; + const Ctx ctx = ctx_enter(mem->url); + debug(20, 3) ("destroy_MemObject: destroying %p\n", mem); +#if URL_CHECKSUM_DEBUG + assert(mem->chksum == url_checksum(mem->url)); +#endif + e->mem_obj = NULL; + if (!shutting_down) + assert(mem->swapout.sio == NULL); + stmemFree(&mem->data_hdr); + mem->inmem_hi = 0; + /* + * There is no way to abort FD-less clients, so they might + * still have mem->clients set if mem->fd == -1 + */ + assert(mem->fd == -1 || mem->clients.head == NULL); + httpReplyDestroy(mem->reply); + requestUnlink(mem->request); + mem->request = NULL; + ctx_exit(ctx); /* must exit before we free mem->url */ + safe_free(mem->url); + safe_free(mem->log_url); /* XXX account log_url */ + memFree(mem, MEM_MEMOBJECT); +} static void destroy_StoreEntry(void *data) @@ -126,14 +335,36 @@ StoreEntry *e = data; debug(20, 3) ("destroy_StoreEntry: destroying %p\n", e); assert(e != NULL); + if (e->mem_obj) + destroy_MemObject(e); storeHashDelete(e); assert(e->hash.key == NULL); memFree(e, MEM_STOREENTRY); } /* ----- INTERFACE BETWEEN STORAGE MANAGER AND HASH TABLE FUNCTIONS --------- */ +#ifdef DSA +static void +destroy_InstanceEntry(void *data) +{ + InstanceEntry *e = data; + debug(20, 3) ("destroy_StoreEntry: destroying %p\n", e); + assert(e != NULL); + instanceHashDelete(e); + assert(e->hash.key == NULL); + if (e->p) arrayDelete(e->p->instances, e); + memFree(e, MEM_INSTANCEENTRY); +} void +storeHashInsert(StoreEntry * e) +{ + debug(20, 3) ("storeHashInsert: Inserting Entry %p key '%s'\n", + e, storeKeyText(e->hash.key)); + hash_join(store_table, &e->hash); +} +#else +void storeHashInsert(StoreEntry * e, const cache_key * key) { debug(20, 3) ("storeHashInsert: Inserting Entry %p key '%s'\n", @@ -141,10 +372,17 @@ e->hash.key = storeKeyDup(key); hash_join(store_table, &e->hash); } +#endif static void storeHashDelete(StoreEntry * e) { +#ifdef DSA + StoreEntry * p = storeGet(e->hash.key); + EBIT_SET(e->flags, KEY_PRIVATE); + if (p == e) /* only remove hash entry from table + in DSA miss */ +#endif hash_remove_link(store_table, &e->hash); storeKeyFree(e->hash.key); e->hash.key = NULL; @@ -152,8 +390,74 @@ /* -------------------------------------------------------------------------- */ + +/* get rid of memory copy of the object */ +/* Only call this if storeCheckPurgeMem(e) returns 1 */ +static void +storePurgeMem(StoreEntry * e) +{ + if (e->mem_obj == NULL) + return; + debug(20, 3) ("storePurgeMem: Freeing memory-copy of %s\n", + storeKeyText(e->hash.key)); + storeSetMemStatus(e, NOT_IN_MEMORY); + destroy_MemObject(e); + if (e->swap_status != SWAPOUT_DONE) + storeRelease(e); +} + +static void +storeEntryReferenced(StoreEntry * e) +{ + SwapDir *SD; + + /* Notify the fs that we're referencing this object again */ + if (e->swap_dirn > -1) { + SD = INDEXSD(e->swap_dirn); + if (SD->refobj) + SD->refobj(SD, e); + } + /* Notify the memory cache that we're referencing this object again */ + if (e->mem_obj) { + if (mem_policy->Referenced) + mem_policy->Referenced(mem_policy, e, &e->mem_obj->repl); + } +} + +static void +storeEntryDereferenced(StoreEntry * e) +{ + SwapDir *SD; + + /* Notify the fs that we're not referencing this object any more */ + if (e->swap_filen > -1) { + SD = INDEXSD(e->swap_dirn); + if (SD->unrefobj != NULL) + SD->unrefobj(SD, e); + } + /* Notify the memory cache that we're not referencing this object any more */ + if (e->mem_obj) { + if (mem_policy->Dereferenced) + mem_policy->Dereferenced(mem_policy, e, &e->mem_obj->repl); + } +} + void +storeLockObject(StoreEntry * e) +{ + e->lock_count++; + debug(20, 3) ("storeLockObject: key '%s' count=%d\n", + storeKeyText(e->hash.key), (int) e->lock_count); + e->lastref = squid_curtime; + storeEntryReferenced(e); +} + +void +#ifdef DSA +instanceReleaseRequest(InstanceEntry * e) +#else storeReleaseRequest(StoreEntry * e) +#endif { if (EBIT_TEST(e->flags, RELEASE_REQUEST)) return; @@ -164,10 +468,41 @@ * anyone else even looks at the cachability flag. Also, this * prevents httpMakePublic from really setting a public key. */ +#ifndef DSA EBIT_CLR(e->flags, ENTRY_CACHABLE); +#endif storeSetPrivateKey(e); } +/* unlock object, return -1 if object get released after unlock + * otherwise lock_count */ +int +storeUnlockObject(StoreEntry * e) +{ + e->lock_count--; + debug(20, 3) ("storeUnlockObject: key '%s' count=%d\n", + storeKeyText(e->hash.key), e->lock_count); + if (e->lock_count) + return (int) e->lock_count; + if (e->store_status == STORE_PENDING) + EBIT_SET(e->flags, RELEASE_REQUEST); + assert(storePendingNClients(e) == 0); + if (EBIT_TEST(e->flags, RELEASE_REQUEST)) + storeRelease(e); + else if (storeKeepInMemory(e)) { + storeEntryDereferenced(e); + storeSetMemStatus(e, IN_MEMORY); + requestUnlink(e->mem_obj->request); + e->mem_obj->request = NULL; + } else { + storePurgeMem(e); + storeEntryDereferenced(e); + if (EBIT_TEST(e->flags, KEY_PRIVATE)) + debug(20, 1) ("WARNING: %s:%d: found KEY_PRIVATE\n", __FILE__, __LINE__); + } + return 0; +} + /* Lookup an object in the cache. * return just a reference to object, don't start swapping in yet. */ StoreEntry * @@ -192,14 +527,83 @@ return key_counter; } +#ifdef DSA void -storeSetPrivateKey(StoreEntry * e) +storeSetPrivateKey(InstanceEntry * e) +{ + const cache_key *newkey; + MemObject *mem = e->p->mem_obj; + if (e->hash.key && EBIT_TEST(e->flags, KEY_PRIVATE)) + return; /* is already private */ + if (e->hash.key) { +// if (e->p->swap_filen > -1) +// storeDirSwapLog(e->p, SWAP_LOG_DEL); + instanceHashDelete(e); + } + if (mem != NULL) { + mem->id = getKeyCounter(); + newkey = storeKeyPrivate(mem->url, mem->method, mem->id); + } else { + newkey = storeKeyPrivate("JUNK", METHOD_NONE, getKeyCounter()); + } + assert(hash_lookup(instance_table, newkey) == NULL); + EBIT_SET(e->flags, KEY_PRIVATE); + instanceHashInsert(e, newkey); +} + +void +storeSetPublicKey(InstanceEntry * e) { + InstanceEntry *e2 = NULL; const cache_key *newkey; + int i; MemObject *mem = e->p->mem_obj; + if (e->hash.key && !EBIT_TEST(e->flags, KEY_PRIVATE)) + return; /* is already public */ + assert(mem); + /* + * We can't make RELEASE_REQUEST objects public. Depending on + * when RELEASE_REQUEST gets set, we might not be swapping out + * the object. If we're not swapping out, then subsequent + * store clients won't be able to access object data which has + * been freed from memory. + * + * If RELEASE_REQUEST is set, then ENTRY_CACHABLE should not + * be set, and storeSetPublicKey() should not be called. + */ + assert(!EBIT_TEST(e->flags, RELEASE_REQUEST)); + newkey = storeKeyPublic(mem->url, mem->method); + if ((e2 = (InstanceEntry *) hash_lookup(instance_table, newkey))) { + debug(20, 3) ("storeSetPublicKey: Making old '%s' private.\n", mem->url); + storeSetPrivateKey(e2); + instanceRelease(e2); + newkey = storeKeyPublic(mem->url, mem->method); + } + if (e->hash.key) + instanceHashDelete(e); + EBIT_CLR(e->flags, KEY_PRIVATE); + if (e->p->instances->count > 0) { + for (i = 0; i < e->p->instances->count; ++i) { + if (e->p->instances->items[i] == e) break; + } + if (i == e->p->instances->count) arrayAppend(e->p->instances, e); + } + else arrayAppend(e->p->instances, e); + instanceHashInsert(e, newkey); + if (e->p->swap_filen > -1) + storeDirSwapLog(e->p, SWAP_LOG_ADD); +} +#else +void +storeSetPrivateKey(StoreEntry * e) +{ + const cache_key *newkey; + MemObject *mem = e->mem_obj; if (e->hash.key && EBIT_TEST(e->flags, KEY_PRIVATE)) return; /* is already private */ if (e->hash.key) { + if (e->swap_filen > -1) + storeDirSwapLog(e, SWAP_LOG_DEL); storeHashDelete(e); } if (mem != NULL) { @@ -218,7 +622,7 @@ { StoreEntry *e2 = NULL; const cache_key *newkey; - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; if (e->hash.key && !EBIT_TEST(e->flags, KEY_PRIVATE)) return; /* is already public */ assert(mem); @@ -249,21 +653,216 @@ storeHashDelete(e); EBIT_CLR(e->flags, KEY_PRIVATE); storeHashInsert(e, newkey); + if (e->swap_filen > -1) + storeDirSwapLog(e, SWAP_LOG_ADD); +} +#endif + +#ifdef DSA +/* oh well, a function that does mkdir -p in UFS. -ymc */ +static int +storeMakeRecursiveDir(char *dir) +{ + char *ptr = dir; + char Delimiter = '/'; + + for (; *ptr != '\0'; ++ptr) + { + if (*ptr != Delimiter) + { + continue; + } + + *ptr = '\0'; + if (strcmp(dir, "") && mkdir(dir, 0755) != 0) + { + if (errno != EEXIST) + { + debug(20, 0) ("Cannot create directory %s: %s\n", + dir, strerror(errno)); + *ptr = Delimiter; + return 0; + } + } + *ptr = Delimiter; + } + return 1; +} + +StoreEntry * +storeCreateEntry() +{ + StoreEntry *e = NULL; + + e = new_StoreEntry(); + e->lock_count = 1; + storeSetMemStatus(e, NOT_IN_MEMORY); + e->swap_filen = -1; + e->swap_dirn = -1; + e->refcount = -1; + e->lastref = squid_curtime; + e->instances = arrayCreate(); + e->store_status = STORE_PENDING; + e->hash.key = memAllocate(MEM_MD5_DIGEST); + EBIT_SET(e->flags, ENTRY_VALIDATED); /* xxxxx */ + EBIT_SET(e->flags, ENTRY_CACHABLE); /* xxxxx */ + EBIT_SET(e->flags, KEY_PRIVATE); /* xxxxx */ + return e; +} + +StoreEntry * +new_StoreEntry() +{ + StoreEntry *e = NULL; + e = memAllocate(MEM_STOREENTRY); + debug(20, 3) ("new_StoreEntry: returning %p\n", e); + e->swap_filen = -1; + e->swap_dirn = -1; + e->swap_status = SWAPOUT_NONE; + MD5Init(&e->ctx); + return e; +} + +/* adds an InstanceEntry to the array in a StoreEntry. + * looks like a very bug prone funcion. -ymc */ +void +storeAddInstanceEntry(StoreEntry * p, InstanceEntry * e) +{ + tlv * tlv_list = NULL; + char * buf = NULL; + char metadata_path[SQUID_MAXPATHLEN]; + int swap_hdr_sz = 0; + FILE * fp; + int i; + cache_key key[MD5_DIGEST_CHARS]; + + /* return if key of p is NULL */ + if (EBIT_TEST(p->flags, KEY_PRIVATE)) + return; + /* return if the entry is already added */ + if (EBIT_TEST(e->flags, ENTRY_CACHABLE)) + return; + if (p->instances->count > 0) { + for (i = 0; i < p->instances->count; ++i) { + if (p->instances->items[i] == e) break; + } + if (i == p->instances->count) arrayAppend(p->instances, e); + } + else + arrayAppend(p->instances, e); + EBIT_SET(e->flags, ENTRY_CACHABLE); + xmemcpy(key, p->hash.key, MD5_DIGEST_CHARS); + snprintf(metadata_path, sizeof(metadata_path), + "%s/instances/%2.2x/%2.2x/%2.2x%2.2x" + "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x" + "%2.2x%2.2x%2.2x%2.2x%2.2x/", + Config.cacheSwap.swapDirs[0].path, + key[ 0] & 0xff, key[ 1] & 0xff, + key[ 2] & 0xff, key[ 3] & 0xff, + key[ 4] & 0xff, key[ 5] & 0xff, + key[ 6] & 0xff, key[ 7] & 0xff, + key[ 8] & 0xff, key[ 9] & 0xff, + key[10] & 0xff, key[11] & 0xff, + key[12] & 0xff, key[13] & 0xff, + key[14] & 0xff, key[15] & 0xff); + if (storeMakeRecursiveDir(metadata_path) == 0) return; + metadata_path[strlen(metadata_path)+MD5_DIGEST_CHARS*2] = '\0'; + xmemcpy(metadata_path+strlen(metadata_path), storeKeyText(e->hash.key), MD5_DIGEST_CHARS*2); + tlv_list = instanceSwapMetaBuild(e); + buf = storeSwapMetaPack(tlv_list, &swap_hdr_sz); + fp = fopen(metadata_path, "w"); + if (fp) { + int ret = fwrite(buf, sizeof(char), swap_hdr_sz, fp); + if (ret != swap_hdr_sz) + debug(20, 0) ("Cannot write metadata file for instance %s of payload %s!", storeKeyText(e->hash.key), storeKeyText(p->hash.key)); + fclose(fp); + } + else + debug(20, 0) ("Cannot open metadata file for instance %s of payload %s!", storeKeyText(e->hash.key), storeKeyText(p->hash.key)); + +} + +void +storeRemoveInstanceEntry(StoreEntry * p, InstanceEntry * e) +{ + char metadata_path[SQUID_MAXPATHLEN]; + cache_key key[MD5_DIGEST_CHARS]; + if (!EBIT_TEST(e->flags, ENTRY_CACHABLE)) + return; + arrayDelete(p->instances, e); + /* remove corresponding metadata file in disk */ + xmemcpy(key, p->hash.key, MD5_DIGEST_CHARS); + snprintf(metadata_path, sizeof(metadata_path), + "%s/instances/%2.2x/%2.2x/%2.2x%2.2x" + "%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x" + "%2.2x%2.2x%2.2x%2.2x%2.2x/", + Config.cacheSwap.swapDirs[0].path, + key[ 0] & 0xff, key[ 1] & 0xff, + key[ 2] & 0xff, key[ 3] & 0xff, + key[ 4] & 0xff, key[ 5] & 0xff, + key[ 6] & 0xff, key[ 7] & 0xff, + key[ 8] & 0xff, key[ 9] & 0xff, + key[10] & 0xff, key[11] & 0xff, + key[12] & 0xff, key[13] & 0xff, + key[14] & 0xff, key[15] & 0xff); + metadata_path[strlen(metadata_path)+MD5_DIGEST_CHARS*2] = '\0'; + if (EBIT_TEST(e->flags, KEY_PRIVATE)) { + if (e->p->mem_obj == NULL) return; + xmemcpy(metadata_path+strlen(metadata_path), storeKeyText(storeKeyPublic(e->p->mem_obj->url, e->p->mem_obj->method)), MD5_DIGEST_CHARS*2); + } + else + xmemcpy(metadata_path+strlen(metadata_path), storeKeyText(e->hash.key), MD5_DIGEST_CHARS*2); + unlink(metadata_path); /* For now, doesn't matter if it fails */ } +/* +static void +destroy_PayloadEntry(void *data) +{ + PayloadEntry *p = data; + int i; + debug(20, 3) ("destroy_PayloadEntry: destroying %p\n", p); + if (p->mem_obj) + destroy_MemObject(p); + assert(p != NULL); + assert(p->instances); + for (i = 0; i < p->instances->count; ++i) + storeRelease(p->instances->items[i]); + xfree(p->instances); + payloadHashDelete(p); + assert(p->hash.key == NULL); + memFree(p, MEM_PAYLOADENTRY); +} +*/ +void +instanceEntryReset(InstanceEntry * e) +{ + MemObject *mem = e->p->mem_obj; + debug(20, 3) ("storeEntryReset: %s\n", storeUrl(e->p)); + assert(mem->swapout.sio == NULL); + stmemFree(&mem->data_hdr); + mem->inmem_hi = mem->inmem_lo = 0; + httpReplyDestroy(mem->reply); + mem->reply = httpReplyCreate(); + e->expires = e->lastmod = e->timestamp = -1; +} + +#else StoreEntry * -storeCreateEntry(const char * url, const char * log_url, request_flags flags, method_t method) +storeCreateEntry(const char *url, const char *log_url, request_flags flags, method_t method) { StoreEntry *e = NULL; + MemObject *mem = NULL; + debug(20, 3) ("storeCreateEntry: '%s'\n", url); e = new_StoreEntry(STORE_ENTRY_WITH_MEMOBJ, url, log_url); - e->p->mem_obj->method = method; + e->lock_count = 1; /* Note lock here w/o calling storeLock() */ + mem = e->mem_obj; + mem->method = method; if (neighbors_do_private_keys || !flags.hierarchical) storeSetPrivateKey(e); else storeSetPublicKey(e); - if (e->p != NULL) - payloadAddStoreEntry(e->p, e); if (flags.cachable) { EBIT_SET(e->flags, ENTRY_CACHABLE); EBIT_CLR(e->flags, RELEASE_REQUEST); @@ -272,20 +871,55 @@ storeReleaseRequest(e); } e->store_status = STORE_PENDING; + storeSetMemStatus(e, NOT_IN_MEMORY); + e->swap_status = SWAPOUT_NONE; + e->swap_filen = -1; + e->swap_dirn = -1; + e->refcount = 0; + e->lastref = squid_curtime; e->timestamp = -1; /* set in storeTimestampsSet() */ e->ping_status = PING_NONE; EBIT_SET(e->flags, ENTRY_VALIDATED); return e; } +#endif /* Mark object as expired */ void +#ifdef DSA +storeExpireNow(InstanceEntry * e) +#else storeExpireNow(StoreEntry * e) +#endif { debug(20, 3) ("storeExpireNow: '%s'\n", storeKeyText(e->hash.key)); e->expires = squid_curtime; } +/* Append incoming data from a primary server to an entry. */ +void +storeAppend(StoreEntry * e, const char *buf, int len) +{ + MemObject *mem = e->mem_obj; + assert(mem != NULL); + assert(len >= 0); +#ifndef DTD + assert(e->store_status == STORE_PENDING); +#endif + if (len) { + debug(20, 5) ("storeAppend: appending %d bytes for '%s'\n", + len, + storeKeyText(e->hash.key)); + storeGetMemSpace(len); + stmemAppend(&mem->data_hdr, buf, len); + mem->inmem_hi += len; + } + if (EBIT_TEST(e->flags, DELAY_SENDING)) + return; + InvokeHandlers(e); + storeSwapOut(e); +} + void #if STDC_HEADERS storeAppendPrintf(StoreEntry * e, const char *fmt,...) @@ -350,7 +984,7 @@ static int storeCheckTooSmall(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) return 0; if (STORE_OK == e->store_status) @@ -380,25 +1014,33 @@ } else if (e->store_status == STORE_OK && EBIT_TEST(e->flags, ENTRY_BAD_LENGTH)) { debug(20, 2) ("storeCheckCachable: NO: wrong content-length\n"); store_check_cachable_hist.no.wrong_content_length++; +#ifdef DSA + } else if (EBIT_TEST(e->mem_obj->e->flags, ENTRY_NEGCACHED)) { +#else } else if (EBIT_TEST(e->flags, ENTRY_NEGCACHED)) { +#endif debug(20, 3) ("storeCheckCachable: NO: negative cached\n"); store_check_cachable_hist.no.negative_cached++; return 0; /* avoid release call below */ - } else if ((e->p->mem_obj->reply->content_length > 0 && - e->p->mem_obj->reply->content_length > Config.Store.maxObjectSize) || - e->p->mem_obj->inmem_hi > Config.Store.maxObjectSize) { + } else if ((e->mem_obj->reply->content_length > 0 && + e->mem_obj->reply->content_length > Config.Store.maxObjectSize) || + e->mem_obj->inmem_hi > Config.Store.maxObjectSize) { debug(20, 2) ("storeCheckCachable: NO: too big\n"); store_check_cachable_hist.no.too_big++; - } else if (e->p->mem_obj->reply->content_length > (int) Config.Store.maxObjectSize) { + } else if (e->mem_obj->reply->content_length > (int) Config.Store.maxObjectSize) { debug(20, 2) ("storeCheckCachable: NO: too big\n"); store_check_cachable_hist.no.too_big++; } else if (storeCheckTooSmall(e)) { debug(20, 2) ("storeCheckCachable: NO: too small\n"); store_check_cachable_hist.no.too_small++; +#ifdef DSA + } else if (EBIT_TEST(e->mem_obj->e->flags, KEY_PRIVATE)) { +#else } else if (EBIT_TEST(e->flags, KEY_PRIVATE)) { +#endif debug(20, 3) ("storeCheckCachable: NO: private key\n"); store_check_cachable_hist.no.private_key++; - } else if (e->p->swap_status != SWAPOUT_NONE) { + } else if (e->swap_status != SWAPOUT_NONE) { /* * here we checked the swap_status because the remaining * cases are only relevant only if we haven't started swapping @@ -449,23 +1091,6 @@ store_check_cachable_hist.yes.Default); } -static MemObject * -new_MemObject(const char *url, const char *log_url) -{ - MemObject *mem = memAllocate(MEM_MEMOBJECT); - mem->reply = httpReplyCreate(); - mem->url = xstrdup(url); -#if URL_CHECKSUM_DEBUG - mem->chksum = url_checksum(mem->url); -#endif - mem->log_url = xstrdup(log_url); - mem->object_sz = -1; - mem->fd = -1; - /* XXX account log_url */ - debug(20, 3) ("new_MemObject: returning %p\n", mem); - return mem; -} - /* Complete transfer into the local cache. */ void storeComplete(StoreEntry * e) @@ -476,20 +1101,22 @@ * if we're not STORE_PENDING, then probably we got aborted * and there should be NO clients on this entry */ +#ifndef DTD assert(EBIT_TEST(e->flags, ENTRY_ABORTED)); - assert(e->p->mem_obj->nclients == 0); + assert(e->mem_obj->nclients == 0); +#endif return; } - e->p->mem_obj->object_sz = e->p->mem_obj->inmem_hi; + e->mem_obj->object_sz = e->mem_obj->inmem_hi; e->store_status = STORE_OK; - assert(e->p->mem_status == NOT_IN_MEMORY); + assert(e->mem_status == NOT_IN_MEMORY); if (!storeEntryValidLength(e)) { EBIT_SET(e->flags, ENTRY_BAD_LENGTH); storeReleaseRequest(e); } #if USE_CACHE_DIGESTS - if (e->p->mem_obj->request) - e->p->mem_obj->request->hier.store_complete_stop = current_time; + if (e->mem_obj->request) + e->mem_obj->request->hier.store_complete_stop = current_time; #endif /* * We used to call InvokeHandlers, then storeSwapOut. However, @@ -509,15 +1136,19 @@ void storeAbort(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; assert(e->store_status == STORE_PENDING); assert(mem != NULL); debug(20, 6) ("storeAbort: %s\n", storeKeyText(e->hash.key)); - payloadLockObject(e->p); /* lock while aborting */ + storeLockObject(e); +#ifdef DSA + storeNegativeCache(e->mem_obj->e); +#else storeNegativeCache(e); +#endif storeReleaseRequest(e); EBIT_SET(e->flags, ENTRY_ABORTED); - payloadSetMemStatus(e->p, NOT_IN_MEMORY); + storeSetMemStatus(e, NOT_IN_MEMORY); e->store_status = STORE_OK; /* * We assign an object length here. The only other place we assign @@ -538,7 +1169,37 @@ InvokeHandlers(e); /* Close any swapout file */ storeSwapOutFileClose(e); - payloadUnlockObject(e->p); /* unlock */ + storeUnlockObject(e); /* unlock */ +} + +/* Clear Memory storage to accommodate the given object len */ +static void +storeGetMemSpace(int size) +{ + StoreEntry *e = NULL; + int released = 0; + static time_t last_check = 0; + int pages_needed; + RemovalPurgeWalker *walker; + if (squid_curtime == last_check) + return; + last_check = squid_curtime; + pages_needed = (size / SM_PAGE_SIZE) + 1; + if (memInUse(MEM_STMEM_BUF) + pages_needed < store_pages_max) + return; + debug(20, 2) ("storeGetMemSpace: Starting, need %d pages\n", pages_needed); + /* XXX what to set as max_scan here? */ + walker = mem_policy->PurgeInit(mem_policy, 100000); + while ((e = walker->Next(walker))) { + storePurgeMem(e); + released++; + if (memInUse(MEM_STMEM_BUF) + pages_needed < store_pages_max) + break; + } + walker->Done(walker); + debug(20, 3) ("storeGetMemSpace stats:\n"); + debug(20, 3) (" %6d HOT objects\n", hot_obj_count); + debug(20, 3) (" %6d were released\n", released); } /* The maximum objects to scan for maintain storage space */ @@ -580,7 +1241,31 @@ eventAdd("MaintainSwapSpace", storeMaintainSwapSpace, NULL, 1.0, 1); } - +#ifdef DSA +/* release an object from a cache */ +void +instanceRelease(InstanceEntry * e) +{ +#ifdef DTD + /* just memFree bogus StoreEntry */ + if (e->flags == 0) { + memFree(e, MEM_INSTANCEENTRY); + return; + } +#endif + debug(20, 3) ("storeRelease: Releasing: '%s'\n", storeKeyText(e->hash.key)); + /* If, for any reason we can't discard this object because of an + * outstanding request, mark it for pending release */ + if (storeEntryLocked(e->p)) { + storeExpireNow(e); + debug(20, 3) ("storeRelease: Only setting RELEASE_REQUEST bit\n"); + instanceReleaseRequest(e); + return; + } + storeRemoveInstanceEntry(e->p, e); + destroy_InstanceEntry(e); +} +#else /* release an object from a cache */ void storeRelease(StoreEntry * e) @@ -594,32 +1279,73 @@ storeReleaseRequest(e); return; } - if (store_dirs_rebuilding && e->p->swap_dirn > -1) { + if (store_dirs_rebuilding && e->swap_filen > -1) { storeSetPrivateKey(e); - if (e->p->swap_filen > -1) { + if (e->mem_obj) { + storeSetMemStatus(e, NOT_IN_MEMORY); + destroy_MemObject(e); + } + if (e->swap_filen > -1) { /* * Fake a call to storeLockObject(). When rebuilding is done, * we'll just call storeUnlockObject() on these. */ - e->p->lock_count++; + e->lock_count++; EBIT_SET(e->flags, RELEASE_REQUEST); + stackPush(&LateReleaseStack, e); return; } else { destroy_StoreEntry(e); } } storeLog(STORE_LOG_RELEASE, e); - payloadRemoveStoreEntry(e->p, e); + if (e->swap_filen > -1) { + storeUnlink(e); + if (e->swap_status == SWAPOUT_DONE) + if (EBIT_TEST(e->flags, ENTRY_VALIDATED)) + storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->swap_dirn], e->swap_file_sz, -1); + if (!EBIT_TEST(e->flags, KEY_PRIVATE)) + storeDirSwapLog(e, SWAP_LOG_DEL); +#if 0 + /* From 2.4. I think we do this in storeUnlink? */ + storeSwapFileNumberSet(e, -1); +#endif + } + storeSetMemStatus(e, NOT_IN_MEMORY); destroy_StoreEntry(e); } +#endif + +static void +storeLateRelease(void *unused) +{ + StoreEntry *e; + int i; + static int n = 0; + if (store_dirs_rebuilding) { + eventAdd("storeLateRelease", storeLateRelease, NULL, 1.0, 1); + return; + } + for (i = 0; i < 10; i++) { + e = stackPop(&LateReleaseStack); + if (e == NULL) { + /* done! */ + debug(20, 1) ("storeLateRelease: released %d objects\n", n); + return; + } + storeUnlockObject(e); + n++; + } + eventAdd("storeLateRelease", storeLateRelease, NULL, 0.0, 1); +} /* return 1 if a store entry is locked */ int storeEntryLocked(const StoreEntry * e) { - if (e->p->lock_count) + if (e->lock_count) return 1; - if (e->p->swap_status == SWAPOUT_WRITING) + if (e->swap_status == SWAPOUT_WRITING) return 1; if (e->store_status == STORE_PENDING) return 1; @@ -627,7 +1353,9 @@ * SPECIAL, PUBLIC entries should be "locked" */ if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) +#ifndef DSA if (!EBIT_TEST(e->flags, KEY_PRIVATE)) +#endif return 1; return 0; } @@ -637,8 +1365,8 @@ { int diff; const HttpReply *reply; - assert(e->p->mem_obj != NULL); - reply = e->p->mem_obj->reply; + assert(e->mem_obj != NULL); + reply = e->mem_obj->reply; debug(20, 3) ("storeEntryValidLength: Checking '%s'\n", storeKeyText(e->hash.key)); debug(20, 5) ("storeEntryValidLength: object_len = %d\n", objectLen(e)); @@ -656,7 +1384,7 @@ storeKeyText(e->hash.key)); return 1; } - if (e->p->mem_obj->method == METHOD_HEAD) { + if (e->mem_obj->method == METHOD_HEAD) { debug(20, 5) ("storeEntryValidLength: HEAD request: %s\n", storeKeyText(e->hash.key)); return 1; @@ -700,9 +1428,15 @@ storeInitHashValues(); store_table = hash_create(storeKeyHashCmp, store_hash_buckets, storeKeyHashHash); - payloadInit(); +#ifdef DSA + instance_table = hash_create(storeKeyHashCmp, + store_hash_buckets, storeKeyHashHash); +#endif + mem_policy = createRemovalPolicy(Config.memPolicy); storeDigestInit(); storeLogOpen(); + stackInit(&LateReleaseStack); + eventAdd("storeLateRelease", storeLateRelease, NULL, 1.0, 1); storeDirInit(); storeRebuildStart(); cachemgrRegister("storedir", @@ -726,8 +1460,23 @@ store_pages_max = Config.memMaxSize / SM_PAGE_SIZE; } +static int +storeKeepInMemory(const StoreEntry * e) +{ + MemObject *mem = e->mem_obj; + if (mem == NULL) + return 0; + if (mem->data_hdr.head == NULL) + return 0; + return mem->inmem_lo == 0; +} + void +#ifdef DSA +storeNegativeCache(InstanceEntry * e) +#else storeNegativeCache(StoreEntry * e) +#endif { e->expires = squid_curtime + Config.negativeTtl; EBIT_SET(e->flags, ENTRY_NEGCACHED); @@ -736,10 +1485,13 @@ void storeFreeMemory(void) { +#ifdef DSA + hashFreeMemory(instance_table); + instance_table = NULL; +#endif hashFreeItems(store_table, destroy_StoreEntry); hashFreeMemory(store_table); store_table = NULL; - payloadFreeMemory(); #if USE_CACHE_DIGESTS if (store_digest) cacheDigestDestroy(store_digest); @@ -755,23 +1507,55 @@ return (expires > (squid_curtime + when)); } +#ifdef DTD +int +storeValidToSend(StoreEntry * e) +{ + if (EBIT_TEST(e->flags, RELEASE_REQUEST)) + return 0; + if (EBIT_TEST(e->flags, ENTRY_NEGCACHED)) + return 0; + if (EBIT_TEST(e->flags, ENTRY_ABORTED)) + return 0; + if (e->store_status == STORE_PENDING) + return 0; + return 1; +} +#endif + int +#ifdef DSA +storeEntryValidToSend(InstanceEntry * e) +#else storeEntryValidToSend(StoreEntry * e) +#endif { if (EBIT_TEST(e->flags, RELEASE_REQUEST)) return 0; if (EBIT_TEST(e->flags, ENTRY_NEGCACHED)) if (e->expires <= squid_curtime) return 0; +#ifdef DSA + if (EBIT_TEST(e->p->flags, ENTRY_ABORTED)) +#else if (EBIT_TEST(e->flags, ENTRY_ABORTED)) +#endif return 0; return 1; } void +#ifdef DSA +storeTimestampsSet(InstanceEntry * entry) +#else storeTimestampsSet(StoreEntry * entry) +#endif { +#ifdef DSA const HttpReply *reply = entry->p->mem_obj->reply; +#else + const HttpReply *reply = entry->mem_obj->reply; +#endif time_t served_date = reply->date; int age = httpHeaderGetInt(&reply->header, HDR_AGE); /* @@ -802,7 +1586,7 @@ void storeRegisterAbort(StoreEntry * e, STABH * cb, void *data) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; assert(mem); assert(mem->abort.callback == NULL); mem->abort.callback = cb; @@ -812,7 +1596,7 @@ void storeUnregisterAbort(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; assert(mem); mem->abort.callback = NULL; } @@ -851,16 +1635,58 @@ { debug(20, l) ("StoreEntry->key: %s\n", storeKeyText(e->hash.key)); debug(20, l) ("StoreEntry->next: %p\n", e->hash.next); - debug(20, l) ("StoreEntry->mem_obj: %p\n", e->p->mem_obj); + debug(20, l) ("StoreEntry->mem_obj: %p\n", e->mem_obj); + debug(20, l) ("StoreEntry->lastref: %d\n", (int) e->lastref); +#ifndef DSA debug(20, l) ("StoreEntry->timestamp: %d\n", (int) e->timestamp); debug(20, l) ("StoreEntry->expires: %d\n", (int) e->expires); debug(20, l) ("StoreEntry->lastmod: %d\n", (int) e->lastmod); +#endif + debug(20, l) ("StoreEntry->swap_file_sz: %d\n", (int) e->swap_file_sz); + debug(20, l) ("StoreEntry->refcount: %d\n", e->refcount); debug(20, l) ("StoreEntry->flags: %s\n", storeEntryFlags(e)); - debug(20, l) ("StoreEntry->lock_count: %d\n", (int) e->p->lock_count); - debug(20, l) ("StoreEntry->mem_status: %d\n", (int) e->p->mem_status); + debug(20, l) ("StoreEntry->swap_dirn: %d\n", (int) e->swap_dirn); + debug(20, l) ("StoreEntry->swap_filen: %d\n", (int) e->swap_filen); + debug(20, l) ("StoreEntry->lock_count: %d\n", (int) e->lock_count); + debug(20, l) ("StoreEntry->mem_status: %d\n", (int) e->mem_status); debug(20, l) ("StoreEntry->ping_status: %d\n", (int) e->ping_status); debug(20, l) ("StoreEntry->store_status: %d\n", (int) e->store_status); -// debug(20, l) ("StoreEntry->swap_status: %d\n", (int) e->swap_status); + debug(20, l) ("StoreEntry->swap_status: %d\n", (int) e->swap_status); +} + +/* + * NOTE, this function assumes only two mem states + */ +void +storeSetMemStatus(StoreEntry * e, int new_status) +{ + MemObject *mem = e->mem_obj; + if (new_status == e->mem_status) + return; + assert(mem != NULL); + if (new_status == IN_MEMORY) { + assert(mem->inmem_lo == 0); + if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) { + debug(20, 4) ("storeSetMemStatus: not inserting special %s into policy\n", + mem->url); + } else { + mem_policy->Add(mem_policy, e, &mem->repl); + debug(20, 4) ("storeSetMemStatus: inserted mem node %s\n", + mem->url); + } + hot_obj_count++; + } else { + if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) { + debug(20, 4) ("storeSetMemStatus: special entry %s\n", + mem->url); + } else { + mem_policy->Remove(mem_policy, e, &mem->repl); + debug(20, 4) ("storeSetMemStatus: removed mem node %s\n", + mem->url); + } + hot_obj_count--; + } + e->mem_status = new_status; } const char * @@ -868,10 +1694,18 @@ { if (e == NULL) return "[null_entry]"; - else if (e->p->mem_obj == NULL) + else if (e->mem_obj == NULL) return "[null_mem_obj]"; else - return e->p->mem_obj->url; + return e->mem_obj->url; +} + +void +storeCreateMemObject(StoreEntry * e, const char *url, const char *log_url) +{ + if (e->mem_obj) + return; + e->mem_obj = new_MemObject(url, log_url); } /* this just sets DELAY_SENDING */ @@ -893,16 +1727,16 @@ int objectLen(const StoreEntry * e) { - assert(e->p->mem_obj != NULL); - return e->p->mem_obj->object_sz; + assert(e->mem_obj != NULL); + return e->mem_obj->object_sz; } int contentLen(const StoreEntry * e) { - assert(e->p->mem_obj != NULL); - assert(e->p->mem_obj->reply != NULL); - return e->p->mem_obj->object_sz - e->p->mem_obj->reply->hdr_sz; + assert(e->mem_obj != NULL); + assert(e->mem_obj->reply != NULL); + return e->mem_obj->object_sz - e->mem_obj->reply->hdr_sz; } HttpReply * @@ -910,22 +1744,24 @@ { if (NULL == e) return NULL; - if (NULL == e->p->mem_obj) + if (NULL == e->mem_obj) return NULL; - return e->p->mem_obj->reply; + return e->mem_obj->reply; } void storeEntryReset(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; debug(20, 3) ("storeEntryReset: %s\n", storeUrl(e)); assert(mem->swapout.sio == NULL); stmemFree(&mem->data_hdr); mem->inmem_hi = mem->inmem_lo = 0; httpReplyDestroy(mem->reply); mem->reply = httpReplyCreate(); +#ifndef DSA e->expires = e->lastmod = e->timestamp = -1; +#endif } /* @@ -977,6 +1813,42 @@ setup(&storefs_list[i]); } +/* + * called to add another store removal policy module + */ +void +storeReplAdd(char *type, REMOVALPOLICYCREATE * create) +{ + int i; + /* find the number of currently known repl types */ + for (i = 0; storerepl_list && storerepl_list[i].typestr; i++) { + assert(strcmp(storerepl_list[i].typestr, type) != 0); + } + /* add the new type */ + storerepl_list = xrealloc(storerepl_list, (i + 2) * sizeof(storerepl_entry_t)); + memset(&storerepl_list[i + 1], 0, sizeof(storerepl_entry_t)); + storerepl_list[i].typestr = type; + storerepl_list[i].create = create; +} + +/* + * Create a removal policy instance + */ +RemovalPolicy * +createRemovalPolicy(RemovalPolicySettings * settings) +{ + storerepl_entry_t *r; + for (r = storerepl_list; r && r->typestr; r++) { + if (strcmp(r->typestr, settings->type) == 0) + return r->create(settings->args); + } + debug(20, 1) ("ERROR: Unknown policy %s\n", settings->type); + debug(20, 1) ("ERROR: Be sure to have set cache_replacement_policy\n"); + debug(20, 1) ("ERROR: and memory_replacement_policy in squid.conf!\n"); + fatalf("ERROR: Unknown policy %s\n", settings->type); + return NULL; +} + #if 0 void storeSwapFileNumberSet(StoreEntry * e, sfileno filn) Index: squid/src/store_client.c diff -u squid/src/store_client.c:1.4.4.1.6.1 squid/src/store_client.c:1.4.4.1.8.4 --- squid/src/store_client.c:1.4.4.1.6.1 Wed Aug 14 03:15:35 2002 +++ squid/src/store_client.c Sun Dec 22 16:13:28 2002 @@ -55,7 +55,7 @@ int storeClientWaiting(const StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; dlink_node *node; store_client *sc; for (node = mem->clients.head; node; node = node->next) { @@ -84,7 +84,7 @@ static store_client_t storeClientType(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; if (mem->inmem_lo) return STORE_DISK_CLIENT; if (EBIT_TEST(e->flags, ENTRY_ABORTED)) { @@ -110,7 +110,7 @@ * to the client, there is no guarantee that we will be able * to open it later when we really need it. */ - else if (e->p->swap_status == SWAPOUT_NONE) + else if (e->swap_status == SWAPOUT_NONE) return STORE_MEM_CLIENT; /* * otherwise, make subsequent clients read from disk so they @@ -124,14 +124,14 @@ store_client * storeClientListAdd(StoreEntry * e, void *data) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; store_client *sc; assert(mem); #if STORE_CLIENT_LIST_DEBUG if (storeClientListSearch(mem, data) != NULL) assert(1 == 0); /* XXX die! */ #endif - e->p->refcount++; + e->refcount++; mem->nclients++; sc = memAllocate(MEM_STORE_CLIENT); cbdataAdd(sc, memFree, MEM_STORE_CLIENT); /* sc is callback_data for file_read */ @@ -145,7 +145,7 @@ if (sc->type == STORE_DISK_CLIENT) /* assert we'll be able to get the data we want */ /* maybe we should open swapin_fd here */ - assert(e->p->swap_filen > -1 || storeSwapOutAble(e)); + assert(e->swap_filen > -1 || storeSwapOutAble(e)); dlinkAdd(sc, &sc->node, &mem->clients); #if DELAY_POOLS sc->delay_id = 0; @@ -187,6 +187,8 @@ STCB * callback, void *data) { + if (!EBIT_TEST(e->flags, KEY_PRIVATE)) + assert(e->hash.key); assert(!EBIT_TEST(e->flags, ENTRY_ABORTED)); debug(20, 3) ("storeClientCopy: %s, seen %d, want %d, size %d, cb %p, cbdata %p\n", storeKeyText(e->hash.key), @@ -266,7 +268,7 @@ static void storeClientCopy3(StoreEntry * e, store_client * sc) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; size_t sz; if (storeClientNoMoreToSend(e, sc)) { @@ -331,7 +333,7 @@ static void storeClientFileRead(store_client * sc) { - MemObject *mem = sc->entry->p->mem_obj; + MemObject *mem = sc->entry->mem_obj; assert(sc->callback != NULL); assert(!sc->flags.disk_io_pending); sc->flags.disk_io_pending = 1; @@ -343,7 +345,7 @@ storeClientReadHeader, sc); } else { - if (sc->entry->p->swap_status == SWAPOUT_WRITING) + if (sc->entry->swap_status == SWAPOUT_WRITING) assert(storeOffset(mem->swapout.sio) > sc->copy_offset + mem->swap_hdr_sz); storeRead(sc->swapin_sio, sc->copy_buf, @@ -358,7 +360,7 @@ storeClientReadBody(void *data, const char *buf, ssize_t len) { store_client *sc = data; - MemObject *mem = sc->entry->p->mem_obj; + MemObject *mem = sc->entry->mem_obj; assert(sc->flags.disk_io_pending); sc->flags.disk_io_pending = 0; assert(sc->callback != NULL); @@ -374,7 +376,7 @@ static int md5_mismatches = 0; store_client *sc = data; StoreEntry *e = sc->entry; - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; int swap_hdr_sz = 0; size_t body_sz; size_t copy_sz; @@ -409,11 +411,11 @@ switch (t->type) { case STORE_META_KEY: assert(t->length == MD5_DIGEST_CHARS); - if (!EBIT_TEST(e->p->flags, KEY_PRIVATE) && - memcmp(t->value, e->p->hash.key, MD5_DIGEST_CHARS)) { + if (!EBIT_TEST(e->flags, KEY_PRIVATE) && + memcmp(t->value, e->hash.key, MD5_DIGEST_CHARS)) { debug(20, 2) ("storeClientReadHeader: swapin MD5 mismatch\n"); debug(20, 2) ("\t%s\n", storeKeyText(t->value)); - debug(20, 2) ("\t%s\n", storeKeyText(e->p->hash.key)); + debug(20, 2) ("\t%s\n", storeKeyText(e->hash.key)); if (isPowTen(++md5_mismatches)) debug(20, 1) ("WARNING: %d swapin MD5 mismatches\n", md5_mismatches); @@ -445,7 +447,7 @@ return; } mem->swap_hdr_sz = swap_hdr_sz; - mem->object_sz = e->p->swap_file_sz - swap_hdr_sz; + mem->object_sz = e->swap_file_sz - swap_hdr_sz; /* * If our last read got some data the client wants, then give * it to them, otherwise schedule another read. @@ -493,9 +495,9 @@ int storeUnregister(store_client * sc, StoreEntry * e, void *data) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; #if STORE_CLIENT_LIST_DEBUG - assert(sc == storeClientListSearch(e->p->mem_obj, data)); + assert(sc == storeClientListSearch(e->mem_obj, data)); #endif if (mem == NULL) return 0; @@ -513,7 +515,7 @@ } dlinkDelete(&sc->node, &mem->clients); mem->nclients--; - if (e->store_status == STORE_OK && e->p->swap_status != SWAPOUT_DONE) + if (e->store_status == STORE_OK && e->swap_status != SWAPOUT_DONE) storeSwapOut(e); if (sc->swapin_sio) { storeClose(sc->swapin_sio); @@ -533,7 +535,7 @@ cbdataUnlock(sc->callback_data); /* we're done with it now */ /*assert(!sc->flags.disk_io_pending); */ cbdataFree(sc); - assert(e->p->lock_count > 0); + assert(e->lock_count > 0); if (mem->nclients == 0) CheckQuickAbort(e); return 1; @@ -542,7 +544,7 @@ off_t storeLowestMemReaderOffset(const StoreEntry * entry) { - const MemObject *mem = entry->p->mem_obj; + const MemObject *mem = entry->mem_obj; off_t lowest = mem->inmem_hi + 1; store_client *sc; dlink_node *nx = NULL; @@ -569,12 +571,11 @@ InvokeHandlers(StoreEntry * e) { int i = 0; - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; store_client *sc; dlink_node *nx = NULL; dlink_node *node; - if (mem == NULL) return; debug(20, 3) ("InvokeHandlers: %s\n", storeKeyText(e->hash.key)); /* walk the entire list looking for valid callbacks */ for (node = mem->clients.head; node; node = nx) { @@ -594,7 +595,7 @@ int storePendingNClients(const StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; int npend = NULL == mem ? 0 : mem->nclients; debug(20, 3) ("storePendingNClients: returning %d\n", npend); return npend; @@ -607,7 +608,7 @@ int curlen; int minlen; int expectlen; - MemObject *mem = entry->p->mem_obj; + MemObject *mem = entry->mem_obj; assert(mem); debug(20, 3) ("CheckQuickAbort2: entry=%p, mem=%p\n", entry, mem); if (mem->request && !mem->request->flags.cachable) { Index: squid/src/store_dir.c diff -u squid/src/store_dir.c:1.4.4.7.4.1 squid/src/store_dir.c:1.4.4.7 --- squid/src/store_dir.c:1.4.4.7.4.1 Wed Aug 14 03:15:36 2002 +++ squid/src/store_dir.c Thu Mar 29 04:02:12 2001 @@ -146,7 +146,7 @@ if (!storeDirValidSwapDirSize(i, objsize)) continue; /* check for error or overload condition */ - load = sd->checkobj(sd, e->p); + load = sd->checkobj(sd, e); if (load < 0 || load > 1000) { continue; } @@ -183,11 +183,11 @@ /* Calculate the object size */ objsize = (ssize_t) objectLen(e); if (objsize != -1) - objsize += e->p->mem_obj->swap_hdr_sz; + objsize += e->mem_obj->swap_hdr_sz; for (i = 0; i < Config.cacheSwap.n_configured; i++) { SD = &Config.cacheSwap.swapDirs[i]; SD->flags.selected = 0; - load = SD->checkobj(SD, e->p); + load = SD->checkobj(SD, e); if (load < 0 || load > 1000) { continue; } @@ -239,23 +239,24 @@ * 2. It MUST have a valid (> -1) swap_filen. */ void -storeDirSwapLog(const PayloadEntry * p, int op) +storeDirSwapLog(const StoreEntry * e, int op) { SwapDir *sd; - assert(p->swap_filen >= 0); + assert(!EBIT_TEST(e->flags, KEY_PRIVATE)); + assert(e->swap_filen >= 0); /* * icons and such; don't write them to the swap log */ - if (EBIT_TEST(p->flags, ENTRY_SPECIAL)) + if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) return; assert(op > SWAP_LOG_NOP && op < SWAP_LOG_MAX); debug(20, 3) ("storeDirSwapLog: %s %s %d %08X\n", swap_log_op_str[op], - storeKeyText(p->hash.key), - p->swap_dirn, - p->swap_filen); - sd = &Config.cacheSwap.swapDirs[p->swap_dirn]; - sd->log.write(sd, p, op); + storeKeyText(e->hash.key), + e->swap_dirn, + e->swap_filen); + sd = &Config.cacheSwap.swapDirs[e->swap_dirn]; + sd->log.write(sd, e, op); } void @@ -363,7 +364,7 @@ int storeDirWriteCleanLogs(int reopen) { - const PayloadEntry *p = NULL; + const StoreEntry *e = NULL; int n = 0; struct timeval start; double dt; @@ -391,17 +392,23 @@ sd = &Config.cacheSwap.swapDirs[dirn]; if (NULL == sd->log.clean.write) continue; - p = sd->log.clean.nextentry(sd); - if (!p) + e = sd->log.clean.nextentry(sd); + if (!e) continue; notdone = 1; - if (p->swap_filen < 0) + if (e->swap_filen < 0) continue; - if (p->swap_file_sz <= 0) + if (e->swap_status != SWAPOUT_DONE) continue; - if (EBIT_TEST(p->flags, ENTRY_SPECIAL)) + if (e->swap_file_sz <= 0) continue; - sd->log.clean.write(sd, p); + if (EBIT_TEST(e->flags, RELEASE_REQUEST)) + continue; + if (EBIT_TEST(e->flags, KEY_PRIVATE)) + continue; + if (EBIT_TEST(e->flags, ENTRY_SPECIAL)) + continue; + sd->log.clean.write(sd, e); if ((++n & 0xFFFF) == 0) { getCurrentTime(); debug(20, 1) (" %7d entries written so far.\n", n); Index: squid/src/store_io.c diff -u squid/src/store_io.c:1.2.64.1 squid/src/store_io.c:1.2 --- squid/src/store_io.c:1.2.64.1 Wed Aug 14 03:15:36 2002 +++ squid/src/store_io.c Sat Oct 21 08:16:13 2000 @@ -29,7 +29,7 @@ /* This is just done for logging purposes */ objsize = objectLen(e); if (objsize != -1) - objsize += e->p->mem_obj->swap_hdr_sz; + objsize += e->mem_obj->swap_hdr_sz; /* * Pick the swapdir @@ -61,7 +61,7 @@ storeOpen(StoreEntry * e, STFNCB * file_callback, STIOCB * callback, void *callback_data) { - SwapDir *SD = &Config.cacheSwap.swapDirs[e->p->swap_dirn]; + SwapDir *SD = &Config.cacheSwap.swapDirs[e->swap_dirn]; return SD->obj.open(SD, e, file_callback, callback, callback_data); } @@ -92,7 +92,7 @@ void storeUnlink(StoreEntry * e) { - SwapDir *SD = INDEXSD(e->p->swap_dirn); + SwapDir *SD = INDEXSD(e->swap_dirn); SD->obj.unlink(SD, e); } Index: squid/src/store_key_md5.c diff -u squid/src/store_key_md5.c:1.4.4.1 squid/src/store_key_md5.c:1.4.4.1.6.1 --- squid/src/store_key_md5.c:1.4.4.1 Mon Jan 15 14:49:20 2001 +++ squid/src/store_key_md5.c Sun Dec 22 16:13:28 2002 @@ -153,6 +153,7 @@ int storeKeyNull(const cache_key * key) { + assert(key); if (memcmp(key, null_key, MD5_DIGEST_CHARS) == 0) return 1; else Index: squid/src/store_log.c diff -u squid/src/store_log.c:1.4.4.1.8.1 squid/src/store_log.c:1.4.4.1 --- squid/src/store_log.c:1.4.4.1.8.1 Wed Aug 14 03:15:36 2002 +++ squid/src/store_log.c Mon Jan 15 14:49:20 2001 @@ -49,7 +49,7 @@ void storeLog(int tag, const StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; HttpReply *reply; if (NULL == storelog) return; @@ -71,8 +71,8 @@ (int) current_time.tv_sec, (int) current_time.tv_usec / 1000, storeLogTags[tag], - e->p->swap_dirn, - e->p->swap_filen, + e->swap_dirn, + e->swap_filen, storeKeyText(e->hash.key), reply->sline.status, (int) reply->date, @@ -89,8 +89,8 @@ (int) current_time.tv_sec, (int) current_time.tv_usec / 1000, storeLogTags[tag], - e->p->swap_dirn, - e->p->swap_filen, + e->swap_dirn, + e->swap_filen, storeKeyText(e->hash.key)); } } Index: squid/src/store_rebuild.c diff -u squid/src/store_rebuild.c:1.5.2.2.8.1 squid/src/store_rebuild.c:1.5.2.2 --- squid/src/store_rebuild.c:1.5.2.2.8.1 Wed Aug 14 03:15:37 2002 +++ squid/src/store_rebuild.c Mon Jan 15 14:49:20 2001 @@ -51,8 +51,8 @@ static int storeCleanupDoubleCheck(StoreEntry * e) { - SwapDir *SD = &Config.cacheSwap.swapDirs[e->p->swap_dirn]; - return (SD->dblcheck(SD, e->p)); + SwapDir *SD = &Config.cacheSwap.swapDirs[e->swap_dirn]; + return (SD->dblcheck(SD, e)); } static void @@ -62,7 +62,7 @@ static int validnum = 0; static int store_errors = 0; int validnum_start; - PayloadEntry *p; + StoreEntry *e; hash_link *link_ptr = NULL; hash_link *link_next = NULL; validnum_start = validnum; @@ -79,29 +79,27 @@ storeDigestNoteStoreReady(); return; } - link_next = hash_get_bucket(payload_table, bucketnum); + link_next = hash_get_bucket(store_table, bucketnum); while (NULL != (link_ptr = link_next)) { link_next = link_ptr->next; - p = (PayloadEntry *) link_ptr; - if (EBIT_TEST(p->flags, ENTRY_VALIDATED)) + e = (StoreEntry *) link_ptr; + if (EBIT_TEST(e->flags, ENTRY_VALIDATED)) continue; /* * Calling storeRelease() has no effect because we're * still in 'store_rebuilding' state */ - if (p->swap_filen < 0) + if (e->swap_filen < 0) continue; - /* if (opt_store_doublecheck) if (storeCleanupDoubleCheck(e)) store_errors++; - */ - EBIT_SET(p->flags, ENTRY_VALIDATED); + EBIT_SET(e->flags, ENTRY_VALIDATED); /* * Only set the file bit if we know its a valid entry * otherwise, set it in the validation procedure */ - storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[p->swap_dirn], p->swap_file_sz, 1); + storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->swap_dirn], e->swap_file_sz, 1); if ((++validnum & 0x3FFFF) == 0) debug(20, 1) (" %7d Entries Validated so far.\n", validnum); } Index: squid/src/store_swapin.c diff -u squid/src/store_swapin.c:1.4.4.1.8.1 squid/src/store_swapin.c:1.4.4.1 --- squid/src/store_swapin.c:1.4.4.1.8.1 Wed Aug 14 03:15:37 2002 +++ squid/src/store_swapin.c Mon Jan 15 14:49:20 2001 @@ -42,25 +42,25 @@ storeSwapInStart(store_client * sc) { StoreEntry *e = sc->entry; - assert(e->p->mem_status == NOT_IN_MEMORY); - if (!EBIT_TEST(e->p->flags, ENTRY_VALIDATED)) { + assert(e->mem_status == NOT_IN_MEMORY); + if (!EBIT_TEST(e->flags, ENTRY_VALIDATED)) { /* We're still reloading and haven't validated this entry yet */ return; } debug(20, 3) ("storeSwapInStart: called for %d %08X %s \n", - e->p->swap_dirn, e->p->swap_filen, storeKeyText(e->hash.key)); - if (e->p->swap_status != SWAPOUT_WRITING && e->p->swap_status != SWAPOUT_DONE) { + e->swap_dirn, e->swap_filen, storeKeyText(e->hash.key)); + if (e->swap_status != SWAPOUT_WRITING && e->swap_status != SWAPOUT_DONE) { debug(20, 1) ("storeSwapInStart: bad swap_status (%s)\n", - swapStatusStr[e->p->swap_status]); + swapStatusStr[e->swap_status]); return; } - if (e->p->swap_filen < 0) { + if (e->swap_filen < 0) { debug(20, 1) ("storeSwapInStart: swap_filen < 0\n"); return; } - assert(e->p->mem_obj != NULL); + assert(e->mem_obj != NULL); debug(20, 3) ("storeSwapInStart: Opening fileno %08X\n", - e->p->swap_filen); + e->swap_filen); sc->swapin_sio = storeOpen(e, storeSwapInFileNotify, storeSwapInFileClosed, sc); cbdataLock(sc->swapin_sio); @@ -89,8 +89,8 @@ store_client *sc = data; StoreEntry *e = sc->entry; - debug(1, 3) ("storeSwapInFileNotify: changing %d/%d to %d/%d\n", e->p->swap_filen, e->p->swap_dirn, sio->swap_filen, sio->swap_dirn); + debug(1, 3) ("storeSwapInFileNotify: changing %d/%d to %d/%d\n", e->swap_filen, e->swap_dirn, sio->swap_filen, sio->swap_dirn); - e->p->swap_filen = sio->swap_filen; - e->p->swap_dirn = sio->swap_dirn; + e->swap_filen = sio->swap_filen; + e->swap_dirn = sio->swap_dirn; } Index: squid/src/store_swapmeta.c diff -u squid/src/store_swapmeta.c:1.4.4.2.4.1 squid/src/store_swapmeta.c:1.4.4.2.6.2 --- squid/src/store_swapmeta.c:1.4.4.2.4.1 Wed Aug 14 03:15:37 2002 +++ squid/src/store_swapmeta.c Sun Nov 17 21:44:13 2002 @@ -62,32 +62,25 @@ * Build a TLV list for a StoreEntry */ tlv * -storeInstanceSwapMetaBuild(StoreEntry * e) +storeSwapMetaBuild(StoreEntry * e) { tlv *TLV = NULL; /* we'll return this */ tlv **T = &TLV; +#ifdef DSA + assert(e->mem_obj != NULL); + assert(e->swap_status == SWAPOUT_WRITING); + T = storeSwapTLVAdd(STORE_META_KEY, e->hash.key, MD5_DIGEST_CHARS, T); + T = storeSwapTLVAdd(STORE_META_STD, &e->lastref, STORE_HDR_METASIZE, T); +#else const char *url; + assert(e->mem_obj != NULL); + assert(e->swap_status == SWAPOUT_WRITING); url = storeUrl(e); - assert(e->p->mem_obj != NULL); debug(20, 3) ("storeSwapMetaBuild: %s\n", url); T = storeSwapTLVAdd(STORE_META_KEY, e->hash.key, MD5_DIGEST_CHARS, T); T = storeSwapTLVAdd(STORE_META_STD, &e->timestamp, STORE_HDR_METASIZE, T); T = storeSwapTLVAdd(STORE_META_URL, url, strlen(url) + 1, T); - return TLV; -} - -tlv * -storeSwapMetaBuild(StoreEntry * e) -{ - tlv *TLV = NULL; /* we'll return this */ - tlv **T = &TLV; - cache_key dummy_key[MD5_DIGEST_CHARS]; - memset(dummy_key, '\0', MD5_DIGEST_CHARS); - assert(e->p->mem_obj != NULL); - assert(EBIT_TEST(e->p->flags, ENTRY_VALIDATED)); - assert(e->p->swap_status == SWAPOUT_WRITING); - T = storeSwapTLVAdd(STORE_META_KEY, dummy_key, MD5_DIGEST_CHARS, T); - T = storeSwapTLVAdd(STORE_META_STD, &e->p->lastref, PAYLOAD_HDR_METASIZE, T); +#endif return TLV; } @@ -166,3 +159,23 @@ *hdr_len = buflen; return TLV; } + +#ifdef DSA +/* + * Build a TLV list for a StoreEntry + */ +tlv * +instanceSwapMetaBuild(InstanceEntry * e) +{ + tlv *TLV = NULL; /* we'll return this */ + tlv **T = &TLV; + const char *url; + url = storeUrl(e->p); + assert(e->p->mem_obj != NULL); + debug(20, 3) ("storeSwapMetaBuild: %s\n", url); + T = storeSwapTLVAdd(STORE_META_KEY, e->hash.key, MD5_DIGEST_CHARS, T); + T = storeSwapTLVAdd(STORE_META_STD, &e->timestamp, INSTANCE_HDR_METASIZE, T); + T = storeSwapTLVAdd(STORE_META_URL, url, strlen(url) + 1, T); + return TLV; +} +#endif Index: squid/src/store_swapout.c diff -u squid/src/store_swapout.c:1.4.4.2.2.1 squid/src/store_swapout.c:1.4.4.2.4.11.2.2 --- squid/src/store_swapout.c:1.4.4.2.2.1 Wed Aug 14 03:15:37 2002 +++ squid/src/store_swapout.c Thu Jan 2 22:33:34 2003 @@ -45,7 +45,7 @@ storeSwapOutStart(StoreEntry * e) { generic_cbdata *c; - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; int swap_hdr_sz = 0; tlv *tlv_list; char *buf; @@ -54,8 +54,8 @@ * metadata there is to store */ debug(20, 5) ("storeSwapOutStart: Begin SwapOut '%s' to dirno %d, fileno %08X\n", - storeUrl(e), e->p->swap_dirn, e->p->swap_filen); - e->p->swap_status = SWAPOUT_WRITING; + storeUrl(e), e->swap_dirn, e->swap_filen); + e->swap_status = SWAPOUT_WRITING; tlv_list = storeSwapMetaBuild(e); buf = storeSwapMetaPack(tlv_list, &swap_hdr_sz); storeSwapTLVFree(tlv_list); @@ -66,17 +66,17 @@ cbdataAdd(c, memFree, MEM_GEN_CBDATA); mem->swapout.sio = storeCreate(e, storeSwapOutFileNotify, storeSwapOutFileClosed, c); if (NULL == mem->swapout.sio) { - e->p->swap_status = SWAPOUT_NONE; + e->swap_status = SWAPOUT_NONE; cbdataFree(c); xfree(buf); storeLog(STORE_LOG_SWAPOUTFAIL, e); return; } - payloadLockObject(e->p); /* Don't lock until after create, or the replacement + storeLockObject(e); /* Don't lock until after create, or the replacement * code might get confused */ /* Pick up the file number if it was assigned immediately */ - e->p->swap_filen = mem->swapout.sio->swap_filen; - e->p->swap_dirn = mem->swapout.sio->swap_dirn; + e->swap_filen = mem->swapout.sio->swap_filen; + e->swap_dirn = mem->swapout.sio->swap_dirn; /* write out the swap metadata */ cbdataLock(mem->swapout.sio); storeWrite(mem->swapout.sio, buf, mem->swap_hdr_sz, 0, xfree); @@ -87,19 +87,19 @@ { generic_cbdata *c = data; StoreEntry *e = c->data; - MemObject *mem = e->p->mem_obj; - assert(e->p->swap_status == SWAPOUT_WRITING); + MemObject *mem = e->mem_obj; + assert(e->swap_status == SWAPOUT_WRITING); assert(mem); assert(mem->swapout.sio == sio); assert(errflag == 0); - e->p->swap_filen = mem->swapout.sio->swap_filen; - e->p->swap_dirn = mem->swapout.sio->swap_dirn; + e->swap_filen = mem->swapout.sio->swap_filen; + e->swap_dirn = mem->swapout.sio->swap_dirn; } void storeSwapOut(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; off_t lowest_offset; off_t new_mem_lo; off_t on_disk = 0; @@ -172,7 +172,7 @@ } stmemFreeDataUpto(&mem->data_hdr, new_mem_lo); mem->inmem_lo = new_mem_lo; - if (e->p->swap_status == SWAPOUT_WRITING) + if (e->swap_status == SWAPOUT_WRITING) assert(mem->inmem_lo <= on_disk); if (!storeSwapOutAble(e)) return; @@ -195,7 +195,7 @@ return; } /* Ok, we have stuff to swap out. Is there a swapout.sio open? */ - if (e->p->swap_status == SWAPOUT_NONE) { + if (e->swap_status == SWAPOUT_NONE) { assert(mem->swapout.sio == NULL); assert(mem->inmem_lo == 0); if (storeCheckCachable(e)) @@ -238,7 +238,7 @@ mem->swapout.queue_offset += swap_buf_len; storeWrite(mem->swapout.sio, mem->swapout.memnode->data, swap_buf_len, -1, NULL); /* the storeWrite() call might generate an error */ - if (e->p->swap_status != SWAPOUT_WRITING) + if (e->swap_status != SWAPOUT_WRITING) break; swapout_size = (ssize_t) (mem->inmem_hi - mem->swapout.queue_offset); if (e->store_status == STORE_PENDING) @@ -262,7 +262,7 @@ void storeSwapOutFileClose(StoreEntry * e) { - MemObject *mem = e->p->mem_obj; + MemObject *mem = e->mem_obj; assert(mem != NULL); debug(20, 3) ("storeSwapOutFileClose: %s\n", storeKeyText(e->hash.key)); debug(20, 3) ("storeSwapOutFileClose: sio = %p\n", mem->swapout.sio); @@ -276,31 +276,32 @@ { generic_cbdata *c = data; StoreEntry *e = c->data; - MemObject *mem = e->p->mem_obj; - assert(e->p->swap_status == SWAPOUT_WRITING); + MemObject *mem = e->mem_obj; + assert(e->swap_status == SWAPOUT_WRITING); cbdataFree(c); if (errflag) { debug(20, 1) ("storeSwapOutFileClosed: dirno %d, swapfile %08X, errflag=%d\n\t%s\n", - e->p->swap_dirn, e->p->swap_filen, errflag, xstrerror()); + e->swap_dirn, e->swap_filen, errflag, xstrerror()); if (errflag == DISK_NO_SPACE_LEFT) { - storeDirDiskFull(e->p->swap_dirn); + storeDirDiskFull(e->swap_dirn); storeDirConfigure(); storeConfigure(); } - if (e->p->swap_filen > 0) + if (e->swap_filen > 0) storeUnlink(e); - e->p->swap_filen = -1; - e->p->swap_dirn = -1; - e->p->swap_status = SWAPOUT_NONE; + e->swap_filen = -1; + e->swap_dirn = -1; + e->swap_status = SWAPOUT_NONE; storeReleaseRequest(e); } else { /* swapping complete */ debug(20, 3) ("storeSwapOutFileClosed: SwapOut complete: '%s' to %d, %08X\n", - storeUrl(e), e->p->swap_dirn, e->p->swap_filen); - e->p->swap_file_sz = objectLen(e) + mem->swap_hdr_sz; - e->p->swap_status = SWAPOUT_DONE; - storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->p->swap_dirn], e->p->swap_file_sz, 1); + storeUrl(e), e->swap_dirn, e->swap_filen); + e->swap_file_sz = objectLen(e) + mem->swap_hdr_sz; + e->swap_status = SWAPOUT_DONE; + storeDirUpdateSwapSize(&Config.cacheSwap.swapDirs[e->swap_dirn], e->swap_file_sz, 1); if (storeCheckCachable(e)) { +#ifdef DSA /* * Check if the PayloadEntry is in payload_table. If yes, it means the * HEAD reply contains an MD5 digest and this object is already in the @@ -310,39 +311,42 @@ * object. Otherwise, the object will be moved to the real cache * directory. */ - PayloadEntry * p; - p = payloadGet(e->p->hash.key); + StoreEntry * p; + InstanceEntry * entry = instanceGetPublic(e->mem_obj->url, e->mem_obj->method); + if (e->mem_obj->method == METHOD_GET) { + assert(!EBIT_TEST(e->flags, KEY_PRIVATE)); + p = storeGet(e->hash.key); if (p == NULL) { /* The object is not in hash, add it */ - payloadHashInsert(e->p, e->p->hash.key); + storeHashInsert(e); storeLog(STORE_LOG_SWAPOUT, e); - storeDirSwapLog(e->p, SWAP_LOG_ADD); - payloadAddStoreEntry(e->p, e); + storeDirSwapLog(e, SWAP_LOG_ADD); + storeAddInstanceEntry(e, entry); } - else if (p == e->p) { + else if (p == e) { /* This is the case when HEAD has MD5 and we finish download */ storeLog(STORE_LOG_SWAPOUT, e); - storeDirSwapLog(e->p, SWAP_LOG_ADD); - payloadAddStoreEntry(e->p, e); + storeDirSwapLog(e, SWAP_LOG_ADD); + storeAddInstanceEntry(e, entry); } else { - /* The object is already in the right place, remove this one */ - if (p->mem_obj == NULL) { - p->mem_obj = e->p->mem_obj; - e->p->mem_obj = NULL; - payloadSetMemStatus(e->p, NOT_IN_MEMORY); - } - payloadRemoveStoreEntry(e->p, e); - payloadAddStoreEntry(p, e); - e->p = p; + EBIT_SET(e->flags, KEY_PRIVATE); // set to KEY_PRIVATE, + // so no SWAP_LOG_DEL + storeAddInstanceEntry(p, entry); + storeReleaseRequest(e); } + } +#else + storeLog(STORE_LOG_SWAPOUT, e); + storeDirSwapLog(e, SWAP_LOG_ADD); +#endif } statCounter.swap.outs++; } debug(20, 3) ("storeSwapOutFileClosed: %s:%d\n", __FILE__, __LINE__); mem->swapout.sio = NULL; cbdataUnlock(sio); - payloadUnlockObject(e->p); + storeUnlockObject(e); } /* @@ -378,15 +382,15 @@ storeSwapOutAble(const StoreEntry * e) { dlink_node *node; - if (e->p->mem_obj->swapout.sio != NULL) + if (e->mem_obj->swapout.sio != NULL) return 1; - if (e->p->mem_obj->inmem_lo > 0) + if (e->mem_obj->inmem_lo > 0) return 0; /* * If there are DISK clients, we must write to disk * even if its not cachable */ - for (node = e->p->mem_obj->clients.head; node; node = node->next) { + for (node = e->mem_obj->clients.head; node; node = node->next) { if (((store_client *) node->data)->type == STORE_DISK_CLIENT) return 1; } Index: squid/src/structs.h diff -u squid/src/structs.h:1.6.2.10.2.2 squid/src/structs.h:1.6.2.11.2.5.2.2 --- squid/src/structs.h:1.6.2.10.2.2 Wed Aug 14 04:27:28 2002 +++ squid/src/structs.h Wed Mar 10 22:02:58 2004 @@ -783,6 +783,9 @@ HttpStatusLine sline; HttpHeader header; HttpBody body; /* for small constant memory-resident text bodies only */ +#ifdef DTD + String content_md5; /* content MD5 value, needed for DTD */ +#endif }; struct _http_state_flags { @@ -792,7 +795,11 @@ }; struct _HttpStateData { +#ifdef DSA + InstanceEntry * entry; +#else StoreEntry *entry; +#endif request_t *request; char *reply_hdr; size_t reply_hdr_size; @@ -883,8 +890,13 @@ } out; HttpHdrRangeIter range_iter; /* data for iterating thru range specs */ size_t req_sz; /* raw request size on input, not current request size */ +#ifdef DSA + InstanceEntry * entry; + InstanceEntry * old_entry; +#else StoreEntry *entry; StoreEntry *old_entry; +#endif log_type log_type; #if USE_CACHE_DIGESTS const char *lookup_type; /* temporary hack: storeGet() result: HIT/MISS/NONE */ @@ -968,8 +980,13 @@ struct _DigestFetchState { PeerDigest *pd; +#ifdef DSA + InstanceEntry * entry; + InstanceEntry * old_entry; +#else StoreEntry *entry; StoreEntry *old_entry; +#endif store_client *sc; store_client *old_sc; request_t *request; @@ -1144,7 +1161,11 @@ struct _ps_state { request_t *request; +#ifdef DSA + InstanceEntry * entry; +#else StoreEntry *entry; +#endif int always_direct; int never_direct; int direct; @@ -1257,10 +1278,10 @@ char *_type; void *_data; void (*Free) (RemovalPolicy * policy); - void (*Add) (RemovalPolicy * policy, PayloadEntry * entry, RemovalPolicyNode * node); - void (*Remove) (RemovalPolicy * policy, PayloadEntry * entry, RemovalPolicyNode * node); - void (*Referenced) (RemovalPolicy * policy, const PayloadEntry * entry, RemovalPolicyNode * node); - void (*Dereferenced) (RemovalPolicy * policy, const PayloadEntry * entry, RemovalPolicyNode * node); + void (*Add) (RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node); + void (*Remove) (RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node); + void (*Referenced) (RemovalPolicy * policy, const StoreEntry * entry, RemovalPolicyNode * node); + void (*Dereferenced) (RemovalPolicy * policy, const StoreEntry * entry, RemovalPolicyNode * node); RemovalPolicyWalker *(*WalkInit) (RemovalPolicy * policy); RemovalPurgeWalker *(*PurgeInit) (RemovalPolicy * policy, int max_scan); }; @@ -1268,7 +1289,7 @@ struct _RemovalPolicyWalker { RemovalPolicy *_policy; void *_data; - const PayloadEntry *(*Next) (RemovalPolicyWalker * walker); + const StoreEntry *(*Next) (RemovalPolicyWalker * walker); void (*Done) (RemovalPolicyWalker * walker); }; @@ -1276,7 +1297,7 @@ RemovalPolicy *_policy; void *_data; int scanned, max_scan, locked; - PayloadEntry *(*Next) (RemovalPurgeWalker * walker); + StoreEntry *(*Next) (RemovalPurgeWalker * walker); void (*Done) (RemovalPurgeWalker * walker); }; @@ -1312,35 +1333,50 @@ #if URL_CHECKSUM_DEBUG unsigned int chksum; #endif +#ifdef DSA + InstanceEntry * e; /* pointer to the initial InstanceEntry */ +#endif }; -struct _StoreEntry { - hash_link hash; /* must be first */ +#ifdef DSA +struct _InstanceEntry { + hash_link hash; time_t timestamp; time_t expires; time_t lastmod; u_short flags; - store_status_t store_status:3; - ping_status_t ping_status:3; - PayloadEntry * p; + StoreEntry * p; /* pointer to corresponding StoreEntry */ }; +#endif -struct _PayloadEntry { +struct _StoreEntry { hash_link hash; /* must be first */ MemObject *mem_obj; RemovalPolicyNode repl; +#ifndef DSA + time_t timestamp; +#endif time_t lastref; +#ifndef DSA + time_t expires; + time_t lastmod; +#endif + size_t swap_file_sz; u_short refcount; u_short flags; - size_t swap_file_sz; sfileno swap_filen:25; sdirno swap_dirn:7; - u_short lock_count; /* sum of all the lock_count's of the associated StoreEntry */ + u_short lock_count; /* Assume < 65536! */ mem_status_t mem_status:3; + ping_status_t ping_status:3; + store_status_t store_status:3; swap_status_t swap_status:3; - MD5_CTX ctx; /* MD5 context for the hash, updated per httpReadReply */ - Array * instances; /* array of StoreEntry's (aka instances) */ -}; +#ifdef DSA + MD5_CTX ctx; /* MD5 context for the hash, updated per each read(2) + in httpReadReply */ + Array * instances; /* Array of related InstanceEntry's */ +#endif +}; struct _SwapDir { char *type; @@ -1417,6 +1453,9 @@ #endif unsigned int accelerated:1; unsigned int internal:1; +#ifdef DTD + unsigned int was_get:1; /* to mark if this is a DTD request in the HEAD phase */ +#endif }; struct _link_list { @@ -1427,7 +1466,7 @@ struct _storeIOState { sdirno swap_dirn; sfileno swap_filen; - PayloadEntry *p; /* Need this so the FS layers can play god */ + StoreEntry *e; /* Need this so the FS layers can play god */ mode_t mode; size_t st_size; /* do stat(2) after read open */ off_t offset; /* current on-disk offset pointer */ @@ -1694,7 +1733,14 @@ struct _storeSwapLogData { char op; sfileno swap_filen; +#ifndef DSA + time_t timestamp; +#endif time_t lastref; +#ifndef DSA + time_t expires; + time_t lastmod; +#endif size_t swap_file_sz; u_short refcount; u_short flags; @@ -1761,7 +1807,11 @@ struct _FwdState { int client_fd; +#ifdef DSA + InstanceEntry * entry; +#else StoreEntry *entry; +#endif request_t *request; FwdServer *servers; int server_fd; @@ -1869,8 +1919,13 @@ int s_fd; /* server end */ int rcvd; /* bytes received from client */ int sent; /* bytes sent to server */ +#ifdef DSA + InstanceEntry * request_entry; + InstanceEntry * reply_entry; +#else StoreEntry *request_entry; /* the request entry */ StoreEntry *reply_entry; /* the reply entry */ +#endif CWCB *callback; /* what to do when we finish sending */ void *cbdata; /* callback data passed to callback func */ struct { @@ -1894,7 +1949,7 @@ * This defines an repl type */ -struct _payloadrepl_entry { +struct _storerepl_entry { char *typestr; REMOVALPOLICYCREATE *create; }; Index: squid/src/typedefs.h diff -u squid/src/typedefs.h:1.3.4.3.4.1 squid/src/typedefs.h:1.3.4.3.6.1 --- squid/src/typedefs.h:1.3.4.3.4.1 Wed Aug 14 03:15:37 2002 +++ squid/src/typedefs.h Fri Nov 15 01:10:37 2002 @@ -130,8 +130,10 @@ typedef struct _mem_hdr mem_hdr; typedef struct _store_client store_client; typedef struct _MemObject MemObject; +#ifdef DSA +typedef struct _InstanceEntry InstanceEntry; +#endif typedef struct _StoreEntry StoreEntry; -typedef struct _PayloadEntry PayloadEntry; typedef struct _SwapDir SwapDir; typedef struct _request_flags request_flags; typedef struct _helper_flags helper_flags; @@ -170,12 +172,8 @@ typedef struct _PumpStateData PumpStateData; typedef struct _storefs_entry storefs_entry_t; typedef struct _storerepl_entry storerepl_entry_t; -typedef struct _payloadrepl_entry payloadrepl_entry_t; typedef struct _diskd_queue diskd_queue; typedef struct _Logfile Logfile; -typedef struct _PLRemovalPolicy PLRemovalPolicy; -typedef struct _PLRemovalPolicyWalker PLRemovalPolicyWalker; -typedef struct _PLRemovalPurgeWalker PLRemovalPurgeWalker; typedef struct _RemovalPolicy RemovalPolicy; typedef struct _RemovalPolicyWalker RemovalPolicyWalker; typedef struct _RemovalPurgeWalker RemovalPurgeWalker; @@ -242,12 +240,12 @@ typedef void STNEWFS(SwapDir *); typedef void STDUMP(StoreEntry *, const char *, SwapDir *); typedef void STFREE(SwapDir *); -typedef int STDBLCHECK(SwapDir *, PayloadEntry *); +typedef int STDBLCHECK(SwapDir *, StoreEntry *); typedef void STSTATFS(SwapDir *, StoreEntry *); typedef void STMAINTAINFS(SwapDir *); -typedef int STCHECKOBJ(SwapDir *, const PayloadEntry *); -typedef void STREFOBJ(SwapDir *, PayloadEntry *); -typedef void STUNREFOBJ(SwapDir *, PayloadEntry *); +typedef int STCHECKOBJ(SwapDir *, const StoreEntry *); +typedef void STREFOBJ(SwapDir *, StoreEntry *); +typedef void STUNREFOBJ(SwapDir *, StoreEntry *); typedef void STSETUP(storefs_entry_t *); typedef void STDONE(void); typedef int STCALLBACK(SwapDir *); @@ -262,10 +260,10 @@ typedef void STLOGOPEN(SwapDir *); typedef void STLOGCLOSE(SwapDir *); -typedef void STLOGWRITE(const SwapDir *, const PayloadEntry *, int); +typedef void STLOGWRITE(const SwapDir *, const StoreEntry *, int); typedef int STLOGCLEANSTART(SwapDir *); -typedef const PayloadEntry *STLOGCLEANNEXTENTRY(SwapDir *); -typedef void STLOGCLEANWRITE(SwapDir *, const PayloadEntry *); +typedef const StoreEntry *STLOGCLEANNEXTENTRY(SwapDir *); +typedef void STLOGCLEANWRITE(SwapDir *, const StoreEntry *); typedef void STLOGCLEANDONE(SwapDir *); /* Store dir configuration routines */ @@ -316,7 +314,6 @@ #endif typedef RemovalPolicy *REMOVALPOLICYCREATE(wordlist * args); -typedef PLRemovalPolicy *PLREMOVALPOLICYCREATE(wordlist * args); typedef int STDIRSELECT(const StoreEntry *); Index: squid/src/urn.c diff -u squid/src/urn.c:1.3.4.3.8.1 squid/src/urn.c:1.3.4.3.10.1 --- squid/src/urn.c:1.3.4.3.8.1 Wed Aug 14 03:15:37 2002 +++ squid/src/urn.c Fri Nov 15 01:10:37 2002 @@ -36,9 +36,17 @@ #include "squid.h" typedef struct { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif store_client *sc; +#ifdef DSA + InstanceEntry *urlres_e; +#else StoreEntry *urlres_e; +#endif request_t *request; request_t *urlres_r; struct { @@ -96,21 +104,37 @@ } void +#ifdef DSA +urnStart(request_t * r, InstanceEntry * e) +#else urnStart(request_t * r, StoreEntry * e) +#endif { LOCAL_ARRAY(char, urlres, 4096); request_t *urlres_r = NULL; const char *t; char *host; UrnState *urnState; +#ifdef DSA + InstanceEntry *urlres_e; +#else StoreEntry *urlres_e; +#endif ErrorState *err; +#ifdef DSA + debug(52, 3) ("urnStart: '%s'\n", storeUrl(e->p)); +#else debug(52, 3) ("urnStart: '%s'\n", storeUrl(e)); +#endif urnState = xcalloc(1, sizeof(UrnState)); urnState->entry = e; urnState->request = requestLink(r); cbdataAdd(urnState, cbdataXfree, 0); - payloadLockObject(urnState->entry->p); +#ifdef DSA + storeLockObject(urnState->entry->p); +#else + storeLockObject(urnState->entry); +#endif if (strncasecmp(strBuf(r->urlpath), "menu.", 5) == 0) { char *new_path = xstrdup(strBuf(r->urlpath) + 5); urnState->flags.force_menu = 1; @@ -135,17 +159,32 @@ return; } httpHeaderPutStr(&urlres_r->header, HDR_ACCEPT, "text/plain"); +#ifdef DSA + if ((urlres_e = instanceGetPublic(urlres, METHOD_GET)) == NULL) { + urlres_e = instanceCreateEntry(urlres, urlres, null_request_flags, METHOD_GET); + urnState->sc = storeClientListAdd(urlres_e->p, urnState); +#else if ((urlres_e = storeGetPublic(urlres, METHOD_GET)) == NULL) { urlres_e = storeCreateEntry(urlres, urlres, null_request_flags, METHOD_GET); urnState->sc = storeClientListAdd(urlres_e, urnState); +#endif fwdStart(-1, urlres_e, urlres_r); } else { - payloadLockObject(urlres_e->p); +#ifdef DSA + storeLockObject(urlres_e->p); + urnState->sc = storeClientListAdd(urlres_e->p, urnState); +#else + storeLockObject(urlres_e); urnState->sc = storeClientListAdd(urlres_e, urnState); +#endif } urnState->urlres_e = urlres_e; urnState->urlres_r = requestLink(urlres_r); +#ifdef DSA + storeClientCopy(urnState->sc, urlres_e->p, +#else storeClientCopy(urnState->sc, urlres_e, +#endif 0, 0, 4096, @@ -173,8 +212,13 @@ urnHandleReply(void *data, char *buf, ssize_t size) { UrnState *urnState = data; +#ifdef DSA + StoreEntry *e = urnState->entry->p; + StoreEntry *urlres_e = urnState->urlres_e->p; +#else StoreEntry *e = urnState->entry; StoreEntry *urlres_e = urnState->urlres_e; +#endif char *s = NULL; size_t k; HttpReply *rep; @@ -217,16 +261,20 @@ return; } s = buf + k; - assert(urlres_e->p->mem_obj->reply); - httpReplyParse(urlres_e->p->mem_obj->reply, buf, k); + assert(urlres_e->mem_obj->reply); + httpReplyParse(urlres_e->mem_obj->reply, buf, k); debug(52, 3) ("mem->reply exists, code=%d.\n", - urlres_e->p->mem_obj->reply->sline.status); - if (urlres_e->p->mem_obj->reply->sline.status != HTTP_OK) { + urlres_e->mem_obj->reply->sline.status); + if (urlres_e->mem_obj->reply->sline.status != HTTP_OK) { debug(52, 3) ("urnHandleReply: failed.\n"); err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); err->request = requestLink(urnState->request); err->url = xstrdup(storeUrl(e)); +#ifdef DSA + errorAppendEntry(urnState->entry, err); +#else errorAppendEntry(e, err); +#endif return; } while (xisspace(*s)) @@ -240,7 +288,11 @@ err = errorCon(ERR_URN_RESOLVE, HTTP_NOT_FOUND); err->request = requestLink(urnState->request); err->url = xstrdup(storeUrl(e)); +#ifdef DSA + errorAppendEntry(urnState->entry, err); +#else errorAppendEntry(e, err); +#endif return; } min_u = urnFindMinRtt(urls, urnState->request->method, NULL); @@ -271,7 +323,7 @@ "Generated by %s@%s\n" "\n", full_appname_string, getMyHostname()); - rep = e->p->mem_obj->reply; + rep = e->mem_obj->reply; httpReplyReset(rep); httpBuildVersion(&version, 1, 0); httpReplySetHeaders(rep, version, HTTP_MOVED_TEMPORARILY, NULL, @@ -292,8 +344,12 @@ safe_free(urls); /* mb was absorbed in httpBodySet call, so we must not clean it */ storeUnregister(urnState->sc, urlres_e, urnState); - payloadUnlockObject(urlres_e->p); - payloadUnlockObject(urnState->entry->p); + storeUnlockObject(urlres_e); +#ifdef DSA + storeUnlockObject(urnState->entry->p); +#else + storeUnlockObject(urnState->entry); +#endif requestUnlink(urnState->request); requestUnlink(urnState->urlres_r); cbdataFree(urnState); Index: squid/src/wais.c diff -u squid/src/wais.c:1.3.4.1.8.1 squid/src/wais.c:1.3.4.1.10.4.2.1 --- squid/src/wais.c:1.3.4.1.8.1 Wed Aug 14 03:15:37 2002 +++ squid/src/wais.c Mon Dec 30 15:06:41 2002 @@ -37,7 +37,11 @@ typedef struct { int fd; +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif method_t method; const HttpHeader *request_hdr; char url[MAX_URL]; @@ -57,7 +61,11 @@ WaisStateData *waisState = data; if (waisState == NULL) return; - payloadUnlockObject(waisState->entry->p); +#ifdef DSA + storeUnlockObject(waisState->entry->p); +#else + storeUnlockObject(waisState->entry); +#endif requestUnlink(waisState->request); cbdataFree(waisState); } @@ -67,10 +75,14 @@ waisTimeout(int fd, void *data) { WaisStateData *waisState = data; +#ifdef DSA + StoreEntry *entry = waisState->entry->p; +#else StoreEntry *entry = waisState->entry; +#endif debug(24, 4) ("waisTimeout: FD %d: '%s'\n", fd, storeUrl(entry)); if (entry->store_status == STORE_PENDING) { - if (entry->p->mem_obj->inmem_hi == 0) { + if (entry->mem_obj->inmem_hi == 0) { fwdFail(waisState->fwd, errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT)); } @@ -85,7 +97,11 @@ { WaisStateData *waisState = data; LOCAL_ARRAY(char, buf, 4096); +#ifdef DSA + StoreEntry *entry = waisState->entry->p; +#else StoreEntry *entry = waisState->entry; +#endif int len; int clen; int bin; @@ -135,19 +151,31 @@ err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR); err->xerrno = errno; err->request = requestLink(waisState->request); +#ifdef DSA + errorAppendEntry(waisState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); } - } else if (len == 0 && entry->p->mem_obj->inmem_hi == 0) { + } else if (len == 0 && entry->mem_obj->inmem_hi == 0) { ErrorState *err; err = errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; err->request = requestLink(waisState->request); +#ifdef DSA + errorAppendEntry(waisState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); } else if (len == 0) { /* Connection closed; retrieval done. */ +#ifdef DSA + waisState->entry->expires = squid_curtime; +#else entry->expires = squid_curtime; +#endif fwdComplete(waisState->fwd); comm_close(fd); } else { @@ -165,7 +193,11 @@ waisSendComplete(int fd, char *bufnotused, size_t size, int errflag, void *data) { WaisStateData *waisState = data; +#ifdef DSA + StoreEntry *entry = waisState->entry->p; +#else StoreEntry *entry = waisState->entry; +#endif debug(24, 5) ("waisSendComplete: FD %d size: %d errflag: %d\n", fd, size, errflag); if (size > 0) { @@ -180,7 +212,11 @@ err = errorCon(ERR_WRITE_ERROR, HTTP_SERVICE_UNAVAILABLE); err->xerrno = errno; err->request = requestLink(waisState->request); +#ifdef DSA + errorAppendEntry(waisState->entry, err); +#else errorAppendEntry(entry, err); +#endif comm_close(fd); } else { /* Schedule read reply. */ @@ -211,9 +247,15 @@ memBufPrintf(&mb, "\r\n"); debug(24, 6) ("waisSendRequest: buf: %s\n", mb.buf); comm_write_mbuf(fd, mb, waisSendComplete, waisState); +#ifdef DSA + if (EBIT_TEST(waisState->entry->p->flags, ENTRY_CACHABLE)) + storeSetPublicKey(waisState->entry); /* Make it public */ + EBIT_CLR(waisState->entry->p->flags, ENTRY_FWD_HDR_WAIT); +#else if (EBIT_TEST(waisState->entry->flags, ENTRY_CACHABLE)) storeSetPublicKey(waisState->entry); /* Make it public */ EBIT_CLR(waisState->entry->flags, ENTRY_FWD_HDR_WAIT); +#endif } void @@ -221,7 +263,11 @@ { WaisStateData *waisState = NULL; request_t *request = fwd->request; +#ifdef DSA + StoreEntry *entry = fwd->entry->p; +#else StoreEntry *entry = fwd->entry; +#endif int fd = fwd->server_fd; const char *url = storeUrl(entry); method_t method = request->method; @@ -233,12 +279,16 @@ waisState->method = method; waisState->request_hdr = &request->header; waisState->fd = fd; +#ifdef DSA + waisState->entry = fwd->entry; +#else waisState->entry = entry; +#endif xstrncpy(waisState->url, url, MAX_URL); waisState->request = requestLink(request); waisState->fwd = fwd; comm_add_close_handler(waisState->fd, waisStateFree, waisState); - payloadLockObject(entry->p); + storeLockObject(entry); commSetSelect(fd, COMM_SELECT_WRITE, waisSendRequest, waisState, 0); commSetTimeout(fd, Config.Timeout.read, waisTimeout, waisState); } Index: squid/src/whois.c diff -u squid/src/whois.c:1.3.4.1.8.1 squid/src/whois.c:1.3.4.1.10.1 --- squid/src/whois.c:1.3.4.1.8.1 Wed Aug 14 03:15:38 2002 +++ squid/src/whois.c Fri Nov 15 01:10:37 2002 @@ -38,7 +38,11 @@ #define WHOIS_PORT 43 typedef struct { +#ifdef DSA + InstanceEntry *entry; +#else StoreEntry *entry; +#endif request_t *request; FwdState *fwd; } WhoisState; @@ -60,7 +64,11 @@ p->entry = fwd->entry; p->fwd = fwd; cbdataAdd(p, cbdataXfree, 0); - payloadLockObject(p->entry->p); +#ifdef DSA + storeLockObject(p->entry->p); +#else + storeLockObject(p->entry); +#endif comm_add_close_handler(fd, whoisClose, p); l = strLen(p->request->urlpath) + 3; buf = xmalloc(l); @@ -76,7 +84,11 @@ whoisTimeout(int fd, void *data) { WhoisState *p = data; +#ifdef DSA + debug(75, 1) ("whoisTimeout: %s\n", storeUrl(p->entry->p)); +#else debug(75, 1) ("whoisTimeout: %s\n", storeUrl(p->entry)); +#endif whoisClose(fd, p); } @@ -84,9 +96,13 @@ whoisReadReply(int fd, void *data) { WhoisState *p = data; +#ifdef DSA + StoreEntry *entry = p->entry->p; +#else StoreEntry *entry = p->entry; +#endif char *buf = memAllocate(MEM_4K_BUF); - MemObject *mem = entry->p->mem_obj; + MemObject *mem = entry->mem_obj; int len; statCounter.syscalls.sock.reads++; len = read(fd, buf, 4095); @@ -128,6 +144,10 @@ { WhoisState *p = data; debug(75, 3) ("whoisClose: FD %d\n", fd); - payloadUnlockObject(p->entry->p); +#ifdef DSA + storeUnlockObject(p->entry->p); +#else + storeUnlockObject(p->entry); +#endif cbdataFree(p); } Index: squid/src/fs/ufs/Makefile.in diff -u squid/src/fs/ufs/Makefile.in:1.2 squid/src/fs/ufs/Makefile.in:1.2.64.1 --- squid/src/fs/ufs/Makefile.in:1.2 Sat Oct 21 09:44:46 2000 +++ squid/src/fs/ufs/Makefile.in Sat Nov 16 00:19:02 2002 @@ -15,6 +15,7 @@ RANLIB = @RANLIB@ AC_CFLAGS = @CFLAGS@ SHELL = /bin/sh +DEFINES = -DDSA INCLUDE = -I../../../include -I$(top_srcdir)/include -I$(top_srcdir)/src/ CFLAGS = $(AC_CFLAGS) $(INCLUDE) $(DEFINES) Index: squid/src/fs/ufs/store_dir_ufs.c diff -u squid/src/fs/ufs/store_dir_ufs.c:1.4.2.9.2.1 squid/src/fs/ufs/store_dir_ufs.c:1.4.2.9.4.3 --- squid/src/fs/ufs/store_dir_ufs.c:1.4.2.9.2.1 Wed Aug 14 03:15:38 2002 +++ squid/src/fs/ufs/store_dir_ufs.c Mon Dec 2 00:11:22 2002 @@ -78,19 +78,31 @@ static EVH storeUfsDirRebuildFromDirectory; static EVH storeUfsDirRebuildFromSwapLog; static int storeUfsDirGetNextFile(RebuildState *, int *sfileno, int *size); -static PayloadEntry *storeUfsDirAddDiskRestore(SwapDir * SD, const cache_key * key, +static StoreEntry *storeUfsDirAddDiskRestore(SwapDir * SD, const cache_key * key, int file_number, size_t swap_file_sz, +#ifndef DSA + time_t expires, + time_t timestamp, +#endif time_t lastref, +#ifndef DSA + time_t lastmod, +#endif u_num32 refcount, u_short flags, +#ifdef DSA Array * instances, +#endif int clean); -static StoreEntry *storeUfsDirAddInstanceRestore(const cache_key * key, +#ifdef DSA +static InstanceEntry * storeUfsDirAddInstanceRestore(const cache_key * key, time_t timestamp, time_t expires, time_t lastmod, u_short flags); +static Array * storeUfsDirAddInstances(const cache_key *); +#endif static void storeUfsDirRebuild(SwapDir * sd); static void storeUfsDirCloseTmpSwapLog(SwapDir * sd); static FILE *storeUfsDirOpenTmpSwapLog(SwapDir *, int *, int *); @@ -114,11 +126,10 @@ static EVH storeUfsDirCleanEvent; static int storeUfsDirIs(SwapDir * sd); static int storeUfsFilenoBelongsHere(int fn, int F0, int F1, int F2); -static int storeUfsCleanupDoubleCheck(SwapDir *, PayloadEntry *); +static int storeUfsCleanupDoubleCheck(SwapDir *, StoreEntry *); static void storeUfsDirStats(SwapDir *, StoreEntry *); static void storeUfsDirInitBitmap(SwapDir *); static int storeUfsDirValidFileno(SwapDir *, sfileno, int); -static Array * storeUfsDirAddInstances(const cache_key *); /* * These functions were ripped straight out of the heart of store_dir.c. @@ -377,8 +388,8 @@ RebuildState *rb = data; SwapDir *SD = rb->sd; LOCAL_ARRAY(char, hdr_buf, SM_PAGE_SIZE); - PayloadEntry *p = NULL; - PayloadEntry tmpp; + StoreEntry *e = NULL; + StoreEntry tmpe; cache_key key[MD5_DIGEST_CHARS]; int sfileno = 0; int count; @@ -386,9 +397,11 @@ struct stat sb; int swap_hdr_len; int fd = -1; - int i; tlv *tlv_list; tlv *t; +#ifdef DSA + int i; +#endif assert(rb != NULL); debug(20, 3) ("storeUfsDirRebuildFromDirectory: DIR #%d\n", rb->sd->index); for (count = 0; count < rb->speed; count++) { @@ -445,7 +458,7 @@ } debug(20, 3) ("storeUfsDirRebuildFromDirectory: successful swap meta unpacking\n"); memset(key, '\0', MD5_DIGEST_CHARS); - memset(&tmpp, '\0', sizeof(PayloadEntry)); + memset(&tmpe, '\0', sizeof(StoreEntry)); for (t = tlv_list; t; t = t->next) { switch (t->type) { case STORE_META_KEY: @@ -453,8 +466,12 @@ xmemcpy(key, t->value, MD5_DIGEST_CHARS); break; case STORE_META_STD: - assert(t->length == PAYLOAD_HDR_METASIZE); - xmemcpy(&tmpp.lastref, t->value, PAYLOAD_HDR_METASIZE); + assert(t->length == STORE_HDR_METASIZE); +#ifdef DSA + xmemcpy(&tmpe.lastref, t->value, STORE_HDR_METASIZE); +#else + xmemcpy(&tmpe.timestamp, t->value, STORE_HDR_METASIZE); +#endif break; default: break; @@ -467,57 +484,72 @@ storeUfsDirUnlinkFile(SD, sfileno); continue; } - tmpp.hash.key = key; + tmpe.hash.key = key; /* check sizes */ - if (tmpp.swap_file_sz == 0) { - tmpp.swap_file_sz = sb.st_size; - } else if (tmpp.swap_file_sz == sb.st_size - swap_hdr_len) { - tmpp.swap_file_sz = sb.st_size; - } else if (tmpp.swap_file_sz != sb.st_size) { + if (tmpe.swap_file_sz == 0) { + tmpe.swap_file_sz = sb.st_size; + } else if (tmpe.swap_file_sz == sb.st_size - swap_hdr_len) { + tmpe.swap_file_sz = sb.st_size; + } else if (tmpe.swap_file_sz != sb.st_size) { debug(20, 1) ("storeUfsDirRebuildFromDirectory: SIZE MISMATCH %d!=%d\n", - tmpp.swap_file_sz, (int) sb.st_size); + tmpe.swap_file_sz, (int) sb.st_size); storeUfsDirUnlinkFile(SD, sfileno); continue; } - /* +#ifdef DSA + EBIT_CLR(tmpe.flags, KEY_PRIVATE); +#else if (EBIT_TEST(tmpe.flags, KEY_PRIVATE)) { storeUfsDirUnlinkFile(SD, sfileno); rb->counts.badflags++; continue; } - */ - p = payloadGet(key); - if (p && p->lastref >= tmpp.lastref) { +#endif + e = storeGet(key); + if (e && e->lastref >= tmpe.lastref) { /* key already exists, current entry is newer */ /* keep old, ignore new */ rb->counts.dupcount++; continue; - } else if (NULL != p) { + } else if (NULL != e) { /* URL already exists, this swapfile not being used */ /* junk old, load new */ - payloadRelease(p); /* release old entry */ + storeRelease(e); /* release old entry */ rb->counts.dupcount++; } rb->counts.objcount++; - tmpp.instances = storeUfsDirAddInstances(key); - if (tmpp.instances == NULL || tmpp.instances->count <= 0) { - if (tmpp.instances) - arrayDestroy(tmpp.instances); +#ifdef DSA + tmpe.instances = storeUfsDirAddInstances(key); + if (tmpe.instances == NULL || tmpe.instances->count <= 0) { + if (tmpe.instances) + arrayDestroy(tmpe.instances); rb->counts.dupcount++; continue; - } - payloadEntryDump(&tmpp, 5); - p = storeUfsDirAddDiskRestore(SD, key, + } +#endif + storeEntryDump(&tmpe, 5); + e = storeUfsDirAddDiskRestore(SD, key, sfileno, - tmpp.swap_file_sz, - tmpp.lastref, /* lastref */ - tmpp.refcount, /* refcount */ - tmpp.flags, /* flags */ - tmpp.instances, /* instances */ + tmpe.swap_file_sz, +#ifndef DSA + tmpe.expires, + tmpe.timestamp, +#endif + tmpe.lastref, +#ifndef DSA + tmpe.lastmod, +#endif + tmpe.refcount, /* refcount */ + tmpe.flags, /* flags */ +#ifdef DSA + tmpe.instances, +#endif (int) rb->flags.clean); - for (i = 0; i < tmpp.instances->count; ++i) - ((StoreEntry *) tmpp.instances->items[i])->p = p; - storeDirSwapLog(p, SWAP_LOG_ADD); +#ifdef DSA + for (i = 0; i < tmpe.instances->count; ++i) + ((InstanceEntry *) tmpe.instances->items[i])->p = e; +#endif + storeDirSwapLog(e, SWAP_LOG_ADD); } eventAdd("storeRebuild", storeUfsDirRebuildFromDirectory, rb, 0.0, 1); } @@ -527,15 +559,17 @@ { RebuildState *rb = data; SwapDir *SD = rb->sd; - PayloadEntry *p = NULL; + StoreEntry *e = NULL; storeSwapLogData s; size_t ss = sizeof(storeSwapLogData); int count; - int i; int used; /* is swapfile already in use? */ int disk_entry_newer; /* is the log entry newer than current entry? */ double x; +#ifdef DSA + int i; Array * instances; +#endif assert(rb != NULL); /* load a number of objects per invocation */ for (count = 0; count < rb->speed; count++) { @@ -571,7 +605,7 @@ if (s.op == SWAP_LOG_ADD) { (void) 0; } else if (s.op == SWAP_LOG_DEL) { - if ((p = payloadGet(s.key)) != NULL) { + if ((e = storeGet(s.key)) != NULL) { /* * Make sure we don't unlink the file, it might be * in use by a subsequent entry. Also note that @@ -579,13 +613,20 @@ * because adding to store_swap_size happens in * the cleanup procedure. */ - if (p->swap_filen > -1) { - storeUfsDirReplRemove(p); - storeUfsDirMapBitReset(SD, p->swap_filen); - p->swap_filen = -1; - p->swap_dirn = -1; +#ifdef DSA + assert(e->instances->count > 0); + storeExpireNow(e->instances->items[0]); +#else + storeExpireNow(e); +#endif + storeReleaseRequest(e); + if (e->swap_filen > -1) { + storeUfsDirReplRemove(e); + storeUfsDirMapBitReset(SD, e->swap_filen); + e->swap_filen = -1; + e->swap_dirn = -1; } - payloadRelease(p); + storeRelease(e); rb->counts.objcount--; rb->counts.cancelcount++; } @@ -608,28 +649,36 @@ rb->counts.invalid++; continue; } - /* ymc: No concept of PRIVATE for payloads if (EBIT_TEST(s.flags, KEY_PRIVATE)) { rb->counts.badflags++; continue; } - */ - p = payloadGet(s.key); + e = storeGet(s.key); used = storeUfsDirMapBitTest(SD, s.swap_filen); /* If this URL already exists in the cache, does the swap log * appear to have a newer entry? Compare 'lastref' from the * swap log to e->lastref. */ - disk_entry_newer = p ? (s.lastref > p->lastref ? 1 : 0) : 0; + disk_entry_newer = e ? (s.lastref > e->lastref ? 1 : 0) : 0; if (used && !disk_entry_newer) { /* log entry is old, ignore it */ rb->counts.clashcount++; continue; - } else if (used && p && p->swap_filen == s.swap_filen && p->swap_dirn == SD->index) { + } else if (used && e && e->swap_filen == s.swap_filen && e->swap_dirn == SD->index) { /* swapfile taken, same URL, newer, update meta */ - p->lastref = s.lastref; - p->flags = s.flags; - p->refcount = s.refcount; - storeUfsDirUnrefObj(SD, p); + if (e->store_status == STORE_OK) { + e->lastref = s.lastref; +#ifndef DSA + e->timestamp = s.timestamp; + e->expires = s.expires; + e->lastmod = s.lastmod; +#endif + e->flags = s.flags; + e->refcount += s.refcount; + storeUfsDirUnrefObj(SD, e); + } else { + debug_trap("storeUfsDirRebuildFromSwapLog: bad condition"); + debug(20, 1) ("\tSee %s:%d\n", __FILE__, __LINE__); + } continue; } else if (used) { /* swapfile in use, not by this URL, log entry is newer */ @@ -651,22 +700,29 @@ assert(rb->flags.need_to_validate); rb->counts.clashcount++; continue; - } else if (p && !disk_entry_newer) { + } else if (e && !disk_entry_newer) { /* key already exists, current entry is newer */ /* keep old, ignore new */ rb->counts.dupcount++; continue; - } else if (p) { + } else if (e) { /* key already exists, this swapfile not being used */ /* junk old, load new */ - if (p->swap_filen > -1) { - storeUfsDirReplRemove(p); +#ifdef DSA + assert(e->instances->count > 0); + storeExpireNow(e->instances->items[0]); +#else + storeExpireNow(e); +#endif + storeReleaseRequest(e); + if (e->swap_filen > -1) { + storeUfsDirReplRemove(e); /* Make sure we don't actually unlink the file */ - storeUfsDirMapBitReset(SD, p->swap_filen); - p->swap_filen = -1; - p->swap_dirn = -1; + storeUfsDirMapBitReset(SD, e->swap_filen); + e->swap_filen = -1; + e->swap_dirn = -1; } - payloadRelease(p); + storeRelease(e); rb->counts.dupcount++; } else { /* URL doesnt exist, swapfile not in use */ @@ -675,24 +731,37 @@ } /* update store_swap_size */ rb->counts.objcount++; +#ifdef DSA instances = storeUfsDirAddInstances(s.key); if (instances == NULL || instances->count <= 0) { if (instances) - arrayDestroy(instances); + arrayDestroy(instances); rb->counts.dupcount++; continue; - } - p = storeUfsDirAddDiskRestore(SD, s.key, + } +#endif + e = storeUfsDirAddDiskRestore(SD, s.key, s.swap_filen, s.swap_file_sz, +#ifndef DSA + s.expires, + s.timestamp, +#endif s.lastref, +#ifndef DSA + s.lastmod, +#endif s.refcount, s.flags, +#ifdef DSA instances, +#endif (int) rb->flags.clean); - for (i = 0; i < instances->count; ++i) - ((StoreEntry *) instances->items[i])->p = p; - storeDirSwapLog(p, SWAP_LOG_ADD); +#ifdef DSA + for (i = 0; i < instances->count; ++i) + ((InstanceEntry *) instances->items[i])->p = e; +#endif + storeDirSwapLog(e, SWAP_LOG_ADD); } eventAdd("storeRebuild", storeUfsDirRebuildFromSwapLog, rb, 0.0, 1); } @@ -786,43 +855,65 @@ /* Add a new object to the cache with empty memory copy and pointer to disk * use to rebuild store from disk. */ -static PayloadEntry * +static StoreEntry * storeUfsDirAddDiskRestore(SwapDir * SD, const cache_key * key, int file_number, size_t swap_file_sz, +#ifndef DSA + time_t expires, + time_t timestamp, +#endif time_t lastref, +#ifndef DSA + time_t lastmod, +#endif u_num32 refcount, u_short flags, +#ifdef DSA Array * instances, +#endif int clean) { - PayloadEntry *p = NULL; + StoreEntry *e = NULL; debug(20, 5) ("storeUfsAddDiskRestore: %s, fileno=%08X\n", storeKeyText(key), file_number); /* if you call this you'd better be sure file_number is not * already in use! */ - p = new_PayloadEntry(STORE_ENTRY_WITHOUT_MEMOBJ, NULL, NULL); - payloadSetMemStatus(p, NOT_IN_MEMORY); - p->swap_filen = file_number; - p->swap_dirn = SD->index; - p->swap_file_sz = swap_file_sz; - p->swap_status = SWAPOUT_DONE; - p->lock_count = 0; - p->lastref = lastref; - p->refcount = refcount; - p->flags = flags; - p->instances = instances; - EBIT_SET(p->flags, ENTRY_CACHABLE); - EBIT_CLR(p->flags, RELEASE_REQUEST); - EBIT_CLR(p->flags, KEY_PRIVATE); - EBIT_CLR(p->flags, ENTRY_VALIDATED); - storeUfsDirMapBitSet(SD, p->swap_filen); - payloadHashInsert(p, key); /* do it after we clear KEY_PRIVATE */ - storeUfsDirReplAdd(SD, p); - return p; + e = new_StoreEntry(STORE_ENTRY_WITHOUT_MEMOBJ, NULL, NULL); + e->store_status = STORE_OK; + storeSetMemStatus(e, NOT_IN_MEMORY); + e->swap_status = SWAPOUT_DONE; + e->swap_filen = file_number; + e->swap_dirn = SD->index; + e->swap_file_sz = swap_file_sz; + e->lock_count = 0; + e->lastref = lastref; +#ifndef DSA + e->timestamp = timestamp; + e->expires = expires; + e->lastmod = lastmod; +#endif + e->refcount = refcount; + e->flags = flags; + EBIT_SET(e->flags, ENTRY_CACHABLE); + EBIT_CLR(e->flags, RELEASE_REQUEST); + EBIT_CLR(e->flags, KEY_PRIVATE); + e->ping_status = PING_NONE; + EBIT_CLR(e->flags, ENTRY_VALIDATED); + storeUfsDirMapBitSet(SD, e->swap_filen); +#ifdef DSA + e->instances = instances; + e->hash.key = storeKeyDup(key); + storeHashInsert(e); /* do it after we clear KEY_PRIVATE */ +#else + storeHashInsert(e, key); /* do it after we clear KEY_PRIVATE */ +#endif + storeUfsDirReplAdd(SD, e); + return e; } +#ifdef DSA static Array * -storeUfsDirAddInstances(const cache_key * key) +storeUfsDirAddInstances(const cache_key * key) { char fullpath[SQUID_MAXPATHLEN]; char fullfilename[SQUID_MAXPATHLEN]; @@ -830,8 +921,8 @@ DIR * dp; char hdr_buf[SM_PAGE_SIZE]; struct dirent * de; - StoreEntry * e = NULL; - StoreEntry tmpe; + InstanceEntry * e = NULL; + InstanceEntry tmpe; int fd; struct stat sb; tlv * tlv_list; @@ -905,7 +996,7 @@ } debug(20, 3) ("storeUfsDirAddInstances: successful swap meta unpacking\n"); memset(skey, '\0', MD5_DIGEST_CHARS); - memset(&tmpe, '\0', sizeof(StoreEntry)); + memset(&tmpe, '\0', sizeof(InstanceEntry)); for (t = tlv_list; t; t = t->next) { switch (t->type) { case STORE_META_KEY: @@ -913,8 +1004,8 @@ xmemcpy(skey, t->value, MD5_DIGEST_CHARS); break; case STORE_META_STD: - assert(t->length == STORE_HDR_METASIZE); - xmemcpy(&tmpe.timestamp, t->value, STORE_HDR_METASIZE); + assert(t->length == INSTANCE_HDR_METASIZE); + xmemcpy(&tmpe.timestamp, t->value, INSTANCE_HDR_METASIZE); break; default: break; @@ -946,7 +1037,7 @@ continue; } - e = storeGet(skey); + e = instanceGet(skey); if (e && e->timestamp >= tmpe.timestamp) { /* key already exists, current entry is newer */ /* keep old, ignore new */ @@ -954,9 +1045,15 @@ } else if (NULL != e) { /* URL already exists, this swapfile not being used */ /* junk old, load new */ +#ifdef DSA + instanceRelease(e); /* release old entry */ +#else storeRelease(e); /* release old entry */ +#endif } +#ifndef DSA storeEntryDump(&tmpe, 5); +#endif e = storeUfsDirAddInstanceRestore(skey, tmpe.timestamp, /* timestamp */ tmpe.expires, /* expires */ @@ -966,37 +1063,36 @@ } closedir(dp); if (ar->count <= 0) { - arrayDestroy(ar); - return 0; + arrayDestroy(ar); + return 0; } return ar; } -static StoreEntry * +static InstanceEntry * storeUfsDirAddInstanceRestore(const cache_key * key, time_t timestamp, time_t expires, time_t lastmod, u_short flags) { - StoreEntry *e = NULL; + InstanceEntry *e = NULL; debug(20, 5) ("storeUfsAddInstanceRestore: %s\n", storeKeyText(key)); /* if you call this you'd better be sure file_number is not * already in use! */ - e = new_StoreEntry(STORE_ENTRY_WITHOUT_MEMOBJ, NULL, NULL); + e = new_InstanceEntry(STORE_ENTRY_WITHOUT_MEMOBJ, NULL, NULL); e->timestamp = timestamp; e->expires = expires; - e->store_status = STORE_OK; e->lastmod = lastmod; e->flags = flags; EBIT_SET(e->flags, ENTRY_CACHABLE); EBIT_CLR(e->flags, RELEASE_REQUEST); EBIT_CLR(e->flags, KEY_PRIVATE); - e->ping_status = PING_NONE; EBIT_CLR(e->flags, ENTRY_VALIDATED); - storeHashInsert(e, key); /* do it after we clear KEY_PRIVATE */ + instanceHashInsert(e, key); /* do it after we clear KEY_PRIVATE */ return e; } +#endif static void storeUfsDirRebuild(SwapDir * sd) @@ -1018,7 +1114,7 @@ if (fp == NULL || zero) { if (fp != NULL) fclose(fp); -func = storeUfsDirRebuildFromDirectory; + func = storeUfsDirRebuildFromDirectory; } else { func = storeUfsDirRebuildFromSwapLog; rb->log = fp; @@ -1163,10 +1259,10 @@ /* * Get the next entry that is a candidate for clean log writing */ -const PayloadEntry * +const StoreEntry * storeUfsDirCleanLogNextEntry(SwapDir * sd) { - const PayloadEntry *entry = NULL; + const StoreEntry *entry = NULL; struct _clean_state *state = sd->log.clean.state; if (state->walker) entry = state->walker->Next(state->walker); @@ -1177,19 +1273,26 @@ * "write" an entry to the clean log file. */ static void -storeUfsDirWriteCleanEntry(SwapDir * sd, const PayloadEntry * p) +storeUfsDirWriteCleanEntry(SwapDir * sd, const StoreEntry * e) { storeSwapLogData s; static size_t ss = sizeof(storeSwapLogData); struct _clean_state *state = sd->log.clean.state; memset(&s, '\0', ss); s.op = (char) SWAP_LOG_ADD; - s.swap_filen = p->swap_filen; - s.lastref = p->lastref; - s.swap_file_sz = p->swap_file_sz; - s.refcount = p->refcount; - s.flags = p->flags; - xmemcpy(&s.key, p->hash.key, MD5_DIGEST_CHARS); + s.swap_filen = e->swap_filen; +#ifndef DSA + s.timestamp = e->timestamp; +#endif + s.lastref = e->lastref; +#ifndef DSA + s.expires = e->expires; + s.lastmod = e->lastmod; +#endif + s.swap_file_sz = e->swap_file_sz; + s.refcount = e->refcount; + s.flags = e->flags; + xmemcpy(&s.key, e->hash.key, MD5_DIGEST_CHARS); xmemcpy(state->outbuf + state->outbuf_offset, &s, ss); state->outbuf_offset += ss; /* buffered write */ @@ -1273,17 +1376,24 @@ } static void -storeUfsDirSwapLog(const SwapDir * sd, const PayloadEntry * p, int op) +storeUfsDirSwapLog(const SwapDir * sd, const StoreEntry * e, int op) { ufsinfo_t *ufsinfo = (ufsinfo_t *) sd->fsdata; storeSwapLogData *s = memAllocate(MEM_SWAP_LOG_DATA); s->op = (char) op; - s->swap_filen = p->swap_filen; - s->lastref = p->lastref; - s->swap_file_sz = p->swap_file_sz; - s->refcount = p->refcount; - s->flags = p->flags; - xmemcpy(s->key, p->hash.key, MD5_DIGEST_CHARS); + s->swap_filen = e->swap_filen; +#ifndef DSA + s->timestamp = e->timestamp; +#endif + s->lastref = e->lastref; +#ifndef DSA + s->expires = e->expires; + s->lastmod = e->lastmod; +#endif + s->swap_file_sz = e->swap_file_sz; + s->refcount = e->refcount; + s->flags = e->flags; + xmemcpy(s->key, e->hash.key, MD5_DIGEST_CHARS); file_write(ufsinfo->swaplog_fd, -1, s, @@ -1296,12 +1406,16 @@ static void storeUfsDirNewfs(SwapDir * sd) { +#ifdef DSA char instances_dir[SQUID_MAXPATHLEN]; +#endif debug(47, 3) ("Creating swap space in %s\n", sd->path); storeUfsDirCreateDirectory(sd->path, 0); +#ifdef DSA strcpy(instances_dir, sd->path); strcat(instances_dir, "/instances"); storeUfsDirCreateDirectory(instances_dir, 0); +#endif storeUfsDirCreateSwapSubDirs(sd); } @@ -1484,7 +1598,7 @@ void storeUfsDirMaintain(SwapDir * SD) { - PayloadEntry *p = NULL; + StoreEntry *e = NULL; int removed = 0; int max_scan; int max_remove; @@ -1509,11 +1623,11 @@ break; if (removed >= max_remove) break; - p = walker->Next(walker); - if (!p) + e = walker->Next(walker); + if (!e) break; /* no more objects */ removed++; - payloadRelease(p); + storeRelease(e); } walker->Done(walker); debug(20, (removed ? 2 : 3)) ("storeUfsDirMaintain: %s removed %d/%d f=%.03f max_scan=%d\n", @@ -1528,7 +1642,7 @@ * happily store anything as long as the LRU time isn't too small. */ int -storeUfsDirCheckObj(SwapDir * SD, const PayloadEntry * p) +storeUfsDirCheckObj(SwapDir * SD, const StoreEntry * e) { /* Return 999 (99.9%) constant load */ return 999; @@ -1541,12 +1655,12 @@ * maintain replacement information within the storage fs. */ void -storeUfsDirRefObj(SwapDir * SD, PayloadEntry * p) +storeUfsDirRefObj(SwapDir * SD, StoreEntry * e) { - debug(1, 3) ("storeUfsDirRefObj: referencing %p %d/%d\n", p, p->swap_dirn, - p->swap_filen); + debug(1, 3) ("storeUfsDirRefObj: referencing %p %d/%d\n", e, e->swap_dirn, + e->swap_filen); if (SD->repl->Referenced) - SD->repl->Referenced(SD->repl, p, &p->repl); + SD->repl->Referenced(SD->repl, e, &e->repl); } /* @@ -1555,12 +1669,12 @@ * removed, to maintain replacement information within the storage fs. */ void -storeUfsDirUnrefObj(SwapDir * SD, PayloadEntry * p) +storeUfsDirUnrefObj(SwapDir * SD, StoreEntry * e) { - debug(1, 3) ("storeUfsDirUnrefObj: referencing %p %d/%d\n", p, p->swap_dirn, - p->swap_filen); + debug(1, 3) ("storeUfsDirUnrefObj: referencing %p %d/%d\n", e, e->swap_dirn, + e->swap_filen); if (SD->repl->Dereferenced) - SD->repl->Dereferenced(SD->repl, p, &p->repl); + SD->repl->Dereferenced(SD->repl, e, &e->repl); } /* @@ -1590,21 +1704,21 @@ */ void -storeUfsDirReplAdd(SwapDir * SD, PayloadEntry * p) +storeUfsDirReplAdd(SwapDir * SD, StoreEntry * e) { - debug(20, 4) ("storeUfsDirReplAdd: added node %p to dir %d\n", p, + debug(20, 4) ("storeUfsDirReplAdd: added node %p to dir %d\n", e, SD->index); - SD->repl->Add(SD->repl, p, &p->repl); + SD->repl->Add(SD->repl, e, &e->repl); } void -storeUfsDirReplRemove(PayloadEntry * p) +storeUfsDirReplRemove(StoreEntry * e) { - SwapDir *SD = INDEXSD(p->swap_dirn); - debug(20, 4) ("storeUfsDirReplRemove: remove node %p from dir %d\n", p, + SwapDir *SD = INDEXSD(e->swap_dirn); + debug(20, 4) ("storeUfsDirReplRemove: remove node %p from dir %d\n", e, SD->index); - SD->repl->Remove(SD->repl, p, &p->repl); + SD->repl->Remove(SD->repl, e, &e->repl); } @@ -1749,26 +1863,26 @@ * This is called by storeCleanup() if -S was given on the command line. */ static int -storeUfsCleanupDoubleCheck(SwapDir * sd, PayloadEntry * p) +storeUfsCleanupDoubleCheck(SwapDir * sd, StoreEntry * e) { struct stat sb; - if (stat(storeUfsDirFullPath(sd, p->swap_filen, NULL), &sb) < 0) { + if (stat(storeUfsDirFullPath(sd, e->swap_filen, NULL), &sb) < 0) { debug(20, 0) ("storeUfsCleanupDoubleCheck: MISSING SWAP FILE\n"); - debug(20, 0) ("storeUfsCleanupDoubleCheck: FILENO %08X\n", p->swap_filen); + debug(20, 0) ("storeUfsCleanupDoubleCheck: FILENO %08X\n", e->swap_filen); debug(20, 0) ("storeUfsCleanupDoubleCheck: PATH %s\n", - storeUfsDirFullPath(sd, p->swap_filen, NULL)); - payloadEntryDump(p, 0); + storeUfsDirFullPath(sd, e->swap_filen, NULL)); + storeEntryDump(e, 0); return -1; } - if (p->swap_file_sz != sb.st_size) { + if (e->swap_file_sz != sb.st_size) { debug(20, 0) ("storeUfsCleanupDoubleCheck: SIZE MISMATCH\n"); - debug(20, 0) ("storeUfsCleanupDoubleCheck: FILENO %08X\n", p->swap_filen); + debug(20, 0) ("storeUfsCleanupDoubleCheck: FILENO %08X\n", e->swap_filen); debug(20, 0) ("storeUfsCleanupDoubleCheck: PATH %s\n", - storeUfsDirFullPath(sd, p->swap_filen, NULL)); + storeUfsDirFullPath(sd, e->swap_filen, NULL)); debug(20, 0) ("storeUfsCleanupDoubleCheck: ENTRY SIZE: %d, FILE SIZE: %d\n", - p->swap_file_sz, (int) sb.st_size); - payloadEntryDump(p, 0); + e->swap_file_sz, (int) sb.st_size); + storeEntryDump(e, 0); return -1; } return 0; Index: squid/src/fs/ufs/store_io_ufs.c diff -u squid/src/fs/ufs/store_io_ufs.c:1.2.6.2.8.1 squid/src/fs/ufs/store_io_ufs.c:1.2.6.2 --- squid/src/fs/ufs/store_io_ufs.c:1.2.6.2.8.1 Wed Aug 14 03:15:38 2002 +++ squid/src/fs/ufs/store_io_ufs.c Mon Jan 15 14:49:22 2001 @@ -48,7 +48,7 @@ storeUfsOpen(SwapDir * SD, StoreEntry * e, STFNCB * file_callback, STIOCB * callback, void *callback_data) { - sfileno f = e->p->swap_filen; + sfileno f = e->swap_filen; char *path = storeUfsDirFullPath(SD, f, NULL); storeIOState *sio; struct stat sb; @@ -70,7 +70,7 @@ sio->callback = callback; sio->callback_data = callback_data; cbdataLock(callback_data); - sio->p = e->p; + sio->e = e; ((ufsstate_t *) (sio->fsstate))->fd = fd; ((ufsstate_t *) (sio->fsstate))->flags.writing = 0; ((ufsstate_t *) (sio->fsstate))->flags.reading = 0; @@ -118,7 +118,7 @@ sio->callback = callback; sio->callback_data = callback_data; cbdataLock(callback_data); - sio->p = (PayloadEntry *) e->p; + sio->e = (StoreEntry *) e; ((ufsstate_t *) (sio->fsstate))->fd = fd; ((ufsstate_t *) (sio->fsstate))->flags.writing = 0; ((ufsstate_t *) (sio->fsstate))->flags.reading = 0; @@ -126,7 +126,7 @@ store_open_disk_fd++; /* now insert into the replacement policy */ - storeUfsDirReplAdd(SD, e->p); + storeUfsDirReplAdd(SD, e); return sio; } @@ -184,10 +184,10 @@ void storeUfsUnlink(SwapDir * SD, StoreEntry * e) { - debug(79, 3) ("storeUfsUnlink: fileno %08X\n", e->p->swap_filen); - storeUfsDirReplRemove(e->p); - storeUfsDirMapBitReset(SD, e->p->swap_filen); - storeUfsDirUnlinkFile(SD, e->p->swap_filen); + debug(79, 3) ("storeUfsUnlink: fileno %08X\n", e->swap_filen); + storeUfsDirReplRemove(e); + storeUfsDirMapBitReset(SD, e->swap_filen); + storeUfsDirUnlinkFile(SD, e->swap_filen); } /* === STATIC =========================================================== */ Index: squid/src/fs/ufs/store_ufs.h diff -u squid/src/fs/ufs/store_ufs.h:1.2.126.1 squid/src/fs/ufs/store_ufs.h:1.2 --- squid/src/fs/ufs/store_ufs.h:1.2.126.1 Wed Aug 14 03:15:38 2002 +++ squid/src/fs/ufs/store_ufs.h Sat Oct 21 09:44:46 2000 @@ -34,8 +34,8 @@ extern int storeUfsDirMapBitAllocate(SwapDir *); extern char *storeUfsDirFullPath(SwapDir * SD, sfileno filn, char *fullpath); extern void storeUfsDirUnlinkFile(SwapDir *, sfileno); -extern void storeUfsDirReplAdd(SwapDir * SD, PayloadEntry *); -extern void storeUfsDirReplRemove(PayloadEntry *); +extern void storeUfsDirReplAdd(SwapDir * SD, StoreEntry *); +extern void storeUfsDirReplRemove(StoreEntry *); /* * Store IO stuff Index: squid/src/repl/heap/store_heap_replacement.c diff -u squid/src/repl/heap/store_heap_replacement.c:1.3.4.1.8.1 squid/src/repl/heap/store_heap_replacement.c:1.3.4.1 --- squid/src/repl/heap/store_heap_replacement.c:1.3.4.1.8.1 Wed Aug 14 03:15:38 2002 +++ squid/src/repl/heap/store_heap_replacement.c Mon Jan 15 14:49:22 2001 @@ -65,9 +65,9 @@ * turnarounds) */ heap_key -HeapKeyGen_PayloadEntry_LFUDA(void *entry, double age) +HeapKeyGen_StoreEntry_LFUDA(void *entry, double age) { - PayloadEntry *e = entry; + StoreEntry *e = entry; heap_key key; double tie; if (e->lastref <= 0) @@ -77,8 +77,11 @@ else tie = 1.0 - exp((double) (e->lastref - squid_curtime) / 86400.0); key = age + (double) e->refcount - tie; - debug(81, 3) ("HeapKeyGen_PayloadEntry_LFUDA: %s refcnt=%ld lastref=%ld age=%f tie=%f -> %f\n", + debug(81, 3) ("HeapKeyGen_StoreEntry_LFUDA: %s refcnt=%ld lastref=%ld age=%f tie=%f -> %f\n", storeKeyText(e->hash.key), e->refcount, e->lastref, age, tie, key); + if (e->mem_obj && e->mem_obj->url) + debug(81, 3) ("HeapKeyGen_StoreEntry_LFUDA: url=%s\n", + e->mem_obj->url); return (double) key; } @@ -103,15 +106,18 @@ * turnarounds) */ heap_key -HeapKeyGen_PayloadEntry_GDSF(void *entry, double age) +HeapKeyGen_StoreEntry_GDSF(void *entry, double age) { - PayloadEntry *e = entry; + StoreEntry *e = entry; heap_key key; double size = e->swap_file_sz ? (double) e->swap_file_sz : 1.0; double tie = (e->lastref > 1) ? (1.0 / e->lastref) : 1.0; key = age + ((double) e->refcount / size) - tie; - debug(81, 3) ("HeapKeyGen_PayloadEntry_GDSF: %s size=%f refcnt=%ld lastref=%ld age=%f tie=%f -> %f\n", + debug(81, 3) ("HeapKeyGen_StoreEntry_GDSF: %s size=%f refcnt=%ld lastref=%ld age=%f tie=%f -> %f\n", storeKeyText(e->hash.key), size, e->refcount, e->lastref, age, tie, key); + if (e->mem_obj && e->mem_obj->url) + debug(81, 3) ("HeapKeyGen_StoreEntry_GDSF: url=%s\n", + e->mem_obj->url); return key; } @@ -123,10 +129,13 @@ * heap-based replacement policies... */ heap_key -HeapKeyGen_PayloadEntry_LRU(void *entry, double age) +HeapKeyGen_StoreEntry_LRU(void *entry, double age) { - PayloadEntry *e = entry; - debug(81, 3) ("HeapKeyGen_PayloadEntry_LRU: %s age=%f lastref=%f\n", + StoreEntry *e = entry; + debug(81, 3) ("HeapKeyGen_StoreEntry_LRU: %s age=%f lastref=%f\n", storeKeyText(e->hash.key), age, (double) e->lastref); + if (e->mem_obj && e->mem_obj->url) + debug(81, 3) ("HeapKeyGen_StoreEntry_LRU: url=%s\n", + e->mem_obj->url); return (heap_key) e->lastref; } Index: squid/src/repl/heap/store_heap_replacement.h diff -u squid/src/repl/heap/store_heap_replacement.h:1.2.124.1 squid/src/repl/heap/store_heap_replacement.h:1.2 --- squid/src/repl/heap/store_heap_replacement.h:1.2.124.1 Wed Aug 14 03:15:38 2002 +++ squid/src/repl/heap/store_heap_replacement.h Sat Oct 21 09:44:46 2000 @@ -1,3 +1,3 @@ -extern heap_key HeapKeyGen_PayloadEntry_LFUDA(void *entry, double age); -extern heap_key HeapKeyGen_PayloadEntry_GDSF(void *entry, double age); -extern heap_key HeapKeyGen_PayloadEntry_LRU(void *entry, double age); +extern heap_key HeapKeyGen_StoreEntry_LFUDA(void *entry, double age); +extern heap_key HeapKeyGen_StoreEntry_GDSF(void *entry, double age); +extern heap_key HeapKeyGen_StoreEntry_LRU(void *entry, double age); Index: squid/src/repl/heap/store_repl_heap.c diff -u squid/src/repl/heap/store_repl_heap.c:1.3.4.1.8.1 squid/src/repl/heap/store_repl_heap.c:1.3.4.1 --- squid/src/repl/heap/store_repl_heap.c:1.3.4.1.8.1 Wed Aug 14 03:15:38 2002 +++ squid/src/repl/heap/store_repl_heap.c Mon Jan 15 14:49:22 2001 @@ -48,21 +48,48 @@ heap_key_func *keyfunc; int count; int nwalkers; + enum heap_entry_type { + TYPE_UNKNOWN = 0, TYPE_STORE_ENTRY, TYPE_STORE_MEM + } type; }; +/* Hack to avoid having to remember the RemovalPolicyNode location. + * Needed by the purge walker. + */ +static enum heap_entry_type +heap_guessType(StoreEntry * entry, RemovalPolicyNode * node) +{ + if (node == &entry->repl) + return TYPE_STORE_ENTRY; + if (entry->mem_obj && node == &entry->mem_obj->repl) + return TYPE_STORE_MEM; + fatal("Heap Replacement: Unknown StoreEntry node type"); + return TYPE_UNKNOWN; +} +#define SET_POLICY_NODE(entry,value) \ + switch(heap->type) { \ + case TYPE_STORE_ENTRY: entry->repl.data = value; break ; \ + case TYPE_STORE_MEM: entry->mem_obj->repl.data = value ; break ; \ + default: break; \ + } + static void -heap_add(RemovalPolicy * policy, PayloadEntry * entry, RemovalPolicyNode * node) +heap_add(RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node) { HeapPolicyData *heap = policy->_data; assert(!node->data); + if (EBIT_TEST(entry->flags, ENTRY_SPECIAL)) + return; /* We won't manage these.. they messes things up */ node->data = heap_insert(heap->heap, entry); heap->count += 1; + if (!heap->type) + heap->type = heap_guessType(entry, node); /* Add a little more variance to the aging factor */ heap->heap->age += heap->heap->age / 100000000; } static void -heap_remove(RemovalPolicy * policy, PayloadEntry * entry, +heap_remove(RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node) { HeapPolicyData *heap = policy->_data; @@ -75,14 +102,14 @@ } static void -heap_referenced(RemovalPolicy * policy, const PayloadEntry * entry, +heap_referenced(RemovalPolicy * policy, const StoreEntry * entry, RemovalPolicyNode * node) { HeapPolicyData *heap = policy->_data; heap_node *hnode = node->data; if (!hnode) return; - heap_update(heap->heap, hnode, (PayloadEntry *) entry); + heap_update(heap->heap, hnode, (StoreEntry *) entry); } /** RemovalPolicyWalker **/ @@ -92,16 +119,16 @@ int current; }; -const PayloadEntry * +const StoreEntry * heap_walkNext(RemovalPolicyWalker * walker) { HeapWalkData *heap_walk = walker->_data; RemovalPolicy *policy = walker->_policy; HeapPolicyData *heap = policy->_data; - PayloadEntry *entry; + StoreEntry *entry; if (heap_walk->current >= heap_nodes(heap->heap)) return NULL; /* done */ - entry = (PayloadEntry *) heap_peep(heap->heap, heap_walk->current++); + entry = (StoreEntry *) heap_peep(heap->heap, heap_walk->current++); return entry; } @@ -143,25 +170,25 @@ heap_key min_age; }; -static PayloadEntry * +static StoreEntry * heap_purgeNext(RemovalPurgeWalker * walker) { HeapPurgeData *heap_walker = walker->_data; RemovalPolicy *policy = walker->_policy; HeapPolicyData *heap = policy->_data; - PayloadEntry *entry; + StoreEntry *entry; heap_key age; try_again: if (!heap_nodes(heap->heap) > 0) return NULL; /* done */ age = heap_peepminkey(heap->heap); entry = heap_extractmin(heap->heap); - if (payloadEntryLocked(entry)) { + if (storeEntryLocked(entry)) { linklistPush(&heap_walker->locked_entries, entry); goto try_again; } heap_walker->min_age = age; - entry->repl.data = NULL; + SET_POLICY_NODE(entry, NULL); return entry; } @@ -171,7 +198,7 @@ HeapPurgeData *heap_walker = walker->_data; RemovalPolicy *policy = walker->_policy; HeapPolicyData *heap = policy->_data; - PayloadEntry *entry; + StoreEntry *entry; assert(strcmp(policy->_type, "heap") == 0); assert(heap->nwalkers > 0); heap->nwalkers -= 1; @@ -185,7 +212,7 @@ */ while ((entry = linklistShift(&heap_walker->locked_entries))) { heap_node *node = heap_insert(heap->heap, entry); - entry->repl.data = node; + SET_POLICY_NODE(entry, node); } safe_free(walker->_data); cbdataFree(walker); @@ -251,15 +278,15 @@ keytype = "LRU"; } if (!strcmp(keytype, "GDSF")) - heap_data->keyfunc = HeapKeyGen_PayloadEntry_GDSF; + heap_data->keyfunc = HeapKeyGen_StoreEntry_GDSF; else if (!strcmp(keytype, "LFUDA")) - heap_data->keyfunc = HeapKeyGen_PayloadEntry_LFUDA; + heap_data->keyfunc = HeapKeyGen_StoreEntry_LFUDA; else if (!strcmp(keytype, "LRU")) - heap_data->keyfunc = HeapKeyGen_PayloadEntry_LRU; + heap_data->keyfunc = HeapKeyGen_StoreEntry_LRU; else { debug(81, 0) ("createRemovalPolicy_heap: Unknown key type \"%s\". Using LRU\n", keytype); - heap_data->keyfunc = HeapKeyGen_PayloadEntry_LRU; + heap_data->keyfunc = HeapKeyGen_StoreEntry_LRU; } /* No additional arguments expected */ assert(!args); Index: squid/src/repl/lru/store_repl_lru.c diff -u squid/src/repl/lru/store_repl_lru.c:1.2.6.1.8.1 squid/src/repl/lru/store_repl_lru.c:1.2.6.1 --- squid/src/repl/lru/store_repl_lru.c:1.2.6.1.8.1 Wed Aug 14 03:15:39 2002 +++ squid/src/repl/lru/store_repl_lru.c Mon Jan 15 14:49:22 2001 @@ -52,13 +52,13 @@ * Needed by the purge walker to clear the policy information */ static enum heap_entry_type -repl_guessType(PayloadEntry * entry, RemovalPolicyNode * node) +repl_guessType(StoreEntry * entry, RemovalPolicyNode * node) { if (node == &entry->repl) return TYPE_STORE_ENTRY; if (entry->mem_obj && node == &entry->mem_obj->repl) return TYPE_STORE_MEM; - fatal("Heap Replacement: Unknown PayloadEntry node type"); + fatal("Heap Replacement: Unknown StoreEntry node type"); return TYPE_UNKNOWN; } #define SET_POLICY_NODE(entry,value) \ @@ -80,7 +80,7 @@ static int nr_lru_policies = 0; static void -lru_add(RemovalPolicy * policy, PayloadEntry * entry, RemovalPolicyNode * node) +lru_add(RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node) { LruPolicyData *lru = policy->_data; LruNode *lru_node; @@ -93,7 +93,7 @@ } static void -lru_remove(RemovalPolicy * policy, PayloadEntry * entry, RemovalPolicyNode * node) +lru_remove(RemovalPolicy * policy, StoreEntry * entry, RemovalPolicyNode * node) { LruPolicyData *lru = policy->_data; LruNode *lru_node = node->data; @@ -114,7 +114,7 @@ } static void -lru_referenced(RemovalPolicy * policy, const PayloadEntry * entry, +lru_referenced(RemovalPolicy * policy, const StoreEntry * entry, RemovalPolicyNode * node) { LruPolicyData *lru = policy->_data; @@ -132,7 +132,7 @@ LruNode *current; }; -const PayloadEntry * +const StoreEntry * lru_walkNext(RemovalPolicyWalker * walker) { LruWalkData *lru_walk = walker->_data; @@ -140,7 +140,7 @@ if (!lru_node) return NULL; lru_walk->current = (LruNode *) lru_node->node.next; - return (PayloadEntry *) lru_node->node.data; + return (StoreEntry *) lru_node->node.data; } static void @@ -181,14 +181,14 @@ LruNode *start; }; -static PayloadEntry * +static StoreEntry * lru_purgeNext(RemovalPurgeWalker * walker) { LruPurgeData *lru_walker = walker->_data; RemovalPolicy *policy = walker->_policy; LruPolicyData *lru = policy->_data; LruNode *lru_node; - PayloadEntry *entry; + StoreEntry *entry; try_again: lru_node = lru_walker->current; if (!lru_node || walker->scanned >= walker->max_scan) @@ -199,9 +199,9 @@ /* Last node found */ lru_walker->current = NULL; } - entry = (PayloadEntry *) lru_node->node.data; + entry = (StoreEntry *) lru_node->node.data; dlinkDelete(&lru_node->node, &lru->list); - if (payloadEntryLocked(entry)) { + if (storeEntryLocked(entry)) { /* Shit, it is locked. we can't return this one */ walker->locked++; dlinkAddTail(entry, &lru_node->node, &lru->list);