From 44e237d0136e9e49c455387428a2c604d673e598 Mon Sep 17 00:00:00 2001 From: wessels <> Date: Thu, 27 Aug 1998 12:28:28 +0000 Subject: [PATCH] HTCP progress --- src/htcp.cc | 13 +++-- src/peer_select.cc | 122 ++++++++++++++++++++++++++++++++------------- 2 files changed, 96 insertions(+), 39 deletions(-) diff --git a/src/htcp.cc b/src/htcp.cc index d10e011a22..4b44c1b783 100644 --- a/src/htcp.cc +++ b/src/htcp.cc @@ -1,6 +1,6 @@ /* - * $Id: htcp.cc,v 1.18 1998/08/26 19:53:39 wessels Exp $ + * $Id: htcp.cc,v 1.19 1998/08/27 06:28:28 wessels Exp $ * * DEBUG: section 31 Hypertext Caching Protocol * AUTHOR: Duane Wesssels @@ -540,7 +540,8 @@ htcpTstReply(htcpDataHeader *dhdr, StoreEntry * e, htcpSpecifier * spec, struct char cto_buf[128]; stuff.op = HTCP_TST; stuff.rr = RR_RESPONSE; - stuff.f1 = e ? 0 : 1; + stuff.f1 = 0; + stuff.response = e ? 0 : 1; stuff.msg_id = dhdr->msg_id; if (spec) { memBufDefInit(&mb); @@ -614,11 +615,15 @@ htcpHandleTstResponse(htcpDataHeader * hdr, char *buf, int sz, struct sockaddr_i cache_key *key = NULL; htcpDetail *d = NULL; char *t; + if (hdr->F1 == 1) { + debug(31,1)("htcpHandleTstResponse: error condition, F1/MO == 1\n"); + return; + } memset(&htcpReply, '\0', sizeof(htcpReply)); httpHeaderInit(&htcpReply.hdr, hoHtcpReply); htcpReply.msg_id = hdr->msg_id; debug(31,1)("htcpHandleTstResponse: msg_id = %d\n", (int) htcpReply.msg_id); - htcpReply.hit = hdr->F1 ? 0 : 1; + htcpReply.hit = hdr->response ? 0 : 1; if (hdr->F1) { debug(31, 1) ("htcpHandleTstResponse: MISS\n"); } else { @@ -654,6 +659,8 @@ htcpHandleTstRequest(htcpDataHeader *dhdr, char *buf, int sz, struct sockaddr_in debug(31, 1) ("htcpHandleTst: nothing to do\n"); return; } + if (dhdr->F1 == 0) + return; s = htcpUnpackSpecifier(buf, sz); if (NULL == s) { debug(31, 1) ("htcpHandleTstRequest: htcpUnpackSpecifier failed\n"); diff --git a/src/peer_select.cc b/src/peer_select.cc index f9d434ee0f..169b7dddb8 100644 --- a/src/peer_select.cc +++ b/src/peer_select.cc @@ -1,6 +1,6 @@ /* - * $Id: peer_select.cc,v 1.78 1998/08/26 05:36:45 wessels Exp $ + * $Id: peer_select.cc,v 1.79 1998/08/27 06:28:28 wessels Exp $ * * DEBUG: section 44 Peer Selection Algorithm * AUTHOR: Duane Wessels @@ -79,6 +79,10 @@ static void peerSelectCallbackFail(ps_state * psstate); static IRCB peerHandlePingReply; static void peerSelectStateFree(ps_state * psstate); static void peerIcpParentMiss(peer *, icp_common_t *, ps_state *); +#if USE_HTCP +static void peerHtcpParentMiss(peer *, htcpReplyData *, ps_state *); +static void peerHandleHtcpReply(peer *, peer_t, htcpReplyData *, void *); +#endif static int peerCheckNetdbDirect(ps_state * psstate); static void @@ -198,7 +202,7 @@ peerSelectCallback(ps_state * psstate, peer * p) eventDelete(peerPingTimeout, psstate); entry->ping_status = PING_DONE; } - psstate->icp.stop = current_time; + psstate->ping.stop = current_time; if (cbdataValid(data)) psstate->callback(p, data); cbdataUnlock(data); @@ -214,7 +218,7 @@ peerSelectCallbackFail(ps_state * psstate) debug(44, 1) ("Failed to select source for '%s'\n", url); debug(44, 1) (" always_direct = %d\n", psstate->always_direct); debug(44, 1) (" never_direct = %d\n", psstate->never_direct); - debug(44, 1) (" timedout = %d\n", psstate->icp.timedout); + debug(44, 1) (" timedout = %d\n", psstate->ping.timedout); if (cbdataValid(data)) psstate->fail_callback(NULL, data); cbdataUnlock(data); @@ -233,8 +237,8 @@ peerCheckNetdbDirect(ps_state * psstate) myrtt = netdbHostRtt(psstate->request->host); debug(44, 3) ("peerCheckNetdbDirect: MY RTT = %d msec\n", myrtt); debug(44, 3) ("peerCheckNetdbDirect: closest_parent_miss RTT = %d msec\n", - psstate->icp.p_rtt); - if (myrtt && myrtt < psstate->icp.p_rtt) + psstate->ping.p_rtt); + if (myrtt && myrtt < psstate->ping.p_rtt) return 1; myhops = netdbHostHops(psstate->request->host); debug(44, 3) ("peerCheckNetdbDirect: MY hops = %d\n", myhops); @@ -290,7 +294,7 @@ peerSelectFoo(ps_state * psstate) debug(44, 3) ("peerSelectFoo: direct = %s\n", DirectStr[direct]); if (direct == DIRECT_YES) { debug(44, 3) ("peerSelectFoo: DIRECT\n"); - hierarchyNote(&request->hier, DIRECT, &psstate->icp, request->host); + hierarchyNote(&request->hier, DIRECT, &psstate->ping, request->host); peerSelectCallback(psstate, NULL); return; } @@ -304,14 +308,14 @@ peerSelectFoo(ps_state * psstate) request->hier.alg = PEER_SA_DIGEST; code = CACHE_DIGEST_HIT; debug(44, 2) ("peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(&request->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); return; } #endif #if USE_CARP else if ((p = carpSelectParent(request))) { - hierarchyNote(&request->hier, CARP, &psstate->icp, p->host); + hierarchyNote(&request->hier, CARP, &psstate->ping, p->host); peerSelectCallback(psstate, p); return; } @@ -320,30 +324,30 @@ peerSelectFoo(ps_state * psstate) request->hier.alg = PEER_SA_NETDB; code = CLOSEST_PARENT; debug(44, 2) ("peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(&request->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); return; } else if (peerSelectIcpPing(request, direct, entry)) { assert(entry->ping_status == PING_NONE); request->hier.alg = PEER_SA_ICP; debug(44, 3) ("peerSelect: Doing ICP pings\n"); - psstate->icp.start = current_time; - psstate->icp.n_sent = neighborsUdpPing(request, + psstate->ping.start = current_time; + psstate->ping.n_sent = neighborsUdpPing(request, entry, peerHandlePingReply, psstate, - &psstate->icp.n_replies_expected, - &psstate->icp.timeout); - if (psstate->icp.n_sent == 0) + &psstate->ping.n_replies_expected, + &psstate->ping.timeout); + if (psstate->ping.n_sent == 0) debug(44, 0) ("WARNING: neighborsUdpPing returned 0\n"); debug(44, 3) ("peerSelectFoo: %d ICP replies expected, RTT %d msec\n", - psstate->icp.n_replies_expected, psstate->icp.timeout); - if (psstate->icp.n_replies_expected > 0) { + psstate->ping.n_replies_expected, psstate->ping.timeout); + if (psstate->ping.n_replies_expected > 0) { entry->ping_status = PING_WAITING; eventAdd("peerPingTimeout", peerPingTimeout, psstate, - 0.001 * psstate->icp.timeout, + 0.001 * psstate->ping.timeout, 0); return; } @@ -352,35 +356,35 @@ peerSelectFoo(ps_state * psstate) if (peerCheckNetdbDirect(psstate)) { code = CLOSEST_DIRECT; debug(44, 3) ("peerSelect: %s/%s\n", hier_strings[code], request->host); - hierarchyNote(&request->hier, code, &psstate->icp, request->host); + hierarchyNote(&request->hier, code, &psstate->ping, request->host); peerSelectCallback(psstate, NULL); } else if ((p = whichPeer(&psstate->closest_parent_miss))) { code = CLOSEST_PARENT_MISS; debug(44, 3) ("peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(&request->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); } else if ((p = whichPeer(&psstate->first_parent_miss))) { code = FIRST_PARENT_MISS; debug(44, 3) ("peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(&request->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); } else if ((p = whichPeer(&psstate->single_parent))) { code = SINGLE_PARENT; debug(44, 3) ("peerSelect: %s/%s\n", hier_strings[code], p->host); - hierarchyNote(&request->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); } else if (direct != DIRECT_NO) { code = DIRECT; debug(44, 3) ("peerSelect: %s/%s\n", hier_strings[code], request->host); - hierarchyNote(&request->hier, code, &psstate->icp, request->host); + hierarchyNote(&request->hier, code, &psstate->ping, 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->hier, code, &psstate->icp, p->host); + hierarchyNote(&request->hier, code, &psstate->ping, p->host); peerSelectCallback(psstate, p); } else { code = NO_DIRECT_FAIL; - hierarchyNote(&request->hier, code, &psstate->icp, NULL); + hierarchyNote(&request->hier, code, &psstate->ping, NULL); peerSelectCallbackFail(psstate); } } @@ -400,7 +404,7 @@ peerPingTimeout(void *data) debug(44, 3) ("peerPingTimeout: '%s'\n", storeUrl(entry)); entry->ping_status = PING_TIMEOUT; PeerStats.timeouts++; - psstate->icp.timedout = 1; + psstate->ping.timedout = 1; peerSelectFoo(psstate); } @@ -422,9 +426,9 @@ peerIcpParentMiss(peer * p, icp_common_t * header, ps_state * ps) hops = (header->pad >> 16) & 0xFFFF; if (rtt > 0 && rtt < 0xFFFF) netdbUpdatePeer(ps->request, p, rtt, hops); - if (rtt && (ps->icp.p_rtt == 0 || rtt < ps->icp.p_rtt)) { + if (rtt && (ps->ping.p_rtt == 0 || rtt < ps->ping.p_rtt)) { ps->closest_parent_miss = p->in_addr; - ps->icp.p_rtt = rtt; + ps->ping.p_rtt = rtt; } } } @@ -434,10 +438,10 @@ peerIcpParentMiss(peer * p, icp_common_t * header, ps_state * ps) /* set FIRST_MISS if there is no CLOSEST parent */ if (ps->closest_parent_miss.sin_addr.s_addr != any_addr.s_addr) return; - rtt = tvSubMsec(ps->icp.start, current_time) / p->weight; - if (ps->icp.w_rtt == 0 || rtt < ps->icp.w_rtt) { + rtt = tvSubMsec(ps->ping.start, current_time) / p->weight; + if (ps->ping.w_rtt == 0 || rtt < ps->ping.w_rtt) { ps->first_parent_miss = p->in_addr; - ps->icp.w_rtt = rtt; + ps->ping.w_rtt = rtt; } } @@ -456,36 +460,82 @@ peerHandleIcpReply(peer * p, peer_t type, icp_common_t * header, void *data) peerNoteDigestLookup(request, p, peerDigestLookup(p, request, psstate->entry)); #endif - psstate->icp.n_recv++; + psstate->ping.n_recv++; if (op == ICP_MISS || op == ICP_DECHO) { if (type == PEER_PARENT) peerIcpParentMiss(p, header, psstate); } else if (op == ICP_HIT) { hierarchyNote(&request->hier, type == PEER_PARENT ? PARENT_HIT : SIBLING_HIT, - &psstate->icp, + &psstate->ping, p->host); peerSelectCallback(psstate, p); return; } else if (op == ICP_SECHO) { hierarchyNote(&request->hier, SOURCE_FASTEST, - &psstate->icp, + &psstate->ping, request->host); peerSelectCallback(psstate, NULL); return; } - if (psstate->icp.n_recv < psstate->icp.n_replies_expected) + if (psstate->ping.n_recv < psstate->ping.n_replies_expected) return; peerSelectFoo(psstate); } #if USE_HTCP static void -peerHandleHtcpReply(peer * p, peer_t type, icp_common_t * header, void *data) +peerHandleHtcpReply(peer * p, peer_t type, htcpReplyData * htcp, void *data) { ps_state *psstate = data; - debug(44,1)("peerHandleHtcpReply: write me\n"); + request_t *request = psstate->request; + debug(44, 3) ("peerHandleIcpReply: %s %s\n", + htcp->hit ? "HIT" : "MISS", + storeUrl(psstate->entry)); + psstate->ping.n_recv++; + if (htcp->hit) { + hierarchyNote(&request->hier, + type == PEER_PARENT ? PARENT_HIT : SIBLING_HIT, + &psstate->ping, + p->host); + peerSelectCallback(psstate, p); + return; + } + if (type == PEER_PARENT) + peerHtcpParentMiss(p, htcp, psstate); + if (psstate->ping.n_recv < psstate->ping.n_replies_expected) + return; + peerSelectFoo(psstate); +} + +static void +peerHtcpParentMiss(peer * p, htcpReplyData * htcp, ps_state * ps) +{ + int rtt; + int hops; + if (Config.onoff.query_icmp) { + if (htcp->cto.rtt > 0) { + rtt = (int) htcp->cto.rtt * 1000; + hops = (int) htcp->cto.hops * 1000; + netdbUpdatePeer(ps->request, p, rtt, hops); + if (rtt && (ps->ping.p_rtt == 0 || rtt < ps->ping.p_rtt)) { + ps->closest_parent_miss = p->in_addr; + ps->ping.p_rtt = rtt; + } + } + } + /* if closest-only is set, then don't allow FIRST_PARENT_MISS */ + if (EBIT_TEST(p->options, NEIGHBOR_CLOSEST_ONLY)) + return; + /* set FIRST_MISS if there is no CLOSEST parent */ + if (ps->closest_parent_miss.sin_addr.s_addr != any_addr.s_addr) + return; + rtt = tvSubMsec(ps->ping.start, current_time) / p->weight; + if (ps->ping.w_rtt == 0 || rtt < ps->ping.w_rtt) { + ps->first_parent_miss = p->in_addr; + ps->ping.w_rtt = rtt; + } } #endif -- 2.47.3