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()); }
private WorkerDiscovered <StartUnitTest, UnitTestResult> GenerateWorker(SystemStatusEvent app, object[] meta, string id) { return(new WorkerDiscovered <StartUnitTest, UnitTestResult>() // 8-| { Worker = new bfgWorkerRxnManagerBridge(_appCmds, _rxnManager, _appUpdates, ToInfo(meta)) { Route = RouteExtensions.GetRoute(app), Name = $"{app.SystemName}_{Guid.NewGuid().ToString().Split('-').FirstOrDefault()}", Ip = app.IpAddress, } }); }
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; } } } }
/// <summary> /// Updates apps that connect to the /// </summary> /// <param name="updates"></param> /// <param name="app"></param> /// <returns></returns> public IObservable <IRxn> OnNewAppDiscovered(IAppStatusManager updates, SystemStatusEvent app, object[] meta) { return(OnAppHeartBeat(updates, app, meta)); }