--------------------- PatchSet 10179 Date: 2007/11/30 07:21:11 Author: adri Branch: store_copy Tag: (none) Log: First pass of the storeClientCopy -> storeClientRef for the digest code - attack all the simple stuff The remainder actually uses storeClientCopy() to directly update the digest map; I'll have to write a memcpy() for that. Members: src/peer_digest.c:1.21->1.21.10.1 Index: squid/src/peer_digest.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/peer_digest.c,v retrieving revision 1.21 retrieving revision 1.21.10.1 diff -u -r1.21 -r1.21.10.1 --- squid/src/peer_digest.c 21 Jan 2007 14:03:56 -0000 1.21 +++ squid/src/peer_digest.c 30 Nov 2007 07:21:11 -0000 1.21.10.1 @@ -1,6 +1,6 @@ /* - * $Id: peer_digest.c,v 1.21 2007/01/21 14:03:56 squidadm Exp $ + * $Id: peer_digest.c,v 1.21.10.1 2007/11/30 07:21:11 adri Exp $ * * DEBUG: section 72 Peer Digest Routines * AUTHOR: Alex Rousskov @@ -46,14 +46,14 @@ static void peerDigestClean(PeerDigest *); static EVH peerDigestCheck; static void peerDigestRequest(PeerDigest * pd); -static STCB peerDigestFetchReply; -static STCB peerDigestSwapInHeaders; -static STCB peerDigestSwapInCBlock; +static STNCB peerDigestFetchReply; +static STNCB peerDigestSwapInHeaders; +static STNCB peerDigestSwapInCBlock; static STCB peerDigestSwapInMask; -static int peerDigestFetchedEnough(DigestFetchState * fetch, char *buf, ssize_t size, const char *step_name); -static void peerDigestFetchStop(DigestFetchState * fetch, char *buf, const char *reason); -static void peerDigestFetchAbort(DigestFetchState * fetch, char *buf, const char *reason); -static void peerDigestReqFinish(DigestFetchState * fetch, char *buf, int, int, int, const char *reason, int err); +static int peerDigestFetchedEnough(DigestFetchState * fetch, const char *buf, ssize_t size, const char *step_name); +static void peerDigestFetchStop(DigestFetchState * fetch, const char *buf, const char *reason); +static void peerDigestFetchAbort(DigestFetchState * fetch, const char *buf, const char *reason); +static void peerDigestReqFinish(DigestFetchState * fetch, const char *buf, int, int, int, const char *reason, int err); static void peerDigestPDFinish(DigestFetchState * fetch, int pcb_valid, int err); static void peerDigestFetchFinish(DigestFetchState * fetch, int err); static void peerDigestFetchSetStats(DigestFetchState * fetch); @@ -330,22 +330,23 @@ fwdStart(-1, e, req); cbdataLock(fetch); cbdataLock(fetch->pd); - storeClientCopy(fetch->sc, e, 0, 0, 4096, memAllocate(MEM_4K_BUF), - peerDigestFetchReply, fetch); + storeClientRef(fetch->sc, e, 0, 0, SM_PAGE_SIZE, peerDigestFetchReply, fetch); } /* wait for full http headers to be received then parse them */ static void -peerDigestFetchReply(void *data, char *buf, ssize_t size) +peerDigestFetchReply(void *data, mem_node_ref nr, ssize_t size) { + const char *buf = nr.node->data + nr.offset; DigestFetchState *fetch = data; PeerDigest *pd = fetch->pd; size_t hdr_size; assert(pd && buf); assert(!fetch->offset); + assert(size <= nr.node->len - nr.offset); if (peerDigestFetchedEnough(fetch, buf, size, "peerDigestFetchReply")) - return; + goto finish; if ((hdr_size = headersEnd(buf, size))) { http_status status; @@ -388,34 +389,38 @@ } else { /* some kind of a bug */ peerDigestFetchAbort(fetch, buf, httpStatusLineReason(&reply->sline)); - return; + goto finish; } /* must have a ready-to-use store entry if we got here */ /* can we stay with the old in-memory digest? */ if (status == HTTP_NOT_MODIFIED && fetch->pd->cd) peerDigestFetchStop(fetch, buf, "Not modified"); else - storeClientCopy(fetch->sc, fetch->entry, /* have to swap in */ - 0, 0, SM_PAGE_SIZE, buf, peerDigestSwapInHeaders, fetch); + storeClientRef(fetch->sc, fetch->entry, /* have to swap in */ + 0, 0, SM_PAGE_SIZE, peerDigestSwapInHeaders, fetch); } else { /* need more data, do we have space? */ if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "reply header too big"); else - storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, - peerDigestFetchReply, fetch); + storeClientRef(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, peerDigestFetchReply, fetch); } +finish: + stmemNodeUnref(&nr); } /* fetch headers from disk, pass on to SwapInCBlock */ static void -peerDigestSwapInHeaders(void *data, char *buf, ssize_t size) +peerDigestSwapInHeaders(void *data, mem_node_ref nr, ssize_t size) { + + const char *buf = nr.node->data + nr.offset; DigestFetchState *fetch = data; size_t hdr_size; + assert(size <= nr.node->len - nr.offset); if (peerDigestFetchedEnough(fetch, buf, size, "peerDigestSwapInHeaders")) - return; + goto finish; assert(!fetch->offset); if ((hdr_size = headersEnd(buf, size))) { @@ -426,29 +431,32 @@ debug(72, 1) ("peerDigestSwapInHeaders: %s status %d got cached!\n", strBuf(fetch->pd->host), fetch->entry->mem_obj->reply->sline.status); peerDigestFetchAbort(fetch, buf, "internal status error"); - return; + goto finish; } fetch->offset += hdr_size; - storeClientCopy(fetch->sc, fetch->entry, size, fetch->offset, - SM_PAGE_SIZE, buf, - peerDigestSwapInCBlock, fetch); + storeClientRef(fetch->sc, fetch->entry, size, fetch->offset, + SM_PAGE_SIZE, peerDigestSwapInCBlock, fetch); } else { /* need more data, do we have space? */ if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "stored header too big"); else - storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, + storeClientRef(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, peerDigestSwapInHeaders, fetch); } +finish: + stmemNodeUnref(&nr); } static void -peerDigestSwapInCBlock(void *data, char *buf, ssize_t size) +peerDigestSwapInCBlock(void *data, mem_node_ref nr, ssize_t size) { + const char *buf = nr.node->data + nr.offset; DigestFetchState *fetch = data; + assert(size <= nr.node->len - nr.offset); if (peerDigestFetchedEnough(fetch, buf, size, "peerDigestSwapInCBlock")) - return; + goto finish; if (size >= StoreDigestCBlockSize) { PeerDigest *pd = fetch->pd; @@ -460,8 +468,6 @@ /* XXX: soon we will have variable header size */ fetch->offset += StoreDigestCBlockSize; /* switch to CD buffer and fetch digest guts */ - memFree(buf, MEM_4K_BUF); - buf = NULL; assert(pd->cd->mask); storeClientCopy(fetch->sc, fetch->entry, seen, @@ -477,9 +483,11 @@ if (size >= SM_PAGE_SIZE) peerDigestFetchAbort(fetch, buf, "digest cblock too big"); else - storeClientCopy(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, buf, + storeClientRef(fetch->sc, fetch->entry, size, 0, SM_PAGE_SIZE, peerDigestSwapInCBlock, fetch); } +finish: + stmemNodeUnref(&nr); } static void @@ -515,7 +523,7 @@ } static int -peerDigestFetchedEnough(DigestFetchState * fetch, char *buf, ssize_t size, const char *step_name) +peerDigestFetchedEnough(DigestFetchState * fetch, const char *buf, ssize_t size, const char *step_name) { PeerDigest *pd = NULL; const char *host = ""; /* peer host */ @@ -582,7 +590,7 @@ /* call this when all callback data is valid and fetch must be stopped but * no error has occurred (e.g. we received 304 reply and reuse old digest) */ static void -peerDigestFetchStop(DigestFetchState * fetch, char *buf, const char *reason) +peerDigestFetchStop(DigestFetchState * fetch, const char *buf, const char *reason) { assert(reason); debug(72, 2) ("peerDigestFetchStop: peer %s, reason: %s\n", @@ -592,7 +600,7 @@ /* call this when all callback data is valid but something bad happened */ static void -peerDigestFetchAbort(DigestFetchState * fetch, char *buf, const char *reason) +peerDigestFetchAbort(DigestFetchState * fetch, const char *buf, const char *reason) { assert(reason); debug(72, 2) ("peerDigestFetchAbort: peer %s, reason: %s\n", @@ -602,7 +610,7 @@ /* complete the digest transfer, update stats, unlock/release everything */ static void -peerDigestReqFinish(DigestFetchState * fetch, char *buf, +peerDigestReqFinish(DigestFetchState * fetch, const char *buf, int fcb_valid, int pdcb_valid, int pcb_valid, const char *reason, int err) { @@ -631,8 +639,6 @@ peerDigestPDFinish(fetch, pcb_valid, err); if (fcb_valid) peerDigestFetchFinish(fetch, err); - if (buf) - memFree(buf, MEM_4K_BUF); }