->m_Listener->SetErrorHandler(error_handler);
133 return m_Impl->GetServer();
163 return m_Impl->GetRate();
197server_group_impl->m_Servers.begin() +
s_GetRand(
198 CRandom::TValue((server_group_impl->m_SuppressedBegin -
199server_group_impl->m_Servers.begin()) - 1)))
208 if(number_of_servers <= 1)
219}
while(number_of_servers > 0);
269m_KeyCRC32(key_crc32)
271TNetServerList::const_iterator server_list_iter(
m_Position);
283 if(highest_rank < server_rank)
284highest_rank = server_rank;
299TNetServerList::const_iterator server_list_iter(
333m_PropCreator(listener->GetPropCreator()),
334m_EnforcedServer(0, 0),
335m_MaxTotalTime(
CTimeout::eInfinite),
336m_UseOldStyleAuth(
false)
342m_Listener(listener),
344m_ServiceName(service_name),
345m_RebalanceStrategy(
registry, sections),
348m_ClientName(client_name)
353m_Listener(prototype->m_Listener->Clone()),
354m_ServerPool(prototype->m_ServerPool),
355m_ServiceName(server->m_Address.AsString()),
356m_RebalanceStrategy(prototype->m_RebalanceStrategy),
357m_RoundRobin(prototype->m_RoundRobin.load()),
358m_APIName(prototype->m_APIName),
359m_ClientName(prototype->m_ClientName),
360m_UseSmartRetries(prototype->m_UseSmartRetries),
361m_ConnectionMaxRetries(prototype->m_ConnectionMaxRetries),
362m_ConnectionRetryDelay(prototype->m_ConnectionRetryDelay),
363m_NetInfo(prototype->m_NetInfo)
369m_Listener(prototype->m_Listener->Clone()),
370m_ServerPool(prototype->m_ServerPool),
371m_ServiceName(service_name),
372m_RebalanceStrategy(prototype->m_RebalanceStrategy),
373m_RoundRobin(prototype->m_RoundRobin.load()),
374m_APIName(prototype->m_APIName),
375m_ClientName(prototype->m_ClientName),
376m_UseSmartRetries(prototype->m_UseSmartRetries),
377m_ConnectionMaxRetries(prototype->m_ConnectionMaxRetries),
378m_ConnectionRetryDelay(prototype->m_ConnectionRetryDelay),
379m_NetInfo(prototype->m_NetInfo)
406 const string& api_name,
const string& service_name,
const string& client_name,
411rv->Init(
registry, sections, ns_client_name);
425 #ifdef NCBI_GRID_XSITE_CONN_SUPPORT 428SNetServiceXSiteAPI::AllowXSiteConnections();
433 returnSNetServiceXSiteAPI::IsUsingXSiteProxy();
436 static const charkXSiteFwd[] =
"XSITEFWD";
438 voidSNetServiceXSiteAPI::AllowXSiteConnections()
441 const autolocal_domain = GetDomain(local_ip);
447m_LocalDomain.store(local_domain);
448m_AllowXSiteConnections.store(
true);
451 boolSNetServiceXSiteAPI::IsUsingXSiteProxy()
453 returnm_AllowXSiteConnections.load();
458 if(
registry.
Get({
"netservice_api", sections },
"allow_xsite_conn",
false)) {
459AllowXSiteConnections();
471 if(IsForeignAddr(actual.host)) {
476memset(&rr, 0,
sizeof(rr));
478rr.host = actual.host;
483 autotext_len = service.size() ?
min(service.size() + 1, text_max) : 0;
484memcpy(rr.text, service.c_str(), text_len);
489svc.rdbuf()->PUBSETBUF(0, 0);
490 if(svc.write((
const char*) &rr.ticket
,
sizeof(rr.ticket)) &&
492svc.read(
buf,
sizeof(
buf)-1);
493 len= (size_t) svc.gcount();
503err =
"Connection refused";
505err =
"Short response received";
508?
"Client rejected":
"Unknown error";
509 else if(memcmp(
buf,
"NCBI", 4) != 0)
510err = rr.text[0] ? rr.text :
"Unspecified error";
514 "Error while acquiring auth ticket from" 515 " cross-site connection proxy " 516<< kXSiteFwd <<
": "<< err);
521actual.host = rr.host;
531text_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 intSNetServiceXSiteAPI::GetDomain(
unsigned int ip)
571 boolSNetServiceXSiteAPI::IsForeignAddr(
unsigned int ip)
573 if(!IsUsingXSiteProxy())
return false;
575 const autod = GetDomain(
ip);
576 returnd && (d != m_LocalDomain);
579atomic<int> SNetServiceXSiteAPI::m_LocalDomain{0};
580atomic<bool> SNetServiceXSiteAPI::m_AllowXSiteConnections{
false};
626 stringhost =
registry.
Get(sections, {
"server",
"host"},
"");
627 stringport =
registry.
Get(sections,
"port",
"");
629 if(!host.empty() && !port.empty())
m_ServiceName= host +
":"+ port;
649 m_APIName<<
": client name is not set");
661 const autokConnTimeoutDefault = 2.0;
662 const autokCommTimeoutDefault = 12.0;
663 const autokFirstServerTimeoutDefault = 0.0;
672 doubleconn_timeout =
registry.
Get(sections,
"connection_timeout", kConnTimeoutDefault);
675 doublecomm_timeout =
registry.
Get({ sections,
"netservice_api"},
"communication_timeout", kCommTimeoutDefault);
678 doublefirst_srv_timeout =
registry.
Get(sections,
"first_server_timeout", kFirstServerTimeoutDefault);
681 doublemax_total_time =
registry.
Get(sections,
"max_connection_time", 0.0);
688 unsigneddiscovery_iteration)
696server_group->
Reset(discovery_iteration);
707auth +=
"client=\"";
720auth +=
" 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);
758output_stream <<
'['<< (*it).GetServerAddress() <<
']'<< endl;
760 switch(output_style) {
762output_stream << (*it).ExecWithRetry(
cmd,
false).response << endl;
767 CUrlArgsurl_parser((*it).ExecWithRetry(
cmd,
false).response);
770output_stream << field->name <<
771 ": "<< field->value << endl;
779(*it).ExecWithRetry(
cmd,
true));
782 output->SetNetCacheCompatMode();
786 while(
output.ReadLine(line))
787output_stream << line << endl;
792output_stream << endl;
804 returnloc.first->second;
808loc.first->second = server;
827server->m_ServerPool =
this;
876 boolmultiline_output)
881 m_APIName<<
": service name is not set");
890exec_result, &random_traversal,
908 boolmultiline_output)
910 return m_Impl->FindServerAndExec(
cmd, multiline_output);
916(*it).ExecWithRetry(
cmd,
false);
923 m_APIName<<
": service name is not set");
958TNetServerList::size_type number_of_regular_servers = 0;
959TNetServerList::size_type number_of_standby_servers = 0;
964 for(
const auto& d : discovered) {
971servers.insert(servers.begin() +
972number_of_regular_servers++, server_rate);
973 else if(d.second < max_standby_rate ||
975servers.push_back(server_rate);
977servers.insert(servers.begin() +
978number_of_regular_servers, server_rate);
979 if(d.second == max_standby_rate)
980++number_of_standby_servers;
982max_standby_rate = d.second;
983number_of_standby_servers = 1;
989(number_of_regular_servers > 0 ?
990number_of_regular_servers : number_of_standby_servers);
1027 for(
auto& w : *
this) {
1039 boolmultiline_output,
1048 enumEIterationMode {
1051} iteration_mode = eInitialIteration;
1054vector<CNetServer> servers_to_retry;
1055 unsignedcurrent_server = 0;
1059 unsignednumber_of_servers = 0;
1060 unsignedns_with_submits_disabled = 0;
1061 unsignedservers_throttled = 0;
1062 boolblob_not_found =
false;
1065 const booluse_fst = (fst.sec || fst.usec) && (retry_count > 0 ||
m_UseSmartRetries);
1066 const STimeout* timeout = use_fst ? &fst :
nullptr;
1071skip_server =
false;
1076fail_only_warnings.clear();
1088blob_not_found =
true;
1089skip_server =
true;
1101++ns_with_submits_disabled;
1102skip_server =
true;
1103fail_only_warnings.emplace_back(ex.
GetMsg(), server);
1119++servers_throttled;
1120fail_only_warnings.emplace_back(ex.
GetMsg(), server);
1128++number_of_servers;
1130 if(iteration_mode == eInitialIteration) {
1132servers_to_retry.push_back(server);
1138servers_to_retry.erase(servers_to_retry.begin() +
1141 if(current_server < servers_to_retry.size())
1142server = 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.");
1183number_of_servers = 0;
1184ns_with_submits_disabled = 0;
1185servers_throttled = 0;
1187iteration_mode = eRetry;
1188server = servers_to_retry[current_server = 0];
1203 default:
return nullptr;
1212it->second->m_CurrentConnectionGeneration.Add(1);
1232 while(server_group !=
NULL) {
1234 deleteserver_group;
1235server_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 stringerror_messages;
1354 if(!error_messages.empty())
1355error_messages +=
'\n';
1357error_messages += (*it)->m_ServerInPool->m_Address.AsString();
1358error_messages +=
": ";
1359error_messages += ex.
what();
1362 if(!error_messages.empty())
1363error_messages +=
'\n';
1365error_messages += (*it)->m_ServerInPool->m_Address.AsString();
1366error_messages +=
": ";
1367error_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 =
1427 for(
auto& service_name:
m_Allowed) {
1450 result.SetByKey((*it).GetServerAddress(), exec_to_json.
ExecOn(*it));
1463 voidOnErrorImpl(
const string&,
CNetServer&)
override{}
1464 voidOnWarningImpl(
const string&,
CNetServer&)
override{}
1471registry_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).
static CNCBI_IPAddr GetLocalHostAddress(ESwitch reget=eDefault)
Local host address in network byte order (cached for faster retrieval)
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.
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.
TNCBI_IPv6Addr * 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)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4