Beispiel #1
0
        public DirectorNodeService(string TAG, IEnumerable <NodeName> allNodeNames, INodeProxyProvider proxyProvider, DCEPSettings settings)
        {
            this.TAG                   = TAG + "[DirectorNodeService] ";
            this.allNodeNames          = allNodeNames;
            this.settings              = settings;
            this.localNodeCanTerminate = false;
            if (settings.duration != 0)
            {
                this.durationMS = settings.timeUnit.GetTimeSpanFromDuration(settings.duration).TotalMilliseconds;
            }

            experimentRunMessageQueue = new SerializableQueue <ExperimentRunNodeDataMessage>();

            nodesToWaitWithStartingFor = new HashSet <NodeName>(allNodeNames);
            systemState = NodeExecutionState.WaitForStart;

            lastReadyToTerminateSignalTime = new Dictionary <NodeName, double>();
            experimentRunDataByNodeName    = new Dictionary <NodeName, ExperimentRunData>();

            foreach (var nodeName in allNodeNames)
            {
                lastReadyToTerminateSignalTime[nodeName] = -1;
                experimentRunDataByNodeName[nodeName]    = null;
            }

            this.proxyProvider = proxyProvider;

            Thread t = new Thread(new ThreadStart(threadStartMethod));

            t.Start();
        }
Beispiel #2
0
 public void  terminateImmediately()
 {
     state = NodeExecutionState.DoTerminate;
     if (directorNodeService != null)
     {
         directorNodeService.terminateAllNodesImmediately();
     }
 }
Beispiel #3
0
        public virtual void OnPostExecute(Connector prevConnector)
        {
            if (NodeGraphManager.OutputDebugInfo)
            {
                System.Diagnostics.Debug.WriteLine("Node.OnPostExecute()");
            }

            ExecutionState = NodeExecutionState.Executed;
        }
Beispiel #4
0
        private void broadcastUpdatedExecutionState(NodeExecutionState newstate)
        {
            var m = new UpdatedExecutionStateMessage(settings.directorNodeName, newstate);

            foreach (var item in allNodeNames)
            {
                (proxyProvider.getProxy(item) as IAmbrosiaNodeProxy).ReceiveDCEPControlMessageFork(m);
            }
        }
Beispiel #5
0
 public DCEPNode(NodeName name, string[] inputlines, DCEPSettings settings)
 {
     TAG = "[" + name + "] ";
     Console.WriteLine(TAG + "DCEPNode Constructor called.");
     state = NodeExecutionState.WaitForStart;
     receivedEventCount      = 0;
     sentReadyToStartMessage = false;
     nodeName            = name;
     externalEventQueue  = new SerializableQueue <AbstractEvent>();
     internalEventQueue  = new SerializableQueue <AbstractEvent>();
     controlMessageQueue = new SerializableQueue <DCEPControlMessage>();
     queryProcessors     = new List <QueryProcessor>();
     this.settings       = settings;
     executionPlan       = new ExecutionPlan(inputlines);
     benchmarkMeter      = new BenchmarkMeter(settings, nodeName);
     createQueryProcessors(executionPlan.queriesByNodeName[nodeName]);
 }
Beispiel #6
0
 public void processControlMessages()
 {
     while (!controlMessageQueue.Data.IsEmpty)
     {
         DCEPControlMessage controlMessage = null;
         if (controlMessageQueue.Data.TryDequeue(out controlMessage))
         {
             if (controlMessage is NodeInfoForCoordinatorMessage)
             {
                 directorNodeService.ProcessNodeInfoForCoordinatorMessage(controlMessage as NodeInfoForCoordinatorMessage);
             }
             else if (controlMessage is UpdatedExecutionStateMessage)
             {
                 var newState = (controlMessage as UpdatedExecutionStateMessage).newState;
                 Console.WriteLine(TAG + "updated execution state from " + state.ToString() + " to " + newState.ToString());
                 state = newState;
             }
         }
     }
 }
 public UpdatedExecutionStateMessage(NodeName sendingNode, NodeExecutionState newState) : base(sendingNode)
 {
     this.newState = newState;
 }
