public WebHostRpcWorkerChannelManagerTests()
        {
            _eventManager    = new ScriptEventManager();
            _rpcServer       = new TestRpcServer();
            _loggerProvider  = new TestLoggerProvider();
            _loggerFactory   = new LoggerFactory();
            _testEnvironment = new TestEnvironment();
            _loggerFactory.AddProvider(_loggerProvider);
            _rpcWorkerProcess      = new Mock <IWorkerProcess>();
            _languageWorkerOptions = new LanguageWorkerOptions
            {
                WorkerConfigs = TestHelpers.GetTestWorkerConfigs()
            };
            var applicationHostOptions = new ScriptApplicationHostOptions
            {
                IsSelfHost = true,
                ScriptPath = @"c:\testing\FUNCTIONS-TEST\test$#"
            };

            _optionsMonitor = TestHelpers.CreateOptionsMonitor(applicationHostOptions);

            _rpcWorkerProcessFactory = new Mock <IRpcWorkerProcessFactory>();
            _rpcWorkerProcessFactory.Setup(m => m.Create(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>())).Returns(_rpcWorkerProcess.Object);

            _testLogger = new TestLogger("WebHostLanguageWorkerChannelManagerTests");
            _rpcWorkerChannelFactory = new TestRpcWorkerChannelFactory(_eventManager, _testLogger, _scriptRootPath);
            _rpcWorkerChannelManager = new WebHostRpcWorkerChannelManager(_eventManager, _testEnvironment, _loggerFactory, _rpcWorkerChannelFactory, _optionsMonitor, new TestMetricsLogger());
        }
 public TesRpcWorkerChannelManager(IScriptEventManager eventManager, ILogger testLogger, string scriptRootPath, IRpcWorkerChannelFactory testLanguageWorkerChannelFactory)
 {
     _eventManager   = eventManager;
     _testLogger     = testLogger;
     _scriptRootPath = scriptRootPath;
     _testLanguageWorkerChannelFactory = testLanguageWorkerChannelFactory;
 }
        public WebHostLanguageWorkerChannelManager(IScriptEventManager eventManager, IEnvironment environment, ILoggerFactory loggerFactory, IRpcWorkerChannelFactory languageWorkerChannelFactory, IOptionsMonitor <ScriptApplicationHostOptions> applicationHostOptions)
        {
            _environment   = environment ?? throw new ArgumentNullException(nameof(environment));
            _eventManager  = eventManager;
            _loggerFactory = loggerFactory;
            _languageWorkerChannelFactory = languageWorkerChannelFactory;
            _logger = loggerFactory.CreateLogger <WebHostLanguageWorkerChannelManager>();
            _applicationHostOptions = applicationHostOptions;

            _shutdownStandbyWorkerChannels = ScheduleShutdownStandbyChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(milliseconds: 5000);
        }
        public RpcFunctionInvocationDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                               IMetricsLogger metricsLogger,
                                               IEnvironment environment,
                                               IApplicationLifetime applicationLifetime,
                                               IScriptEventManager eventManager,
                                               ILoggerFactory loggerFactory,
                                               IRpcWorkerChannelFactory rpcWorkerChannelFactory,
                                               IOptions <LanguageWorkerOptions> languageWorkerOptions,
                                               IWebHostRpcWorkerChannelManager webHostLanguageWorkerChannelManager,
                                               IJobHostRpcWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                               IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                               IRpcFunctionInvocationDispatcherLoadBalancer functionDispatcherLoadBalancer)
        {
            _metricsLogger       = metricsLogger;
            _scriptOptions       = scriptHostOptions.Value;
            _environment         = environment;
            _applicationLifetime = applicationLifetime;
            _webHostLanguageWorkerChannelManager = webHostLanguageWorkerChannelManager;
            _jobHostLanguageWorkerChannelManager = jobHostLanguageWorkerChannelManager;
            _eventManager             = eventManager;
            _workerConfigs            = languageWorkerOptions.Value.WorkerConfigs;
            _managedDependencyOptions = managedDependencyOptions ?? throw new ArgumentNullException(nameof(managedDependencyOptions));
            _logger = loggerFactory.CreateLogger <RpcFunctionInvocationDispatcher>();
            _rpcWorkerChannelFactory = rpcWorkerChannelFactory;
            _workerRuntime           = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName);

            var processCount = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionsWorkerProcessCountSettingName);

            _maxProcessCount = (processCount != null && int.Parse(processCount) > 1) ? int.Parse(processCount) : 1;
            _maxProcessCount = _maxProcessCount > _maxAllowedProcessCount ? _maxAllowedProcessCount : _maxProcessCount;
            _functionDispatcherLoadBalancer = functionDispatcherLoadBalancer;

            State = FunctionInvocationDispatcherState.Default;
            ErrorEventsThreshold = 3 * _maxProcessCount;

            _workerErrorSubscription = _eventManager.OfType <WorkerErrorEvent>()
                                       .Subscribe(WorkerError);
            _workerRestartSubscription = _eventManager.OfType <WorkerRestartEvent>()
                                         .Subscribe(WorkerRestart);

            _shutdownStandbyWorkerChannels = ShutdownWebhostLanguageWorkerChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(milliseconds: 5000);
        }
