From 8aee76c79a1fa369cfa41e8122959cfcd6f905b9 Mon Sep 17 00:00:00 2001 From: XieHan Date: Sun, 17 Apr 2022 20:55:42 +0800 Subject: [PATCH 1/4] Optimize service governance code structure --- src/nameservice/WFDnsResolver.cc | 76 ++++++---------------- src/nameservice/WFDnsResolver.h | 54 ++++++++++++++-- src/nameservice/WFServiceGovernance.cc | 90 ++++++++++++++++++++++---- src/nameservice/WFServiceGovernance.h | 1 + 4 files changed, 148 insertions(+), 73 deletions(-) diff --git a/src/nameservice/WFDnsResolver.cc b/src/nameservice/WFDnsResolver.cc index 341ad125..6984a034 100644 --- a/src/nameservice/WFDnsResolver.cc +++ b/src/nameservice/WFDnsResolver.cc @@ -223,49 +223,24 @@ static ThreadDnsTask *__create_thread_dns_task(const std::string& host, return task; } -class WFResolverTask : public WFRouterTask +WFResolverTask::WFResolverTask(const struct WFNSParams *params, + int dns_cache_level, + unsigned int dns_ttl_default, + unsigned int dns_ttl_min, + const struct EndpointParams *endpoint_params, + router_callback_t&& cb) : + WFRouterTask(std::move(cb)) { -public: - WFResolverTask(const struct WFNSParams *params, int dns_cache_level, - unsigned int dns_ttl_default, unsigned int dns_ttl_min, - const struct EndpointParams *endpoint_params, - router_callback_t&& cb) : - WFRouterTask(std::move(cb)) - { - type_ = params->type; - host_ = params->uri.host ? params->uri.host : ""; - port_ = params->uri.port ? atoi(params->uri.port) : 0; - info_ = params->info; - dns_cache_level_ = dns_cache_level; - dns_ttl_default_ = dns_ttl_default; - dns_ttl_min_ = dns_ttl_min; - endpoint_params_ = *endpoint_params; - first_addr_only_ = params->fixed_addr; - } - -private: - virtual void dispatch(); - virtual SubTask *done(); - void thread_dns_callback(ThreadDnsTask *dns_task); - void dns_single_callback(WFDnsTask *dns_task); - static void dns_partial_callback(WFDnsTask *dns_task); - void dns_parallel_callback(const ParallelWork *pwork); - void dns_callback_internal(DnsOutput *dns_task, - unsigned int ttl_default, - unsigned int ttl_min); - -private: - TransportType type_; - std::string host_; - std::string info_; - unsigned short port_; - bool first_addr_only_; - bool query_dns_; - int dns_cache_level_; - unsigned int dns_ttl_default_; - unsigned int dns_ttl_min_; - struct EndpointParams endpoint_params_; -}; + type_ = params->type; + host_ = params->uri.host ? params->uri.host : ""; + port_ = params->uri.port ? atoi(params->uri.port) : 0; + info_ = params->info; + dns_cache_level_ = dns_cache_level; + dns_ttl_default_ = dns_ttl_default; + dns_ttl_min_ = dns_ttl_min; + endpoint_params_ = *endpoint_params; + first_addr_only_ = params->fixed_addr; +} void WFResolverTask::dispatch() { @@ -452,6 +427,7 @@ SubTask *WFResolverTask::done() return series->pop(); } + void WFResolverTask::dns_callback_internal(DnsOutput *dns_out, unsigned int ttl_default, unsigned int ttl_min) @@ -601,17 +577,6 @@ void WFResolverTask::thread_dns_callback(ThreadDnsTask *dns_task) delete this; } -WFRouterTask * -WFDnsResolver::create(const struct WFNSParams *params, int dns_cache_level, - unsigned int dns_ttl_default, unsigned int dns_ttl_min, - const struct EndpointParams *endpoint_params, - router_callback_t&& callback) -{ - return new WFResolverTask(params, dns_cache_level, dns_ttl_default, - dns_ttl_min, endpoint_params, - std::move(callback)); -} - WFRouterTask *WFDnsResolver::create_router_task(const struct WFNSParams *params, router_callback_t callback) { @@ -621,7 +586,8 @@ WFRouterTask *WFDnsResolver::create_router_task(const struct WFNSParams *params, const struct EndpointParams *endpoint_params = &settings->endpoint_params; int dns_cache_level = params->retry_times == 0 ? DNS_CACHE_LEVEL_2 : DNS_CACHE_LEVEL_1; - return create(params, dns_cache_level, dns_ttl_default, dns_ttl_min, - endpoint_params, std::move(callback)); + return new WFResolverTask(params, dns_cache_level, dns_ttl_default, + dns_ttl_min, endpoint_params, + std::move(callback)); } diff --git a/src/nameservice/WFDnsResolver.h b/src/nameservice/WFDnsResolver.h index 0cd52382..f9dec9e9 100644 --- a/src/nameservice/WFDnsResolver.h +++ b/src/nameservice/WFDnsResolver.h @@ -19,21 +19,61 @@ #ifndef _WFDNSRESOLVER_H_ #define _WFDNSRESOLVER_H_ +#include +#include +#include "Workflow.h" +#include "DnsMessage.h" +#include "DnsRoutine.h" #include "EndpointParams.h" #include "WFNameService.h" -#include "WFResourcePool.h" + +class WFResolverTask : public WFRouterTask +{ +public: + WFResolverTask(const struct WFNSParams *params, int dns_cache_level, + unsigned int dns_ttl_default, unsigned int dns_ttl_min, + const struct EndpointParams *endpoint_params, + router_callback_t&& cb); + + WFResolverTask(router_callback_t&& cb) : + WFRouterTask(std::move(cb)) + { + } + +protected: + virtual void dispatch(); + virtual SubTask *done(); + +private: + using DnsTask_thrd = WFThreadTask; + using DnsTask_net = WFNetworkTask; + void thread_dns_callback(DnsTask_thrd *dns_task); + void dns_single_callback(DnsTask_net *dns_task); + static void dns_partial_callback(DnsTask_net *dns_task); + void dns_parallel_callback(const ParallelWork *pwork); + void dns_callback_internal(DnsOutput *dns_task, + unsigned int ttl_default, + unsigned int ttl_min); + +protected: + TransportType type_; + std::string host_; + std::string info_; + unsigned short port_; + bool first_addr_only_; + bool query_dns_; + int dns_cache_level_; + unsigned int dns_ttl_default_; + unsigned int dns_ttl_min_; + struct EndpointParams endpoint_params_; +}; class WFDnsResolver : public WFNSPolicy { public: virtual WFRouterTask *create_router_task(const struct WFNSParams *params, router_callback_t callback); - -public: - WFRouterTask *create(const struct WFNSParams *params, int dns_cache_level, - unsigned int dns_ttl_default, unsigned int dns_ttl_min, - const struct EndpointParams *endpoint_params, - router_callback_t&& callback); }; #endif diff --git a/src/nameservice/WFServiceGovernance.cc b/src/nameservice/WFServiceGovernance.cc index 36050bf5..6429d23f 100644 --- a/src/nameservice/WFServiceGovernance.cc +++ b/src/nameservice/WFServiceGovernance.cc @@ -49,7 +49,7 @@ PolicyAddrParams::PolicyAddrParams(const struct AddressParams *params) : this->dns_ttl_min = params->dns_ttl_min; this->max_fails = params->max_fails; } - +/* class WFSelectorFailTask : public WFRouterTask { public: @@ -60,9 +60,6 @@ public: virtual void dispatch() { - this->state = WFT_STATE_TASK_ERROR; - this->error = WFT_ERR_UPSTREAM_UNAVAILABLE; - return this->subtask_done(); } }; @@ -81,7 +78,7 @@ static void copy_host_port(ParsedURI& uri, const EndpointAddress *addr) uri.port = strdup(addr->port.c_str()); } } - +*/ EndpointAddress::EndpointAddress(const std::string& address, PolicyAddrParams *address_params) { @@ -108,26 +105,96 @@ EndpointAddress::EndpointAddress(const std::string& address, this->port = arr[1]; } +using sg_select_t = std::function; + +class WFSGResolverTask : public WFResolverTask +{ +public: + WFSGResolverTask(const struct WFNSParams *params, + WFServiceGovernance *sg, + router_callback_t&& cb) : + WFResolverTask(std::move(cb)), + params_(*params) + { + sg_ = sg; + } + +protected: + virtual void dispatch(); + +protected: + const struct WFNSParams params_; + WFServiceGovernance *sg_; +}; + +void WFSGResolverTask::dispatch() +{ + WFNSTracing *tracing = params_.tracing; + EndpointAddress *addr; + + if (sg_->select(params_.uri, tracing, &addr)) + { + auto *tracing_data = (WFServiceGovernance::TracingData *)tracing->data; + if (!tracing_data) + { + tracing_data = new WFServiceGovernance::TracingData; + tracing_data->sg = sg_; + tracing->data = tracing_data; + tracing->deleter = WFServiceGovernance::tracing_deleter; + } + + tracing_data->history.push_back(addr); + + type_ = params_.type; + if (!addr->host.empty()) + host_ = addr->host; + else + host_ = params_.uri.host ? params_.uri.host : ""; + + if (!addr->port.empty()) + port_ = atoi(addr->port.c_str()); + else + port_ = params_.uri.port ? atoi(params_.uri.port) : 0; + + info_ = params_.info; + dns_cache_level_ = params_.retry_times == 0 ? DNS_CACHE_LEVEL_2 : + DNS_CACHE_LEVEL_1; + dns_ttl_default_ = addr->params->dns_ttl_default; + dns_ttl_min_ = addr->params->dns_ttl_min; + endpoint_params_ = addr->params->endpoint_params; + first_addr_only_ = params_.fixed_addr; + this->WFResolverTask::dispatch(); + return; + } + else + { + this->state = WFT_STATE_TASK_ERROR; + this->error = WFT_ERR_UPSTREAM_UNAVAILABLE; + query_dns_ = false; + return this->subtask_done(); + } +} + WFRouterTask *WFServiceGovernance::create_router_task(const struct WFNSParams *params, router_callback_t callback) { - WFNSTracing *tracing = params->tracing; - EndpointAddress *addr; - WFRouterTask *task; - + return new WFSGResolverTask(params, this, std::move(callback)); +/* if (this->select(params->uri, tracing, &addr)) { - WFDnsResolver *resolver = WFGlobal::get_dns_resolver(); unsigned int dns_ttl_default = addr->params->dns_ttl_default; unsigned int dns_ttl_min = addr->params->dns_ttl_min; const struct EndpointParams *endpoint_params = &addr->params->endpoint_params; int dns_cache_level = params->retry_times == 0 ? DNS_CACHE_LEVEL_2 : DNS_CACHE_LEVEL_1; - copy_host_port(params->uri, addr); + task = resolver->create(params, dns_cache_level, dns_ttl_default, dns_ttl_min, endpoint_params, std::move(callback)); + task = resolver->create(params, std::move(sg_select), std::move(callback)); + struct TracingData *tracing_data = (struct TracingData *)tracing->data; if (!tracing_data) { @@ -143,6 +210,7 @@ WFRouterTask *WFServiceGovernance::create_router_task(const struct WFNSParams *p task = new WFSelectorFailTask(std::move(callback)); return task; +*/ } void WFServiceGovernance::tracing_deleter(void *data) diff --git a/src/nameservice/WFServiceGovernance.h b/src/nameservice/WFServiceGovernance.h index f5fc24c4..772e7058 100644 --- a/src/nameservice/WFServiceGovernance.h +++ b/src/nameservice/WFServiceGovernance.h @@ -193,6 +193,7 @@ protected: pthread_rwlock_t rwlock; std::atomic nalives; bool try_another; + friend class WFSGResolverTask; }; #endif From 7a72fb1ed252253d259cb9be8256e3036b4be1d9 Mon Sep 17 00:00:00 2001 From: XieHan Date: Sun, 17 Apr 2022 21:18:25 +0800 Subject: [PATCH 2/4] remove unused codes --- src/nameservice/WFDnsResolver.cc | 1 - src/nameservice/WFServiceGovernance.cc | 63 -------------------------- 2 files changed, 64 deletions(-) diff --git a/src/nameservice/WFDnsResolver.cc b/src/nameservice/WFDnsResolver.cc index 6984a034..b2d2f13e 100644 --- a/src/nameservice/WFDnsResolver.cc +++ b/src/nameservice/WFDnsResolver.cc @@ -427,7 +427,6 @@ SubTask *WFResolverTask::done() return series->pop(); } - void WFResolverTask::dns_callback_internal(DnsOutput *dns_out, unsigned int ttl_default, unsigned int ttl_min) diff --git a/src/nameservice/WFServiceGovernance.cc b/src/nameservice/WFServiceGovernance.cc index 6429d23f..18372fab 100644 --- a/src/nameservice/WFServiceGovernance.cc +++ b/src/nameservice/WFServiceGovernance.cc @@ -49,36 +49,7 @@ PolicyAddrParams::PolicyAddrParams(const struct AddressParams *params) : this->dns_ttl_min = params->dns_ttl_min; this->max_fails = params->max_fails; } -/* -class WFSelectorFailTask : public WFRouterTask -{ -public: - WFSelectorFailTask(router_callback_t&& cb) : - WFRouterTask(std::move(cb)) - { - } - virtual void dispatch() - { - return this->subtask_done(); - } -}; - -static void copy_host_port(ParsedURI& uri, const EndpointAddress *addr) -{ - if (!addr->host.empty()) - { - free(uri.host); - uri.host = strdup(addr->host.c_str()); - } - - if (!addr->port.empty()) - { - free(uri.port); - uri.port = strdup(addr->port.c_str()); - } -} -*/ EndpointAddress::EndpointAddress(const std::string& address, PolicyAddrParams *address_params) { @@ -105,9 +76,6 @@ EndpointAddress::EndpointAddress(const std::string& address, this->port = arr[1]; } -using sg_select_t = std::function; - class WFSGResolverTask : public WFResolverTask { public: @@ -180,37 +148,6 @@ WFRouterTask *WFServiceGovernance::create_router_task(const struct WFNSParams *p router_callback_t callback) { return new WFSGResolverTask(params, this, std::move(callback)); -/* - if (this->select(params->uri, tracing, &addr)) - { - unsigned int dns_ttl_default = addr->params->dns_ttl_default; - unsigned int dns_ttl_min = addr->params->dns_ttl_min; - const struct EndpointParams *endpoint_params = &addr->params->endpoint_params; - int dns_cache_level = params->retry_times == 0 ? DNS_CACHE_LEVEL_2 : - DNS_CACHE_LEVEL_1; - copy_host_port(params->uri, addr); - - task = resolver->create(params, dns_cache_level, dns_ttl_default, dns_ttl_min, - endpoint_params, std::move(callback)); - - task = resolver->create(params, std::move(sg_select), std::move(callback)); - - struct TracingData *tracing_data = (struct TracingData *)tracing->data; - if (!tracing_data) - { - tracing_data = new TracingData; - tracing_data->sg = this; - tracing->data = tracing_data; - tracing->deleter = WFServiceGovernance::tracing_deleter; - } - - tracing_data->history.push_back(addr); - } - else - task = new WFSelectorFailTask(std::move(callback)); - - return task; -*/ } void WFServiceGovernance::tracing_deleter(void *data) From 16f3d54ccaf624b6cfb9085bcf68445dbdf1dac6 Mon Sep 17 00:00:00 2001 From: XieHan Date: Mon, 18 Apr 2022 02:58:56 +0800 Subject: [PATCH 3/4] Simplify codes. Add back copy_host_port() --- src/nameservice/WFDnsResolver.cc | 147 +++++++++---------------- src/nameservice/WFDnsResolver.h | 34 +++--- src/nameservice/WFServiceGovernance.cc | 43 ++++---- 3 files changed, 94 insertions(+), 130 deletions(-) diff --git a/src/nameservice/WFDnsResolver.cc b/src/nameservice/WFDnsResolver.cc index b2d2f13e..8173fb3c 100644 --- a/src/nameservice/WFDnsResolver.cc +++ b/src/nameservice/WFDnsResolver.cc @@ -41,18 +41,6 @@ #include "WFDnsClient.h" #include "WFDnsResolver.h" -/* -DNS_CACHE_LEVEL_0 -> NO cache -DNS_CACHE_LEVEL_1 -> TTL MIN -DNS_CACHE_LEVEL_2 -> TTL [DEFAULT] -DNS_CACHE_LEVEL_3 -> Forever -*/ - -#define DNS_CACHE_LEVEL_0 0 -#define DNS_CACHE_LEVEL_1 1 -#define DNS_CACHE_LEVEL_2 2 -#define DNS_CACHE_LEVEL_3 3 - #define HOSTS_LINEBUF_INIT_SIZE 128 #define PORT_STR_MAX 5 @@ -223,91 +211,60 @@ static ThreadDnsTask *__create_thread_dns_task(const std::string& host, return task; } -WFResolverTask::WFResolverTask(const struct WFNSParams *params, - int dns_cache_level, - unsigned int dns_ttl_default, - unsigned int dns_ttl_min, - const struct EndpointParams *endpoint_params, - router_callback_t&& cb) : - WFRouterTask(std::move(cb)) -{ - type_ = params->type; - host_ = params->uri.host ? params->uri.host : ""; - port_ = params->uri.port ? atoi(params->uri.port) : 0; - info_ = params->info; - dns_cache_level_ = dns_cache_level; - dns_ttl_default_ = dns_ttl_default; - dns_ttl_min_ = dns_ttl_min; - endpoint_params_ = *endpoint_params; - first_addr_only_ = params->fixed_addr; -} - void WFResolverTask::dispatch() { - if (dns_cache_level_ != DNS_CACHE_LEVEL_0) + const ParsedURI& uri = ns_params_.uri; + host_ = uri.host ? uri.host : ""; + port_ = uri.port ? atoi(uri.port) : 0; + + DnsCache *dns_cache = WFGlobal::get_dns_cache(); + const DnsCache::DnsHandle *addr_handle; + std::string hostname = host_; + + if (ns_params_.retry_times == 0) + addr_handle = dns_cache->get_ttl(hostname, port_); + else + addr_handle = dns_cache->get_confident(hostname, port_); + + if (addr_handle) { - DnsCache *dns_cache = WFGlobal::get_dns_cache(); - const DnsCache::DnsHandle *addr_handle; + RouteManager *route_manager = WFGlobal::get_route_manager(); + struct addrinfo *addrinfo = addr_handle->value.addrinfo; + struct addrinfo first; - switch (dns_cache_level_) + if (ns_params_.fixed_addr && addrinfo->ai_next) { - case DNS_CACHE_LEVEL_1: - addr_handle = dns_cache->get_confident(host_, port_); - break; - - case DNS_CACHE_LEVEL_2: - addr_handle = dns_cache->get_ttl(host_, port_); - break; - - case DNS_CACHE_LEVEL_3: - addr_handle = dns_cache->get(host_, port_); - break; - - default: - addr_handle = NULL; - break; + first = *addrinfo; + first.ai_next = NULL; + addrinfo = &first; } - if (addr_handle) + if (route_manager->get(ns_params_.type, addrinfo, ns_params_.info, + &ep_params_, hostname, this->result) < 0) { - RouteManager *route_manager = WFGlobal::get_route_manager(); - struct addrinfo *addrinfo = addr_handle->value.addrinfo; - struct addrinfo first; - - if (first_addr_only_ && addrinfo->ai_next) - { - first = *addrinfo; - first.ai_next = NULL; - addrinfo = &first; - } - - if (route_manager->get(type_, addrinfo, info_, &endpoint_params_, - host_, this->result) < 0) - { - this->state = WFT_STATE_SYS_ERROR; - this->error = errno; - } - else - this->state = WFT_STATE_SUCCESS; - - dns_cache->release(addr_handle); - query_dns_ = false; - this->subtask_done(); - return; + this->state = WFT_STATE_SYS_ERROR; + this->error = errno; } + else + this->state = WFT_STATE_SUCCESS; + + dns_cache->release(addr_handle); + query_dns_ = false; + this->subtask_done(); + return; } - if (!host_.empty()) + if (*host_) { - char front = host_.front(); - char back = host_.back(); + char front = host_[0]; + char back = host_[hostname.size() - 1]; struct in6_addr addr; int ret; - if (host_.find(':') != std::string::npos) - ret = inet_pton(AF_INET6, host_.c_str(), &addr); + if (strchr(host_, ':')) + ret = inet_pton(AF_INET6, host_, &addr); else if (isdigit(back) && isdigit(front)) - ret = inet_pton(AF_INET, host_.c_str(), &addr); + ret = inet_pton(AF_INET, host_, &addr); else if (front == '/') ret = 1; else @@ -315,7 +272,7 @@ void WFResolverTask::dispatch() if (ret == 1) { - DnsInput dns_in(host_, port_, true); // 'true' means numeric host + DnsInput dns_in(hostname, port_, true); // 'true' means numeric host DnsOutput dns_out; DnsRoutine::run(&dns_in, &dns_out); @@ -331,7 +288,7 @@ void WFResolverTask::dispatch() if (hosts) { struct addrinfo *ai; - int ret = __readaddrinfo(hosts, host_.c_str(), port_, &__ai_hints, &ai); + int ret = __readaddrinfo(hosts, host_, port_, &__ai_hints, &ai); if (ret == 0) { @@ -356,7 +313,7 @@ void WFResolverTask::dispatch() auto&& cb = std::bind(&WFResolverTask::dns_single_callback, this, std::placeholders::_1); - WFDnsTask *dns_task = client->create_dns_task(host_, std::move(cb)); + WFDnsTask *dns_task = client->create_dns_task(hostname, std::move(cb)); if (family == AF_INET6) dns_task->get_req()->set_question_type(DNS_TYPE_AAAA); @@ -376,10 +333,10 @@ void WFResolverTask::dispatch() dctx[0].port = port_; dctx[1].port = port_; - task_v4 = client->create_dns_task(host_, dns_partial_callback); + task_v4 = client->create_dns_task(hostname, dns_partial_callback); task_v4->user_data = dctx; - task_v6 = client->create_dns_task(host_, dns_partial_callback); + task_v6 = client->create_dns_task(hostname, dns_partial_callback); task_v6->get_req()->set_question_type(DNS_TYPE_AAAA); task_v6->user_data = dctx + 1; @@ -403,7 +360,7 @@ void WFResolverTask::dispatch() auto&& cb = std::bind(&WFResolverTask::thread_dns_callback, this, std::placeholders::_1); - ThreadDnsTask *dns_task = __create_thread_dns_task(host_, port_, + ThreadDnsTask *dns_task = __create_thread_dns_task(hostname, port_, std::move(cb)); series_of(this)->push_front(dns_task); } @@ -452,12 +409,13 @@ void WFResolverTask::dns_callback_internal(DnsOutput *dns_out, DnsCache *dns_cache = WFGlobal::get_dns_cache(); struct addrinfo *addrinfo = dns_out->move_addrinfo(); const DnsCache::DnsHandle *addr_handle; + std::string hostname = host_; - addr_handle = dns_cache->put(host_, port_, addrinfo, + addr_handle = dns_cache->put(hostname, port_, addrinfo, (unsigned int)ttl_default, (unsigned int)ttl_min); - if (route_manager->get(type_, addrinfo, info_, &endpoint_params_, - host_, this->result) < 0) + if (route_manager->get(ns_params_.type, addrinfo, ns_params_.info, + &ep_params_, hostname, this->result) < 0) { this->state = WFT_STATE_SYS_ERROR; this->error = errno; @@ -477,7 +435,7 @@ void WFResolverTask::dns_single_callback(WFDnsTask *dns_task) { struct addrinfo *ai = NULL; int ret; - + ret = protocol::DnsUtil::getaddrinfo(dns_task->get_resp(), port_, &ai); DnsOutput out; DnsRoutine::create(&out, ret, ai); @@ -582,11 +540,8 @@ WFRouterTask *WFDnsResolver::create_router_task(const struct WFNSParams *params, const struct WFGlobalSettings *settings = WFGlobal::get_global_settings(); unsigned int dns_ttl_default = settings->dns_ttl_default; unsigned int dns_ttl_min = settings->dns_ttl_min; - const struct EndpointParams *endpoint_params = &settings->endpoint_params; - int dns_cache_level = params->retry_times == 0 ? DNS_CACHE_LEVEL_2 : - DNS_CACHE_LEVEL_1; - return new WFResolverTask(params, dns_cache_level, dns_ttl_default, - dns_ttl_min, endpoint_params, + const struct EndpointParams *ep_params = &settings->endpoint_params; + return new WFResolverTask(params, dns_ttl_default, dns_ttl_min, ep_params, std::move(callback)); } diff --git a/src/nameservice/WFDnsResolver.h b/src/nameservice/WFDnsResolver.h index f9dec9e9..b6851580 100644 --- a/src/nameservice/WFDnsResolver.h +++ b/src/nameservice/WFDnsResolver.h @@ -30,13 +30,22 @@ class WFResolverTask : public WFRouterTask { public: - WFResolverTask(const struct WFNSParams *params, int dns_cache_level, + WFResolverTask(const struct WFNSParams *ns_params, unsigned int dns_ttl_default, unsigned int dns_ttl_min, - const struct EndpointParams *endpoint_params, - router_callback_t&& cb); + const struct EndpointParams *ep_params, + router_callback_t&& cb) : + WFRouterTask(std::move(cb)), + ns_params_(*ns_params), + ep_params_(*ep_params) + { + dns_ttl_default_ = dns_ttl_default; + dns_ttl_min_ = dns_ttl_min; + } - WFResolverTask(router_callback_t&& cb) : - WFRouterTask(std::move(cb)) + WFResolverTask(const struct WFNSParams *ns_params, + router_callback_t&& cb) : + WFRouterTask(std::move(cb)), + ns_params_(*ns_params) { } @@ -57,16 +66,15 @@ private: unsigned int ttl_min); protected: - TransportType type_; - std::string host_; - std::string info_; - unsigned short port_; - bool first_addr_only_; - bool query_dns_; - int dns_cache_level_; + struct WFNSParams ns_params_; unsigned int dns_ttl_default_; unsigned int dns_ttl_min_; - struct EndpointParams endpoint_params_; + struct EndpointParams ep_params_; + bool query_dns_; + +private: + unsigned short port_; + const char *host_; }; class WFDnsResolver : public WFNSPolicy diff --git a/src/nameservice/WFServiceGovernance.cc b/src/nameservice/WFServiceGovernance.cc index 18372fab..e30f4664 100644 --- a/src/nameservice/WFServiceGovernance.cc +++ b/src/nameservice/WFServiceGovernance.cc @@ -17,6 +17,8 @@ Xie Han (xiehan@sogou-inc.com) */ +#include +#include #include #include #include @@ -82,8 +84,7 @@ public: WFSGResolverTask(const struct WFNSParams *params, WFServiceGovernance *sg, router_callback_t&& cb) : - WFResolverTask(std::move(cb)), - params_(*params) + WFResolverTask(params, std::move(cb)) { sg_ = sg; } @@ -92,16 +93,30 @@ protected: virtual void dispatch(); protected: - const struct WFNSParams params_; WFServiceGovernance *sg_; }; +static void copy_host_port(ParsedURI& uri, const EndpointAddress *addr) +{ + if (!addr->host.empty()) + { + free(uri.host); + uri.host = strdup(addr->host.c_str()); + } + + if (!addr->port.empty()) + { + free(uri.port); + uri.port = strdup(addr->port.c_str()); + } +} + void WFSGResolverTask::dispatch() { - WFNSTracing *tracing = params_.tracing; + WFNSTracing *tracing = ns_params_.tracing; EndpointAddress *addr; - if (sg_->select(params_.uri, tracing, &addr)) + if (sg_->select(ns_params_.uri, tracing, &addr)) { auto *tracing_data = (WFServiceGovernance::TracingData *)tracing->data; if (!tracing_data) @@ -114,24 +129,10 @@ void WFSGResolverTask::dispatch() tracing_data->history.push_back(addr); - type_ = params_.type; - if (!addr->host.empty()) - host_ = addr->host; - else - host_ = params_.uri.host ? params_.uri.host : ""; - - if (!addr->port.empty()) - port_ = atoi(addr->port.c_str()); - else - port_ = params_.uri.port ? atoi(params_.uri.port) : 0; - - info_ = params_.info; - dns_cache_level_ = params_.retry_times == 0 ? DNS_CACHE_LEVEL_2 : - DNS_CACHE_LEVEL_1; + copy_host_port(ns_params_.uri, addr); dns_ttl_default_ = addr->params->dns_ttl_default; dns_ttl_min_ = addr->params->dns_ttl_min; - endpoint_params_ = addr->params->endpoint_params; - first_addr_only_ = params_.fixed_addr; + ep_params_ = addr->params->endpoint_params; this->WFResolverTask::dispatch(); return; } From f923b300875e8cfaa6205179b772ec88dec3ca70 Mon Sep 17 00:00:00 2001 From: XieHan Date: Mon, 18 Apr 2022 20:42:18 +0800 Subject: [PATCH 4/4] update WFDnsResolverTask --- src/nameservice/WFDnsResolver.cc | 3 --- src/nameservice/WFDnsResolver.h | 6 ++++-- src/nameservice/WFServiceGovernance.cc | 1 - 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/nameservice/WFDnsResolver.cc b/src/nameservice/WFDnsResolver.cc index 8173fb3c..af795c30 100644 --- a/src/nameservice/WFDnsResolver.cc +++ b/src/nameservice/WFDnsResolver.cc @@ -249,7 +249,6 @@ void WFResolverTask::dispatch() this->state = WFT_STATE_SUCCESS; dns_cache->release(addr_handle); - query_dns_ = false; this->subtask_done(); return; } @@ -278,7 +277,6 @@ void WFResolverTask::dispatch() DnsRoutine::run(&dns_in, &dns_out); __add_passive_flags((struct addrinfo *)dns_out.get_addrinfo()); dns_callback_internal(&dns_out, (unsigned int)-1, (unsigned int)-1); - query_dns_ = false; this->subtask_done(); return; } @@ -296,7 +294,6 @@ void WFResolverTask::dispatch() DnsRoutine::create(&out, ret, ai); __add_passive_flags((struct addrinfo *)out.get_addrinfo()); dns_callback_internal(&out, dns_ttl_default_, dns_ttl_min_); - query_dns_ = false; this->subtask_done(); return; } diff --git a/src/nameservice/WFDnsResolver.h b/src/nameservice/WFDnsResolver.h index b6851580..01fb58e2 100644 --- a/src/nameservice/WFDnsResolver.h +++ b/src/nameservice/WFDnsResolver.h @@ -40,6 +40,7 @@ public: { dns_ttl_default_ = dns_ttl_default; dns_ttl_min_ = dns_ttl_min; + query_dns_ = false; } WFResolverTask(const struct WFNSParams *ns_params, @@ -47,6 +48,7 @@ public: WFRouterTask(std::move(cb)), ns_params_(*ns_params) { + query_dns_ = false; } protected: @@ -70,11 +72,11 @@ protected: unsigned int dns_ttl_default_; unsigned int dns_ttl_min_; struct EndpointParams ep_params_; - bool query_dns_; private: - unsigned short port_; const char *host_; + unsigned short port_; + bool query_dns_; }; class WFDnsResolver : public WFNSPolicy diff --git a/src/nameservice/WFServiceGovernance.cc b/src/nameservice/WFServiceGovernance.cc index e30f4664..e946277d 100644 --- a/src/nameservice/WFServiceGovernance.cc +++ b/src/nameservice/WFServiceGovernance.cc @@ -140,7 +140,6 @@ void WFSGResolverTask::dispatch() { this->state = WFT_STATE_TASK_ERROR; this->error = WFT_ERR_UPSTREAM_UNAVAILABLE; - query_dns_ = false; return this->subtask_done(); } }