]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Luyers finished delay pools patch
authorwessels <>
Fri, 14 Aug 1998 15:22:31 +0000 (15:22 +0000)
committerwessels <>
Fri, 14 Aug 1998 15:22:31 +0000 (15:22 +0000)
15 files changed:
src/HttpRequest.cc
src/client_side.cc
src/comm_select.cc
src/delay_pools.cc
src/forward.cc
src/ftp.cc
src/gopher.cc
src/http.cc
src/protos.h
src/ssl.cc
src/structs.h
src/tunnel.cc
src/typedefs.h
src/urn.cc
src/wais.cc

index a6df6593e9a1753d291d5abb31e0ba2d1c1d7ede..35bbaafa67c2c74db79fe48203a290946f40f764 100644 (file)
@@ -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;
index ff088df09346438c7ac712f9fd96d584150ddbb6..9cf4a436f94a35e8dbd9094a840d2e0540e5f6e5 100644 (file)
@@ -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,
index 65a617d69c1ac8f1f524f8ff80da73d3cad301b6..db2d91e1e13af92ced94970b69310a56001a417c 100644 (file)
@@ -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
index f6128fb0f55f46c52326535c857049a3def13e00..eb3abd1a6a1e038ed6e31bc9226024ad0ce91d13 100644 (file)
@@ -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 <luyer@ucs.uwa.edu.au>
@@ -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
index dbbcb7dbb20bdfb377b11266bde2685f44b5a90f..279984ed8a3e685277c5ebe8c77918e371dbeeef 100644 (file)
@@ -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;
index 94258fcd7eff4d0edc9852dfd625ef536a97432d..7f24547f9de04d64a8daeb37eb4e278805a5d243 100644 (file)
@@ -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;
index 987965dbfae78854757e7e743b1581bb797905d7..2885e7ef6a630cc8ebfa723a294dd70fd640e888 100644 (file)
@@ -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);
     }
index a3a3875e752a2e12855ce5ddb35410af278381dd..7554a7fc7062c6288803eac9ba0169bc69c7b2ef 100644 (file)
@@ -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 {
index bf52e3b80a9e6802c0d1ddf1d5fab794eb156a35..d463807aa770d66dc322f8ed2e692c8d2951ce9a 100644 (file)
@@ -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
 
 /*
index 2bc618bbfc41975fc7cd3c3c6099605bea916fa5..71271f8e18fa78ef3cbdcf21ee0dbbbcb225e1f9 100644 (file)
@@ -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
     }
 }
 
index 41aa246c28a50a99f88310f834115902a23ca058..defff3eb370bf487db55aedc29523ad2c9265349 100644 (file)
@@ -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
 };
 
index 3fe501af513c25a2804e09559ed51dd7e77954e5..90ab422ff31b4e1541556b8c6094ca3e69617aab 100644 (file)
@@ -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
     }
 }
 
index 78eaef6bc45b0306640ae6967ac9e713e3b9bb07..2fea3951fab7f6cd66c4330b245e3870175a47c0 100644 (file)
@@ -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
index ce626e6e61d8fd0bf869fb52a319773ccfd7d20d..14e2fe7cbcb1a4a012b0417e5b70847a4581361f 100644 (file)
@@ -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,
index 9f80fa0d965795b4e496287f6fa6eb4c3efc2ead..7f068e1a80a04c851efdc6c8379e691224332354 100644 (file)
@@ -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);
     }