33 #include "../ncbi_comm.h"
34 #include "../ncbi_lbsmd.h"
35 #include "../ncbi_servicep.h"
58 #define NCBI_USE_ERRCODE_X ConnServ_Connection
60 #define LBSMD_PENALIZED_RATE_BOUNDARY -0.01
103 m_Service->m_Listener->SetErrorHandler(error_handler);
133 return m_Impl->GetServer();
197 server_group_impl->m_Servers.begin() +
s_GetRand(
198 CRandom::TValue((server_group_impl->m_SuppressedBegin -
199 server_group_impl->m_Servers.begin()) - 1)))
208 if (number_of_servers <= 1)
219 }
while (number_of_servers > 0);
269 m_KeyCRC32(key_crc32)
271 TNetServerList::const_iterator server_list_iter(
m_Position);
283 if (highest_rank < server_rank)
284 highest_rank = server_rank;
299 TNetServerList::const_iterator server_list_iter(
333 m_PropCreator(listener->GetPropCreator()),
334 m_EnforcedServer(0, 0),
335 m_MaxTotalTime(
CTimeout::eInfinite),
336 m_UseOldStyleAuth(
false)
342 m_Listener(listener),
344 m_ServiceName(service_name),
345 m_RebalanceStrategy(
registry, sections),
348 m_ClientName(client_name)
353 m_Listener(prototype->m_Listener->Clone()),
354 m_ServerPool(prototype->m_ServerPool),
355 m_ServiceName(server->m_Address.AsString()),
356 m_RebalanceStrategy(prototype->m_RebalanceStrategy),
357 m_RoundRobin(prototype->m_RoundRobin.load()),
358 m_APIName(prototype->m_APIName),
359 m_ClientName(prototype->m_ClientName),
360 m_UseSmartRetries(prototype->m_UseSmartRetries),
361 m_ConnectionMaxRetries(prototype->m_ConnectionMaxRetries),
362 m_ConnectionRetryDelay(prototype->m_ConnectionRetryDelay),
363 m_NetInfo(prototype->m_NetInfo)
369 m_Listener(prototype->m_Listener->Clone()),
370 m_ServerPool(prototype->m_ServerPool),
371 m_ServiceName(service_name),
372 m_RebalanceStrategy(prototype->m_RebalanceStrategy),
373 m_RoundRobin(prototype->m_RoundRobin.load()),
374 m_APIName(prototype->m_APIName),
375 m_ClientName(prototype->m_ClientName),
376 m_UseSmartRetries(prototype->m_UseSmartRetries),
377 m_ConnectionMaxRetries(prototype->m_ConnectionMaxRetries),
378 m_ConnectionRetryDelay(prototype->m_ConnectionRetryDelay),
379 m_NetInfo(prototype->m_NetInfo)
406 const string& api_name,
const string& service_name,
const string& client_name,
411 rv->Init(
registry, sections, ns_client_name);
425 #ifdef NCBI_GRID_XSITE_CONN_SUPPORT
428 SNetServiceXSiteAPI::AllowXSiteConnections();
433 return SNetServiceXSiteAPI::IsUsingXSiteProxy();
436 static const char kXSiteFwd[] =
"XSITEFWD";
438 void SNetServiceXSiteAPI::AllowXSiteConnections()
441 const auto local_domain = GetDomain(local_ip);
447 m_LocalDomain.store(local_domain);
448 m_AllowXSiteConnections.store(
true);
451 bool SNetServiceXSiteAPI::IsUsingXSiteProxy()
453 return m_AllowXSiteConnections.load();
458 if (
registry.
Get({
"netservice_api", sections },
"allow_xsite_conn",
false)) {
459 AllowXSiteConnections();
471 if (IsForeignAddr(actual.host)) {
476 memset(&rr, 0,
sizeof(rr));
478 rr.host = actual.host;
483 auto text_len = service.size() ?
min(service.size() + 1, text_max) : 0;
484 memcpy(rr.text, service.c_str(), text_len);
489 svc.rdbuf()->PUBSETBUF(0, 0);
490 if (svc.write((
const char*) &rr.ticket,
sizeof(rr.ticket)) &&
492 svc.read(
buf,
sizeof(
buf)-1);
493 len = (size_t) svc.gcount();
503 err =
"Connection refused";
505 err =
"Short response received";
508 ?
"Client rejected" :
"Unknown error";
509 else if (memcmp(
buf,
"NCBI", 4) != 0)
510 err = rr.text[0] ? rr.text :
"Unspecified error";
514 "Error while acquiring auth ticket from"
515 " cross-site connection proxy "
516 << kXSiteFwd <<
": " << err);
521 actual.host = rr.host;
531 text_len = strlen(rr.text) + 1;
532 if (text_len > text_max)
542 "Error while tunneling through proxy "
543 << kXSiteFwd <<
": " << err);
556 "Error while sending proxy auth ticket");
560 int SNetServiceXSiteAPI::GetDomain(
unsigned int ip)
571 bool SNetServiceXSiteAPI::IsForeignAddr(
unsigned int ip)
573 if (!IsUsingXSiteProxy())
return false;
575 const auto d = GetDomain(
ip);
576 return d && (d != m_LocalDomain);
579 atomic<int> SNetServiceXSiteAPI::m_LocalDomain{0};
580 atomic<bool> SNetServiceXSiteAPI::m_AllowXSiteConnections{
false};
626 string host =
registry.
Get(sections, {
"server",
"host" },
"");
629 if (!host.empty() && !port.empty())
m_ServiceName = host +
":" + port;
649 m_APIName <<
": client name is not set");
661 const auto kConnTimeoutDefault = 2.0;
662 const auto kCommTimeoutDefault = 12.0;
663 const auto kFirstServerTimeoutDefault = 0.0;
672 double conn_timeout =
registry.
Get(sections,
"connection_timeout", kConnTimeoutDefault);
675 double comm_timeout =
registry.
Get({ sections,
"netservice_api" },
"communication_timeout", kCommTimeoutDefault);
678 double first_srv_timeout =
registry.
Get(sections,
"first_server_timeout", kFirstServerTimeoutDefault);
681 double max_total_time =
registry.
Get(sections,
"max_connection_time", 0.0);
688 unsigned discovery_iteration)
696 server_group->
Reset(discovery_iteration);
720 auth +=
" client_path=\"";
731 return m_Impl->m_ServiceName;
736 return m_Impl->m_ServerPool;
741 return m_Impl->IsLoadBalanced();
746 m_Impl->m_EnforcedServer = std::move(address);
758 output_stream <<
'[' << (*it).GetServerAddress() <<
']' << endl;
760 switch (output_style) {
762 output_stream << (*it).ExecWithRetry(
cmd,
false).response << endl;
767 CUrlArgs url_parser((*it).ExecWithRetry(
cmd,
false).response);
770 output_stream << field->name <<
771 ": " << field->value << endl;
779 (*it).ExecWithRetry(
cmd,
true));
782 output->SetNetCacheCompatMode();
786 while (
output.ReadLine(line))
787 output_stream << line << endl;
792 output_stream << endl;
804 return loc.first->second;
808 loc.first->second = server;
827 server->m_ServerPool =
this;
876 bool multiline_output)
881 m_APIName <<
": service name is not set");
890 exec_result, &random_traversal,
908 bool multiline_output)
910 return m_Impl->FindServerAndExec(
cmd, multiline_output);
916 (*it).ExecWithRetry(
cmd,
false);
923 m_APIName <<
": service name is not set");
958 TNetServerList::size_type number_of_regular_servers = 0;
959 TNetServerList::size_type number_of_standby_servers = 0;
964 for (
const auto& d : discovered) {
971 servers.insert(servers.begin() +
972 number_of_regular_servers++, server_rate);
973 else if (d.second < max_standby_rate ||
975 servers.push_back(server_rate);
977 servers.insert(servers.begin() +
978 number_of_regular_servers, server_rate);
979 if (d.second == max_standby_rate)
980 ++number_of_standby_servers;
982 max_standby_rate = d.second;
983 number_of_standby_servers = 1;
989 (number_of_regular_servers > 0 ?
990 number_of_regular_servers : number_of_standby_servers);
1027 for (
auto& w : *
this) {
1039 bool multiline_output,
1048 enum EIterationMode {
1051 } iteration_mode = eInitialIteration;
1054 vector<CNetServer> servers_to_retry;
1055 unsigned current_server = 0;
1059 unsigned number_of_servers = 0;
1060 unsigned ns_with_submits_disabled = 0;
1061 unsigned servers_throttled = 0;
1062 bool blob_not_found =
false;
1065 const bool use_fst = (fst.sec || fst.usec) && (retry_count > 0 ||
m_UseSmartRetries);
1066 const STimeout* timeout = use_fst ? &fst :
nullptr;
1071 skip_server =
false;
1076 fail_only_warnings.clear();
1088 blob_not_found =
true;
1101 ++ns_with_submits_disabled;
1103 fail_only_warnings.emplace_back(ex.
GetMsg(), server);
1119 ++servers_throttled;
1120 fail_only_warnings.emplace_back(ex.
GetMsg(), server);
1128 ++number_of_servers;
1130 if (iteration_mode == eInitialIteration) {
1132 servers_to_retry.push_back(server);
1138 servers_to_retry.erase(servers_to_retry.begin() +
1141 if (current_server < servers_to_retry.size())
1142 server = servers_to_retry[current_server];
1147 if (!blob_not_found && !deadline.
IsInfinite() &&
1154 if (number_of_servers == ns_with_submits_disabled) {
1156 "Cannot execute [" <<
cmd <<
1157 "]: all NetSchedule servers are "
1158 "in REFUSESUBMITS mode for the " +
m_ServiceName +
" service.");
1161 if (number_of_servers == servers_throttled) {
1163 "Cannot execute [" <<
cmd <<
1164 "]: all servers are throttled for the " +
m_ServiceName +
" service.");
1167 if (retry_count <= 0 || servers_to_retry.empty()) {
1168 if (blob_not_found) {
1170 "Cannot execute [" <<
cmd <<
"]: blob not found.");
1173 "Unable to execute [" <<
cmd <<
1174 "] on any of the discovered servers for the " +
m_ServiceName +
" service.");
1179 "of the discovered servers; will retry after delay.");
1183 number_of_servers = 0;
1184 ns_with_submits_disabled = 0;
1185 servers_throttled = 0;
1187 iteration_mode = eRetry;
1188 server = servers_to_retry[current_server = 0];
1203 default:
return nullptr;
1212 it->second->m_CurrentConnectionGeneration.Add(1);
1232 while (server_group !=
NULL) {
1234 delete server_group;
1235 server_group = next_group;
1241 m_Impl->m_CommTimeout = to;
1245 return m_Impl->m_CommTimeout;
1251 m_Impl->GetDiscoveredServers(servers);
1268 "Couldn't find any available servers for the " +
1269 m_Impl->m_ServiceName +
" service.");
1274 return m_Impl->Iterate(priority_server);
1294 "Couldn't find any available servers for the " +
1301 m_Impl->GetDiscoveredServers(servers);
1305 "Couldn't find any available servers for the " +
1306 m_Impl->m_ServiceName +
" service.");
1319 m_Impl->GetDiscoveredServers(servers);
1328 return ++circular_iter;
1341 string error_messages;
1354 if (!error_messages.empty())
1355 error_messages +=
'\n';
1357 error_messages += (*it)->m_ServerInPool->m_Address.AsString();
1358 error_messages +=
": ";
1359 error_messages += ex.
what();
1362 if (!error_messages.empty())
1363 error_messages +=
'\n';
1365 error_messages += (*it)->m_ServerInPool->m_Address.AsString();
1366 error_messages +=
": ";
1367 error_messages += ex.
what();
1371 if (!error_messages.empty()) {
1387 m_Impl->m_Listener->SetErrorHandler(error_handler);
1392 m_Impl->m_Listener->SetWarningHandler(warning_handler);
1408 return !loc.second ? loc.first->second :
1409 (loc.first->second =
1450 result.SetByKey((*it).GetServerAddress(), exec_to_json.
ExecOn(*it));
1463 void OnErrorImpl(
const string&,
CNetServer&)
override {}
1464 void OnWarningImpl(
const string&,
CNetServer&)
override {}
1471 registry_builder, sections);
Checksum and hash calculation classes.
CChecksum – Checksum calculator.
Helper hook-up class that installs default logging/registry/locking (but only if they have not yet be...
This stream exchanges data with a named service, in a constraint that the service is implemented as o...
void Release()
Manually force the resource to be released.
static CJsonNode NewObjectNode()
Create a new JSON object node.
Exception thrown when the requested blob is older than the requested age.
NetCache internal exception.
NetSchedule internal exception.
void StickToServer(SSocketAddress address)
CNetRef< SNetServerPoolImpl > m_Impl
void SetCommunicationTimeout(const STimeout &to)
const STimeout & GetCommunicationTimeout() const
SExecResult ExecWithRetry(const string &cmd, bool multiline_output=false)
Execute remote command 'cmd', wait for the reply, check if it starts with 'OK:', and return the remai...
CNetRef< SNetServiceIteratorImpl > m_Impl
function< bool(const string &, CNetServer)> TEventHandler
void SetErrorHandler(TEventHandler error_handler)
CNetRef< SNetServiceImpl > m_Impl
CNetServiceIterator FindServer(INetServerFinder *finder, EIterationMode mode=eSortByLoad)
const string & GetServiceName() const
static bool IsUsingXSiteProxy()
CNetServer GetServer(unsigned host, unsigned short port)
void PrintCmdOutput(const string &cmd, CNcbiOstream &output_stream, ECmdOutputStyle output_style, CNetService::EIterationMode=CNetService::eSortByLoad)
CNetServiceIterator ExcludeServer(CNetServer::TInstance server)
Start iteration excluding 'server' (return the next server after 'server' or NULL).
@ eMultilineOutput_NetCacheStyle
@ eMultilineOutput_NoHeaders
void ExecOnAllServers(const string &cmd)
CNetServiceIterator IterateByWeight(const string &key)
static CNetService Create(const string &api_name, const string &service_name, const string &client_name)
CNetServer::SExecResult FindServerAndExec(const string &cmd, bool multiline_output=false)
void SetWarningHandler(TEventHandler warning_handler)
bool IsLoadBalanced() const
CNetServerPool GetServerPool()
CNetServiceIterator Iterate(EIterationMode mode=eSortByLoad)
CNetService Clone(const string &name)
static void AllowXSiteConnections()
static TServers DiscoverImpl(const string &, unsigned, shared_ptr< void > &, pair< string, const char * >, int, unsigned long)
void OnResourceRequested()
CTimeout – Timeout interval.
This class is for use by the grid_cli utility only.
virtual CJsonNode ExecOn(CNetServer server)=0
virtual bool Consider(CNetServer server)=0
virtual CNetServer BeginIteration()=0
virtual CNetServer NextServer()=0
SRandomServiceTraversal(CNetService::TInstance service)
virtual CNetServer NextServer()
CNetServiceIterator m_Iterator
virtual CNetServer BeginIteration()
iterator_bool insert(const value_type &val)
container_type::value_type value_type
iterator_bool insert(const value_type &val)
static SQLCHAR output[256]
static const struct type types[]
const string & GetProgramExecutablePath(EFollowLinks follow_links=eIgnoreLinks) const
Get the application's executable path.
static CNcbiApplicationGuard InstanceGuard(void)
Singleton method.
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
const string & GetProgramDisplayName(void) const
Get the application's "display" name.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
void swap(NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair1, NCBI_NS_NCBI::pair_base_member< T1, T2 > &pair2)
@ eTakeOwnership
An object can take ownership of another.
Uint4 GetChecksum(void) const
Return calculated checksum.
void AddChars(const char *str, size_t len)
Update current control sum with data provided.
EIO_Status CONN_GetSOCK(CONN conn, SOCK *sock)
Get an underlying SOCK handle for connection that is implemented as a socket.
static CRequestContext & GetRequestContext(void)
Shortcut to CDiagContextThreadData::GetThreadData().GetRequestContext()
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
TErrCode GetErrCode(void) const
Get error code.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
const string & GetMsg(void) const
Get message string.
void Warning(CExceptionArgs_Base &args)
#define NCBI_THROW_FMT(exception_class, err_code, message)
The same as NCBI_THROW but with message processed as output to ostream.
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
@ eBlobNotFound
Access denied.
bool Referenced(void) const THROWS_NONE
Check if object is referenced.
TObjectType * Release(void)
Release a reference to the object and return a pointer to the object.
uint32_t Uint4
4-byte (32-bit) unsigned integer
Uint4 TValue
Type of the generated integer value and/or the seed value.
TValue GetRand(void)
Get the next random number in the interval [0..GetMax()] (inclusive)
void Randomize(void)
Re-initialize (re-seed) the generator using platform-specific randomization.
virtual const string & Get(const string §ion, const string &name, TFlags flags=0) const
Get the parameter value.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
unsigned int TSERV_Type
Bitwise OR of ESERV_Type[Special].
#define SERV_LOCALHOST
Special values for the "preferred_host" parameter.
@ fSERV_IncludeSuppressed
#define SOCK_NetToHostShort
unsigned short SOCK_HostToNetShort(unsigned short value)
See man for the BSDisms, htonl() and htons().
void Reset(SOCK sock, EOwnership if_to_own, ECopyTimeout whence)
Close the current underlying "SOCK" (if any, and if owned), and from now on use "sock" as the underly...
EIO_Status SOCK_Pushback(SOCK sock, const void *data, size_t size)
Push the specified data back to the socket's input queue (in the socket's internal read buffer).
EIO_Status SOCK_CreateOnTop(const void *handle, size_t handle_size, SOCK *sock)
[SERVER-side] Create a socket on top of a "handle".
EIO_Status Write(const void *buf, size_t size, size_t *n_written=0, EIO_WriteMethod how=eIO_WritePersist)
Write to socket.
static unsigned int GetLocalHostAddress(ESwitch reget=eDefault)
Local host address in network byte order (cached for faster retrieval)
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
static string PrintableString(const CTempString str, TPrintableMode mode=fNewLine_Quote|fNonAscii_Passthru)
Get a printable version of the specified string.
static SIZE_TYPE FindNoCase(const CTempString str, const CTempString pattern, SIZE_TYPE start, SIZE_TYPE end, EOccurrence which=eFirst)
Find the pattern in the specified range of a string using a case insensitive search.
static void TruncateSpacesInPlace(string &str, ETrunc where=eTrunc_Both)
Truncate whitespace in a string (in-place)
CNanoTimeout GetRemainingTime(void) const
Get time left to the expiration.
const long kMilliSecondsPerSecond
Number milliseconds in one second.
unsigned long GetAsMilliSeconds(void) const
Get as number of milliseconds.
bool IsInfinite(void) const
Check if the deadline is infinite.
const TArgs & GetArgs(void) const
Get the const list of arguments.
const STimeout * g_CTimeoutToSTimeout(const CTimeout &cto, STimeout &sto)
CTimeout/STimeout adapters.
const char * IO_StatusStr(EIO_Status status)
Get the text form of an enum status value.
@ eIO_Success
everything is fine, no error occurred
Definition of all error codes used in connect services library (xconnserv.lib and others).
static void text(MDB_val *v)
constexpr auto sort(_Init &&init)
const struct ncbi::grid::netcache::search::fields::KEY key
#define FWD_RR_KEEPALIVE
Try to reuse the connection.
#define FWD_RR_FIREWALL
FWDaemon request / reply.
#define FWD_RR_REJECTMASK
#define FWD_RR_MAX_SIZE
Maximal accepted request/reply size.
Parameters initialization model.
int NcbiIPv4ToIPv6(TNCBI_IPv6Addr *addr, unsigned int ipv4, size_t pfxlen)
Embed a passed network byte order IPv4 address into an IPv6 address using the specified prefix length...
const char * LBSMD_GetHostParameter(unsigned int addr, const char *name)
IMessage/IMessageListener interfaces and basic implementations.
void SleepMilliSec(unsigned long ml_sec, EInterruptOnSignal onsignal=eRestartOnSignal)
NetCache API exception declarations.
CJsonNode g_ExecToJson(IExecToJson &exec_to_json, CNetService service, CNetService::EIterationMode iteration_mode)
This function is for use by the grid_cli utility only.
void g_AppendClientIPSessionIDHitID(string &cmd)
#define LBSMD_PENALIZED_RATE_BOUNDARY
DEFINE_STATIC_FAST_MUTEX(s_RndLock)
static CRandom::TValue s_GetRand(CRandom::TValue max_value)
void g_AppendClientIPAndSessionID(string &cmd, const CRequestContext &req)
pair< SNetServerInPool *, double > TServerRate
vector< TServerRate > TNetServerList
void g_AppendHitID(string &cmd, CRequestContext &req)
#define RETRY_DELAY_DEFAULT
#define CONNECTION_MAX_RETRIES
static CMiniMutex s_RndLock
void OnWarning(const string &warn_msg, CNetServer &server)
virtual void DeleteThis()
Virtual method "deleting" this object.
TNetServerList::const_iterator m_SuppressedBegin
SDiscoveredServers * m_NextGroupInPool
unsigned m_DiscoveryIteration
void Reset(unsigned discovery_iteration)
CRef< INetServerConnectionListener > m_Listener
SFailOnlyWarnings(CRef< INetServerConnectionListener > listener)
CRef< SNetServerInPool > m_ServerInPool
static void ConnectImpl(CSocket &, SConnectDeadline &, const SSocketAddress &, const SSocketAddress &)
CNetServer::SExecResult ConnectAndExec(const string &cmd, bool multiline_output, bool retry_on_exception=false)
SThrottleStats m_ThrottleStats
CNetServerPool m_ServerPool
CNetServer GetServer(SNetServiceImpl *service, SSocketAddress server_address)
STimeout m_FirstServerTimeout
void ResetServerConnections()
CRef< SNetServerInPool > ReturnServer(SNetServerInPool *server_impl)
virtual ~SNetServerPoolImpl()
void Init(CSynRegistry ®istry, const SRegSynonyms §ions)
SNetServerPoolImpl(INetServerConnectionListener *listener)
TLBSMAffinity m_LBSMAffinity
SSocketAddress m_EnforcedServer
SNetServerInPool * FindOrCreateServerImpl(SSocketAddress server_address)
SThrottleParams m_ThrottleParams
INetServerConnectionListener::TPropCreator m_PropCreator
TNetServerByAddress m_Servers
void Swap(SNetServiceImpl &impl, unsigned &n)
EServiceType m_ServiceType
CRef< INetServerConnectionListener > m_Listener
CNetServerPool m_ServerPool
void DiscoverServersIfNeeded()
CNetServer GetServer(SSocketAddress server_address)
@ eRethrowAllServerErrors
static SNetServiceImpl * Create(const string &api_name, const string &service_name, const string &client_name, INetServerConnectionListener *listener, CSynRegistry ®istry, SRegSynonyms §ions, const string &ns_client_name=kEmptyStr)
shared_ptr< void > m_NetInfo
void Init(CSynRegistry ®istry, SRegSynonyms §ions, const string &ns_client_name)
unsigned m_LatestDiscoveryIteration
CNetServer::SExecResult FindServerAndExec(const string &cmd, bool multiline_output)
CSimpleRebalanceStrategy m_RebalanceStrategy
SNetServiceImpl(const string &api_name, const string &service_name, const string &client_name, INetServerConnectionListener *listener, CSynRegistry ®istry, const SRegSynonyms §ions)
SNetServiceIteratorImpl * Iterate(CNetServer::TInstance priority_server)
unsigned long m_ConnectionRetryDelay
CFastMutex m_DiscoveryMutex
void GetDiscoveredServers(CRef< SDiscoveredServers > &discovered_servers)
void IterateUntilExecOK(const string &cmd, bool multiline_output, CNetServer::SExecResult &exec_result, IServiceTraversal *service_traversal, EServerErrorHandling error_handling)
shared_ptr< void > CreateRetryGuard(SRetry::EType type)
SDiscoveredServers * m_DiscoveredServers
SDiscoveredServers * m_ServerGroupPool
static SNetServiceImpl * Clone(SNetServerInPool *server, SNetServiceImpl *prototype)
unsigned m_ConnectionMaxRetries
virtual ~SNetServiceImpl()
bool IsInService(CNetServer::TInstance server)
SDiscoveredServers * AllocServerGroup(unsigned discovery_iteration)
TNetServerList::const_iterator m_Position
CRef< SDiscoveredServers > m_ServerGroup
TNetServerList::const_iterator m_Pivot
SNetServiceIterator_RandomPivot(SDiscoveredServers *server_group_impl, TNetServerList::const_iterator pivot)
TRandomIterators m_RandomIterators
TRandomIterators::const_iterator m_RandomIterator
TNetServerList::const_iterator m_ServerListIter
SNetServiceIterator_Weighted(SDiscoveredServers *server_group_impl, Uint4 key_crc32)
vector< SServerRank >::const_iterator m_CurrentServerRank
SServerRank x_GetServerRank(TNetServerList::const_iterator server) const
vector< SServerRank > m_ServerRanks
bool IsAllowed(const string &service_name) const
void AddToAllowed(const string &service_name)
set< string, PNocase > m_Allowed
TNetServiceByName m_ServiceByName
CNetService GetServiceByNameImpl(const string &, SNetServiceImpl *)
CFastMutex m_ServiceMapMutex
CNetService GetServiceByName(const string &service_name, SNetServiceImpl *prototype)
static void ConnectXSite(CSocket &, SNetServerImpl::SConnectDeadline &, const SSocketAddress &, const string &)
static void InitXSite(CSynRegistry ®istry, const SRegSynonyms §ions)
SNoRetryNoErrors(SNetServiceImpl *service)
void Set(CNetService::TEventHandler error_handler)
CNetRef< SNetServiceImpl > m_Service
SNoRetry(SNetServiceImpl *service)
static SSocketAddress Parse(const string &address, SHost::EName name=SHost::EName::eResolved)
void Init(CSynRegistry ®istry, const SRegSynonyms §ions)