From b6c0e933b91fafb6f021165ec913722427a24c12 Mon Sep 17 00:00:00 2001 From: wessels <> Date: Sat, 1 Mar 1997 04:33:34 +0000 Subject: [PATCH] jumbo mumbo hacking to get new peer_selection working --- src/acl.cc | 117 +++++++++++++------------- src/errorpage.cc | 4 +- src/http.cc | 3 +- src/neighbors.cc | 46 ++++++---- src/peer_select.cc | 203 ++++++++++++++++++++------------------------- src/squid.h | 4 +- src/ssl.cc | 57 +++++-------- src/stat.cc | 20 +++-- src/tunnel.cc | 57 +++++-------- 9 files changed, 243 insertions(+), 268 deletions(-) diff --git a/src/acl.cc b/src/acl.cc index 7da8464cd8..03105242e8 100644 --- a/src/acl.cc +++ b/src/acl.cc @@ -1,5 +1,5 @@ /* - * $Id: acl.cc,v 1.87 1997/02/27 02:57:04 wessels Exp $ + * $Id: acl.cc,v 1.88 1997/02/28 21:33:34 wessels Exp $ * * DEBUG: section 28 Access Control * AUTHOR: Duane Wessels @@ -1145,10 +1145,10 @@ aclCheckFast(const struct _acl_access *A, aclCheck_t * checklist) { int allow = 0; while (A) { - allow = A->allow; - if (aclMatchAclList(A->acl_list, checklist)) - return allow; - A = A->next; + allow = A->allow; + if (aclMatchAclList(A->acl_list, checklist)) + return allow; + A = A->next; } return !allow; } @@ -1164,38 +1164,38 @@ aclCheck(aclCheck_t * checklist) debug(28, 3, "aclCheck: checking '%s'\n", A->cfgline); allow = A->allow; match = aclMatchAclList(A->acl_list, checklist); - if (checklist->state[ACL_DST_IP] == ACL_LOOKUP_NEED) { - checklist->state[ACL_DST_IP] = ACL_LOOKUP_PENDING; - ipcache_nbgethostbyname(checklist->request->host, - -1, - aclLookupDstIPDone, - checklist); - return; - } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEED) { - checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING; - fqdncache_nbgethostbyaddr(checklist->src_addr, - -1, - aclLookupSrcFQDNDone, - checklist); - return; - } else if (checklist->state[ACL_DST_DOMAIN] == ACL_LOOKUP_NEED) { - if ((ia = ipcacheCheckNumeric(checklist->request->host)) != NULL) { - checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_PENDING; - fqdncache_nbgethostbyaddr(ia->in_addrs[0], - -1, - aclLookupDstFQDNDone, - checklist); + if (checklist->state[ACL_DST_IP] == ACL_LOOKUP_NEED) { + checklist->state[ACL_DST_IP] = ACL_LOOKUP_PENDING; + ipcache_nbgethostbyname(checklist->request->host, + -1, + aclLookupDstIPDone, + checklist); + return; + } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEED) { + checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING; + fqdncache_nbgethostbyaddr(checklist->src_addr, + -1, + aclLookupSrcFQDNDone, + checklist); + return; + } else if (checklist->state[ACL_DST_DOMAIN] == ACL_LOOKUP_NEED) { + if ((ia = ipcacheCheckNumeric(checklist->request->host)) != NULL) { + checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_PENDING; + fqdncache_nbgethostbyaddr(ia->in_addrs[0], + -1, + aclLookupDstFQDNDone, + checklist); } else { - checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_DONE; + checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_DONE; } - return; - } + return; + } if (match) { debug(28, 3, "aclCheck: match found, returning %d\n", allow); - aclCheckCallback(checklist, !allow); + aclCheckCallback(checklist, allow); return; } - checklist->access_list = A->next; + checklist->access_list = A->next; } aclCheckCallback(checklist, !allow); } @@ -1204,55 +1204,56 @@ aclCheck(aclCheck_t * checklist) static void aclCheckCallback(aclCheck_t * checklist, int answer) { - checklist->callback(answer, checklist->callback_data); - requestUnlink(checklist->request); - xfree(checklist); + debug(28, 3, "aclCheckCallback: answer=%d\n", answer); + checklist->callback(answer, checklist->callback_data); + requestUnlink(checklist->request); + xfree(checklist); } static void aclLookupDstIPDone(int fd, const ipcache_addrs * ia, void *data) { - aclCheck_t * checklist = data; - checklist->state[ACL_DST_IP] = ACL_LOOKUP_DONE; - aclCheck(checklist); + aclCheck_t *checklist = data; + checklist->state[ACL_DST_IP] = ACL_LOOKUP_DONE; + aclCheck(checklist); } static void aclLookupSrcFQDNDone(int fd, const char *fqdn, void *data) { - aclCheck_t * checklist = data; - checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE; - aclCheck(checklist); + aclCheck_t *checklist = data; + checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE; + aclCheck(checklist); } static void aclLookupDstFQDNDone(int fd, const char *fqdn, void *data) { - aclCheck_t * checklist = data; + aclCheck_t *checklist = data; checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE; aclCheck(checklist); } void aclNBCheck(const struct _acl_access *A, - request_t *request, - struct in_addr src_addr, - char *user_agent, - char *ident, - PF callback, - void *callback_data) + request_t * request, + struct in_addr src_addr, + char *user_agent, + char *ident, + PF callback, + void *callback_data) { - aclCheck_t *checklist = xcalloc(1, sizeof(aclCheck_t));; - checklist->access_list = A; - checklist->request = requestLink(request); - checklist->src_addr = src_addr; - if (user_agent) - xstrncpy(checklist->browser, user_agent, BROWSERNAMELEN); - if (ident) - xstrncpy(checklist->ident, ident, ICP_IDENT_SZ); - checklist->callback = callback; - checklist->callback_data = callback_data; - aclCheck(checklist); + aclCheck_t *checklist = xcalloc(1, sizeof(aclCheck_t));; + checklist->access_list = A; + checklist->request = requestLink(request); + checklist->src_addr = src_addr; + if (user_agent) + xstrncpy(checklist->browser, user_agent, BROWSERNAMELEN); + if (ident) + xstrncpy(checklist->ident, ident, ICP_IDENT_SZ); + checklist->callback = callback; + checklist->callback_data = callback_data; + aclCheck(checklist); } diff --git a/src/errorpage.cc b/src/errorpage.cc index 618113603d..5ceb5346eb 100644 --- a/src/errorpage.cc +++ b/src/errorpage.cc @@ -1,6 +1,6 @@ /* - * $Id: errorpage.cc,v 1.53 1997/01/15 23:01:13 wessels Exp $ + * $Id: errorpage.cc,v 1.54 1997/02/28 21:33:36 wessels Exp $ * * DEBUG: section 4 Error Generation * AUTHOR: Duane Wessels @@ -240,7 +240,7 @@ Generated by %s/%s@%s\n\ \n" char * -squid_error_request(const char *request, int type, const char *address, int code) +squid_error_request(const char *request, int type, int code) { int error_index; diff --git a/src/http.cc b/src/http.cc index d69bc6cb1e..5f39e96f9e 100644 --- a/src/http.cc +++ b/src/http.cc @@ -1,5 +1,5 @@ /* - * $Id: http.cc,v 1.151 1997/02/27 02:57:09 wessels Exp $ + * $Id: http.cc,v 1.152 1997/02/28 21:33:37 wessels Exp $ * * DEBUG: section 11 Hypertext Transfer Protocol (HTTP) * AUTHOR: Harvest Derived @@ -959,7 +959,6 @@ proxyhttpStartComplete(void *data, int status) sock, httpConnect, httpState); - xfree(url); return; } diff --git a/src/neighbors.cc b/src/neighbors.cc index af415ec661..39e0191b09 100644 --- a/src/neighbors.cc +++ b/src/neighbors.cc @@ -1,5 +1,5 @@ /* - * $Id: neighbors.cc,v 1.127 1997/02/27 06:29:15 wessels Exp $ + * $Id: neighbors.cc,v 1.128 1997/02/28 21:33:39 wessels Exp $ * * DEBUG: section 15 Neighbor Routines * AUTHOR: Harvest Derived @@ -112,7 +112,7 @@ static void neighborRemove _PARAMS((peer *)); static peer *whichPeer _PARAMS((const struct sockaddr_in * from)); static void neighborAlive _PARAMS((peer *, const MemObject *, const icp_common_t *)); static void neighborCountIgnored _PARAMS((peer * e, icp_opcode op_unused)); -static neighbor_t parseNeighborType _PARAMS((const char *s)); +static peer_t parseNeighborType _PARAMS((const char *s)); static void peerRefreshDNS _PARAMS((void *)); static void peerDNSConfigure _PARAMS((int fd, const ipcache_addrs * ia, void *data)); @@ -184,16 +184,20 @@ whichPeer(const struct sockaddr_in *from) } void -hierarchyNote(request_t * request, hier_code code, int timeout, const char *cache_host) +hierarchyNote(request_t * request, + hier_code code, + icp_ping_data *icpdata, + const char *cache_host) { if (request) { request->hierarchy.code = code; - request->hierarchy.timeout = timeout; + request->hierarchy.icp = *icpdata; request->hierarchy.host = xstrdup(cache_host); + request->hierarchy.icp.stop = current_time; } } -static neighbor_t +static peer_t neighborType(const peer * e, const request_t * request) { const struct _domain_type *d = NULL; @@ -433,15 +437,19 @@ neighbors_open(int fd) } int -neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep) +neighborsUdpPing(request_t * request, + StoreEntry * entry, + IRCB callback, + void *callback_data, + int *exprep) { char *host = request->host; char *url = entry->url; + MemObject *mem = entry->mem_obj; const ipcache_addrs *ia = NULL; struct sockaddr_in to_addr; peer *e = NULL; int i; - MemObject *mem = entry->mem_obj; int reqnum = 0; int flags; icp_common_t *query; @@ -459,7 +467,9 @@ neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep) } if (entry->swap_status != NO_SWAP) fatal_dump("neighborsUdpPing: bad swap_status"); - + mem->start_ping = current_time; + mem->icp_reply_callback = callback; + mem->ircb_data = callback_data; for (i = 0, e = Peers.first_ping; i++ < Peers.n; e = e->next) { if (e == NULL) e = Peers.peers_head; @@ -510,7 +520,7 @@ neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep) ICP_mcasts_sent++; } else if (neighborUp(e)) { /* its alive, expect a reply from it */ - *exprep++; + (*exprep)++; } else { /* Neighbor is dead; ping it anyway, but don't expect a reply */ /* log it once at the threshold */ @@ -596,9 +606,7 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc { peer *e = NULL; MemObject *mem = entry->mem_obj; - int w_rtt; - HttpStateData *httpState = NULL; - neighbor_t ntype = PEER_NONE; + peer_t ntype = PEER_NONE; char *opcode_d; icp_opcode opcode = (icp_opcode) header->opcode; @@ -646,14 +654,14 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc } else if (ntype != PEER_PARENT) { (void) 0; /* ignore MISS from non-parent */ } else { - mem->icp_reply_callback(e, ntype, opcode, mem->cb_data); + mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data); } } else if (opcode == ICP_OP_HIT || opcode == ICP_OP_HIT_OBJ) { if (e == NULL) { debug(15, 1, "Ignoring HIT from non-peer %s\n", inet_ntoa(from->sin_addr)); } else { - mem->icp_reply_callback(e, ntype, ICP_OP_HIT, mem->cb_data); + mem->icp_reply_callback(e, ntype, ICP_OP_HIT, mem->ircb_data); } } else if (opcode == ICP_OP_DECHO) { if (e == NULL) { @@ -663,14 +671,16 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc debug_trap("neighborsUdpAck: Found non-ICP cache as SIBLING\n"); debug_trap("neighborsUdpAck: non-ICP neighbors must be a PARENT\n"); } else { - mem->icp_reply_callback(e, ntype, opcode, mem->cb_data); + mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data); } } else if (opcode == ICP_OP_SECHO) { if (e) { debug(15, 1, "Ignoring SECHO from neighbor %s\n", e->host); neighborCountIgnored(e, opcode); + } else if (!Config.sourcePing) { + debug(15, 1, "Unsolicited SECHO from %s\n", inet_ntoa(from->sin_addr)); } else { - mem->icp_reply_callback(NULL, ntype, opcode, mem->cb_data); + mem->icp_reply_callback(NULL, ntype, opcode, mem->ircb_data); } } else if (opcode == ICP_OP_DENIED) { if (e == NULL) { @@ -687,7 +697,7 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc } } } else if (opcode == ICP_OP_MISSNOFETCH) { - mem->icp_reply_callback(e, ntype, opcode, mem->cb_data); + mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data); } else { debug(15, 0, "neighborsUdpAck: Unexpected ICP reply: %s\n", opcode_d); } @@ -828,7 +838,7 @@ neighborFindByName(const char *name) return e; } -static neighbor_t +static peer_t parseNeighborType(const char *s) { if (!strcasecmp(s, "parent")) diff --git a/src/peer_select.cc b/src/peer_select.cc index 689daf1e89..fe15323ce2 100644 --- a/src/peer_select.cc +++ b/src/peer_select.cc @@ -1,5 +1,5 @@ /* - * $Id: peer_select.cc,v 1.5 1997/02/27 06:29:16 wessels Exp $ + * $Id: peer_select.cc,v 1.6 1997/02/28 21:33:41 wessels Exp $ * * DEBUG: section 44 Peer Selection Algorithm * AUTHOR: Duane Wessels @@ -34,29 +34,11 @@ static struct { int timeouts; } PeerStats; -typedef struct { - request_t *request; - StoreEntry *entry; - int always_direct; - int never_direct; - PSC callback; - PSC fail_callback; - void *callback_data; - struct { - struct timeval start; - int n_sent; - int n_recv; - int n_replies_expected; - int timeout; - peer *best_parent; - } ping; -} psctrl_t; - -static void peerSelectFoo _PARAMS((psctrl_t *)); +static void peerSelectFoo _PARAMS((ps_state *)); static void peerPingTimeout _PARAMS((void *data)); -void peerPingComplete _PARAMS((void *data)); -static void peerSelectCallbackFail _PARAMS((psctrl_t * ctrl)); +static void peerSelectCallbackFail _PARAMS((ps_state * psstate)); +static void peerHandleIcpReply _PARAMS((peer * p, peer_t type, icp_opcode op, void *data)); int peerSelectIcpPing(request_t * request, int direct, StoreEntry * entry) @@ -114,92 +96,99 @@ peerGetSomeParent(request_t * request, hier_code * code) void peerSelect(request_t * request, - StoreEntry *entry, - PSC callback, - PSC fail_callback, - void *callback_data) + StoreEntry * entry, + PSC callback, + PSC fail_callback, + void *callback_data) { - psctrl_t *ctrl = xcalloc(1, sizeof(psctrl_t)); - ctrl->request = requestLink(request); - ctrl->entry = entry; - ctrl->callback = callback; - ctrl->fail_callback = fail_callback; - ctrl->callback_data = callback_data; - peerSelectFoo(ctrl); + ps_state *psstate = xcalloc(1, sizeof(ps_state)); + psstate->request = requestLink(request); + psstate->entry = entry; + psstate->callback = callback; + psstate->fail_callback = fail_callback; + psstate->callback_data = callback_data; + psstate->icp.start = current_time; + peerSelectFoo(psstate); } static void peerCheckNeverDirectDone(int answer, void *data) { - psctrl_t *ctrl = data; + ps_state *psstate = data; debug(44, 3, "peerCheckNeverDirectDone: %d\n", answer); - ctrl->never_direct = answer ? 1 : -1; - peerSelectFoo(ctrl); + psstate->never_direct = answer ? 1 : -1; + peerSelectFoo(psstate); } static void peerCheckAlwaysDirectDone(int answer, void *data) { - psctrl_t *ctrl = data; + ps_state *psstate = data; debug(44, 3, "peerCheckAlwaysDirectDone: %d\n", answer); - ctrl->always_direct = answer ? 1 : -1; - peerSelectFoo(ctrl); + psstate->always_direct = answer ? 1 : -1; + peerSelectFoo(psstate); } static void -peerSelectCallback(psctrl_t * ctrl, peer * p) +peerSelectCallback(ps_state * psstate, peer * p) { - if (!ctrl->ping.timeout) - eventDelete(peerPingTimeout, ctrl); - ctrl->callback(p, ctrl->callback_data); - requestUnlink(ctrl->request); - xfree(ctrl); + StoreEntry *entry = psstate->entry; + if (entry) { + if (entry->ping_status == PING_WAITING) + eventDelete(peerPingTimeout, psstate); + entry->ping_status = PING_DONE; + } + psstate->callback(p, psstate->callback_data); + requestUnlink(psstate->request); + xfree(psstate); } static void -peerSelectCallbackFail(psctrl_t * ctrl) +peerSelectCallbackFail(ps_state * psstate) { - request_t *request = ctrl->request; - char *url = ctrl->entry ? ctrl->entry->url : urlCanonical(request, NULL); + request_t *request = psstate->request; + char *url = psstate->entry ? psstate->entry->url : urlCanonical(request, NULL); debug(44, 1, "Failed to select source for '%s'\n", url); - debug(44, 1, " always_direct = %d\n", ctrl->always_direct); - debug(44, 1, " never_direct = %d\n", ctrl->never_direct); - debug(44, 1, " timeout = %d\n", ctrl->ping.timeout); - ctrl->fail_callback(NULL, ctrl->callback_data); - requestUnlink(ctrl->request); - xfree(ctrl); + debug(44, 1, " always_direct = %d\n", psstate->always_direct); + debug(44, 1, " never_direct = %d\n", psstate->never_direct); + debug(44, 1, " timeout = %d\n", psstate->icp.timeout); + psstate->fail_callback(NULL, psstate->callback_data); + requestUnlink(psstate->request); + xfree(psstate); } static void -peerSelectFoo(psctrl_t * ctrl) +peerSelectFoo(ps_state * psstate) { peer *p; hier_code code; - StoreEntry *entry = ctrl->entry; - request_t *request = ctrl->request; + StoreEntry *entry = psstate->entry; + request_t *request = psstate->request; int direct; - debug(44, 3, "peerSelect: '%s'\n", entry->url); - if (ctrl->never_direct == 0) { + debug(44, 3, "peerSelect: '%s %s'\n", + RequestMethodStr[request->method], + request->host); + if (psstate->never_direct == 0) { aclNBCheck(Config.accessList.NeverDirect, request, request->client_addr, NULL, /* user agent */ NULL, /* ident */ peerCheckNeverDirectDone, - ctrl); + psstate); return; - } else if (ctrl->never_direct > 0) { + } else if (psstate->never_direct > 0) { direct = DIRECT_NO; - } else if (ctrl->always_direct == 0) { + } else if (psstate->always_direct == 0) { aclNBCheck(Config.accessList.AlwaysDirect, request, request->client_addr, NULL, /* user agent */ NULL, /* ident */ peerCheckAlwaysDirectDone, - ctrl); + psstate); return; - } else if (ctrl->always_direct > 0) { + } else if (psstate->always_direct > 0) { direct = DIRECT_YES; } else { direct = DIRECT_MAYBE; @@ -207,69 +196,60 @@ peerSelectFoo(psctrl_t * ctrl) debug(44, 3, "peerSelect: direct = %d\n", direct); if (direct == DIRECT_YES) { debug(44, 3, "peerSelect: HIER_DIRECT\n"); - hierarchyNote(request, HIER_DIRECT, ctrl->ping.timeout, request->host); - peerSelectCallback(ctrl, NULL); + hierarchyNote(request, HIER_DIRECT, &psstate->icp, request->host); + peerSelectCallback(psstate, NULL); return; } if (peerSelectIcpPing(request, direct, entry)) { if (entry->ping_status != PING_NONE) - fatal_dump("peerSelectFoo: bad ping_status"); + fatal_dump("peerSelectFoo: bad ping_status"); debug(44, 3, "peerSelect: Doing ICP pings\n"); - ctrl->ping.n_sent = neighborsUdpPing(request, - entry, - &ctrl->ping.n_replies_expected); - if (ctrl->ping.n_sent > 0) { + psstate->icp.n_sent = neighborsUdpPing(request, + entry, + peerHandleIcpReply, + psstate, + &psstate->icp.n_replies_expected); + if (psstate->icp.n_sent > 0) { entry->ping_status = PING_WAITING; eventAdd("peerPingTimeout", peerPingTimeout, - ctrl, + psstate, Config.neighborTimeout); - ctrl->ping.start = current_time; return; } debug_trap("peerSelect: neighborsUdpPing returned 0"); } - if ((p = ctrl->ping.best_parent)) { + if ((p = psstate->best_parent)) { code = HIER_BEST_PARENT_MISS; debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(request, code, ctrl->ping.timeout, p->host); - peerSelectCallback(ctrl, p); + hierarchyNote(request, code, &psstate->icp, p->host); + peerSelectCallback(psstate, p); } else if (direct != DIRECT_NO) { code = HIER_DIRECT; debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], request->host); - hierarchyNote(request, code, ctrl->ping.timeout, request->host); - peerSelectCallback(ctrl, NULL); + hierarchyNote(request, code, &psstate->icp, request->host); + peerSelectCallback(psstate, NULL); } else if ((p = peerGetSomeParent(request, &code))) { debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(request, code, ctrl->ping.timeout, p->host); - peerSelectCallback(ctrl, p); + hierarchyNote(request, code, &psstate->icp, p->host); + peerSelectCallback(psstate, p); } else { code = HIER_NO_DIRECT_FAIL; - hierarchyNote(request, code, ctrl->ping.timeout, NULL); - peerSelectCallbackFail(ctrl); + hierarchyNote(request, code, &psstate->icp, NULL); + peerSelectCallbackFail(psstate); } } void peerPingTimeout(void *data) { - psctrl_t *ctrl = data; - StoreEntry *entry = ctrl->entry; + ps_state *psstate = data; + StoreEntry *entry = psstate->entry; debug(44, 3, "peerPingTimeout: '%s'\n", entry->url); entry->ping_status = PING_TIMEOUT; PeerStats.timeouts++; - ctrl->ping.timeout = 1; - peerSelectFoo(ctrl); -} - -void -peerPingComplete(void *data) -{ - psctrl_t *ctrl = data; - StoreEntry *entry = ctrl->entry; - debug(44, 3, "peerPingComplete: '%s'\n", entry->url); - entry->ping_status = PING_DONE; - peerSelectFoo(ctrl); + psstate->icp.timeout = 1; + peerSelectFoo(psstate); } void @@ -279,36 +259,37 @@ peerSelectInit(void) } -void -peerHandleIcpReply(peer * p, neighbor_t type, icp_opcode_t op, void *data) +static void +peerHandleIcpReply(peer * p, peer_t type, icp_opcode op, void *data) { - psctrl_t *ctrl = data; + ps_state *psstate = data; int w_rtt; - request_t *reqeust = ctrl->request; - ctrl->pings->n_recv++; + request_t *request = psstate->request; + psstate->icp.n_recv++; if (op == ICP_OP_MISS || op == ICP_OP_DECHO) { if (type == PEER_PARENT) { - w_rtt = tvSubMsec(ctrl->ping.start, current_time) / e->weight; - if (ctrl->ping.w_rtt == 0 || w_rtt < ctrl->ping.w_rtt) { - ctrl->ping.best_parent = e; - ctrl->ping.w_rtt = w_rtt; + w_rtt = tvSubMsec(psstate->icp.start, current_time) / p->weight; + if (psstate->icp.w_rtt == 0 || w_rtt < psstate->icp.w_rtt) { + psstate->best_parent = p; + psstate->icp.w_rtt = w_rtt; } } } else if (op == ICP_OP_HIT || op == ICP_OP_HIT_OBJ) { hierarchyNote(request, type == PEER_PARENT ? HIER_PARENT_HIT : HIER_SIBLING_HIT, - 0, + &psstate->icp, p->host); - peerSelectCallback(ctrl, p); + peerSelectCallback(psstate, p); return; } else if (op == ICP_OP_SECHO) { hierarchyNote(request, HIER_SOURCE_FASTEST, - 0, - request->host - peerSelectCallback(ctrl, p); + &psstate->icp, + request->host); + peerSelectCallback(psstate, p); return; } - if (ctrl->ping.n_recv < ping.n_replies_expected) + if (psstate->icp.n_recv < psstate->icp.n_replies_expected) return; + peerSelectFoo(psstate); } diff --git a/src/squid.h b/src/squid.h index 7df79ea5ee..5d98f5752a 100644 --- a/src/squid.h +++ b/src/squid.h @@ -1,6 +1,6 @@ /* - * $Id: squid.h,v 1.98 1997/02/27 02:57:16 wessels Exp $ + * $Id: squid.h,v 1.99 1997/02/28 21:33:42 wessels Exp $ * * AUTHOR: Duane Wessels * @@ -272,6 +272,7 @@ typedef int (*QS) (const void *, const void *); #include "filemap.h" #include "hash.h" #include "proto.h" /* must go before neighbors.h */ +#include "peer_select.h" /* must go before neighbors.h */ #include "neighbors.h" /* must go before url.h */ #include "url.h" #include "icp.h" @@ -300,7 +301,6 @@ typedef int (*QS) (const void *, const void *); #include "client_db.h" #include "objcache.h" #include "refresh.h" -#include "peer_select.h" #if !HAVE_TEMPNAM #include "tempnam.h" diff --git a/src/ssl.cc b/src/ssl.cc index c81d01371c..db27a07ca1 100644 --- a/src/ssl.cc +++ b/src/ssl.cc @@ -1,6 +1,6 @@ /* - * $Id: ssl.cc,v 1.40 1997/02/26 19:46:22 wessels Exp $ + * $Id: ssl.cc,v 1.41 1997/02/28 21:33:42 wessels Exp $ * * DEBUG: section 26 Secure Sockets Layer Proxy * AUTHOR: Duane Wessels @@ -65,7 +65,8 @@ static void sslClose _PARAMS((SslStateData * sslState)); static void sslClientClosed _PARAMS((int fd, void *)); static void sslConnectDone _PARAMS((int fd, int status, void *data)); static void sslStateFree _PARAMS((int fd, void *data)); -static void sslSelectNeighbor _PARAMS((int fd, const ipcache_addrs *, void *)); +static void sslPeerSelectComplete _PARAMS((peer * p, void *data)); +static void sslPeerSelectFail _PARAMS((peer * p, void *data)); static void sslClose(SslStateData * sslState) @@ -417,10 +418,8 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size SslStateData *sslState = NULL; int sock; char *buf = NULL; - debug(26, 3, "sslStart: '%s %s'\n", RequestMethodStr[request->method], url); - /* Create socket. */ sock = comm_open(SOCK_STREAM, 0, @@ -461,20 +460,11 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size comm_add_close_handler(sslState->client.fd, sslClientClosed, (void *) sslState); - - if (Config.sslProxy) { - ipcache_nbgethostbyname(request->host, - sslState->server.fd, - sslSelectNeighbor, - sslState); - } else { - sslState->host = request->host; - sslState->port = request->port; - ipcache_nbgethostbyname(request->host, - sslState->server.fd, - sslConnect, - sslState); - } + peerSelect(request, + NULL, + sslPeerSelectComplete, + sslPeerSelectFail, + sslState); return COMM_OK; } @@ -499,27 +489,18 @@ sslProxyConnected(int fd, void *data) } static void -sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data) +sslPeerSelectComplete (peer * p, void *data) { SslStateData *sslState = data; request_t *request = sslState->request; - peer *e = NULL; peer *g = NULL; - hier_code code; - if (peerSelectDirect(request)) { - hierarchyNote(request, HIER_DIRECT, 0, request->host); - } else if ((e = peerGetSomeParent(request, &code))) { - hierarchyNote(request, code, 0, e->host); - } else { - hierarchyNote(request, HIER_DIRECT, 0, request->host); - } - sslState->proxying = e ? 1 : 0; - sslState->host = e ? e->host : request->host; - if (e == NULL) { + sslState->proxying = p ? 1 : 0; + sslState->host = p ? p->host : request->host; + if (p == NULL) { sslState->port = request->port; - } else if (e->http_port != 0) { - sslState->port = e->http_port; - } else if ((g = neighborFindByName(e->host))) { + } else if (p->http_port != 0) { + sslState->port = p->http_port; + } else if ((g = neighborFindByName(p->host))) { sslState->port = g->http_port; } else { sslState->port = CACHE_HTTP_PORT; @@ -529,3 +510,11 @@ sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data) sslConnect, sslState); } + +static void +sslPeerSelectFail (peer * p, void *data) +{ + SslStateData *sslState = data; + squid_error_request(sslState->url, ERR_CANNOT_FETCH, 400); + sslClose(sslState); +} diff --git a/src/stat.cc b/src/stat.cc index 8175d3fbf0..2b6d392c3b 100644 --- a/src/stat.cc +++ b/src/stat.cc @@ -1,6 +1,6 @@ /* - * $Id: stat.cc,v 1.127 1997/02/26 19:46:22 wessels Exp $ + * $Id: stat.cc,v 1.128 1997/02/28 21:33:43 wessels Exp $ * * DEBUG: section 18 Cache Manager Statistics * AUTHOR: Harvest Derived @@ -1078,7 +1078,10 @@ log_append(const cacheinfo * obj, const char *client = NULL; hier_code hier_code = HIER_NONE; const char *hier_host = dash_str; - int hier_timeout = 0; + int ns = 0; + int ne = 0; + int nr = 0; + int tt = 0; if (obj->logfile_status != LOG_ENABLE) return; @@ -1101,21 +1104,24 @@ log_append(const cacheinfo * obj, if (hierData) { hier_code = hierData->code; hier_host = hierData->host ? hierData->host : dash_str; - hier_timeout = hierData->timeout; + if (hierData->icp.start.tv_sec && hierData->icp.stop.tv_sec) + tt = tvSubMsec(hierData->icp.start, hierData->icp.stop); + ns = hierData->icp.n_sent; + ne = hierData->icp.n_replies_expected; + nr = hierData->icp.n_recv; } if (Config.commonLogFormat) - sprintf(tmp, "%s %s - [%s] \"%s %s\" %s:%s%s %d\n", + sprintf(tmp, "%s %s - [%s] \"%s %s\" %s:%s %d\n", client, ident, mkhttpdlogtime(&squid_curtime), method, url, action, - hier_timeout ? "TIMEOUT_" : null_string, hier_strings[hier_code], size); else - sprintf(tmp, "%9d.%03d %6d %s %s/%03d %d %s %s %s %s%s/%s %s\n", + sprintf(tmp, "%9d.%03d %6d %s %s/%03d %d %s %s %s %s/%s %d/%d/%d/%d %s\n", (int) current_time.tv_sec, (int) current_time.tv_usec / 1000, msec, @@ -1126,9 +1132,9 @@ log_append(const cacheinfo * obj, method, url, ident, - hier_timeout ? "TIMEOUT_" : null_string, hier_strings[hier_code], hier_host, + ns,ne,nr,tt, content_type); #if LOG_FULL_HEADERS if (Config.logMimeHdrs) { diff --git a/src/tunnel.cc b/src/tunnel.cc index b931b100ba..a293ca6541 100644 --- a/src/tunnel.cc +++ b/src/tunnel.cc @@ -1,6 +1,6 @@ /* - * $Id: tunnel.cc,v 1.40 1997/02/26 19:46:22 wessels Exp $ + * $Id: tunnel.cc,v 1.41 1997/02/28 21:33:42 wessels Exp $ * * DEBUG: section 26 Secure Sockets Layer Proxy * AUTHOR: Duane Wessels @@ -65,7 +65,8 @@ static void sslClose _PARAMS((SslStateData * sslState)); static void sslClientClosed _PARAMS((int fd, void *)); static void sslConnectDone _PARAMS((int fd, int status, void *data)); static void sslStateFree _PARAMS((int fd, void *data)); -static void sslSelectNeighbor _PARAMS((int fd, const ipcache_addrs *, void *)); +static void sslPeerSelectComplete _PARAMS((peer * p, void *data)); +static void sslPeerSelectFail _PARAMS((peer * p, void *data)); static void sslClose(SslStateData * sslState) @@ -417,10 +418,8 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size SslStateData *sslState = NULL; int sock; char *buf = NULL; - debug(26, 3, "sslStart: '%s %s'\n", RequestMethodStr[request->method], url); - /* Create socket. */ sock = comm_open(SOCK_STREAM, 0, @@ -461,20 +460,11 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size comm_add_close_handler(sslState->client.fd, sslClientClosed, (void *) sslState); - - if (Config.sslProxy) { - ipcache_nbgethostbyname(request->host, - sslState->server.fd, - sslSelectNeighbor, - sslState); - } else { - sslState->host = request->host; - sslState->port = request->port; - ipcache_nbgethostbyname(request->host, - sslState->server.fd, - sslConnect, - sslState); - } + peerSelect(request, + NULL, + sslPeerSelectComplete, + sslPeerSelectFail, + sslState); return COMM_OK; } @@ -499,27 +489,18 @@ sslProxyConnected(int fd, void *data) } static void -sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data) +sslPeerSelectComplete (peer * p, void *data) { SslStateData *sslState = data; request_t *request = sslState->request; - peer *e = NULL; peer *g = NULL; - hier_code code; - if (peerSelectDirect(request)) { - hierarchyNote(request, HIER_DIRECT, 0, request->host); - } else if ((e = peerGetSomeParent(request, &code))) { - hierarchyNote(request, code, 0, e->host); - } else { - hierarchyNote(request, HIER_DIRECT, 0, request->host); - } - sslState->proxying = e ? 1 : 0; - sslState->host = e ? e->host : request->host; - if (e == NULL) { + sslState->proxying = p ? 1 : 0; + sslState->host = p ? p->host : request->host; + if (p == NULL) { sslState->port = request->port; - } else if (e->http_port != 0) { - sslState->port = e->http_port; - } else if ((g = neighborFindByName(e->host))) { + } else if (p->http_port != 0) { + sslState->port = p->http_port; + } else if ((g = neighborFindByName(p->host))) { sslState->port = g->http_port; } else { sslState->port = CACHE_HTTP_PORT; @@ -529,3 +510,11 @@ sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data) sslConnect, sslState); } + +static void +sslPeerSelectFail (peer * p, void *data) +{ + SslStateData *sslState = data; + squid_error_request(sslState->url, ERR_CANNOT_FETCH, 400); + sslClose(sslState); +} -- 2.47.2