Beispiel #8
0
        public void threadStartMethod()
        {
            while (keepRunning)
            {
                switch (systemState)
                {
                case NodeExecutionState.WaitForStart:
                    // check if nodes are ready to start and start them when everyone is ready
                    if (nodesToWaitWithStartingFor.Count() == 0)
                    {
                        Console.WriteLine(TAG + " All nodes ready. Transitioning into run phase.");
                        broadcastUpdatedExecutionState(NodeExecutionState.DoStartInputGeneration);

                        if (settings.duration == 0)
                        {
                            Console.WriteLine(TAG + "running indefinitely from now on, DirectorNodeService is terminating.");
                            return;
                        }

                        systemState = NodeExecutionState.Running;
                        stopwatch.Start();
                    }
                    else
                    {
                        Console.WriteLine(TAG + "Waiting for node(s) " + string.Join(",", nodesToWaitWithStartingFor.Select(x => x.ToString())) + " to signal they are ready to start.");
                        Thread.Sleep(1000);
                    }
                    break;

                case NodeExecutionState.Running:
                    // check the timer and send "stop input generation" requests once the timer is over
                    if ((stopwatch.ElapsedMilliseconds - this.durationMS) > 0)
                    {
                        broadcastUpdatedExecutionState(NodeExecutionState.DoStopInputGeneration);
                        systemState = NodeExecutionState.ProcessingRemainder;
                        Console.WriteLine(TAG + "Requested to stop input event generation on all nodes. Now waiting for all nodes to finish processing their event queues.");
                    }

                    break;

                case NodeExecutionState.ProcessingRemainder:
                    // wait until all message queues are empty, then possibly count messages and send "terminate" requests
                    var nowMS = stopwatch.ElapsedMilliseconds;

                    if (lastReadyToTerminateSignalTime.Values.ToList().All(timestamp => timestamp != -1 && nowMS - timestamp < 1000))
                    {
                        Console.WriteLine(TAG + "Done. All nodes signaled their queues are empty within the last second. Requesting to terminate query processing on all nodes.");
                        broadcastUpdatedExecutionState(NodeExecutionState.DoSendExperimentDataAndTerminate);


                        // gathering experiment run data
                        Console.WriteLine(TAG + "Waiting for all nodes to send their ExperimentRunData");

                        while (experimentRunDataByNodeName.Values.ToList().Contains(null))
                        {
                            while (!experimentRunMessageQueue.Data.IsEmpty)
                            {
                                ExperimentRunNodeDataMessage m = null;
                                if (experimentRunMessageQueue.Data.TryDequeue(out m))
                                {
                                    experimentRunDataByNodeName[m.sendingNode] = m.nodeData;
                                    Console.WriteLine(TAG + "Received experiment data from node " + m.sendingNode);
                                }
                            }

                            Thread.Sleep(100);
                        }

                        // all experiment data was received
                        Console.WriteLine(TAG + "ExperimentRunData was received from all nodes. Printing the result and terminating.");

                        long totalSentEvents              = 0;
                        long totalGeneratedComplexEvents  = 0;
                        long totalGeneratedPrimtiveEvents = 0;
                        long totalDroppedComplexEvents    = 0;

                        foreach (var item in experimentRunDataByNodeName)
                        {
                            totalSentEvents              += item.Value.receivedEventCount;
                            totalGeneratedComplexEvents  += item.Value.locallyGeneratedComplexEventCount;
                            totalGeneratedPrimtiveEvents += item.Value.locallyGeneratedPrimitiveEventCount;
                            totalDroppedComplexEvents    += item.Value.locallyDroppedComplexEvents;
                        }

                        Console.WriteLine("");
                        Console.WriteLine("Total number of generated complex events:  " + totalGeneratedComplexEvents);
                        Console.WriteLine("Total number of generated primitive events:  " + totalGeneratedPrimtiveEvents);
                        Console.WriteLine("Total number of events sent over network:  " + totalSentEvents);
                        Console.WriteLine("Total number of dropped complex events: " + totalDroppedComplexEvents);

                        localNodeCanTerminate = true;
                        return;
                    }
                    else
                    {
                        Thread.Sleep(100);
                    }

                    break;
                }
            }
        }
