/*
- * $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
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;
/*
- * $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
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;
}
/* 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 */
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) {
storeUnlockObject(entry);
entry = http->entry = http->old_entry;
entry->refcount++;
+#if DELAY_POOLS
+ http->request->delay_id = 0;
+#endif
/* continue */
} else {
storeClientCopy(entry,
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;
#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",
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) {
/*
*/
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);
}
}
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,
/*
- * $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
*
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
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
/*
- * $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 <luyer@ucs.uwa.edu.au>
#if DELAY_POOLS
#include "squid.h"
+
struct _delayData {
int class1_aggregate;
int class2_aggregate;
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)
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++) {
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++) {
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;
}
}
}
+
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");
}
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
/*
- * $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
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;
/*
- * $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
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);
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;
/*
- * $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
#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 {
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);
}
/*
- * $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
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);
}
/* 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);
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 {
/*
- * $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/
#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
/*
/*
- * $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
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)
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) {
sslState,
0);
}
- if (sslState->client.len < SQUID_TCP_SO_RCVBUF) {
+ if (sslState->client.len < read_sz) {
commSetSelect(sslState->client.fd,
COMM_SELECT_READ,
sslReadClient,
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,
{
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;
Config.Timeout.read,
sslTimeout,
sslState);
+#if DELAY_POOLS
+ commSetDefer(sslState->server.fd, sslDeferServerRead, sslState->request);
+#endif
}
}
/*
- * $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/
int copy_event_pending:1;
} flags;
store_client *next;
+#if DELAY_POOLS
+ delay_id delay_id;
+#endif
};
HierarchyLogEntry hier;
err_type err_type;
#if DELAY_POOLS
- struct {
- int position;
- char class;
- } delay;
+ delay_id delay_id;
#endif
};
/*
- * $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
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)
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) {
sslState,
0);
}
- if (sslState->client.len < SQUID_TCP_SO_RCVBUF) {
+ if (sslState->client.len < read_sz) {
commSetSelect(sslState->client.fd,
COMM_SELECT_READ,
sslReadClient,
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,
{
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;
Config.Timeout.read,
sslTimeout,
sslState);
+#if DELAY_POOLS
+ commSetDefer(sslState->server.fd, sslDeferServerRead, sslState->request);
+#endif
}
}
/*
- * $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/
/* 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
/*
*
- * $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
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);
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,
/*
- * $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
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);
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);
}