Пример #1
0
    //this method gets called once but the HeartbeatController gets an action as a param that it then
    //executes on a timer. I haven't included that but you get the idea

    //This method also checks for tasks that have stopped and restarts them if the manifest call says they should be running.
    //Will also start any new tasks included in the manifest and stop any that aren't included in the manifest.
    internal void MonitorTasks()
    {
        HeartbeatController.Beat(() =>
        {
            HeartBeatHappened?.Invoke(this, null);
            List <int> tasksToStart = new List <int>();

            //this is an api call or whatever drives your config that says what tasks must be running.
            var newManifest = this.GetManifest(Properties.Settings.Default.ResourceId);

            //task Removed Check - If a Processor is removed from the task pool, cancel it if running and remove it from the Tasks List.
            List <int> instanceIds = new List <int>();
            newManifest.Processors.ForEach(x => instanceIds.Add(x.ProcessorId));
            var removed = Tasks.Select(x => x.ProcessorId).ToList().Except(instanceIds).ToList();

            if (removed.Count() > 0)
            {
                foreach (var extaskId in removed)
                {
                    var task = Tasks.FirstOrDefault(x => x.ProcessorId == extaskId);
                    task.CancellationTokenSource?.Cancel();
                }
            }

            foreach (var newtask in newManifest.Processors)
            {
                var oldtask = Tasks.FirstOrDefault(x => x.ProcessorId == newtask.ProcessorId);
                //Existing task check
                if (oldtask != null && oldtask.Task != null)
                {
                    if (!oldtask.Task.IsCanceled && (oldtask.Task.IsCompleted || oldtask.Task.IsFaulted))
                    {
                        var ex = oldtask.Task.Exception;

                        tasksToStart.Add(oldtask.ProcessorId);
                        continue;
                    }
                }
                else         //New task Check
                {
                    tasksToStart.Add(newtask.ProcessorId);
                }
            }

            foreach (var item in tasksToStart)
            {
                var taskToRemove = Tasks.FirstOrDefault(x => x.ProcessorId == item);
                if (taskToRemove != null)
                {
                    Tasks.Remove(taskToRemove);
                }

                var task = newManifest.Processors.FirstOrDefault(x => x.ProcessorId == item);
                if (task != null)
                {
                    CreateProcessorTask(task);
                }
            }
        });
    }
Пример #2
0
        public void should_edit()
        {
            var controller = new HeartbeatController(null, null);

            var result = controller.Edit();

            var display = (CreateHeartbeatInput)result.ViewData.Model;

            display.Message.ShouldBeNull();
        }
Пример #3
0
        public void should_save_new_heartbeat()
        {
            var form = new CreateHeartbeatInput {
                Message = "Howdy"
            };
            var controller = new HeartbeatController(null, null);

            var result = (CommandResult)controller.Edit(form);

            result.Success.AssertActionRedirect().ToAction <HeartbeatController>(a => a.Index());
        }
Пример #4
0
        public void Setup()
        {
            var mockHeartbeatJobController = new Mock <IRecurringJobManager>();
            var mockConfig = new HeartbeatConfig {
                IntervalMinutes = Int32.MaxValue
            };
            var mockOptions = Options.Create <HeartbeatConfig>(mockConfig);

            heartbeat    = new HeartbeatImpl(mockOptions, mockHeartbeatJobController.Object);
            hbController = new HeartbeatController(heartbeat);
        }
Пример #5
0
        public void Get_should_return_status_code_200()
        {
            var controller = new HeartbeatController();

            var result = controller.Get();

            result.Should().BeAssignableTo <StatusCodeResult>();

            var statusCodeResult = result as StatusCodeResult;

            statusCodeResult.StatusCode.Should().Be((int)HttpStatusCode.OK);
        }
Пример #6
0
        public void should_list_on_index()
        {
            var top = new Heartbeat[3];

            var repository = S <IHeartbeatRepository>();

            repository.Stub(x => x.GetTop()).Return(top);

            var controller = new HeartbeatController(repository, null);

            var result = controller.Index();

            result.ViewData.Model.ShouldBeTheSameAs(top);
        }
Пример #7
0
        public void should_check_the_heartbeat()
        {
            var timeout = 5;
            var message = "something";

            var checker = S <IHeartbeatChecker>();

            checker.Stub(x => x.CheckHeartbeat(timeout)).Return(message);

            var controller  = new HeartbeatController(null, checker);
            var result      = controller.Check(5);
            var checkResult = (HeartbeatCheckDisplay)result.ViewData.Model;

            checkResult.Message.ShouldEqual(message);
        }
    public SceneController()
    {
        playerOne = new PlayerController("Player One", 1);
        playerTwo = new PlayerController("Player Two", 2);

        heartbeatController = new HeartbeatController(playerOne, playerTwo);

        mainAudio      = new GameObject("Main Audio").AddComponent <AudioSource>();
        mainAudio.clip = Resources.Load <AudioClip>("Audio/Memo");
        mainAudio.loop = true;
        mainAudio.transform.position = Vector3.zero;
        mainAudio.playOnAwake        = false;
        mainAudio.volume             = 0.02f;

        hasWon  = false;
        victory = GameObject.Find("Victory").transform;
        victory.gameObject.SetActive(false);

        menu = GameObject.Find("Menu").transform;
        menu.gameObject.SetActive(false);
    }
Пример #9
0
        // Heart beats are sent from replica to masters.
        private async Task SendHeartbeats()
        {
            IDictionary <string, Task> heartbeatTasks = new Dictionary <string, Task>();

            foreach (Server masterServer in GetMastersOfPartitionsWhereSelfReplica())
            {
                heartbeatTasks.Add(masterServer.Id, HeartbeatController.ExecuteAsync(masterServer.Stub, selfServerId, HEARTBEAT_TIMEOUT));
            }

            foreach (KeyValuePair <string, Task> heartbeatTask in heartbeatTasks)
            {
                string masterId = heartbeatTask.Key;
                Task   task     = heartbeatTask.Value;
                try
                {
                    await task;
                }
                catch (Grpc.Core.RpcException exception) when(exception.StatusCode == Grpc.Core.StatusCode.DeadlineExceeded || exception.StatusCode == Grpc.Core.StatusCode.Internal)
                {
                    Console.WriteLine($"{DateTime.Now:HH:mm:ss tt} No response from master '{masterId}' heartbeat in '{HEARTBEAT_TIMEOUT}' milliseconds.");
                    DeclareDead(masterId);
                }
            }
        }
 public HeartbeatControllerTests()
 {
     _underTest = new HeartbeatController();
 }