Exemple #1
0
        private void OnRuleUpdate(object notUsed)
        {
            try
            {
                // process rules and start/stop servers as required
                int updatesQueued = Interlocked.Decrement(ref _ruleUpdatesQueued);
                if (updatesQueued > 0)
                {
                    return;
                }

                // subscription is ready and callback flood has stopped
                List <ICoreItem> ruleItems = _hostConfigRuleSubs.Items;
                _logger.LogDebug("Processing {0} host configuration rules", ruleItems.Count);
                // delete old rules
                foreach (ServerFarmNode node in _serverFarmDict.GetValues())
                {
                    node.Rule = null;
                }
                // process rules by priority
                foreach (ICoreItem item in ruleItems)
                {
                    try
                    {
                        if (item.Expires >= DateTimeOffset.Now)
                        {
                            var newRule = (HostConfigRule)item.Data;
                            // ensure server node exists
                            ServerFarmNode node = _serverFarmDict.GetOrSet(
                                newRule.serverApplName, () => new ServerFarmNode(newRule.serverApplName));
                            int            oldPriority = Int32.MinValue;
                            HostConfigRule oldRule     = node.Rule;
                            if (oldRule != null)
                            {
                                oldPriority = oldRule.Priority;
                            }
                            if ((newRule.Priority >= oldPriority) && (!newRule.Disabled))
                            {
                                node.Rule = newRule;
                            }
                        }
                    }
                    catch (Exception excp)
                    {
                        _logger.Log(excp);
                    }
                }

                // now start/stop servers to match rules
                foreach (ServerFarmNode node in _serverFarmDict.GetValues())
                {
                    try
                    {
                        if (node.Server == null)
                        {
                            if (node.Rule != null)
                            {
                                // create and start?
                                if (node.Rule.serverEnabled)
                                {
                                    // server rule enabled but server does not exist
                                    _logger.LogInfo("Server: '{0}' starting...", node.Key);
                                    _logger.LogDebug("    Rule ItemName  : {0}", node.Rule.PrivateKey);
                                    _logger.LogDebug("    Rule Priority  : {0}", node.Rule.Priority);
                                    _logger.LogDebug("    Server ApplName: {0}", node.Rule.serverApplName);
                                    _logger.LogDebug("    Server ImplType: {0}", node.Rule.serverImplType);
                                    _logger.LogDebug("    Server Enabled?: {0}", node.Rule.serverEnabled);
                                    // todo - load dynamically
                                    string  serverName = node.Rule.serverImplType;
                                    ILogger logger     = new FileLogger(@"C:\_qrsc\ServiceLogs\" + serverName + ".{dddd}.log");
                                    // alert monitor
                                    if (serverName == typeof(AlertServer).Name)
                                    {
                                        node.Server = new AlertServer(logger, EnvId.Undefined);
                                    }
                                    //// file importer
                                    //else if (serverName == typeof(FileImportServer).Name)
                                    //{
                                    //    node.Server = new FileImportServer(logger, EnvId.Undefined);
                                    //}
                                    // market data server
                                    else if (serverName == typeof(MarketDataServer).Name)
                                    {
                                        node.Server = new MarketDataServer(logger, EnvId.Undefined);
                                    }
                                    //// trade importer
                                    //else if (serverName == typeof(TradeImportServer).Name)
                                    //{
                                    //    node.Server = new TradeImportServer(logger, EnvId.Undefined);
                                    //}
                                    //// curve importer
                                    //else if (serverName == typeof(CurveImportServer).Name)
                                    //{
                                    //    node.Server = new CurveImportServer(logger, EnvId.Undefined);
                                    //}
                                    // base curve generator - todo - cant be added until ServerStore is deprecated from HL Engine
                                    else if (serverName == typeof(CurveGenServer).Name)
                                    {
                                        node.Server = new CurveGenServer(logger, this.Client);
                                    }
                                    // stressed curve generator
                                    else if (serverName == typeof(StressGenServer).Name)
                                    {
                                        node.Server = new StressGenServer(logger, this.Client);
                                    }
                                    // trade valuation server
                                    else if (serverName == typeof(TradeValuationServer).Name)
                                    {
                                        node.Server = new TradeValuationServer(logger, this.Client);
                                    }
                                    // valuation aggregator
                                    //else if (serverName == typeof(ValueAggServer).Name)
                                    //{
                                    //    node.Server = new ValueAggServer(logger, EnvId.Undefined);
                                    //}
                                    else
                                    {
                                        DisposeHelper.SafeDispose(ref logger);
                                        throw new ApplicationException(
                                                  "Unknown serverImplType: '" + serverName + "'");
                                    }
                                    node.Logger = logger;
                                    node.Server.Start();
                                    _logger.LogInfo("Server: '{0}' started.", node.Key);
                                }
                            }
                        }
                        else
                        {
                            // still running
                            // stop and destroy?
                            if ((node.Rule == null) || (!node.Rule.serverEnabled))
                            {
                                if (node.Rule != null)
                                {
                                    _logger.LogDebug("    Rule ItemName  : {0}", node.Rule.PrivateKey);
                                    _logger.LogDebug("    Rule Priority  : {0}", node.Rule.Priority);
                                    _logger.LogDebug("    Server ApplName: {0}", node.Rule.serverApplName);
                                    _logger.LogDebug("    Server Enabled?: {0}", node.Rule.serverEnabled);
                                }
                                else
                                {
                                    _logger.LogDebug("    No rules found for this server!");
                                }
                                // server exists but rule is not enabled
                                _logger.LogInfo("Server: '{0}' stopping...", node.Key);
                                node.Server.Stop();
                                DisposeHelper.SafeDispose(ref node.Server);
                                DisposeHelper.SafeDispose(ref node.Logger);
                                _logger.LogInfo("Server: '{0}' stopped.", node.Key);
                            }
                        }
                        // publish result
                        PublishHostConfigResult(node, null);
                    }
                    catch (Exception e)
                    {
                        _logger.Log(e);
                        // publish result
                        PublishHostConfigResult(node, "Exception: " + e);
                    }
                }
            }
            catch (Exception e)
            {
                _logger.Log(e);
            }
        }
 /// <summary>
 /// Gets the counter
 /// </summary>
 /// <param name="name"></param>
 /// <returns></returns>
 public StatsCounter GetCounter(string name)
 {
     return(_counters.GetOrSet(name, () => new StatsCounter(name)));
 }
Exemple #3
0
        // Core V3.4 server implementation

        #region ISessCtrlV131 Members

        /// <summary>
        ///
        /// </summary>
        /// <param name="header"></param>
        /// <param name="clientInfo"></param>
        /// <returns></returns>
        public V131SessionReply BeginSessionV131(V131SessionHeader header, V131ClientInfo clientInfo)
        {
            // validate new client
            Guid clientId = clientInfo.NodeGuid;

            // - ensure configured client/server envs are the same
            if (CoreHelper.ToEnvId(clientInfo.ConfigEnv) != _serverCfg.ModuleInfo.ConfigEnv)
            {
                // not valid
                string msg =
                    $"Client environment ({clientInfo.ConfigEnv}) <> server environment ({_serverCfg.ModuleInfo.ConfigEnv})!";
                Logger.LogWarning(msg);
                return(new V131SessionReply(msg));
            }
            // - ensure build environment is backward compatible
            if (CoreHelper.ToEnvId(clientInfo.BuildEnv) < _serverCfg.ModuleInfo.BuildEnv)
            {
                // not valid
                string msg =
                    $"Client build environment ({clientInfo.BuildEnv}) < server build environment ({_serverCfg.ModuleInfo.BuildEnv})!";
                Logger.LogWarning(msg);
                return(new V131SessionReply(msg));
            }
            // - check client version
            const string minimumVersion = "3.4.1723.1"; // 1.1.1501.1  March 01, 2019
            const string optimalVersion = "3.4.1723.1";

            if (!V131Helpers.CheckRequiredFileVersion(Logger, minimumVersion, clientInfo.CompInfo.AssmFVer))
            {
                // older than minimum - reject connection
                string msg = $"Client version ({clientInfo.CompInfo.AssmFVer}) < minimum version ({minimumVersion})!";
                Logger.LogError(msg);
                Logger.LogDebug("Connection: '{0}' rejected ({1})", clientId, header.ReplyAddress);
                return(new V131SessionReply(msg));
            }
            if (!V131Helpers.CheckRequiredFileVersion(Logger, optimalVersion, clientInfo.CompInfo.AssmFVer))
            {
                // older than optimal - log warning
                string msg = $"Client version ({clientInfo.CompInfo.AssmFVer}) < optimal version ({optimalVersion})!";
                Logger.LogWarning(msg);
            }
            // - ensure STG/PRD envs servers only accessed by valid clients
            if (_serverCfg.ModuleInfo.ConfigEnv >= EnvId.Stg_StagingLive && (clientInfo.CompInfo.AssmPTok != _serverCfg.ModuleInfo.CorePTok))
            {
                string msg =
                    $"Client signature ({clientInfo.CompInfo.AssmPTok}) <> server signature ({_serverCfg.ModuleInfo.CorePTok})!";
                Logger.LogWarning(msg);
                return(new V131SessionReply(msg));
            }
            // - ensure automated unit tests are not running integration tests
            if (_serverCfg.ModuleInfo.ConfigEnv >= EnvId.Sit_SystemTest &&
                clientInfo.ApplInfo.AssmName.Equals("QTAgent32", StringComparison.OrdinalIgnoreCase))
            {
                string msg =
                    $"Unauthorised client: {clientInfo.UserInfo.UserIdentityName} {clientInfo.HostName} {clientInfo.ApplInfo.AssmName}";
                Logger.LogWarning(msg);
                return(new V131SessionReply(msg));
            }
            IConnection newConnection;

            // build correct connection version
            if (header.ReplyContract == typeof(ITransferV341).FullName)
            {
                newConnection = new ConnectionV34(
                    Logger, _cacheEngine, _serverCfg, clientId, header.ReplyAddress, NodeType.Client);
            }
            else
            {
                // reply contract not supported
                string msg = $"ReplyContract not supported: {header.ReplyContract}";
                Logger.LogWarning(msg);
                return(new V131SessionReply(msg));
            }
            // success - grant access
            IConnection connection = _connectionIndex.GetOrSet(clientId, () => newConnection);

            connection.ReplyAddress = header.ReplyAddress;
            _cacheEngine.UpdateConnectionState(connection.ClientId, connection.ContractName, connection.ReplyAddress);
            // update who stats: domain/name/host/app
            StatsCountersDelta.AddToHierarchy(
                $"ConnUser.{clientInfo.UserInfo.UserIdentityName}.{clientInfo.HostName}.{clientInfo.ApplInfo.AssmName}");
            // update where stats: ip/host/app
            StatsCountersDelta.AddToHierarchy(
                $"ConnHost.{clientInfo.HostIpV4}.{clientInfo.HostName}.{clientInfo.ApplInfo.AssmName}");
            // update version stats:
            StatsCountersDelta.AddToHierarchy(
                $"CVersion.{clientInfo.BuildEnv}.{string.Join(".", clientInfo.CompInfo.AssmFVer.Split('.'), 0, 2).Replace('.', '_')}.{String.Join(".", clientInfo.CompInfo.AssmFVer.Split('.'), 2, 2).Replace('.', '_')}.{clientInfo.HostName}.{clientInfo.ApplInfo.AssmName}");
            Logger.LogDebug("Connection: '{0}' created ({1})", clientId, header.ReplyAddress);
            if (header.DebugRequest)
            {
                Logger.LogDebug("  Identity   : {0} ({1})", clientInfo.UserInfo.UserIdentityName, clientInfo.UserInfo.UserFullName);
                Logger.LogDebug("  Application: {0} V{1}/{2} ({3}/{4})", clientInfo.ApplInfo.AssmName, clientInfo.ApplInfo.AssmNVer, clientInfo.ApplInfo.AssmFVer, clientInfo.ApplInfo.AssmPTok, clientInfo.ApplInfo.AssmHash);
                Logger.LogDebug("  Component  : {0} V{1}/{2} ({3}/{4})", clientInfo.CompInfo.AssmName, clientInfo.CompInfo.AssmNVer, clientInfo.CompInfo.AssmFVer, clientInfo.CompInfo.AssmPTok, clientInfo.CompInfo.AssmHash);
                Logger.LogDebug("  Client Env.: {0} ({1} build)", clientInfo.ConfigEnv, clientInfo.BuildEnv);
                Logger.LogDebug("  Client Intf: {0}", header.ReplyContract);
                Logger.LogDebug("  Other Addrs: {0} ({1},{2})", clientInfo.HostName, clientInfo.HostIpV4, String.Join(",", clientInfo.NetAddrs.ToArray()));
            }
            return(new V131SessionReply(clientId, null));
        }