From 2d4d40fd9f13086e8bb608f4713d14683538ce9f Mon Sep 17 00:00:00 2001 From: Walter Karas Date: Fri, 4 Jun 2021 13:52:44 -0500 Subject: [PATCH] For peering ring, make upstream group of hosts optional. Add Au tests for strategies.yaml, with consistent hashing, with peering. Caching is disabled when the next hop is a peer (in the first host group). --- doc/admin-guide/files/strategies.yaml.en.rst | 13 +- proxy/http/remap/NextHopConsistentHash.cc | 231 ++--- proxy/http/remap/NextHopSelectionStrategy.cc | 31 +- proxy/http/remap/NextHopSelectionStrategy.h | 1 + proxy/http/remap/unit-tests/peering.yaml | 6 +- .../unit-tests/test_NextHopConsistentHash.cc | 8 +- .../next_hop/zzz_strategies_peer/body.gold | 1 + .../next_hop/zzz_strategies_peer/trace.gold | 793 ++++++++++++++++++ .../zzz_strategies_peer.test.py | 177 ++++ .../next_hop/zzz_strategies_peer2/body.gold | 1 + .../next_hop/zzz_strategies_peer2/trace.gold | 771 +++++++++++++++++ .../zzz_strategies_peer2.test.py | 169 ++++ 12 files changed, 2085 insertions(+), 117 deletions(-) create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer/body.gold create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer/trace.gold create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer/zzz_strategies_peer.test.py create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer2/body.gold create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer2/trace.gold create mode 100644 tests/gold_tests/next_hop/zzz_strategies_peer2/zzz_strategies_peer2.test.py diff --git a/doc/admin-guide/files/strategies.yaml.en.rst b/doc/admin-guide/files/strategies.yaml.en.rst index 15f0369b902..4055e072e15 100644 --- a/doc/admin-guide/files/strategies.yaml.en.rst +++ b/doc/admin-guide/files/strategies.yaml.en.rst @@ -190,12 +190,21 @@ Each **strategy** in the list may using the following parameters:: #. **exhaust_ring**: when a host normally selected by the policy fails, another host is selected from the same group. A new group is not selected until all hosts on the previous group have been exhausted #. **alternate_ring**: retry hosts are selected from groups in an alternating group fashion. - #. **peering_ring** This mode is only implemented for a policy of **consistent_hash** and requires that two host groups are defined. The first host group is a list of peer caches and "this" host itself, the second group is a list of upstream caches. Parents are always selected from the peer list however, if the selected parent is "this" host itself a new parent from the upstream list is chosen. In addition, if any peer host is unreachable or times out, a host from the upstream list is chosen for retries. + #. **peering_ring**: This mode is only implemented for a policy of **consistent_hash** and requires that one or two + host groups are defined. The first host group is a list of peer caches and "this" host itself, the (optional) second + group is a list of upstream caches. Parents are always selected from the peer list however, if the selected parent is + "this" host itself a new parent from the upstream list is chosen. If the second group is omitted, and **go_direct** + is **true**, the upstream "list" has one element, + the host in the remapped URL. In addition, if any peer host is unreachable or times out, a host from the upstream + list is chosen for retries. Because the peer hosts may at times not have consistent up/down markings for the other + peers, requests may be looped sometimes. So it's best to use :ts:cv:`proxy.config.http.insert_request_via_str` and :ts:cv:`proxy.config.http.max_proxy_cycles` to stop looping. - **response_codes**: Part of the **failover** map. This is a list of **http** response codes that may be used for **simple retry**. - **markdown_codes**: Part of the **failover** map. This is a list of **http** response codes that may be used for **unavailable retry** which will cause a parent markdown. - **health_check**: Part of the **failover** map. A list of health checks. **passive** is the default and means that the state machine marks down **hosts** when a transaction timeout or connection error is detected. **passive** is always used by the next hop strategies. **active** means that some external process may actively health check the hosts using the defined **health check url** and mark them down using **traffic_ctl**. - + - **self**: Part of the **failover** map. This can only be used when **ring_mode** is **peering_ring**. This is the hostname of the host in the (first) group of peers that is the local host |TS| runs on. + (**self** should only be necessary when the local hostname can only be translated to an IP address + with a DNS lookup.) Example: :: diff --git a/proxy/http/remap/NextHopConsistentHash.cc b/proxy/http/remap/NextHopConsistentHash.cc index 4ad77e2b8af..f6f304aa798 100644 --- a/proxy/http/remap/NextHopConsistentHash.cc +++ b/proxy/http/remap/NextHopConsistentHash.cc @@ -212,6 +212,8 @@ NextHopConsistentHash::getHashKey(uint64_t sm_id, HttpRequestData *hrdata, ATSHa void NextHopConsistentHash::findNextHop(TSHttpTxn txnp, void *ih, time_t now) { + uint32_t const NO_RING_USE_POST_REMAP = uint32_t(0) - 1; + HttpSM *sm = reinterpret_cast(txnp); ParentResult *result = &sm->t_state.parent_result; HttpRequestData request_info = sm->t_state.request_data; @@ -232,7 +234,6 @@ NextHopConsistentHash::findNextHop(TSHttpTxn txnp, void *ih, time_t now) TSHostStatus host_stat = TSHostStatus::TS_HOST_STATUS_INIT; HostStatRec *hst = nullptr; Machine *machine = Machine::instance(); - ; if (result->line_number == -1 && result->result == PARENT_UNDEFINED) { firstcall = true; @@ -259,10 +260,14 @@ NextHopConsistentHash::findNextHop(TSHttpTxn txnp, void *ih, time_t now) } break; case NH_PEERING_RING: - ink_assert(groups == 2); - // look for the next parent on the - // upstream ring. - result->last_group = cur_ring = 1; + if (groups == 1) { + result->last_group = cur_ring = NO_RING_USE_POST_REMAP; + } else { + ink_assert(groups == 2); + // look for the next parent on the + // upstream ring. + result->last_group = cur_ring = 1; + } break; case NH_EXHAUST_RING: default: @@ -275,125 +280,135 @@ NextHopConsistentHash::findNextHop(TSHttpTxn txnp, void *ih, time_t now) } } - // Do the initial parent look-up. - hash_key = getHashKey(sm_id, &request_info, &hash); - - do { // search until we've selected a different parent if !firstcall - std::shared_ptr r = rings[cur_ring]; - hostRec = chash_lookup(r, hash_key, &result->chashIter[cur_ring], &wrapped, &hash, &result->chash_init[cur_ring], - &result->mapWrapped[cur_ring], sm_id); - wrap_around[cur_ring] = wrapped; - lookups++; - // the 'available' flag is maintained in 'host_groups' and not the hash ring. - if (hostRec) { - pRec = host_groups[hostRec->group_index][hostRec->host_index]; - if (firstcall) { - hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; - result->first_choice_status = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; - // if peering and the selected host is myself, change rings and search for an upstream - // parent. - if (ring_mode == NH_PEERING_RING && machine->is_self(pRec->hostname)) { - // switch to the upstream ring. - cur_ring = 1; - continue; - } - break; - } - } else { - pRec = nullptr; - } - } while (pRec && result->hostname && strcmp(pRec->hostname.c_str(), result->hostname) == 0); - - NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] Initial parent lookups: %d", sm_id, lookups); + if (cur_ring != NO_RING_USE_POST_REMAP) { + // Do the initial parent look-up. + hash_key = getHashKey(sm_id, &request_info, &hash); - // ---------------------------------------------------------------------------------------------------- - // Validate initial parent look-up and perform additional look-ups if required. - // ---------------------------------------------------------------------------------------------------- - - hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; - host_stat = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; - // if the config ignore_self_detect is set to true and the host is down due to SELF_DETECT reason - // ignore the down status and mark it as available - if ((pRec && ignore_self_detect) && (hst && hst->status == TS_HOST_STATUS_DOWN)) { - if (hst->reasons == Reason::SELF_DETECT) { - host_stat = TS_HOST_STATUS_UP; - } - } - if (!pRec || (pRec && !pRec->available.load()) || host_stat == TS_HOST_STATUS_DOWN) { - do { - // check if an unavailable server is now retryable, use it. - if (pRec && !pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { - // check if the host is retryable. It's retryable if the retry window has elapsed - _now == 0 ? _now = time(nullptr) : _now = now; - if ((pRec->failedAt.load() + retry_time) < static_cast(_now)) { - NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] next hop %s, retriers: %d", sm_id, pRec->hostname.c_str(), pRec->retriers()); - if (pRec->retriers.inc(max_retriers)) { - nextHopRetry = true; - result->last_parent = pRec->host_index; - result->last_lookup = pRec->group_index; - result->retry = nextHopRetry; - result->result = PARENT_SPECIFIED; - NH_Debug(NH_DEBUG_TAG, - "[%" PRIu64 "] next hop %s is now retryable, marked it available, retriers: %d, max_retriers: %d.", sm_id, - pRec->hostname.c_str(), pRec->retriers(), max_retriers); - break; - } - } - } - switch (ring_mode) { - case NH_ALTERNATE_RING: - if (pRec && groups > 0) { - cur_ring = (pRec->group_index + 1) % groups; - } else { - cur_ring = 0; - } - break; - case NH_EXHAUST_RING: - default: - if (wrap_around[cur_ring] && groups > 1) { - cur_ring = (cur_ring + 1) % groups; - } - break; - } + do { // search until we've selected a different parent if !firstcall std::shared_ptr r = rings[cur_ring]; hostRec = chash_lookup(r, hash_key, &result->chashIter[cur_ring], &wrapped, &hash, &result->chash_init[cur_ring], &result->mapWrapped[cur_ring], sm_id); wrap_around[cur_ring] = wrapped; lookups++; + // the 'available' flag is maintained in 'host_groups' and not the hash ring. if (hostRec) { - pRec = host_groups[hostRec->group_index][hostRec->host_index]; - hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; - host_stat = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; - // if the config ignore_self_detect is set to true and the host is down due to SELF_DETECT reason - // ignore the down status and mark it as available - if ((pRec && ignore_self_detect) && (hst && hst->status == TS_HOST_STATUS_DOWN)) { - if (hst->reasons == Reason::SELF_DETECT) { - host_stat = TS_HOST_STATUS_UP; + pRec = host_groups[hostRec->group_index][hostRec->host_index]; + if (firstcall) { + hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; + result->first_choice_status = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; + // if peering and the selected host is myself, change rings and search for an upstream + // parent. + if (ring_mode == NH_PEERING_RING && (pRec->self || machine->is_self(pRec->hostname.c_str()))) { + if (groups == 1) { + // use host from post-remap URL + cur_ring = NO_RING_USE_POST_REMAP; + pRec = nullptr; + } else { + // switch to the upstream ring. + cur_ring = 1; + continue; + } } - } - NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] Selected a new parent: %s, available: %s, wrapped: %s, lookups: %d.", sm_id, - pRec->hostname.c_str(), (pRec->available.load()) ? "true" : "false", (wrapped) ? "true" : "false", lookups); - // use available host. - if (pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { break; } } else { pRec = nullptr; } - bool all_wrapped = true; - for (uint32_t c = 0; c < groups; c++) { - if (wrap_around[c] == false) { - all_wrapped = false; + } while (pRec && result->hostname && strcmp(pRec->hostname.c_str(), result->hostname) == 0); + + NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] Initial parent lookups: %d", sm_id, lookups); + + // ---------------------------------------------------------------------------------------------------- + // Validate initial parent look-up and perform additional look-ups if required. + // ---------------------------------------------------------------------------------------------------- + + if (cur_ring != NO_RING_USE_POST_REMAP) { + hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; + host_stat = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; + // if the config ignore_self_detect is set to true and the host is down due to SELF_DETECT reason + // ignore the down status and mark it as available + if ((pRec && ignore_self_detect) && (hst && hst->status == TS_HOST_STATUS_DOWN)) { + if (hst->reasons == Reason::SELF_DETECT) { + host_stat = TS_HOST_STATUS_UP; } } - if (all_wrapped) { - NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] No available parents.", sm_id); - if (pRec) { - pRec = nullptr; - } - break; + if (!pRec || (pRec && !pRec->available.load()) || host_stat == TS_HOST_STATUS_DOWN) { + do { + // check if an unavailable server is now retryable, use it. + if (pRec && !pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { + // check if the host is retryable. It's retryable if the retry window has elapsed + _now == 0 ? _now = time(nullptr) : _now = now; + if ((pRec->failedAt.load() + retry_time) < static_cast(_now)) { + NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] next hop %s, retriers: %d", sm_id, pRec->hostname.c_str(), pRec->retriers()); + if (pRec->retriers.inc(max_retriers)) { + nextHopRetry = true; + result->last_parent = pRec->host_index; + result->last_lookup = pRec->group_index; + result->retry = nextHopRetry; + result->result = PARENT_SPECIFIED; + NH_Debug(NH_DEBUG_TAG, + "[%" PRIu64 "] next hop %s is now retryable, marked it available, retriers: %d, max_retriers: %d.", sm_id, + pRec->hostname.c_str(), pRec->retriers(), max_retriers); + break; + } + } + } + switch (ring_mode) { + case NH_ALTERNATE_RING: + if (pRec && groups > 0) { + cur_ring = (pRec->group_index + 1) % groups; + } else { + cur_ring = 0; + } + break; + case NH_EXHAUST_RING: + default: + if (wrap_around[cur_ring] && groups > 1) { + cur_ring = (cur_ring + 1) % groups; + } + break; + } + std::shared_ptr r = rings[cur_ring]; + hostRec = chash_lookup(r, hash_key, &result->chashIter[cur_ring], &wrapped, &hash, &result->chash_init[cur_ring], + &result->mapWrapped[cur_ring], sm_id); + wrap_around[cur_ring] = wrapped; + lookups++; + if (hostRec) { + pRec = host_groups[hostRec->group_index][hostRec->host_index]; + hst = (pRec) ? pStatus.getHostStatus(pRec->hostname.c_str()) : nullptr; + host_stat = (hst) ? hst->status : TSHostStatus::TS_HOST_STATUS_UP; + // if the config ignore_self_detect is set to true and the host is down due to SELF_DETECT reason + // ignore the down status and mark it as available + if ((pRec && ignore_self_detect) && (hst && hst->status == TS_HOST_STATUS_DOWN)) { + if (hst->reasons == Reason::SELF_DETECT) { + host_stat = TS_HOST_STATUS_UP; + } + } + NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] Selected a new parent: %s, available: %s, wrapped: %s, lookups: %d.", sm_id, + pRec->hostname.c_str(), (pRec->available.load()) ? "true" : "false", (wrapped) ? "true" : "false", lookups); + // use available host. + if (pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { + break; + } + } else { + pRec = nullptr; + } + bool all_wrapped = true; + for (uint32_t c = 0; c < groups; c++) { + if (wrap_around[c] == false) { + all_wrapped = false; + } + } + if (all_wrapped) { + NH_Debug(NH_DEBUG_TAG, "[%" PRIu64 "] No available parents.", sm_id); + if (pRec) { + pRec = nullptr; + } + break; + } + } while (!pRec || (pRec && !pRec->available.load()) || host_stat == TS_HOST_STATUS_DOWN); } - } while (!pRec || (pRec && !pRec->available.load()) || host_stat == TS_HOST_STATUS_DOWN); + } } // ---------------------------------------------------------------------------------------------------- diff --git a/proxy/http/remap/NextHopSelectionStrategy.cc b/proxy/http/remap/NextHopSelectionStrategy.cc index 67489b7cf3a..1ff465cb8f0 100644 --- a/proxy/http/remap/NextHopSelectionStrategy.cc +++ b/proxy/http/remap/NextHopSelectionStrategy.cc @@ -63,6 +63,8 @@ bool NextHopSelectionStrategy::Init(ts::Yaml::Map &n) { NH_Debug(NH_DEBUG_TAG, "calling Init()"); + std::string self_host; + bool self_host_used = false; try { if (n["scheme"]) { @@ -108,7 +110,12 @@ NextHopSelectionStrategy::Init(ts::Yaml::Map &n) } else if (ring_mode_val == exhaust_rings) { ring_mode = NH_EXHAUST_RING; } else if (ring_mode_val == peering_rings) { - ring_mode = NH_PEERING_RING; + ring_mode = NH_PEERING_RING; + YAML::Node self_node = failover_node["self"]; + if (self_node) { + self_host = self_node.Scalar(); + NH_Debug(NH_DEBUG_TAG, "%s is self", self_host.c_str()); + } } else { ring_mode = NH_ALTERNATE_RING; NH_Note("Invalid 'ring_mode' value, '%s', for the strategy named '%s', using default '%s'.", ring_mode_val.c_str(), @@ -214,8 +221,14 @@ NextHopSelectionStrategy::Init(ts::Yaml::Map &n) std::shared_ptr host_rec = std::make_shared(hosts_list[hst].as()); host_rec->group_index = grp; host_rec->host_index = hst; - if (mach->is_self(host_rec->hostname)) { + if ((self_host == host_rec->hostname) || mach->is_self(host_rec->hostname.c_str())) { + if (ring_mode == NH_PEERING_RING && grp != 0) { + throw std::invalid_argument("self host (" + self_host + + ") can only appear in first host group for peering ring mode"); + } h_stat.setHostStatus(host_rec->hostname.c_str(), TSHostStatus::TS_HOST_STATUS_DOWN, 0, Reason::SELF_DETECT); + host_rec->self = true; + self_host_used = true; } hosts_inner.push_back(std::move(host_rec)); num_parents++; @@ -226,14 +239,24 @@ NextHopSelectionStrategy::Init(ts::Yaml::Map &n) } } } + if (!self_host.empty() && !self_host_used) { + throw std::invalid_argument("self host (" + self_host + ") does not appear in the first (peer) group"); + } } catch (std::exception &ex) { NH_Error("Error parsing the strategy named '%s' due to '%s', this strategy will be ignored.", strategy_name.c_str(), ex.what()); return false; } if (ring_mode == NH_PEERING_RING) { - if (groups != 2) { - NH_Error("ring mode is '%s', requires two host groups (peering group and an upstream group).", peering_rings.data()); + if (groups == 1) { + if (!go_direct) { + NH_Error("when ring mode is '%s', go_direct must be true when there is only one host group.", peering_rings.data()); + return false; + } + } else if (groups != 2) { + NH_Error("when ring mode is '%s', requires two host groups (peering group and an upstream group)," + " or just a single peering group with go_direct.", + peering_rings.data()); return false; } if (policy_type != NH_CONSISTENT_HASH) { diff --git a/proxy/http/remap/NextHopSelectionStrategy.h b/proxy/http/remap/NextHopSelectionStrategy.h index ca4a1749a79..26a06068914 100644 --- a/proxy/http/remap/NextHopSelectionStrategy.h +++ b/proxy/http/remap/NextHopSelectionStrategy.h @@ -114,6 +114,7 @@ struct HostRecord : ATSConsistentHashNode { std::string hash_string; int host_index; int group_index; + bool self = false; std::vector> protocols; pRetriers retriers; diff --git a/proxy/http/remap/unit-tests/peering.yaml b/proxy/http/remap/unit-tests/peering.yaml index dae131a181b..d04018c1a0a 100644 --- a/proxy/http/remap/unit-tests/peering.yaml +++ b/proxy/http/remap/unit-tests/peering.yaml @@ -96,10 +96,10 @@ groups: weight: 0.25 - <<: *p2 weight: 0.25 - - <<: *p2 - weight: 0.25 - <<: *p3 weight: 0.25 + - <<: *p4 + weight: 0.25 - &g2 - <<: *m1 weight: 0.33 @@ -121,6 +121,8 @@ strategies: max_simple_retries: 2 ring_mode: peering_ring + self: + p3.bar.com response_codes: # defines the responses codes for failover in exhaust_ring mode - 404 health_check: # specifies the list of healthchecks that should be considered for failover. A list of enums: 'passive' or 'active' diff --git a/proxy/http/remap/unit-tests/test_NextHopConsistentHash.cc b/proxy/http/remap/unit-tests/test_NextHopConsistentHash.cc index 1f36e3104a8..ad4f0d24b10 100644 --- a/proxy/http/remap/unit-tests/test_NextHopConsistentHash.cc +++ b/proxy/http/remap/unit-tests/test_NextHopConsistentHash.cc @@ -631,7 +631,7 @@ SCENARIO("Testing NextHopConsistentHash using a peering ring_mode.") // Get all of the HTTP WKS items populated. http_init(); - GIVEN("Loading the consistent-hash-tests.yaml config for 'consistent_hash' tests.") + GIVEN("Loading the peering.yaml config for 'consistent_hash' tests.") { std::shared_ptr strategy; NextHopStrategyFactory nhf(TS_SRC_DIR "unit-tests/peering.yaml"); @@ -646,6 +646,12 @@ SCENARIO("Testing NextHopConsistentHash using a peering ring_mode.") REQUIRE(strategy->groups == 2); REQUIRE(strategy->ring_mode == NH_PEERING_RING); REQUIRE(strategy->policy_type == NH_CONSISTENT_HASH); + for (std::size_t i = 0; i < strategy->host_groups.size(); ++i) { + for (auto const &elem : strategy->host_groups[i]) { + bool should_be_self = elem.get()->hostname == "p3.bar.com" && i == 0; + REQUIRE(elem.get()->self == should_be_self); + } + } } } } diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer/body.gold b/tests/gold_tests/next_hop/zzz_strategies_peer/body.gold new file mode 100644 index 00000000000..b220ced9569 --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer/body.gold @@ -0,0 +1 @@ +This is the body. diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer/trace.gold b/tests/gold_tests/next_hop/zzz_strategies_peer/trace.gold new file mode 100644 index 00000000000..6dc95c6f4c1 --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer/trace.gold @@ -0,0 +1,793 @@ +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://dummy.com/obj0 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://not_used/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://not_used/obj7 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://also_not_used/obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://also_not_used/obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://also_not_used/obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://dummy.com/obj8 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://not_used/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://dummy.com/obj0 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://not_used/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://not_used/obj7 HTTP/1.1 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://also_not_used/obj7 HTTP/1.1 +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://dummy.com/obj8 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://not_used/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://dummy.com/obj1 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj1 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://not_used/obj1 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://dummy.com/obj9 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj9 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://not_used/obj9 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://not_used/obj10 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://also_not_used/obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://also_not_used/obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://also_not_used/obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://dummy.com/obj3 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj3 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://not_used/obj3 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://not_used/obj10 HTTP/1.1 +trace_peer1.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer1.log:GET http://also_not_used/obj10 HTTP/1.1 +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://dummy.com/obj11 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj11 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://not_used/obj11 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://dummy.com/obj2 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj2 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://not_used/obj2 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj3 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://also_not_used/obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://also_not_used/obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://also_not_used/obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj4 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://also_not_used/obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://also_not_used/obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://also_not_used/obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj5 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://also_not_used/obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://also_not_used/obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://also_not_used/obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj6 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://also_not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://also_not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://also_not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://dummy.com/obj10 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj10 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://not_used/obj10 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj12 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://also_not_used/obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://also_not_used/obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://also_not_used/obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj3 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://also_not_used/obj3 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj4 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://also_not_used/obj4 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj5 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://also_not_used/obj5 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://dummy.com/obj6 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://not_used/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://not_used/obj12 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://also_not_used/obj12 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://dummy.com/obj14 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj14 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://not_used/obj14 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj0 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://also_not_used/obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://also_not_used/obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://also_not_used/obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://dummy.com/obj3 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj3 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://not_used/obj3 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://dummy.com/obj11 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj11 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://not_used/obj11 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj13 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://also_not_used/obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://also_not_used/obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://also_not_used/obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj15 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://also_not_used/obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://also_not_used/obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://also_not_used/obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj0 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://also_not_used/obj0 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://dummy.com/obj1 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj1 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://not_used/obj1 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://dummy.com/obj9 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj9 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://not_used/obj9 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj13 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://also_not_used/obj13 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj15 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://also_not_used/obj15 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://dummy.com/obj4 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://dummy.com/obj12 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://dummy.com/obj4 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://dummy.com/obj12 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://not_used/obj1 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://also_not_used/obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://also_not_used/obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://also_not_used/obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://dummy.com/obj5 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj5 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://not_used/obj5 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://dummy.com/obj13 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj13 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://not_used/obj13 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://not_used/obj14 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://also_not_used/obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://also_not_used/obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://also_not_used/obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://not_used/obj1 HTTP/1.1 +trace_peer5.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer5.log:GET http://also_not_used/obj1 HTTP/1.1 +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://dummy.com/obj7 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj7 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://not_used/obj7 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://not_used/obj14 HTTP/1.1 +trace_peer5.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer5.log:GET http://also_not_used/obj14 HTTP/1.1 +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://dummy.com/obj15 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj15 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://not_used/obj15 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://dummy.com/obj6 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj6 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://not_used/obj6 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://not_used/obj8 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://also_not_used/obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://also_not_used/obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://also_not_used/obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://dummy.com/obj14 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj14 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://not_used/obj14 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://dummy.com/obj2 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj2 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://not_used/obj2 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://not_used/obj8 HTTP/1.1 +trace_peer6.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer6.log:GET http://also_not_used/obj8 HTTP/1.1 +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://dummy.com/obj10 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj10 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://not_used/obj10 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj2 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://also_not_used/obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://also_not_used/obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://also_not_used/obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://dummy.com/obj7 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj7 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://not_used/obj7 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj9 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://also_not_used/obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://also_not_used/obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://also_not_used/obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj11 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://also_not_used/obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://also_not_used/obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://also_not_used/obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://dummy.com/obj15 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj15 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://not_used/obj15 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj2 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://also_not_used/obj2 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://dummy.com/obj5 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj5 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://not_used/obj5 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj9 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://also_not_used/obj9 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj11 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://also_not_used/obj11 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://dummy.com/obj13 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj13 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://not_used/obj13 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer/zzz_strategies_peer.test.py b/tests/gold_tests/next_hop/zzz_strategies_peer/zzz_strategies_peer.test.py new file mode 100644 index 00000000000..a6c262a584f --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer/zzz_strategies_peer.test.py @@ -0,0 +1,177 @@ +''' +''' +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Test.Summary = ''' +Test next hop selection using strategies.yaml with consistent hashing, with peering. +''' + +# The tls_conn_timeout test will fail if it runs before this test in CI. Therefore, this test has a zzz +# prefix so it will run last in CI. + +# Define and populate MicroServer. +# +server = Test.MakeOriginServer("server") +response_header = { + "headers": + "HTTP/1.1 200 OK\r\n" + "Connection: close\r\n" + "Cache-control: max-age=85000\r\n" + "\r\n", + "timestamp": "1469733493.993", + "body": "This is the body.\n" +} +num_object = 16 +for i in range(num_object): + request_header = { + "headers": + f"GET /obj{i} HTTP/1.1\r\n" + "Host: does.not.matter\r\n" # But cannot be omitted. + "\r\n", + "timestamp": "1469733493.993", + "body": "" + } + server.addResponse("sessionlog.json", request_header, response_header) + +dns = Test.MakeDNServer("dns") + +# Define upstream trafficserver instances. +# +num_upstream = 6 +ts_upstream = [] +for i in range(num_upstream): + ts = Test.MakeATSProcess(f"ts_upstream{i}") + dns.addRecords(records={f"ts_upstream{i}": ["127.0.0.1"]}) + ts.Disk.records_config.update({ + 'proxy.config.diags.debug.enabled': 1, + 'proxy.config.diags.debug.tags': 'http|dns', + 'proxy.config.dns.nameservers': f"127.0.0.1:{dns.Variables.Port}", + 'proxy.config.dns.resolv_conf': "NULL", + }) + ts.Disk.remap_config.AddLine( + f"map / http://127.0.0.1:{server.Variables.Port}" + ) + ts_upstream.append(ts) + +# Define peer trafficserver instances. +# +num_peer = 8 +ts_peer = [] +for i in range(num_peer): + ts = Test.MakeATSProcess(f"ts_peer{i}", command=f"traffic_server 2> trace_peer{i}.log") + ts_peer.append(ts) +for i in range(num_peer): + ts = ts_peer[i] + dns.addRecords(records={f"ts_peer{i}": ["127.0.0.1"]}) + + ts.Disk.records_config.update({ + 'proxy.config.diags.debug.enabled': 1, + 'proxy.config.diags.debug.tags': 'http|dns|parent|next_hop|host_statuses|hostdb|cachekey', + 'proxy.config.dns.nameservers': f"127.0.0.1:{dns.Variables.Port}", # Only nameservers if resolv_conf NULL. + 'proxy.config.dns.resolv_conf': "NULL", # This defaults to /etc/resvolv.conf (OS namesevers) if not NULL. + 'proxy.config.http.cache.http': 1, + 'proxy.config.http.cache.required_headers': 0, + 'proxy.config.http.uncacheable_requests_bypass_parent': 0, + 'proxy.config.http.no_dns_just_forward_to_parent': 1, + 'proxy.config.http.parent_proxy.mark_down_hostdb': 0, + 'proxy.config.http.parent_proxy.self_detect': 1, + }) + + ts.Disk.File(ts.Variables.CONFIGDIR + "/strategies.yaml", id="strategies", typename="ats:config") + s = ts.Disk.strategies + s.AddLine("groups:") + s.AddLine(" - &peer_group") + for j in range(num_peer): + s.AddLine(f" - host: ts_peer{j}") + s.AddLine(f" protocol:") + s.AddLine(f" - scheme: http") + s.AddLine(f" port: {ts_peer[j].Variables.port}") + # The health check URL does not seem to be used currently. + # s.AddLine(f" health_check_url: http://ts_peer{j}:{ts_peer[j].Variables.port}") + s.AddLine(f" weight: 1.0") + s.AddLine(" - &peer_upstream") + for j in range(num_upstream): + s.AddLine(f" - host: ts_upstream{j}") + s.AddLine(f" protocol:") + s.AddLine(f" - scheme: http") + s.AddLine(f" port: {ts_upstream[j].Variables.port}") + # The health check URL does not seem to be used currently. + # s.AddLine(f" health_check_url: http://ts_upstream{j}:{ts_upstream[j].Variables.port}") + s.AddLine(f" weight: 1.0") + s.AddLines([ + "strategies:", + " - strategy: the-strategy", + " policy: consistent_hash", + " hash_key: cache_key", + " go_direct: false", + " parent_is_proxy: true", + " cache_peer_result: false", + " ignore_self_detect: false", + " groups:", + " - *peer_group", + " - *peer_upstream", + " scheme: http", + " failover:", + " ring_mode: peering_ring", + f" self: ts_peer{i}", + #" max_simple_retries: 2", + #" response_codes:", + #" - 404", + #" health_check:", + #" - passive", + ]) + + suffix = " @strategy=the-strategy @plugin=cachekey.so @pparam=--uri-type=remap @pparam=--capture-prefix=/(.*):(.*)/$1/" + ts.Disk.remap_config.AddLines([ + "map http://dummy.com http://not_used" + suffix, + "map http://not_used http://also_not_used" + suffix, + ]) + +tr = Test.AddTestRun() +tr.Processes.Default.StartBefore(server) +tr.Processes.Default.StartBefore(dns) +for i in range(num_peer): + tr.Processes.Default.StartBefore(ts_peer[i]) +for i in range(num_upstream): + tr.Processes.Default.StartBefore(ts_upstream[i]) +tr.Processes.Default.Command = 'echo start peer and upstream TSes, HTTP server and DNS server' +tr.Processes.Default.ReturnCode = 0 + +for i in range(num_object): + tr = Test.AddTestRun() + tr.Processes.Default.Command = ( + f'curl --verbose --proxy 127.0.0.1:{ts_peer[i % num_peer].Variables.port} http://dummy.com/obj{i}' + ) + tr.Processes.Default.Streams.stdout = "body.gold" + tr.Processes.Default.ReturnCode = 0 + +for i in range(num_object): + tr = Test.AddTestRun() + # num_peer must not be a multiple of 3 + tr.Processes.Default.Command = ( + f'curl --verbose --proxy 127.0.0.1:{ts_peer[(i * 3) % num_peer].Variables.port} http://dummy.com/obj{i}' + ) + tr.Processes.Default.Streams.stdout = "body.gold" + tr.Processes.Default.ReturnCode = 0 + +tr = Test.AddTestRun() +tr.Processes.Default.Command = ( + "grep -e '^+++' -e '^[A-Z].*TTP/' -e '^.alts. --' -e 'PARENT_SPECIFIED' trace_peer*.log" + " | sed 's/^.*(next_hop) [^ ]* //' | sed 's/[.][0-9]*$$//'" +) +tr.Processes.Default.Streams.stdout = "trace.gold" +tr.Processes.Default.ReturnCode = 0 diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer2/body.gold b/tests/gold_tests/next_hop/zzz_strategies_peer2/body.gold new file mode 100644 index 00000000000..b220ced9569 --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer2/body.gold @@ -0,0 +1 @@ +This is the body. diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer2/trace.gold b/tests/gold_tests/next_hop/zzz_strategies_peer2/trace.gold new file mode 100644 index 00000000000..f4fda63651b --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer2/trace.gold @@ -0,0 +1,771 @@ +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET /obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET /obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer0.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer0.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer0.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET /obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET /obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer1.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer1.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer1.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer1.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer1.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET /obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET /obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET /obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET /obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET /obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET /obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET /obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET /obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET /obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET /obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer2.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer2.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer2.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer2.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer2.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET /obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET /obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj3 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET /obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET /obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET /obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET /obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer3.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer3.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer3.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer3.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer3.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Incoming Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +trace_peer4.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer4.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer4.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET /obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET /obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET /obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET /obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer5.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer5.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Incoming Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer5.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer5.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer5.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer5.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET /obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET /obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj14 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer6.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj8 HTTP/1.1 +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer6.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj10 HTTP/1.1 +trace_peer6.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer6.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer6.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET /obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET /obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj7 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET /obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET /obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET /obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET /obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj15 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj5 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj9 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer7.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj11 HTTP/1.1 +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +result->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer7.log:+++++++++ Proxy's Request after hooks +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj13 HTTP/1.1 +trace_peer7.log:+++++++++ Incoming O.S. Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Base Header for Building Response +++++++++ +trace_peer7.log:HTTP/1.1 200 OK +trace_peer7.log:+++++++++ Proxy's Response 2 +++++++++ +trace_peer7.log:HTTP/1.1 200 OK diff --git a/tests/gold_tests/next_hop/zzz_strategies_peer2/zzz_strategies_peer2.test.py b/tests/gold_tests/next_hop/zzz_strategies_peer2/zzz_strategies_peer2.test.py new file mode 100644 index 00000000000..20c4515e160 --- /dev/null +++ b/tests/gold_tests/next_hop/zzz_strategies_peer2/zzz_strategies_peer2.test.py @@ -0,0 +1,169 @@ +''' +''' +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +Test.Summary = ''' +Test next hop using strategies.yaml with consistent hashing, with peering, and no upstream group" +''' + +# The tls_conn_timeout test will fail if it runs before this test in CI. Therefore, this test has a zzz +# prefix so it will run last in CI. + +# Define and populate MicroServer. +# +server = Test.MakeOriginServer("server") +response_header = { + "headers": + "HTTP/1.1 200 OK\r\n" + "Connection: close\r\n" + "Cache-control: max-age=85000\r\n" + "\r\n", + "timestamp": "1469733493.993", + "body": "This is the body.\n" +} +num_object = 16 +for i in range(num_object): + request_header = { + "headers": + f"GET /obj{i} HTTP/1.1\r\n" + "Host: does.not.matter\r\n" # But cannot be omitted. + "\r\n", + "timestamp": "1469733493.993", + "body": "" + } + server.addResponse("sessionlog.json", request_header, response_header) + +dns = Test.MakeDNServer("dns") + +# Define upstream trafficserver instances. +# +num_upstream = 6 +ts_upstream = [] +for i in range(num_upstream): + ts = Test.MakeATSProcess(f"ts_upstream{i}") + dns.addRecords(records={f"ts_upstream{i}": ["127.0.0.1"]}) + ts.Disk.records_config.update({ + 'proxy.config.diags.debug.enabled': 1, + 'proxy.config.diags.debug.tags': 'http|dns', + 'proxy.config.dns.nameservers': f"127.0.0.1:{dns.Variables.Port}", + 'proxy.config.dns.resolv_conf': "NULL", + }) + ts.Disk.remap_config.AddLine( + f"map / http://127.0.0.1:{server.Variables.Port}" + ) + ts_upstream.append(ts) + +# Define peer trafficserver instances. +# +num_peer = 8 +ts_peer = [] +for i in range(num_peer): + ts = Test.MakeATSProcess(f"ts_peer{i}", command=f"traffic_server 2> trace_peer{i}.log") + ts_peer.append(ts) +for i in range(num_peer): + ts = ts_peer[i] + dns.addRecords(records={f"ts_peer{i}": ["127.0.0.1"]}) + + ts.Disk.records_config.update({ + 'proxy.config.diags.debug.enabled': 1, + 'proxy.config.diags.debug.tags': 'http|dns|parent|next_hop|host_statuses|hostdb', + 'proxy.config.dns.nameservers': f"127.0.0.1:{dns.Variables.Port}", # Only nameservers if resolv_conf NULL. + 'proxy.config.dns.resolv_conf': "NULL", # This defaults to /etc/resvolv.conf (OS namesevers) if not NULL. + 'proxy.config.http.cache.http': 1, + 'proxy.config.http.cache.required_headers': 0, + 'proxy.config.http.uncacheable_requests_bypass_parent': 0, + 'proxy.config.http.no_dns_just_forward_to_parent': 0, + 'proxy.config.http.parent_proxy.mark_down_hostdb': 0, + 'proxy.config.http.parent_proxy.self_detect': 1, + }) + + ts.Disk.File(ts.Variables.CONFIGDIR + "/strategies.yaml", id="strategies", typename="ats:config") + s = ts.Disk.strategies + s.AddLine("groups:") + s.AddLine(" - &peer_group") + for j in range(num_peer): + s.AddLine(f" - host: ts_peer{j}") + s.AddLine(f" protocol:") + s.AddLine(f" - scheme: http") + s.AddLine(f" port: {ts_peer[j].Variables.port}") + # The health check URL does not seem to be used currently. + # s.AddLine(f" health_check_url: http://ts_peer{j}:{ts_peer[j].Variables.port}") + s.AddLine(f" weight: 1.0") + s.AddLines([ + "strategies:", + " - strategy: the-strategy", + " policy: consistent_hash", + " hash_key: path", + " go_direct: true", + " parent_is_proxy: true", + " cache_peer_result: false", + " ignore_self_detect: false", + " groups:", + " - *peer_group", + " scheme: http", + " failover:", + " ring_mode: peering_ring", + f" self: ts_peer{i}", + #" max_simple_retries: 2", + #" response_codes:", + #" - 404", + #" health_check:", + #" - passive", + ]) + + for i in range(num_upstream): + prefix = f"http://ts_upstream{i}:{ts_upstream[i].Variables.port}/" + ts.Disk.remap_config.AddLine(f"map {prefix} {prefix} @strategy=the-strategy") + +tr = Test.AddTestRun() +tr.Processes.Default.StartBefore(server) +tr.Processes.Default.StartBefore(dns) +for i in range(num_peer): + tr.Processes.Default.StartBefore(ts_peer[i]) +for i in range(num_upstream): + tr.Processes.Default.StartBefore(ts_upstream[i]) +tr.Processes.Default.Command = 'echo start peer and upstream TSes, HTTP server and DNS server' +tr.Processes.Default.ReturnCode = 0 + +for i in range(num_object): + tr = Test.AddTestRun() + tr.Processes.Default.Command = ( + f'curl --verbose --proxy 127.0.0.1:{ts_peer[i % num_peer].Variables.port} http://ts_upstream0:{ts_upstream[0].Variables.port}/obj{i}' + ) + tr.Processes.Default.Streams.stdout = "body.gold" + tr.Processes.Default.ReturnCode = 0 + +for i in range(num_object): + tr = Test.AddTestRun() + # num_peer must not be a multiple of 3 + tr.Processes.Default.Command = ( + f'curl --verbose --proxy 127.0.0.1:{ts_peer[(i * 3) % num_peer].Variables.port} http://ts_upstream0:{ts_upstream[0].Variables.port}/obj{i}' + ) + tr.Processes.Default.Streams.stdout = "body.gold" + tr.Processes.Default.ReturnCode = 0 + +normalize_ports = "" +for i in range(num_upstream): + normalize_ports += f" | sed 's/:{ts_upstream[i].Variables.port}/:UP_PORT{i}/'" + +tr = Test.AddTestRun() +tr.Processes.Default.Command = ( + "grep -e '^+++' -e '^[A-Z].*TTP/' -e '^.alts. --' -e 'PARENT_SPECIFIED' trace_peer*.log" + " | sed 's/^.*(next_hop) [^ ]* //' | sed 's/[.][0-9]*$$//' " + normalize_ports +) +tr.Processes.Default.Streams.stdout = "trace.gold" +tr.Processes.Default.ReturnCode = 0