Example #5
0
        public FunctionInvocationDispatcherFactory(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                                   IMetricsLogger metricsLogger,
                                                   IApplicationLifetime applicationLifetime,
                                                   IScriptEventManager eventManager,
                                                   ILoggerFactory loggerFactory,
                                                   IHttpWorkerChannelFactory httpWorkerChannelFactory,
                                                   IRpcWorkerChannelFactory rpcWorkerChannelFactory,
                                                   IOptions <HttpWorkerOptions> httpWorkerOptions,
                                                   IOptionsMonitor <LanguageWorkerOptions> rpcWorkerOptions,
                                                   IEnvironment environment,
                                                   IWebHostRpcWorkerChannelManager webHostLanguageWorkerChannelManager,
                                                   IJobHostRpcWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                                   IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                                   IRpcFunctionInvocationDispatcherLoadBalancer functionDispatcherLoadBalancer,
                                                   IOptions <WorkerConcurrencyOptions> workerConcurrencyOptions)
        {
            if (httpWorkerOptions.Value == null)
            {
                throw new ArgumentNullException(nameof(httpWorkerOptions.Value));
            }

            if (httpWorkerOptions.Value.Description != null)
            {
                _functionDispatcher = new HttpFunctionInvocationDispatcher(scriptHostOptions, metricsLogger, applicationLifetime, eventManager, loggerFactory, httpWorkerChannelFactory);
                return;
            }
            _functionDispatcher = new RpcFunctionInvocationDispatcher(scriptHostOptions,
                                                                      metricsLogger,
                                                                      environment,
                                                                      applicationLifetime,
                                                                      eventManager,
                                                                      loggerFactory,
                                                                      rpcWorkerChannelFactory,
                                                                      rpcWorkerOptions,
                                                                      webHostLanguageWorkerChannelManager,
                                                                      jobHostLanguageWorkerChannelManager,
                                                                      managedDependencyOptions,
                                                                      functionDispatcherLoadBalancer,
                                                                      workerConcurrencyOptions);
        }
        public RpcFunctionInvocationDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                               IMetricsLogger metricsLogger,
                                               IEnvironment environment,
                                               IApplicationLifetime applicationLifetime,
                                               IScriptEventManager eventManager,
                                               ILoggerFactory loggerFactory,
                                               IRpcWorkerChannelFactory rpcWorkerChannelFactory,
                                               IOptionsMonitor <LanguageWorkerOptions> languageWorkerOptions,
                                               IWebHostRpcWorkerChannelManager webHostLanguageWorkerChannelManager,
                                               IJobHostRpcWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                               IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                               IRpcFunctionInvocationDispatcherLoadBalancer functionDispatcherLoadBalancer,
                                               IOptions <WorkerConcurrencyOptions> workerConcurrencyOptions)
        {
            _metricsLogger       = metricsLogger;
            _scriptOptions       = scriptHostOptions.Value;
            _environment         = environment ?? throw new ArgumentNullException(nameof(environment));
            _applicationLifetime = applicationLifetime;
            _webHostLanguageWorkerChannelManager = webHostLanguageWorkerChannelManager;
            _jobHostLanguageWorkerChannelManager = jobHostLanguageWorkerChannelManager;
            _eventManager             = eventManager;
            _workerConfigs            = languageWorkerOptions?.CurrentValue?.WorkerConfigs ?? throw new ArgumentNullException(nameof(languageWorkerOptions));
            _managedDependencyOptions = managedDependencyOptions ?? throw new ArgumentNullException(nameof(managedDependencyOptions));
            _logger = loggerFactory.CreateLogger <RpcFunctionInvocationDispatcher>();
            _rpcWorkerChannelFactory        = rpcWorkerChannelFactory;
            _workerRuntime                  = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName);
            _functionDispatcherLoadBalancer = functionDispatcherLoadBalancer;
            _workerConcurrencyOptions       = workerConcurrencyOptions;
            _workerIndexing                 = Utility.CanWorkerIndex(_workerConfigs, _environment);
            State = FunctionInvocationDispatcherState.Default;

            _workerErrorSubscription   = _eventManager.OfType <WorkerErrorEvent>().Subscribe(WorkerError);
            _workerRestartSubscription = _eventManager.OfType <WorkerRestartEvent>().Subscribe(WorkerRestart);

            _shutdownStandbyWorkerChannels = ShutdownWebhostLanguageWorkerChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(milliseconds: 5000);

            _maxProcessCount = new Lazy <Task <int> >(GetMaxProcessCount);
        }