private void StatusThreadWork(int who,
                               IDictionary <int, ActiveComponent> activeComponents, IDictionary <int, ProblemDataSet> dataSets)
 {
     while (_doStatusWork)
     {
         var elapsed = activeComponents[who].StatusWatch.ElapsedMilliseconds;
         if (elapsed > Properties.Settings.Default.Timeout)
         {
             //backup timeout
             if (activeComponents[who].ComponentType == ComponentType.CommunicationServer)
             {
                 continue;
             }
             Message deregister = new Register()
             {
                 Deregister          = true,
                 DeregisterSpecified = true,
                 Id          = (ulong)who,
                 IdSpecified = true
             };
             SynchronizationQueue.Enqueue(deregister);
             Log.DebugFormat("TIMEOUT of {0}. Deregistering.", activeComponents[who].ComponentType);
             DataSetOps.HandleClientMalfunction(activeComponents, who, dataSets);
             activeComponents.Remove(who);
             return;
         }
         Thread.Sleep((int)Properties.Settings.Default.Timeout);
     }
 }
        public void DataSetCompNodeFailureNextCompNodeWork()
        {
            var comps = new Dictionary <int, ActiveComponent>();

            comps.Add(1, new ActiveComponent()
            {
                ComponentType    = ComponentType.ComputationalNode,
                SolvableProblems = new[] { "abc" }
            });
            comps.Add(2, new ActiveComponent()
            {
                ComponentType    = ComponentType.ComputationalNode,
                SolvableProblems = new[] { "abc" }
            });

            var dict  = new Dictionary <int, ProblemDataSet>();
            var bytes = new byte[1] {
                1
            };

            dict.Add(1,
                     new ProblemDataSet()
            {
                CommonData    = bytes,
                TaskManagerId = 1,
                ProblemType   = "abc",
                PartialSets   = new[]
                {
                    new PartialSet()
                    {
                        PartialProblem  = new SolvePartialProblemsPartialProblem(),
                        PartialSolution = null,
                        Status          = PartialSetStatus.Fresh
                    }
                }
            });
            var ret = DataSetOps.GetMessageForCompNode(comps, 1, dict);

            Assert.AreEqual(typeof(SolvePartialProblems), ret.GetType());

            DataSetOps.HandleClientMalfunction(comps, 1, dict);

            var ret2 = DataSetOps.GetMessageForCompNode(comps, 2, dict);

            Assert.AreEqual(typeof(SolvePartialProblems), ret2.GetType());
            var msg = ret2.Cast <SolvePartialProblems>();

            Assert.AreEqual(1, msg.PartialProblems.Length);
            Assert.AreEqual(1, msg.CommonData.Length);
            Assert.AreEqual(1, msg.CommonData[0]);
            Assert.AreEqual(2, dict[1].PartialSets[0].NodeId);
        }
        public void DataSetTaskManagerFailureNextTaskManagerWork()
        {
            var comps = new Dictionary <int, ActiveComponent>();

            comps.Add(1, new ActiveComponent()
            {
                ComponentType    = ComponentType.TaskManager,
                SolvableProblems = new[] { "abc" }
            });
            comps.Add(2, new ActiveComponent()
            {
                ComponentType    = ComponentType.TaskManager,
                SolvableProblems = new [] { "abc" }
            });
            var dict  = new Dictionary <int, ProblemDataSet>();
            var bytes = new byte[1] {
                1
            };

            dict.Add(1,
                     new ProblemDataSet()
            {
                CommonData    = bytes,
                TaskManagerId = 0,
                ProblemType   = "abc"
            });
            var ret = DataSetOps.GetMessageForTaskManager(comps, 1, dict);

            Assert.AreEqual(typeof(DivideProblem), ret.GetType());

            DataSetOps.HandleClientMalfunction(comps, 1, dict);

            var ret2 = DataSetOps.GetMessageForTaskManager(comps, 2, dict);

            Assert.AreEqual(typeof(DivideProblem), ret2.GetType());
            var msg2 = ret.Cast <DivideProblem>();

            Assert.AreEqual(1, msg2.Data.Length);
            Assert.AreEqual(1, msg2.Data[0]);
            Assert.AreEqual(2, dict[1].TaskManagerId);
        }