コード例 #1
0
        public IObservable <IRxn> OnAppHeartBeat(IAppStatusManager updates, SystemStatusEvent app, object[] meta)
        {
            var heartBeat = new TestArenaWorkerHeadbeat()
            {
                Route        = RouteExtensions.GetRoute(app),
                Name         = app.SystemName,
                IpAddress    = app.IpAddress,
                Host         = ParseValueFromMetaWithId("Id", meta),
                Workers      = ParseValueFromMetaWithId("Free Workers", meta),
                ComputerName = ParseValueFromMetaWithId("ComputerName", meta),
                UserName     = ParseValueFromMetaWithId("UserName", meta),
                Tags         = ParseValueFromMetaWithId(bfgTagWorkflow.WorkerTag, meta)
            };

            //update info / tags
            var workerInfoUpdate = new WorkerInfoUpdated()
            {
                Name = app.SystemName,
                Info = ToInfo(meta)
            };

            BalanceRemoteWorkersWithCluster(heartBeat, app, meta);

            return(new IRxn[] { heartBeat, workerInfoUpdate }.ToObservableSequence());
        }
コード例 #2
0
        private void BalanceRemoteWorkersWithCluster(TestArenaWorkerHeadbeat next, SystemStatusEvent app, object[] meta)
        {
            if (app.SystemName.BasicallyContains("TestArena"))
            {
                return; //dont track our node or bad things will happen!
            }
            var theWorkersWeThinkTheNoteHas = _cluster.Workers.Where(c => c.Value.Worker.Route.Equals(Rxns.RouteExtensions.GetRoute(app)))
                                              .Select(r => r.Key)//this could potentially cause GC issues with large worker counts
                                              .ToArray();

            var theCurrentWorkersOnNode     = next.Workers.Split("/").Last().AsInt();
            var workerExpectedVsCurrentDiff = theCurrentWorkersOnNode - theWorkersWeThinkTheNoteHas.Length;

            if (workerExpectedVsCurrentDiff > 0)
            {
                do
                {
                    _workerPool.Process(GenerateWorker(app, meta, workerExpectedVsCurrentDiff.ToString())).WaitR();
                } while (--workerExpectedVsCurrentDiff > 0);
            }

            else if (workerExpectedVsCurrentDiff < 0)
            {
                foreach (var worker in theWorkersWeThinkTheNoteHas)
                {
                    _workerPoolD.Process(new WorkerDisconnected()
                    {
                        Name = worker
                    }).WaitR();

                    if (--workerExpectedVsCurrentDiff >= 0)
                    {
                        break;
                    }
                }
            }
        }