Beispiel #9
0
 public override void OnHandle(NodeExecutionState evt)
 {
     this.ExecutionState = evt;
 }
Beispiel #10
0
        public void threadStartMethod()
        {
            stopwatch.Start();

            while (true)
            {
                processControlMessages();

                switch (state)
                {
                case NodeExecutionState.WaitForStart:
                    /*                        // broadcast isready signal to directorNode every second
                     *                     if (stopwatch.ElapsedMilliseconds - lastStatusMessageToCoordinator > 1000){
                     *                         proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new NodeIsReadyToStartMessage(nodeName));
                     *                         //Console.WriteLine(TAG + "sending ready to start message to director node "+settings.directorNodeName.ToString());
                     *                         lastStatusMessageToCoordinator = stopwatch.ElapsedMilliseconds;
                     *                     } */

                    if (!sentReadyToStartMessage)
                    {
                        proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new NodeIsReadyToStartMessage(nodeName));
                        sentReadyToStartMessage = true;
                    }

                    break;

                case NodeExecutionState.DoStartInputGeneration:
                    // TODO: check if this is not already running and throw an error if it is
                    primitiveEventSourceService.start();
                    state = NodeExecutionState.Running;
                    processingStep();
                    break;

                case NodeExecutionState.Running:
                    processingStep();
                    break;

                case NodeExecutionState.DoStopInputGeneration:
                    primitiveEventSourceService.stop();
                    state = NodeExecutionState.ProcessingRemainder;

                    break;

                case NodeExecutionState.ProcessingRemainder:
                    processingStep();

                    // when queues are empty, send isReadyToTerminate message every second
                    if (getQueuedEventCount() == 0)
                    {
                        if (stopwatch.ElapsedMilliseconds - lastStatusMessageToCoordinator > 1000)
                        {
                            proxyProvider.getProxy(settings.directorNodeName)
                            .ReceiveDCEPControlMessageFork(new NodeIsReadyToTerminateMessage(nodeName));
                            lastStatusMessageToCoordinator = stopwatch.ElapsedMilliseconds;
                        }
                    }

                    break;

                case NodeExecutionState.DoSendExperimentDataAndTerminate:

                    var data = new ExperimentRunData(
                        locallyGeneratedComplexEventCount,
                        receivedEventCount,
                        locallyGeneratedPrimitiveEventCount,
                        locallyDroppedComplexEvents);

                    proxyProvider.getProxy(settings.directorNodeName).ReceiveDCEPControlMessageFork(new ExperimentRunNodeDataMessage(nodeName, data));
                    Console.WriteLine(TAG + "Sent experiment data. Update loop is terminating.");
                    Thread.Sleep(500);
                    if (getQueuedEventCount() > 0)
                    {
                        Console.WriteLine(TAG + String.Format("WARNING: requested to terminate with {0} events left in queue.", getQueuedEventCount()));
                    }

                    if (directorNodeService != null)
                    {
                        while (!directorNodeService.localNodeCanTerminate)
                        {
                            processControlMessages();
                        }
                    }
                    return;



                case NodeExecutionState.DoTerminate:
                    if (getQueuedEventCount() > 0)
                    {
                        Console.WriteLine(TAG + String.Format("WARNING: requested to terminate with {0} events left in queue.", getQueuedEventCount()));
                    }
                    return;
                }
            }
        }