From c89b77efe7a52ffd9bcf915dea4ea052ab664c3d Mon Sep 17 00:00:00 2001 From: Robert Butts Date: Fri, 7 Jan 2022 13:24:48 -0700 Subject: [PATCH] Ports #7925 #8365 core to parent_select plugin Ports #7925 and #8365 from core strategies to parent_select plugin. PR #7925 adds go_direct support to peering_ring strategies. PR #8365 refactors strategy consistent hashing to fix a bug. They both essentially completely rewrite the strategy consistent hashing, so it was safer and easier to port them both at the same time. Add parent_select plugin autests Tests are mostly copied from the core strategies tests, which makes sense since the plugin strategies should behave the same as core. --- .../parent_select/consistenthash.cc | 362 +++---- .../parent_select/consistenthash.h | 4 + .../parent_select/parent_select.cc | 15 +- .../experimental/parent_select/strategy.cc | 39 +- plugins/experimental/parent_select/strategy.h | 26 +- .../pluginTest/parent_select/body.gold | 1 + .../parent_select/parent_select.test.py | 147 +++ .../parent_select/parent_select_peer.test.py | 177 ++++ .../parent_select/parent_select_peer2.test.py | 172 ++++ .../pluginTest/parent_select/peer.body.gold | 1 + .../pluginTest/parent_select/peer.trace.gold | 898 ++++++++++++++++++ .../pluginTest/parent_select/peer2.body.gold | 1 + .../pluginTest/parent_select/peer2.trace.gold | 804 ++++++++++++++++ .../pluginTest/parent_select/trace.gold | 96 ++ 14 files changed, 2544 insertions(+), 199 deletions(-) create mode 100755 tests/gold_tests/pluginTest/parent_select/body.gold create mode 100755 tests/gold_tests/pluginTest/parent_select/parent_select.test.py create mode 100644 tests/gold_tests/pluginTest/parent_select/parent_select_peer.test.py create mode 100644 tests/gold_tests/pluginTest/parent_select/parent_select_peer2.test.py create mode 100755 tests/gold_tests/pluginTest/parent_select/peer.body.gold create mode 100644 tests/gold_tests/pluginTest/parent_select/peer.trace.gold create mode 100644 tests/gold_tests/pluginTest/parent_select/peer2.body.gold create mode 100644 tests/gold_tests/pluginTest/parent_select/peer2.trace.gold create mode 100755 tests/gold_tests/pluginTest/parent_select/trace.gold diff --git a/plugins/experimental/parent_select/consistenthash.cc b/plugins/experimental/parent_select/consistenthash.cc index 0f950b98044..a32a55dc022 100644 --- a/plugins/experimental/parent_select/consistenthash.cc +++ b/plugins/experimental/parent_select/consistenthash.cc @@ -54,25 +54,16 @@ constexpr std::string_view hash_key_path_query = "path+query"; constexpr std::string_view hash_key_path_fragment = "path+fragment"; constexpr std::string_view hash_key_cache = "cache_key"; -PLHostRecord * -chash_lookup(const std::shared_ptr &ring, uint64_t hash_key, ATSConsistentHashIter *iter, bool *wrapped, - ATSHash64Sip24 *hash, bool *hash_init, bool *mapWrapped, uint64_t sm_id) +static bool +isWrapped(std::vector &wrap_around, uint32_t groups) { - PLHostRecord *host_rec = nullptr; - - if (*hash_init == false) { - host_rec = static_cast(ring->lookup_by_hashval(hash_key, iter, wrapped)); - *hash_init = true; - } else { - host_rec = static_cast(ring->lookup(nullptr, iter, wrapped, hash)); - } - bool wrap_around = *wrapped; - *wrapped = *mapWrapped && *wrapped; - if (!*mapWrapped && wrap_around) { - *mapWrapped = true; + bool all_wrapped = true; + for (uint32_t c = 0; c < groups; c++) { + if (wrap_around[c] == false) { + all_wrapped = false; + } } - - return host_rec; + return all_wrapped; } void @@ -84,6 +75,37 @@ chTxnToStatusTxn(PLNextHopConsistentHashTxn *txn, PLStatusTxn *statusTxn) } // namespace +std::shared_ptr +PLNextHopConsistentHash::chashLookup(const std::shared_ptr &ring, uint32_t cur_ring, + PLNextHopConsistentHashTxn *state, bool *wrapped, uint64_t sm_id, TSMBuffer reqp, TSMLoc url, + TSMLoc parent_selection_url) +{ + uint64_t hash_key = 0; + ATSHash64Sip24 hash; + PLHostRecord *host_rec = nullptr; + ATSConsistentHashIter *iter = &state->chashIter[cur_ring]; + + if (state->chash_init[cur_ring] == false) { + hash_key = getHashKey(sm_id, reqp, url, parent_selection_url, &hash); + host_rec = static_cast(ring->lookup_by_hashval(hash_key, iter, wrapped)); + state->chash_init[cur_ring] = true; + } else { + host_rec = static_cast(ring->lookup(nullptr, iter, wrapped, &hash)); + } + bool wrap_around = *wrapped; + *wrapped = (state->mapWrapped[cur_ring] && *wrapped) ? true : false; + if (!state->mapWrapped[cur_ring] && wrap_around) { + state->mapWrapped[cur_ring] = true; + } + + if (host_rec == nullptr) { + return nullptr; + } else { + std::shared_ptr h = host_groups[host_rec->group_index][host_rec->host_index]; + return h; + } +} + PLNextHopConsistentHash::PLNextHopConsistentHash(const std::string_view name) : PLNextHopSelectionStrategy(name) {} PLNextHopConsistentHash::~PLNextHopConsistentHash() @@ -163,10 +185,21 @@ PLNextHopConsistentHash::Init(const YAML::Node &n) } if (ring_mode == PL_NH_PEERING_RING) { - if (groups != 2) { - PL_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) { + PL_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) { + PL_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 != PL_NH_CONSISTENT_HASH) { + // PL_NH_Error("ring mode '%s', is only implemented for a 'consistent_hash' policy.", peering_rings.data()); + // return false; + // } } return true; @@ -277,16 +310,6 @@ PLNextHopConsistentHash::deleteTxn(void *txn) delete static_cast(txn); } -// next returns the next parent, excluding exclue_hostname:exclude_port as if it were marked down. -// -// exclude_hostname and exclude_port are parents to not consider for the next parent. -// This exists to allow getting the next parent if a failure occurs, before it occurs, -// without actually marking it down which would cause other concurrent transactions to use the wrong parent. -// This is necessary, because there's no plugin hook after a response which is a connection failure. Hacky, but it works. -// If they aren't needed, pass nullptr for exclude_hostname. -// -// out_retry is whether the returned parent was marked down, and is now being retried. -// void PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exclude_hostname, size_t exclude_hostname_len, in_port_t exclude_port, const char **out_hostname, size_t *out_hostname_len, in_port_t *out_port, @@ -297,6 +320,8 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent NH plugin calling"); + uint32_t const NO_RING_USE_POST_REMAP = uint32_t(0) - 1; + auto state = static_cast(strategyTxn); int64_t sm_id = TSHttpTxnIdGet(txnp); @@ -341,34 +366,40 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc } time_t _now = now; - bool firstcall = false; bool nextHopRetry = false; bool wrapped = false; std::vector wrap_around(groups, false); - uint32_t cur_ring = 0; // there is a hash ring for each host group - uint64_t hash_key = 0; - uint32_t lookups = 0; - ATSHash64Sip24 hash; - PLHostRecord *hostRec = nullptr; + uint32_t cur_ring = 0; // there is a hash ring for each host group + uint32_t lookups = 0; std::shared_ptr pRec = nullptr; TSHostStatus host_stat = TSHostStatus::TS_HOST_STATUS_INIT; + std::string_view first_call_host; + int first_call_port = 0; - if (state->line_number == -1 && state->result == PL_NH_PARENT_UNDEFINED) { - firstcall = true; - } + const bool firstcall = state->line_number == -1 && state->result == PL_NH_PARENT_UNDEFINED; + // firstcall indicates that this is the first time the state machine has called findNextHop() for this + // particular transaction so, a parent will be looked up using a hash from the request to locate a + // parent on the consistent hash ring. If not first call, then the transaction was unable to use the parent + // returned from the "firstcall" due to some error so, subsequent calls will not search using a hash but, + // will instead just increment the hash table iterator to find the next parent on the ring if (firstcall) { - PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent [%" PRIu64 "] firstcall, line_number: %d, result: %s", sm_id, state->line_number, + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] firstcall, line_number: %d, result: %s", sm_id, state->line_number, PLNHParentResultStr[state->result]); - state->line_number = PLNextHopConsistentHash::LineNumberPlaceholder; + state->line_number = distance; cur_ring = 0; for (uint32_t i = 0; i < groups; i++) { state->chash_init[i] = false; wrap_around[i] = false; } } else { - PL_NH_Debug(PL_NH_DEBUG_TAG, "getNextHopResult [%" PRIu64 "] not firstcall, line_number: %d, result: %s", sm_id, - state->line_number, PLNHParentResultStr[state->result]); + // not first call, save the previously tried parent. + if (state->hostname) { + first_call_host = state->hostname; + first_call_port = state->port; + } + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] not firstcall, line_number: %d, result: %s", sm_id, state->line_number, + PLNHParentResultStr[state->result]); switch (ring_mode) { case PL_NH_ALTERNATE_RING: if (groups > 1) { @@ -378,10 +409,14 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc } break; case PL_NH_PEERING_RING: - ink_assert(groups == 2); - // look for the next parent on the - // upstream ring. - state->last_group = cur_ring = 1; + if (groups == 1) { + state->last_group = cur_ring = NO_RING_USE_POST_REMAP; + } else { + ink_assert(groups == 2); + // look for the next parent on the + // upstream ring. + state->last_group = cur_ring = 1; + } break; case PL_NH_EXHAUST_RING: default: @@ -394,76 +429,91 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc } } - // Do the initial parent look-up. - hash_key = getHashKey(sm_id, reqp, url, parent_selection_url, &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, &state->chashIter[cur_ring], &wrapped, &hash, &state->chash_init[cur_ring], - &state->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) { - TSHostStatus hostStatus; - const bool hostExists = - pRec ? (TSHostStatusGet(pRec->hostname.c_str(), pRec->hostname.size(), &hostStatus, nullptr) == TS_SUCCESS) : false; - state->first_choice_status = hostExists ? hostStatus : TSHostStatus::TS_HOST_STATUS_UP; - // if peering and the selected host is myself, change rings and search for an upstream - // parent. - if (ring_mode == PL_NH_PEERING_RING && TSHostnameIsSelf(pRec->hostname.c_str(), pRec->hostname.size()) == TS_SUCCESS) { - // switch to the upstream ring. - cur_ring = 1; - continue; - } + if (cur_ring != NO_RING_USE_POST_REMAP) { + do { + // all host groups have been searched and there are no available parents found + if (isWrapped(wrap_around, groups)) { + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] No available parents.", sm_id); + pRec = nullptr; break; } - } else { - pRec = nullptr; - } - } while (pRec && state->hostname && strncmp(pRec->hostname.c_str(), state->hostname, pRec->hostname.size()) == 0); - PL_NH_Debug(PL_NH_DEBUG_TAG, "getNextHopResult [%" PRIu64 "] Initial parent lookups: %d", sm_id, lookups); + // search for available parent + std::shared_ptr r = rings[cur_ring]; + pRec = chashLookup(r, cur_ring, state, &wrapped, sm_id, reqp, url, parent_selection_url); + wrap_around[cur_ring] = wrapped; + lookups++; - // ---------------------------------------------------------------------------------------------------- - // Validate initial parent look-up and perform additional look-ups if required. - // ---------------------------------------------------------------------------------------------------- + TSHostStatus hostStatus; + unsigned int hostStatusReasons; + const bool hostExists = + pRec ? (TSHostStatusGet(pRec->hostname.c_str(), pRec->hostname.size(), &hostStatus, &hostStatusReasons) == TS_SUCCESS) : + false; - TSHostStatus hostStatus; - unsigned int hostReasons; - const bool hostExists = - pRec ? (TSHostStatusGet(pRec->hostname.c_str(), pRec->hostname.size(), &hostStatus, &hostReasons) == TS_SUCCESS) : false; - host_stat = hostExists ? hostStatus : 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) && (hostExists && hostStatus == TS_HOST_STATUS_DOWN)) { - if (hostReasons & TS_HOST_STATUS_SELF_DETECT) { - host_stat = TS_HOST_STATUS_UP; - } - } - bool pRecExclude = exclude_hostname != nullptr && pRec && - strncmp(pRec->hostname.c_str(), exclude_hostname, pRec->hostname.size()) == 0 && - pRec->getPort(scheme) == exclude_port; - if (!pRec || (pRec && (!pRec->available || pRecExclude)) || host_stat == TS_HOST_STATUS_DOWN) { - do { - // check if an unavailable server is now retryable, use it if it is. - if (pRec && !pRec->available && host_stat == TS_HOST_STATUS_UP && !pRecExclude) { - _now == 0 ? _now = time(nullptr) : _now = now; - // check if the host is retryable. It's retryable if the retry window has elapsed - if ((pRec->failedAt + retry_time) < static_cast(_now)) { - nextHopRetry = true; - state->last_parent = pRec->host_index; - state->last_lookup = pRec->group_index; - state->retry = nextHopRetry; - state->result = PL_NH_PARENT_SPECIFIED; - - PL_NH_Debug(PL_NH_DEBUG_TAG, "getNextHopResult [%" PRIu64 "] next hop %.*s is now retryable, marked it available.", sm_id, - int(pRec->hostname.size()), pRec->hostname.c_str()); + // found a parent + if (pRec) { + bool is_self = TSHostnameIsSelf(pRec->hostname.c_str(), pRec->hostname.size()) == TS_SUCCESS; + host_stat = hostExists ? hostStatus : 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 ((host_stat == TS_HOST_STATUS_DOWN && is_self && ignore_self_detect)) { + if (hostStatusReasons == TS_HOST_STATUS_SELF_DETECT) { + host_stat = TS_HOST_STATUS_UP; + } + } + + if (firstcall) { + state->first_choice_status = hostExists ? hostStatus : TSHostStatus::TS_HOST_STATUS_UP; + // if peering and the selected host is myself, change rings and search for an upstream parent. + if (ring_mode == PL_NH_PEERING_RING && (pRec->self || is_self)) { + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] peering ring got self %s - searching for upstream parent", sm_id, + pRec->hostname.c_str()); + if (groups == 1) { + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] peering ring got self %s - 1 group, using host from post-remap URL", + sm_id, pRec->hostname.c_str()); + // use host from post-remap URL + cur_ring = NO_RING_USE_POST_REMAP; + pRec = nullptr; + break; + } else { + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] peering ring got self %s - !1 group, searching upstream ring", sm_id, + pRec->hostname.c_str()); + // switch to and search the upstream ring. + cur_ring = 1; + pRec = nullptr; + continue; + } + } + } else { + // not first call, make sure we're not re-using the same parent, search again if we are. + if (first_call_host.size() > 0 && first_call_host == pRec->hostname && first_call_port == pRec->getPort(scheme)) { + pRec = nullptr; + continue; + } + } + // if the parent is not available check to see if the retry window has expired making it available + // for retry. + if (!pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { + _now == 0 ? _now = time(nullptr) : _now = now; + if ((pRec->failedAt.load() + retry_time) < static_cast(_now)) { + nextHopRetry = true; + state->last_parent = pRec->host_index; + state->last_lookup = pRec->group_index; + state->retry = nextHopRetry; + state->result = PL_NH_PARENT_SPECIFIED; + state->no_cache = false; + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] next hop %s is now retryable", sm_id, pRec->hostname.c_str()); + break; + } + } + + // use the available selected parent + if (pRec->available.load() && host_stat == TS_HOST_STATUS_UP) { break; } } + // try other rings per per the ring mode switch (ring_mode) { case PL_NH_ALTERNATE_RING: if (pRec && groups > 0) { @@ -479,70 +529,29 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc } break; } - std::shared_ptr r = rings[cur_ring]; - hostRec = chash_lookup(r, hash_key, &state->chashIter[cur_ring], &wrapped, &hash, &state->chash_init[cur_ring], - &state->mapWrapped[cur_ring], sm_id); - wrap_around[cur_ring] = wrapped; - lookups++; - if (hostRec) { - pRec = host_groups[hostRec->group_index][hostRec->host_index]; - pRecExclude = exclude_hostname != nullptr && pRec && - strncmp(pRec->hostname.c_str(), exclude_hostname, pRec->hostname.size()) == 0 && - pRec->getPort(scheme) == exclude_port; - - TSHostStatus hostStatus; - unsigned int hostReasons; - const bool hostExists = - pRec ? (TSHostStatusGet(pRec->hostname.c_str(), pRec->hostname.size(), &hostStatus, &hostReasons) == TS_SUCCESS) : false; - host_stat = hostExists ? hostStatus : 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) && (hostExists && hostStatus == TS_HOST_STATUS_DOWN)) { - if (hostReasons & TS_HOST_STATUS_SELF_DETECT) { - host_stat = TS_HOST_STATUS_UP; - } - } - if (pRec) { - PL_NH_Debug(PL_NH_DEBUG_TAG, - "nextParent [%" PRIu64 "] Selected a new parent: %.*s, available: %s, wrapped: %s, lookups: %d, exclude: %s.", - sm_id, int(pRec->hostname.size()), pRec->hostname.c_str(), (pRec->available) ? "true" : "false", - (wrapped) ? "true" : "false", lookups, pRecExclude ? "true" : "false"); - } else { - PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent [%" PRIu64 "] Selected a new parent: null", sm_id); - } - // use available host. - if (pRec && pRec->available && !pRecExclude && 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) { - PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent [%" PRIu64 "] No available parents.", sm_id); - if (pRec) { + if (pRec) { + // if the selected host is down, search again. + if (!pRec->available || host_stat == TS_HOST_STATUS_DOWN) { + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] hostname: %s, available: %s, host_stat: %d", sm_id, pRec->hostname.c_str(), + pRec->available ? "true" : "false", host_stat); pRec = nullptr; + continue; } - break; } - } while (!pRec || (pRec && (!pRec->available || pRecExclude)) || host_stat == TS_HOST_STATUS_DOWN); + } while (!pRec); + + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] Initial parent lookups: %d", sm_id, lookups); } // ---------------------------------------------------------------------------------------------------- // Validate and return the final result. // ---------------------------------------------------------------------------------------------------- - if (pRec && host_stat == TS_HOST_STATUS_UP && (pRec->available || state->retry) && !pRecExclude) { - state->result = PL_NH_PARENT_SPECIFIED; - state->hostname = pRec->hostname.c_str(); - state->hostname_len = pRec->hostname.size(); - state->last_parent = pRec->host_index; + if (pRec && host_stat == TS_HOST_STATUS_UP && (pRec->available.load() || state->retry)) { + state->result = PL_NH_PARENT_SPECIFIED; + state->hostname = pRec->hostname.c_str(); + state->last_parent = pRec->host_index; state->last_lookup = state->last_group = cur_ring; switch (scheme) { case PL_NH_SCHEME_NONE: @@ -554,30 +563,23 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc break; } state->retry = nextHopRetry; - // if using a peering ring mode and the parent selected came from the 'peering' group, // cur_ring == 0, then if the config allows it, set the flag to not cache the result. state->no_cache = ring_mode == PL_NH_PEERING_RING && !cache_peer_result && cur_ring == 0; PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] setting do not cache response from a peer per config: %s", sm_id, - state->no_cache ? "true" : "false"); - + (state->no_cache) ? "true" : "false"); ink_assert(state->hostname != nullptr); ink_assert(state->port != 0); - PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent [%" PRIu64 "] state->result: %s Chosen parent: %.*s:%d", sm_id, - PLNHParentResultStr[state->result], int(state->hostname_len), state->hostname, state->port); + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] state->result: %s Chosen parent: %s.%d", sm_id, PLNHParentResultStr[state->result], + state->hostname, state->port); } else { - if (go_direct == true) { - state->result = PL_NH_PARENT_DIRECT; - } else { - state->result = PL_NH_PARENT_FAIL; - } - state->hostname = nullptr; - state->hostname_len = 0; - state->port = 0; - state->retry = false; - state->no_cache = false; - PL_NH_Debug(PL_NH_DEBUG_TAG, "nextParent [%" PRIu64 "] state->result: %s set hostname null port 0 retry false", sm_id, - PLNHParentResultStr[state->result]); + state->result = go_direct ? PL_NH_PARENT_DIRECT : PL_NH_PARENT_FAIL; + state->retry = false; + state->hostname = nullptr; + state->port = 0; + state->no_cache = false; + PL_NH_Debug(PL_NH_DEBUG_TAG, "[%" PRIu64 "] state->result: %s set hostname null port 0 retry %d", sm_id, + PLNHParentResultStr[state->result], state->retry); } *out_hostname = state->hostname; @@ -585,6 +587,8 @@ PLNextHopConsistentHash::next(TSHttpTxn txnp, void *strategyTxn, const char *exc *out_port = state->port; *out_retry = state->retry; *out_no_cache = state->no_cache; + + return; } void diff --git a/plugins/experimental/parent_select/consistenthash.h b/plugins/experimental/parent_select/consistenthash.h index a8c46af9977..6232f07fc29 100644 --- a/plugins/experimental/parent_select/consistenthash.h +++ b/plugins/experimental/parent_select/consistenthash.h @@ -63,6 +63,10 @@ class PLNextHopConsistentHash : public PLNextHopSelectionStrategy std::vector> rings; uint64_t getHashKey(uint64_t sm_id, TSMBuffer reqp, TSMLoc url, TSMLoc parent_selection_url, ATSHash64 *h); + std::shared_ptr chashLookup(const std::shared_ptr &ring, uint32_t cur_ring, + PLNextHopConsistentHashTxn *state, bool *wrapped, uint64_t sm_id, TSMBuffer reqp, + TSMLoc url, TSMLoc parent_selection_url); + public: const uint32_t LineNumberPlaceholder = 99999; diff --git a/plugins/experimental/parent_select/parent_select.cc b/plugins/experimental/parent_select/parent_select.cc index 1a32ead6cfd..de07fac80c2 100644 --- a/plugins/experimental/parent_select/parent_select.cc +++ b/plugins/experimental/parent_select/parent_select.cc @@ -442,7 +442,14 @@ TSRemapDoRemap(void *ih, TSHttpTxn txnp, TSRemapRequestInfo *rri) strategy->next(txnp, strategyTxn->txn, exclude_host, exclude_host_len, exclude_port, &ra.hostname, &ra.hostname_len, &ra.port, &ra.is_retry, &ra.no_cache); - if (ra.hostname == nullptr) { + ra.nextHopExists = ra.hostname != nullptr; + ra.fail = !ra.nextHopExists; + // The action here is used for the very first connection, not any retry. So of course we should try it. + ra.responseIsRetryable = true; + ra.goDirect = strategy->goDirect(); + ra.parentIsProxy = strategy->parentIsProxy(); + + if (ra.fail && !ra.goDirect) { // TODO make configurable TSDebug(PLUGIN_NAME, "TSRemapDoRemap strategy '%s' next returned nil, returning 502!", strategy->name()); TSHttpTxnStatusSet(txnp, TS_HTTP_STATUS_BAD_GATEWAY); @@ -450,12 +457,6 @@ TSRemapDoRemap(void *ih, TSHttpTxn txnp, TSRemapRequestInfo *rri) return TSREMAP_DID_REMAP; } - ra.fail = false; - ra.nextHopExists = true; - ra.responseIsRetryable = - true; // The action here is used for the very first connection, not any retry. So of course we should try it. - ra.goDirect = strategy->goDirect(); - ra.parentIsProxy = strategy->parentIsProxy(); TSDebug(PLUGIN_NAME, "TSRemapDoRemap setting response_action hostname '%.*s' port %d direct %d proxy %d", int(ra.hostname_len), ra.hostname, ra.port, ra.goDirect, ra.parentIsProxy); TSHttpTxnResponseActionSet(txnp, &ra); diff --git a/plugins/experimental/parent_select/strategy.cc b/plugins/experimental/parent_select/strategy.cc index b329c7e52ef..18009cadc02 100644 --- a/plugins/experimental/parent_select/strategy.cc +++ b/plugins/experimental/parent_select/strategy.cc @@ -67,6 +67,8 @@ bool PLNextHopSelectionStrategy::Init(const YAML::Node &n) { PL_NH_Debug(PL_NH_DEBUG_TAG, "calling Init()"); + std::string self_host; + bool self_host_used = false; try { if (n["scheme"]) { @@ -112,7 +114,12 @@ PLNextHopSelectionStrategy::Init(const YAML::Node &n) } else if (ring_mode_val == exhaust_rings) { ring_mode = PL_NH_EXHAUST_RING; } else if (ring_mode_val == peering_rings) { - ring_mode = PL_NH_PEERING_RING; + ring_mode = PL_NH_PEERING_RING; + YAML::Node self_node = failover_node["self"]; + if (self_node) { + self_host = self_node.Scalar(); + PL_NH_Debug(PL_NH_DEBUG_TAG, "%s is self", self_host.c_str()); + } } else { ring_mode = PL_NH_ALTERNATE_RING; PL_NH_Note("Invalid 'ring_mode' value, '%s', for the strategy named '%s', using default '%s'.", ring_mode_val.c_str(), @@ -219,9 +226,16 @@ PLNextHopSelectionStrategy::Init(const YAML::Node &n) std::shared_ptr host_rec = std::make_shared(hosts_list[hst].as()); host_rec->group_index = grp; host_rec->host_index = hst; - if (TSHostnameIsSelf(host_rec->hostname.c_str(), host_rec->hostname.size()) == TS_SUCCESS) { + if (self_host == host_rec->hostname || + TSHostnameIsSelf(host_rec->hostname.c_str(), host_rec->hostname.size()) == TS_SUCCESS) { + if (ring_mode == PL_NH_PEERING_RING && grp != 0) { + throw std::invalid_argument("self host (" + self_host + + ") can only appear in first host group for peering ring mode"); + } TSHostStatusSet(host_rec->hostname.c_str(), host_rec->hostname.size(), TSHostStatus::TS_HOST_STATUS_DOWN, 0, static_cast(TS_HOST_STATUS_SELF_DETECT)); + host_rec->self = true; + self_host_used = true; } hosts_inner.push_back(std::move(host_rec)); num_parents++; @@ -232,12 +246,33 @@ PLNextHopSelectionStrategy::Init(const YAML::Node &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) { PL_NH_Note("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 == PL_NH_PEERING_RING) { + if (groups == 1) { + if (!go_direct) { + PL_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) { + PL_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 != PL_NH_CONSISTENT_HASH) { + // PL_NH_Error("ring mode '%s', is only implemented for a 'consistent_hash' policy.", peering_rings.data()); + // return false; + // } + } + return true; } diff --git a/plugins/experimental/parent_select/strategy.h b/plugins/experimental/parent_select/strategy.h index 62d27a3d74d..a0f9d62754a 100644 --- a/plugins/experimental/parent_select/strategy.h +++ b/plugins/experimental/parent_select/strategy.h @@ -105,13 +105,14 @@ struct PLNHProtocol { struct PLHostRecord : ATSConsistentHashNode { std::mutex _mutex; std::string hostname; - time_t failedAt; - uint32_t failCount; - time_t upAt; + std::atomic failedAt; + std::atomic failCount; + std::atomic upAt; float weight; std::string hash_string; int host_index; int group_index; + bool self = false; std::vector> protocols; // construct without locking the _mutex. @@ -132,15 +133,16 @@ struct PLHostRecord : ATSConsistentHashNode { PLHostRecord(const PLHostRecord &o) { hostname = o.hostname; - failedAt = o.failedAt; - failCount = o.failCount; - upAt = o.upAt; + failedAt = o.failedAt.load(); + failCount = o.failCount.load(); + upAt = o.upAt.load(); weight = o.weight; hash_string = o.hash_string; - host_index = -1; - group_index = -1; - available = true; + host_index = o.host_index; + group_index = o.group_index; + available = o.available.load(); protocols = o.protocols; + self = o.self; } // assign without copying the _mutex. @@ -148,14 +150,16 @@ struct PLHostRecord : ATSConsistentHashNode { operator=(const PLHostRecord &o) { hostname = o.hostname; - failedAt = o.failedAt; - upAt = o.upAt; + failedAt = o.failedAt.load(); + failCount = o.failCount.load(); + upAt = o.upAt.load(); weight = o.weight; hash_string = o.hash_string; host_index = o.host_index; group_index = o.group_index; available = o.available.load(); protocols = o.protocols; + self = o.self; return *this; } diff --git a/tests/gold_tests/pluginTest/parent_select/body.gold b/tests/gold_tests/pluginTest/parent_select/body.gold new file mode 100755 index 00000000000..b220ced9569 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/body.gold @@ -0,0 +1 @@ +This is the body. diff --git a/tests/gold_tests/pluginTest/parent_select/parent_select.test.py b/tests/gold_tests/pluginTest/parent_select/parent_select.test.py new file mode 100755 index 00000000000..d93c8862687 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/parent_select.test.py @@ -0,0 +1,147 @@ +''' +''' +# 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 = ''' +Basic parent_select plugin test +''' + +Test.SkipUnless( + Condition.PluginExists('parent_select.so'), +) +Test.ContinueOnFail = False + +# 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_objects = 32 +for i in range(num_objects): + 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 next hop trafficserver instances. +# +num_nh = 8 +ts_nh = [] +for i in range(num_nh): + ts = Test.MakeATSProcess(f"ts_nh{i}", command=f"traffic_server 2>nh_trace{i}.log") + 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_nh.append(ts) + +ts = Test.MakeATSProcess("ts") + +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': 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': 0, +}) + +ts.Disk.File(ts.Variables.CONFIGDIR + "/strategies.yaml", id="strategies", typename="ats:config") +s = ts.Disk.strategies +s.AddLine("groups:") +s.AddLine(" - &g1") +for i in range(num_nh): + dns.addRecords(records={f"next_hop{i}": ["127.0.0.1"]}) + s.AddLine(f" - host: next_hop{i}") + s.AddLine(f" protocol:") + s.AddLine(f" - scheme: http") + s.AddLine(f" port: {ts_nh[i].Variables.port}") + # The health check URL does not seem to be used currently. + # s.AddLine(f" health_check_url: http://next_hop{i}:{ts_nh[i].Variables.port}") + s.AddLine(f" weight: 1.0") +s.AddLines([ + "strategies:", + " - strategy: the-strategy", + " policy: consistent_hash", + " hash_key: path", + " go_direct: false", + " parent_is_proxy: true", + " ignore_self_detect: true", + " groups:", + " - *g1", + " scheme: http"]) + +# Fallover not currently tested. +# +# s.AddLines([ +# " fallover:", +# " max_simple_retries: 2", +# " ring_mode: exhaust_ring", +# " response_codes:", +# " - 404", +# " health_check:", +# " - passive"]) + +ts.Disk.remap_config.AddLine( + "map http://dummy.com http://not_used @plugin=parent_select.so @pparam=" + + ts.Variables.CONFIGDIR + + "/strategies.yaml @pparam=the-strategy") + +tr = Test.AddTestRun() +tr.Processes.Default.StartBefore(server) +tr.Processes.Default.StartBefore(dns) +for i in range(num_nh): + tr.Processes.Default.StartBefore(ts_nh[i]) +tr.Processes.Default.StartBefore(Test.Processes.ts) +tr.Processes.Default.Command = 'echo start TS, HTTP server, DNS server and next hop TSes' +tr.Processes.Default.ReturnCode = 0 + +for i in range(num_objects): + tr = Test.AddTestRun() + tr.Processes.Default.Command = ( + f'curl --verbose --proxy 127.0.0.1:{ts.Variables.port} http://dummy.com/obj{i}' + ) + tr.Processes.Default.Streams.stdout = "body.gold" + tr.Processes.Default.ReturnCode = 0 + +tr = Test.AddTestRun() +# For some reason, the * won't be expanded when the command is executed, if stdout is not piped through "cat". +tr.Processes.Default.Command = "grep -F '200 OK' nh_trace*.log | cat" +tr.Processes.Default.Streams.stdout = "trace.gold" +tr.Processes.Default.ReturnCode = 0 diff --git a/tests/gold_tests/pluginTest/parent_select/parent_select_peer.test.py b/tests/gold_tests/pluginTest/parent_select/parent_select_peer.test.py new file mode 100644 index 00000000000..f28b9c8a0a0 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/parent_select_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|plugin_nexthop', + '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 = f" @plugin=parent_select.so @pparam={ts.Variables.CONFIGDIR}/strategies.yaml @pparam=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 = "peer.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 = "peer.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/^.*(plugin_nexthop) [^ ]* //' | sed 's/[.][0-9]*$$//'" +) +tr.Processes.Default.Streams.stdout = "peer.trace.gold" +tr.Processes.Default.ReturnCode = 0 diff --git a/tests/gold_tests/pluginTest/parent_select/parent_select_peer2.test.py b/tests/gold_tests/pluginTest/parent_select/parent_select_peer2.test.py new file mode 100644 index 00000000000..e611c94614b --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/parent_select_peer2.test.py @@ -0,0 +1,172 @@ +''' +''' +# 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|plugin_nexthop', + '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} @plugin=parent_select.so @pparam=" + + ts.Variables.CONFIGDIR + + "/strategies.yaml @pparam=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 = "peer2.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 = "peer2.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/^.*(plugin_nexthop) [^ ]* //' | sed 's/[.][0-9]*$$//' " + normalize_ports +) +tr.Processes.Default.Streams.stdout = "peer2.trace.gold" +tr.Processes.Default.ReturnCode = 0 diff --git a/tests/gold_tests/pluginTest/parent_select/peer.body.gold b/tests/gold_tests/pluginTest/parent_select/peer.body.gold new file mode 100755 index 00000000000..b220ced9569 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/peer.body.gold @@ -0,0 +1 @@ +This is the body. diff --git a/tests/gold_tests/pluginTest/parent_select/peer.trace.gold b/tests/gold_tests/pluginTest/parent_select/peer.trace.gold new file mode 100644 index 00000000000..4c1810eebf3 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/peer.trace.gold @@ -0,0 +1,898 @@ +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://dummy.com/obj0 HTTP/1.1 +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj0 HTTP/1.1 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://not_used/obj0 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://not_used/obj7 HTTP/1.1 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:+++++++++ Proxy's Request +++++++++ +trace_peer0.log:GET http://not_used/obj8 HTTP/1.1 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://not_used/obj8 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/obj0 HTTP/1.1 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://not_used/obj0 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://not_used/obj7 HTTP/1.1 +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://not_used/obj8 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_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://dummy.com/obj1 HTTP/1.1 +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj1 HTTP/1.1 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://not_used/obj1 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/obj9 HTTP/1.1 +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj9 HTTP/1.1 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://not_used/obj9 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://not_used/obj10 HTTP/1.1 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj3 HTTP/1.1 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://not_used/obj3 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://not_used/obj10 HTTP/1.1 +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer1.log:+++++++++ Proxy's Request +++++++++ +trace_peer1.log:GET http://not_used/obj11 HTTP/1.1 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://not_used/obj11 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_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://dummy.com/obj2 HTTP/1.1 +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj2 HTTP/1.1 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://not_used/obj2 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 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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 +[4] state->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 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj10 HTTP/1.1 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://not_used/obj10 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 +[6] state->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 +[6] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[7] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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/obj5 HTTP/1.1 +[8] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[9] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj6 HTTP/1.1 +[9] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[9] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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://dummy.com/obj14 HTTP/1.1 +[10] state->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer2.log:+++++++++ Proxy's Request +++++++++ +trace_peer2.log:GET http://not_used/obj14 HTTP/1.1 +[10] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[10] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://not_used/obj14 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_peer3.log:+++++++++ Incoming Request +++++++++ +trace_peer3.log:GET http://not_used/obj0 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj3 HTTP/1.1 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://not_used/obj3 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/obj11 HTTP/1.1 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj11 HTTP/1.1 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://not_used/obj11 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/obj13 HTTP/1.1 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[4] state->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 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream1 +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://dummy.com/obj1 HTTP/1.1 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj1 HTTP/1.1 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://not_used/obj1 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/obj9 HTTP/1.1 +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer3.log:+++++++++ Proxy's Request +++++++++ +trace_peer3.log:GET http://not_used/obj9 HTTP/1.1 +[6] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://not_used/obj9 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/obj13 HTTP/1.1 +[7] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[8] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +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 +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:+++++++++ Proxy's Request +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +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 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer4.log:GET http://not_used/obj4 HTTP/1.1 +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 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer4.log:GET http://not_used/obj12 HTTP/1.1 +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 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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 +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj5 HTTP/1.1 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://not_used/obj5 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/obj13 HTTP/1.1 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj13 HTTP/1.1 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://not_used/obj13 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/obj14 HTTP/1.1 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream1 +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 +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj7 HTTP/1.1 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://not_used/obj7 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/obj14 HTTP/1.1 +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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 +[7] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer5.log:+++++++++ Proxy's Request +++++++++ +trace_peer5.log:GET http://not_used/obj15 HTTP/1.1 +[7] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[7] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://not_used/obj15 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_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://dummy.com/obj6 HTTP/1.1 +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj6 HTTP/1.1 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://not_used/obj6 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://not_used/obj8 HTTP/1.1 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream3 +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 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer5 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj14 HTTP/1.1 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://not_used/obj14 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/obj2 HTTP/1.1 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer7 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj2 HTTP/1.1 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://not_used/obj2 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/obj10 HTTP/1.1 +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_peer1 +trace_peer6.log:+++++++++ Proxy's Request +++++++++ +trace_peer6.log:GET http://not_used/obj10 HTTP/1.1 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://not_used/obj10 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_peer7.log:+++++++++ Incoming Request +++++++++ +trace_peer7.log:GET http://not_used/obj2 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[0] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_peer0 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj7 HTTP/1.1 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[1] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://not_used/obj7 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/obj9 HTTP/1.1 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj15 HTTP/1.1 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[4] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream4 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://not_used/obj15 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/obj2 HTTP/1.1 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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 +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj5 HTTP/1.1 +[6] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[6] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream5 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://not_used/obj5 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/obj9 HTTP/1.1 +[7] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream0 +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 +[8] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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 +[9] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer7.log:+++++++++ Proxy's Request +++++++++ +trace_peer7.log:GET http://not_used/obj13 HTTP/1.1 +[9] not firstcall, line_number: 0, result: PARENT_SPECIFIED +[9] state->result: PARENT_SPECIFIED Chosen parent: ts_upstream2 +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://not_used/obj13 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 diff --git a/tests/gold_tests/pluginTest/parent_select/peer2.body.gold b/tests/gold_tests/pluginTest/parent_select/peer2.body.gold new file mode 100644 index 00000000000..b220ced9569 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/peer2.body.gold @@ -0,0 +1 @@ +This is the body. diff --git a/tests/gold_tests/pluginTest/parent_select/peer2.trace.gold b/tests/gold_tests/pluginTest/parent_select/peer2.trace.gold new file mode 100644 index 00000000000..47eee1d8356 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/peer2.trace.gold @@ -0,0 +1,804 @@ +trace_peer0.log:+++++++++ Incoming Request +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 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/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 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 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/obj0 HTTP/1.1 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer3 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj0 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/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 +[5] state->result: PARENT_SPECIFIED Chosen parent: ts_peer6 +trace_peer0.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer0.log:GET http://ts_upstream0:UP_PORT0/obj8 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_peer1.log:+++++++++ Incoming Request +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj1 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj1 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/obj9 HTTP/1.1 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj9 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/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 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj3 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/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 +[5] state->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 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer1.log:GET http://ts_upstream0:UP_PORT0/obj11 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_peer2.log:+++++++++ Incoming Request +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj2 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj2 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:+++++++++ 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 +[5] state->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 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj10 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/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/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/obj14 HTTP/1.1 +[10] state->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 +[10] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer2.log:GET http://ts_upstream0:UP_PORT0/obj14 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_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 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj3 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/obj11 HTTP/1.1 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj11 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/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/obj1 HTTP/1.1 +[5] state->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 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj1 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/obj9 HTTP/1.1 +[6] state->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 +[6] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer3.log:GET http://ts_upstream0:UP_PORT0/obj9 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/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 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +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 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +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 +[2] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj4 HTTP/1.1 +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 +[3] state->result: PARENT_SPECIFIED Chosen parent: ts_peer2 +trace_peer4.log:[alts] ---- alternate #1 (Q = 1) has these request/response hdrs: +trace_peer4.log:GET http://ts_upstream0:UP_PORT0/obj12 HTTP/1.1 +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 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj5 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/obj13 HTTP/1.1 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj13 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/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 +[5] state->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 +[5] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj7 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/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 +[7] state->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 +[7] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer5.log:GET http://ts_upstream0:UP_PORT0/obj15 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_peer6.log:+++++++++ Incoming Request +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj6 HTTP/1.1 +[0] state->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 +[0] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj6 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/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 +[2] state->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 +[2] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj14 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/obj2 HTTP/1.1 +[3] state->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 +[3] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj2 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/obj10 HTTP/1.1 +[4] state->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 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer6.log:GET http://ts_upstream0:UP_PORT0/obj10 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_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 +[1] state->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 +[1] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj7 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/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 +[4] state->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 +[4] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj15 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/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 +[6] state->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 +[6] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj5 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/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 +[9] state->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 +[9] not firstcall, line_number: 0, result: PARENT_SPECIFIED +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:+++++++++ Cached Request Hdr +++++++++ +trace_peer7.log:GET http://ts_upstream0:UP_PORT0/obj13 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 diff --git a/tests/gold_tests/pluginTest/parent_select/trace.gold b/tests/gold_tests/pluginTest/parent_select/trace.gold new file mode 100755 index 00000000000..05120d365b0 --- /dev/null +++ b/tests/gold_tests/pluginTest/parent_select/trace.gold @@ -0,0 +1,96 @@ +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace0.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace1.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace2.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace3.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace4.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace5.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace6.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK +nh_trace7.log:HTTP/1.1 200 OK