From: wessels <> Date: Fri, 14 Aug 1998 15:22:31 +0000 (+0000) Subject: Luyers finished delay pools patch X-Git-Tag: SQUID_3_0_PRE1~2903 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=447e176bc0560af9b837d744877f154af7fe92c9;p=thirdparty%2Fsquid.git Luyers finished delay pools patch --- diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc index a6df6593e9..35bbaafa67 100644 --- a/src/HttpRequest.cc +++ b/src/HttpRequest.cc @@ -1,6 +1,6 @@ /* - * $Id: HttpRequest.cc,v 1.17 1998/08/13 20:53:54 wessels Exp $ + * $Id: HttpRequest.cc,v 1.18 1998/08/14 09:22:31 wessels Exp $ * * DEBUG: section 73 HTTP Request * AUTHOR: Duane Wessels @@ -46,7 +46,7 @@ requestCreate(method_t method, protocol_t protocol, const char *urlpath) req->max_age = -1; req->max_forwards = -1; #if DELAY_POOLS - req->delay.class = 0; + req->delay_id = 0; #endif httpHeaderInit(&req->header, hoRequest); return req; diff --git a/src/client_side.cc b/src/client_side.cc index ff088df093..9cf4a436f9 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side.cc,v 1.375 1998/08/05 06:04:59 wessels Exp $ + * $Id: client_side.cc,v 1.376 1998/08/14 09:22:32 wessels Exp $ * * DEBUG: section 33 Client-side Routines * AUTHOR: Duane Wessels @@ -154,6 +154,9 @@ clientCreateStoreEntry(clientHttpRequest * h, method_t m, int flags) h->request = requestLink(requestCreate(m, PROTO_NONE, NULL)); e = storeCreateEntry(h->uri, h->log_uri, flags, m); storeClientListAdd(e, h); +#if DELAY_POOLS + delaySetStoreClient(e, h, h->request->delay_id); +#endif storeClientCopy(e, 0, 0, 4096, memAllocate(MEM_4K_BUF), clientSendMoreData, h); return e; } @@ -256,6 +259,10 @@ clientProcessExpired(void *data) /* NOTE, don't call storeLockObject(), storeCreateEntry() does it */ storeClientListAdd(entry, http); storeClientListAdd(http->old_entry, http); +#if DELAY_POOLS + delaySetStoreClient(entry, http, http->request->delay_id); + delaySetStoreClient(http->old_entry, http, http->request->delay_id); +#endif entry->lastmod = http->old_entry->lastmod; debug(33, 5) ("clientProcessExpired: lastmod %d\n", (int) entry->lastmod); entry->refcount++; /* EXPIRED CASE */ @@ -330,6 +337,9 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) storeUnlockObject(entry); entry = http->entry = http->old_entry; entry->refcount++; +#if DELAY_POOLS + http->request->delay_id = 0; +#endif } else if (STORE_PENDING == entry->store_status && 0 == status) { debug(33, 3) ("clientHandleIMSReply: Incomplete headers for '%s'\n", url); if (size >= 4096) { @@ -341,6 +351,9 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) storeUnlockObject(entry); entry = http->entry = http->old_entry; entry->refcount++; +#if DELAY_POOLS + http->request->delay_id = 0; +#endif /* continue */ } else { storeClientCopy(entry, @@ -376,6 +389,9 @@ clientHandleIMSReply(void *data, char *buf, ssize_t size) requestUnlink(entry->mem_obj->request); entry->mem_obj->request = NULL; } +#if DELAY_POOLS + http->request->delay_id = 0; +#endif } else { /* the client can handle this reply, whatever it is */ http->log_type = LOG_TCP_REFRESH_MISS; @@ -725,7 +741,8 @@ clientInterpretRequestHeaders(clientHttpRequest * http) #if DELAY_POOLS if (delayClient(http)) { debug(33, 5) ("clientInterpretRequestHeaders: delay request class %d position %d\n", - request->delay.class, request->delay.position); + request->delay_id >> 16, + request->delay_id & 0xFFFF); } #endif debug(33, 5) ("clientInterpretRequestHeaders: REQ_NOCACHE = %s\n", @@ -1120,6 +1137,9 @@ clientCacheHit(void *data, char *buf, ssize_t size) assert(http->log_type == LOG_TCP_HIT); if (checkNegativeHit(e)) { http->log_type = LOG_TCP_NEGATIVE_HIT; +#if DELAY_POOLS + http->request->delay_id = 0; +#endif clientSendMoreData(data, buf, size); } else if (refreshCheck(e, r, 0) && !http->flags.internal) { /* @@ -1171,6 +1191,9 @@ clientCacheHit(void *data, char *buf, ssize_t size) */ if (e->mem_status == IN_MEMORY) http->log_type = LOG_TCP_MEM_HIT; +#if DELAY_POOLS + http->request->delay_id = 0; +#endif clientSendMoreData(data, buf, size); } } @@ -1642,6 +1665,9 @@ clientProcessRequest(clientHttpRequest * http) storeLockObject(http->entry); storeCreateMemObject(http->entry, http->uri, http->log_uri); storeClientListAdd(http->entry, http); +#if DELAY_POOLS + delaySetStoreClient(http->entry, http, http->request->delay_id); +#endif http->entry->refcount++; storeClientCopy(http->entry, http->out.offset, diff --git a/src/comm_select.cc b/src/comm_select.cc index 65a617d69c..db2d91e1e1 100644 --- a/src/comm_select.cc +++ b/src/comm_select.cc @@ -1,7 +1,7 @@ /* - * $Id: comm_select.cc,v 1.4 1998/07/31 00:15:39 wessels Exp $ + * $Id: comm_select.cc,v 1.5 1998/08/14 09:22:33 wessels Exp $ * * DEBUG: section 5 Socket Functions * @@ -278,7 +278,7 @@ comm_poll(int msec) comm_poll_http_incoming(); #if DELAY_POOLS if (squid_curtime > delay_pools_last_update) { - delayPoolsUpdate(delay_pools_last_update - squid_curtime); + delayPoolsUpdate(squid_curtime - delay_pools_last_update); delay_pools_last_update = squid_curtime; } #endif @@ -537,7 +537,7 @@ comm_select(int msec) comm_select_http_incoming(); #if DELAY_POOLS if (squid_curtime > delay_pools_last_update) { - delayPoolsUpdate(delay_pools_last_update - squid_curtime); + delayPoolsUpdate(squid_curtime - delay_pools_last_update); delay_pools_last_update = squid_curtime; } #endif diff --git a/src/delay_pools.cc b/src/delay_pools.cc index f6128fb0f5..eb3abd1a6a 100644 --- a/src/delay_pools.cc +++ b/src/delay_pools.cc @@ -1,6 +1,6 @@ /* - * $Id: delay_pools.cc,v 1.1 1998/07/31 00:15:40 wessels Exp $ + * $Id: delay_pools.cc,v 1.2 1998/08/14 09:22:34 wessels Exp $ * * DEBUG: section 77 Delay Pools * AUTHOR: David Luyer @@ -38,6 +38,7 @@ #if DELAY_POOLS #include "squid.h" + struct _delayData { int class1_aggregate; int class2_aggregate; @@ -58,6 +59,14 @@ struct _delayData { static struct _delayData delay_data; static OBJH delayPoolStats; +static delay_id delayId(unsigned char class, int position); + +static delay_id +delayId(unsigned char class, int position) +{ + assert(class <= 3); + return (class << 16) | (position & 0xFFFF); +} int delayClient(clientHttpRequest * http) @@ -66,20 +75,25 @@ delayClient(clientHttpRequest * http) int i, j; unsigned int host; unsigned char net; + unsigned char class = 0; + int position = 0; + request_t *r = http->request; memset(&ch, '\0', sizeof(ch)); ch.src_addr = http->conn->peer.sin_addr; - ch.request = http->request; + ch.request = r; if (aclCheckFast(Config.Delay.class1.access, &ch)) { - http->request->delay.class = 1; + class = 1; + r->delay_id = delayId(class, position); return 1; } if (aclCheckFast(Config.Delay.class2.access, &ch)) { - http->request->delay.class = 2; + class = 2; host = ntohl(ch.src_addr.s_addr) & 0xff; if (host == 255 || !host) { debug(77, 0) ("ARGH: Delay requested for host %s\n", inet_ntoa(ch.src_addr)); - http->request->delay.class = 0; + class = 0; + r->delay_id = delayId(class, position); return 0; } for (i = 0;; i++) { @@ -92,17 +106,19 @@ delayClient(clientHttpRequest * http) break; } } - http->request->delay.position = i; + position = i; + r->delay_id = delayId(class, position); return 1; } if (aclCheckFast(Config.Delay.class3.access, &ch)) { - http->request->delay.class = 3; + class = 3; host = ntohl(ch.src_addr.s_addr) & 0xffff; net = host >> 8; host &= 0xff; if (host == 255 || !host || net == 255) { debug(77, 0) ("ARGH: Delay requested for host %s\n", inet_ntoa(ch.src_addr)); - http->request->delay.class = 0; + class = 0; + r->delay_id = delayId(class, position); return 0; } for (i = 0;; i++) { @@ -110,28 +126,31 @@ delayClient(clientHttpRequest * http) break; if (delay_data.class3_network_map[i] == 255) { delay_data.class3_network_map[i] = net; + delay_data.class3_individual_map[i][0] = 255; delay_data.class3_network_map[i + 1] = 255; delay_data.class3_network[i] = Config.Delay.class3.network.restore_bps; break; } } - http->request->delay.position = i << 8; + position = i << 8; for (j = 0;; j++) { if (delay_data.class3_individual_map[i][j] == host) { - http->request->delay.position |= j; + position |= j; break; } if (delay_data.class3_individual_map[i][j] == 255) { delay_data.class3_individual_map[i][j] = host; delay_data.class3_individual_map[i][j + 1] = 255; - delay_data.class3_individual[http->request->delay.position |= j] = + delay_data.class3_individual[position |= j] = Config.Delay.class3.individual.restore_bps; break; } } + r->delay_id = delayId(class, position); return 1; } - http->request->delay.class = 0; + class = 0; + r->delay_id = delayId(class, position); return 0; } @@ -202,61 +221,104 @@ delayPoolsUpdate(int incr) } } + static void delayPoolStats(StoreEntry * sentry) { int i; int j; storeAppendPrintf(sentry, "Class 1 Delay Pool Statistics:\n"); - storeAppendPrintf(sentry, "\n\tAggregate:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class1.aggregate.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class1.aggregate.restore_bps); - storeAppendPrintf(sentry, "\t\tCurrent: %d\n", delay_data.class1_aggregate); + if (Config.Delay.class1.aggregate.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\tAggregate:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class1.aggregate.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class1.aggregate.restore_bps); + storeAppendPrintf(sentry, "\t\tCurrent: %d\n", + delay_data.class1_aggregate); + } else { + storeAppendPrintf(sentry, "\n\tAggregate:\n\tDisabled.\n"); + } storeAppendPrintf(sentry, "\nClass 2 Delay Pool Statistics:\n"); - storeAppendPrintf(sentry, "\n\tAggregate:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class2.aggregate.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class2.aggregate.restore_bps); - storeAppendPrintf(sentry, "\t\tCurrent: %d\n", delay_data.class2_aggregate); - storeAppendPrintf(sentry, "\n\tIndividual:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class2.individual.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class2.individual.restore_bps); - storeAppendPrintf(sentry, "\t\tCurrent: "); - for (i = 0;; i++) { - if (delay_data.class2_individual_map[i] == 255) - break; - storeAppendPrintf(sentry, "%d:%d ", delay_data.class2_individual_map[i], - delay_data.class2_individual[i]); + if (Config.Delay.class2.aggregate.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\tAggregate:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class2.aggregate.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class2.aggregate.restore_bps); + storeAppendPrintf(sentry, "\t\tCurrent: %d\n", + delay_data.class2_aggregate); + } else { + storeAppendPrintf(sentry, "\n\tAggregate:\n\tDisabled.\n"); + } + if (Config.Delay.class2.individual.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\tIndividual:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class2.individual.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class2.individual.restore_bps); + storeAppendPrintf(sentry, "\t\tCurrent: "); + for (i = 0;; i++) { + if (delay_data.class2_individual_map[i] == 255) + break; + storeAppendPrintf(sentry, "%d:%d ", + delay_data.class2_individual_map[i], + delay_data.class2_individual[i]); + } + } else { + storeAppendPrintf(sentry, "\n\tIndividual:\n\tDisabled."); } storeAppendPrintf(sentry, "\n\nClass 3 Delay Pool Statistics:\n"); - storeAppendPrintf(sentry, "\n\tAggregate:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class3.aggregate.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class3.aggregate.restore_bps); - storeAppendPrintf(sentry, "\t\tCurrent: %d\n", delay_data.class3_aggregate); - storeAppendPrintf(sentry, "\n\tNetwork:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class3.network.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class3.network.restore_bps); - storeAppendPrintf(sentry, "\t\tCurrent: "); - for (i = 0;; i++) { - if (delay_data.class3_network_map[i] == 255) - break; - storeAppendPrintf(sentry, "%d:%d ", delay_data.class3_network_map[i], - delay_data.class3_network[i]); + if (Config.Delay.class3.aggregate.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\tAggregate:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class3.aggregate.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class3.aggregate.restore_bps); + storeAppendPrintf(sentry, "\t\tCurrent: %d\n", + delay_data.class3_aggregate); + } else { + storeAppendPrintf(sentry, "\n\tAggregate:\n\tDisabled.\n"); } - storeAppendPrintf(sentry, "\n\n\tIndividual:\n"); - storeAppendPrintf(sentry, "\t\tMax: %d\n", Config.Delay.class3.individual.max_bytes); - storeAppendPrintf(sentry, "\t\tRate: %d\n", Config.Delay.class3.individual.restore_bps); - for (i = 0;; i++) { - if (delay_data.class3_network_map[i] == 255) - break; - storeAppendPrintf(sentry, "\t\tCurrent [Network %d]: ", - delay_data.class3_network_map[i]); - for (j = 0;; j++) { - if (delay_data.class3_individual_map[i][j] == 255) + if (Config.Delay.class3.network.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\tNetwork:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class3.network.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class3.network.restore_bps); + storeAppendPrintf(sentry, "\t\tCurrent: "); + for (i = 0;; i++) { + if (delay_data.class3_network_map[i] == 255) break; - storeAppendPrintf(sentry, "%d:%d ", delay_data.class3_individual_map[i][j], - delay_data.class3_individual[(i << 8) + j]); + storeAppendPrintf(sentry, "%d:%d ", + delay_data.class3_network_map[i], + delay_data.class3_network[i]); } - storeAppendPrintf(sentry, "\n"); + } else { + storeAppendPrintf(sentry, "\n\tNetwork:\n\tDisabled."); + } + if (Config.Delay.class3.individual.restore_bps != -1) { + storeAppendPrintf(sentry, "\n\n\tIndividual:\n"); + storeAppendPrintf(sentry, "\t\tMax: %d\n", + Config.Delay.class3.individual.max_bytes); + storeAppendPrintf(sentry, "\t\tRate: %d\n", + Config.Delay.class3.individual.restore_bps); + for (i = 0;; i++) { + if (delay_data.class3_network_map[i] == 255) + break; + storeAppendPrintf(sentry, "\t\tCurrent [Network %d]: ", + delay_data.class3_network_map[i]); + for (j = 0;; j++) { + if (delay_data.class3_individual_map[i][j] == 255) + break; + storeAppendPrintf(sentry, "%d:%d ", + delay_data.class3_individual_map[i][j], + delay_data.class3_individual[(i << 8) + j]); + } + storeAppendPrintf(sentry, "\n"); + } + } else { + storeAppendPrintf(sentry, "\n\n\tIndividual:\n\tDisabled.\n"); } storeAppendPrintf(sentry, "\n"); } @@ -273,4 +335,122 @@ delayPoolsInit(void) cachemgrRegister("delay", "Delay Pool Levels", delayPoolStats, 0, 1); } +/* + * this returns the number of bytes the client is permitted. it does not take + * into account bytes already buffered - that is up to the caller. + */ +int +delayBytesWanted(delay_id d, int max) +{ + int position = d & 0xFFFF; + unsigned char class = (d & 0xFF0000) >> 16; + int nbytes = max; + switch (class) { + case 0: + break; + + case 1: + if (Config.Delay.class1.aggregate.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class1_aggregate); + break; + + case 2: + if (Config.Delay.class2.aggregate.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class2_aggregate); + if (Config.Delay.class2.individual.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class2_individual[position]); + break; + + case 3: + if (Config.Delay.class3.aggregate.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class3_aggregate); + if (Config.Delay.class3.individual.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class3_individual[position]); + if (Config.Delay.class3.network.restore_bps != -1) + nbytes = XMIN(nbytes, delay_data.class3_network[position >> 8]); + break; + + default: + fatalf("delayBytesWanted: Invalid class %d\n", class); + break; + } + assert(nbytes > 0); + assert(nbytes <= max); + return nbytes; +} + +/* + * this records actual bytes recieved. always recorded, even if the + * class is disabled - see above for all the cases which would be needed + * to efficiently not record it, so it's just ignored if not wanted. + */ +void +delayBytesIn(delay_id d, int qty) +{ + int position = d & 0xFFFF; + unsigned char class = (d & 0xFF0000) >> 16; + if (class == 0) + return; + if (class == 1) { + delay_data.class1_aggregate -= qty; + return; + } + if (class == 2) { + delay_data.class2_aggregate -= qty; + delay_data.class3_individual[position] -= qty; + return; + } + if (class == 3) { + delay_data.class3_aggregate -= qty; + delay_data.class3_network[position >> 8] -= qty; + delay_data.class3_individual[position] -= qty; + return; + } + assert(0); +} + +int +delayMostBytesWanted(const MemObject * mem, int max) +{ + int i = 0; + store_client *sc; + for (sc = mem->clients; sc; sc = sc->next) { + if (sc->callback_data == NULL) /* open slot */ + continue; + if (sc->type != STORE_MEM_CLIENT) + continue; + i = XMAX(delayBytesWanted(sc->delay_id, max), i); + } + return i; +} + +delay_id +delayMostBytesAllowed(const MemObject * mem) +{ + int j; + int jmax = 0; + store_client *sc; + delay_id d = 0; + for (sc = mem->clients; sc; sc = sc->next) { + if (sc->callback_data == NULL) /* open slot */ + continue; + if (sc->type != STORE_MEM_CLIENT) + continue; + j = delayBytesWanted(sc->delay_id, SQUID_TCP_SO_RCVBUF); + if (j > jmax) { + jmax = j; + d = sc->delay_id; + } + } + return d; +} + +void +delaySetStoreClient(StoreEntry * e, void *data, delay_id delay_id) +{ + store_client *sc = storeClientListSearch(e->mem_obj, data); + assert(sc != NULL); + sc->delay_id = delay_id; +} + #endif diff --git a/src/forward.cc b/src/forward.cc index dbbcb7dbb2..279984ed8a 100644 --- a/src/forward.cc +++ b/src/forward.cc @@ -1,6 +1,6 @@ /* - * $Id: forward.cc,v 1.22 1998/08/13 18:26:17 wessels Exp $ + * $Id: forward.cc,v 1.23 1998/08/14 09:22:34 wessels Exp $ * * DEBUG: section 17 Request Forwarding * AUTHOR: Duane Wessels @@ -393,6 +393,10 @@ fwdCheckDeferRead(int fdnotused, void *data) MemObject *mem = e->mem_obj; if (mem == NULL) return 0; +#if DELAY_POOLS + if (delayMostBytesWanted(mem, 1) == 0) + return 1; +#endif if (mem->inmem_hi - storeLowestMemReaderOffset(e) < READ_AHEAD_GAP) return 0; return 1; diff --git a/src/ftp.cc b/src/ftp.cc index 94258fcd7e..7f24547f9d 100644 --- a/src/ftp.cc +++ b/src/ftp.cc @@ -1,6 +1,6 @@ /* - * $Id: ftp.cc,v 1.242 1998/07/23 23:52:35 wessels Exp $ + * $Id: ftp.cc,v 1.243 1998/08/14 09:22:35 wessels Exp $ * * DEBUG: section 9 File Transfer Protocol (FTP) * AUTHOR: Harvest Derived @@ -793,6 +793,10 @@ ftpDataRead(int fd, void *data) int bin; StoreEntry *entry = ftpState->entry; MemObject *mem = entry->mem_obj; + size_t read_sz; +#if DELAY_POOLS + delay_id delay_id = delayMostBytesAllowed(mem); +#endif assert(fd == ftpState->data.fd); if (fwdAbortFetch(entry)) { storeAbort(entry, 0); @@ -800,13 +804,18 @@ ftpDataRead(int fd, void *data) return; } errno = 0; - memset(ftpState->data.buf + ftpState->data.offset, '\0', - ftpState->data.size - ftpState->data.offset); - len = read(fd, - ftpState->data.buf + ftpState->data.offset, - ftpState->data.size - ftpState->data.offset); + read_sz = ftpState->data.size - ftpState->data.offset; +#if DELAY_POOLS + read_sz = delayBytesWanted(delay_id, read_sz); + assert(read_sz > 0); +#endif + memset(ftpState->data.buf + ftpState->data.offset, '\0', read_sz); + len = read(fd, ftpState->data.buf + ftpState->data.offset, read_sz); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.ftp.kbytes_in, len); ftpState->data.offset += len; diff --git a/src/gopher.cc b/src/gopher.cc index 987965dbfa..2885e7ef6a 100644 --- a/src/gopher.cc +++ b/src/gopher.cc @@ -1,7 +1,7 @@ /* - * $Id: gopher.cc,v 1.134 1998/07/30 22:29:35 wessels Exp $ + * $Id: gopher.cc,v 1.135 1998/08/14 09:22:36 wessels Exp $ * * DEBUG: section 10 Gopher * AUTHOR: Harvest Derived @@ -64,7 +64,7 @@ #define GOPHER_PORT 70 #define TAB '\t' -#define TEMP_BUF_SIZE SM_PAGE_SIZE +#define TEMP_BUF_SIZE 4096 #define MAX_CSO_RESULT 1024 typedef struct gopher_ds { @@ -596,18 +596,29 @@ gopherReadReply(int fd, void *data) int len; int clen; int bin; + size_t read_sz; +#if DELAY_POOLS + delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); +#endif if (fwdAbortFetch(entry)) { storeAbort(entry, 0); comm_close(fd); return; } - /* check if we want to defer reading */ - buf = memAllocate(MEM_4K_BUF); errno = 0; + buf = memAllocate(MEM_4K_BUF); + read_sz = 4096 - 1; /* leave room for termination */ +#if DELAY_POOLS + read_sz = delayBytesWanted(delay_id, read_sz); + assert(read_sz > 0); +#endif /* leave one space for \0 in gopherToHTML */ - len = read(fd, buf, TEMP_BUF_SIZE - 1); + len = read(fd, buf, read_sz); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.other.kbytes_in, len); } diff --git a/src/http.cc b/src/http.cc index a3a3875e75..7554a7fc70 100644 --- a/src/http.cc +++ b/src/http.cc @@ -1,6 +1,6 @@ /* - * $Id: http.cc,v 1.304 1998/08/12 22:32:57 wessels Exp $ + * $Id: http.cc,v 1.305 1998/08/14 09:22:37 wessels Exp $ * * DEBUG: section 11 Hypertext Transfer Protocol (HTTP) * AUTHOR: Harvest Derived @@ -360,6 +360,10 @@ httpReadReply(int fd, void *data) int len; int bin; int clen; + size_t read_sz; +#if DELAY_POOLS + delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); +#endif if (fwdAbortFetch(entry)) { storeAbort(entry, 0); comm_close(fd); @@ -367,10 +371,18 @@ httpReadReply(int fd, void *data) } /* check if we want to defer reading */ errno = 0; - len = read(fd, buf, SQUID_TCP_SO_RCVBUF); + read_sz = SQUID_TCP_SO_RCVBUF; +#if DELAY_POOLS + read_sz = delayBytesWanted(delay_id, read_sz); + assert(read_sz > 0); +#endif + len = read(fd, buf, read_sz); debug(11, 5) ("httpReadReply: FD %d: len %d.\n", fd, len); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.http.kbytes_in, len); commSetTimeout(fd, Config.Timeout.read, NULL, NULL); @@ -723,10 +735,9 @@ httpStart(FwdState * fwdState, int fd) storeReleaseRequest(httpState->entry); #if DELAY_POOLS if (EBIT_TEST(httpState->peer->options, NEIGHBOR_NO_DELAY)) { - proxy_req->delay.class = 0; + proxy_req->delay_id = 0; } else { - proxy_req->delay.class = orig_req->delay.class; - proxy_req->delay.position = orig_req->delay.position; + proxy_req->delay_id = orig_req->delay_id; } #endif } else { diff --git a/src/protos.h b/src/protos.h index bf52e3b80a..d463807aa7 100644 --- a/src/protos.h +++ b/src/protos.h @@ -1,6 +1,6 @@ /* - * $Id: protos.h,v 1.245 1998/08/11 20:07:04 wessels Exp $ + * $Id: protos.h,v 1.246 1998/08/14 09:22:38 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -1061,7 +1061,12 @@ extern peer *carpSelectParent(request_t *); #if DELAY_POOLS extern int delayClient(clientHttpRequest *); extern void delayPoolsInit(void); -void delayPoolsUpdate(int); +extern void delayPoolsUpdate(int); +extern int delayMostBytesWanted(const MemObject * mem, int max); +extern int delayMostBytesAllowed(const MemObject * mem); +extern void delayBytesIn(delay_id, int qty); +extern void delaySetStoreClient(StoreEntry * e, void *data, delay_id delay_id); +extern int delayBytesWanted(delay_id d, int max); #endif /* diff --git a/src/ssl.cc b/src/ssl.cc index 2bc618bbfc..71271f8e18 100644 --- a/src/ssl.cc +++ b/src/ssl.cc @@ -1,6 +1,6 @@ /* - * $Id: ssl.cc,v 1.85 1998/07/22 20:37:51 wessels Exp $ + * $Id: ssl.cc,v 1.86 1998/08/14 09:22:40 wessels Exp $ * * DEBUG: section 26 Secure Sockets Layer Proxy * AUTHOR: Duane Wessels @@ -66,6 +66,9 @@ static void sslStateFree(SslStateData * sslState); static void sslConnected(int fd, void *); static void sslProxyConnected(int fd, void *); static void sslSetSelect(SslStateData * sslState); +#if DELAY_POOLS +static DEFER sslDeferServerRead; +#endif static void sslServerClosed(int fd, void *data) @@ -105,9 +108,19 @@ sslStateFree(SslStateData * sslState) cbdataFree(sslState); } +#if DELAY_POOLS +static int +sslDeferServerRead(int fdnotused, void *data) +{ + request_t *r = data; + return delayBytesWanted(r->delay_id, 1) == 0; +} +#endif + static void sslSetSelect(SslStateData * sslState) { + size_t read_sz = SQUID_TCP_SO_RCVBUF; assert(sslState->server.fd > -1 || sslState->client.fd > -1); if (sslState->client.fd > -1) { if (sslState->server.len > 0) { @@ -117,7 +130,7 @@ sslSetSelect(SslStateData * sslState) sslState, 0); } - if (sslState->client.len < SQUID_TCP_SO_RCVBUF) { + if (sslState->client.len < read_sz) { commSetSelect(sslState->client.fd, COMM_SELECT_READ, sslReadClient, @@ -135,7 +148,11 @@ sslSetSelect(SslStateData * sslState) sslState, 0); } - if (sslState->server.len < SQUID_TCP_SO_RCVBUF) { +#if DELAY_POOLS + read_sz = delayBytesWanted(sslState->request->delay_id, read_sz); + assert(read_sz > 0); +#endif + if (sslState->server.len < read_sz) { /* Have room to read more */ commSetSelect(sslState->server.fd, COMM_SELECT_READ, @@ -156,16 +173,22 @@ sslReadServer(int fd, void *data) { SslStateData *sslState = data; int len; + size_t read_sz = SQUID_TCP_SO_RCVBUF - sslState->server.len; assert(fd == sslState->server.fd); debug(26, 3) ("sslReadServer: FD %d, reading %d bytes at offset %d\n", - fd, SQUID_TCP_SO_RCVBUF - sslState->server.len, - sslState->server.len); - len = read(fd, - sslState->server.buf + sslState->server.len, - SQUID_TCP_SO_RCVBUF - sslState->server.len); + fd, read_sz, sslState->server.len); + errno = 0; +#if DELAY_POOLS + read_sz = delayBytesWanted(sslState->request->delay_id, read_sz); + assert(read_sz > 0); +#endif + len = read(fd, sslState->server.buf + sslState->server.len, read_sz); debug(26, 3) ("sslReadServer: FD %d, read %d bytes\n", fd, len); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(sslState->request->delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.other.kbytes_in, len); sslState->server.len += len; @@ -360,6 +383,9 @@ sslConnectDone(int fdnotused, int status, void *data) Config.Timeout.read, sslTimeout, sslState); +#if DELAY_POOLS + commSetDefer(sslState->server.fd, sslDeferServerRead, sslState->request); +#endif } } diff --git a/src/structs.h b/src/structs.h index 41aa246c28..defff3eb37 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.195 1998/08/11 05:53:50 wessels Exp $ + * $Id: structs.h,v 1.196 1998/08/14 09:22:41 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -1112,6 +1112,9 @@ struct _store_client { int copy_event_pending:1; } flags; store_client *next; +#if DELAY_POOLS + delay_id delay_id; +#endif }; @@ -1205,10 +1208,7 @@ struct _request_t { HierarchyLogEntry hier; err_type err_type; #if DELAY_POOLS - struct { - int position; - char class; - } delay; + delay_id delay_id; #endif }; diff --git a/src/tunnel.cc b/src/tunnel.cc index 3fe501af51..90ab422ff3 100644 --- a/src/tunnel.cc +++ b/src/tunnel.cc @@ -1,6 +1,6 @@ /* - * $Id: tunnel.cc,v 1.85 1998/07/22 20:37:51 wessels Exp $ + * $Id: tunnel.cc,v 1.86 1998/08/14 09:22:40 wessels Exp $ * * DEBUG: section 26 Secure Sockets Layer Proxy * AUTHOR: Duane Wessels @@ -66,6 +66,9 @@ static void sslStateFree(SslStateData * sslState); static void sslConnected(int fd, void *); static void sslProxyConnected(int fd, void *); static void sslSetSelect(SslStateData * sslState); +#if DELAY_POOLS +static DEFER sslDeferServerRead; +#endif static void sslServerClosed(int fd, void *data) @@ -105,9 +108,19 @@ sslStateFree(SslStateData * sslState) cbdataFree(sslState); } +#if DELAY_POOLS +static int +sslDeferServerRead(int fdnotused, void *data) +{ + request_t *r = data; + return delayBytesWanted(r->delay_id, 1) == 0; +} +#endif + static void sslSetSelect(SslStateData * sslState) { + size_t read_sz = SQUID_TCP_SO_RCVBUF; assert(sslState->server.fd > -1 || sslState->client.fd > -1); if (sslState->client.fd > -1) { if (sslState->server.len > 0) { @@ -117,7 +130,7 @@ sslSetSelect(SslStateData * sslState) sslState, 0); } - if (sslState->client.len < SQUID_TCP_SO_RCVBUF) { + if (sslState->client.len < read_sz) { commSetSelect(sslState->client.fd, COMM_SELECT_READ, sslReadClient, @@ -135,7 +148,11 @@ sslSetSelect(SslStateData * sslState) sslState, 0); } - if (sslState->server.len < SQUID_TCP_SO_RCVBUF) { +#if DELAY_POOLS + read_sz = delayBytesWanted(sslState->request->delay_id, read_sz); + assert(read_sz > 0); +#endif + if (sslState->server.len < read_sz) { /* Have room to read more */ commSetSelect(sslState->server.fd, COMM_SELECT_READ, @@ -156,16 +173,22 @@ sslReadServer(int fd, void *data) { SslStateData *sslState = data; int len; + size_t read_sz = SQUID_TCP_SO_RCVBUF - sslState->server.len; assert(fd == sslState->server.fd); debug(26, 3) ("sslReadServer: FD %d, reading %d bytes at offset %d\n", - fd, SQUID_TCP_SO_RCVBUF - sslState->server.len, - sslState->server.len); - len = read(fd, - sslState->server.buf + sslState->server.len, - SQUID_TCP_SO_RCVBUF - sslState->server.len); + fd, read_sz, sslState->server.len); + errno = 0; +#if DELAY_POOLS + read_sz = delayBytesWanted(sslState->request->delay_id, read_sz); + assert(read_sz > 0); +#endif + len = read(fd, sslState->server.buf + sslState->server.len, read_sz); debug(26, 3) ("sslReadServer: FD %d, read %d bytes\n", fd, len); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(sslState->request->delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.other.kbytes_in, len); sslState->server.len += len; @@ -360,6 +383,9 @@ sslConnectDone(int fdnotused, int status, void *data) Config.Timeout.read, sslTimeout, sslState); +#if DELAY_POOLS + commSetDefer(sslState->server.fd, sslDeferServerRead, sslState->request); +#endif } } diff --git a/src/typedefs.h b/src/typedefs.h index 78eaef6bc4..2fea3951fa 100644 --- a/src/typedefs.h +++ b/src/typedefs.h @@ -1,6 +1,6 @@ /* - * $Id: typedefs.h,v 1.66 1998/07/22 20:54:07 wessels Exp $ + * $Id: typedefs.h,v 1.67 1998/08/14 09:22:41 wessels Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -225,3 +225,9 @@ typedef char HttpHeaderMask[8]; /* a common objPackInto interface; used by debugObj */ typedef void (*ObjPackMethod) (void *obj, Packer * p); + +#if DELAY_POOLS +typedef int delay_id; +#else +typedef int delay_id; +#endif diff --git a/src/urn.cc b/src/urn.cc index ce626e6e61..14e2fe7cbc 100644 --- a/src/urn.cc +++ b/src/urn.cc @@ -1,7 +1,7 @@ /* * - * $Id: urn.cc,v 1.41 1998/07/31 00:15:55 wessels Exp $ + * $Id: urn.cc,v 1.42 1998/08/14 09:22:42 wessels Exp $ * * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -138,10 +138,6 @@ urnStart(request_t * r, StoreEntry * e) errorAppendEntry(e, err); return; } -#if DELAY_POOLS - urlres_r->delay.class = r->delay.class; - urlres_r->delay.position = r->delay.position; -#endif httpHeaderPutStr(&urlres_r->header, HDR_ACCEPT, "text/plain"); if ((urlres_e = storeGet(k)) == NULL) { urlres_e = storeCreateEntry(urlres, urlres, 0, METHOD_GET); @@ -151,6 +147,10 @@ urnStart(request_t * r, StoreEntry * e) storeLockObject(urlres_e); storeClientListAdd(urlres_e, urnState); } +#if DELAY_POOLS + urlres_r->delay_id = r->delay_id; + delaySetStoreClient(urlres_e, urnState, r->delay_id); +#endif urnState->urlres_e = urlres_e; urnState->urlres_r = requestLink(urlres_r); storeClientCopy(urlres_e, diff --git a/src/wais.cc b/src/wais.cc index 9f80fa0d96..7f068e1a80 100644 --- a/src/wais.cc +++ b/src/wais.cc @@ -1,6 +1,6 @@ /* - * $Id: wais.cc,v 1.115 1998/07/30 22:29:36 wessels Exp $ + * $Id: wais.cc,v 1.116 1998/08/14 09:22:43 wessels Exp $ * * DEBUG: section 24 WAIS Relay * AUTHOR: Harvest Derived @@ -85,8 +85,11 @@ waisReadReply(int fd, void *data) StoreEntry *entry = waisState->entry; int len; int clen; - int off; int bin; + size_t read_sz; +#if DELAY_POOLS + delay_id delay_id = delayMostBytesAllowed(entry->mem_obj); +#endif if (fwdAbortFetch(entry)) { ErrorState *err; err = errorCon(ERR_CLIENT_ABORT, HTTP_INTERNAL_SERVER_ERROR); @@ -95,11 +98,18 @@ waisReadReply(int fd, void *data) comm_close(fd); return; } - /* check if we want to defer reading */ - off = storeLowestMemReaderOffset(entry); - len = read(fd, buf, 4096); + errno = 0; + read_sz = 4096; +#if DELAY_POOLS + read_sz = delayBytesWanted(delay_id, read_sz); + assert(read_sz > 0); +#endif + len = read(fd, buf, read_sz); if (len > 0) { fd_bytes(fd, len, FD_READ); +#if DELAY_POOLS + delayBytesIn(delay_id, len); +#endif kb_incr(&Counter.server.all.kbytes_in, len); kb_incr(&Counter.server.other.kbytes_in, len); }