Пример #1
0
        public Task AddASameTypeStatelessOperatorToTopology(Guid guid)
        {
            var unit = topology.GetUnit(guid);

            if (unit.OperatorType == OperatorType.Stateless)
            {
                var newUnit = new TopologyUnit(OperatorType.Stateless, Guid.NewGuid());
                //To Add a new operator, we need connect it with all the upper stream units
                //and lower stream unit
                var upperStreamUnits = unit.GetUpperStreamUnits();
                var downsStreamUnits = unit.GetdownStreamUnits();

                var newStatelessOp = GrainFactory.GetGrain <IStatelessOperator>(newUnit.PrimaryKey, Constants.Stateless_Operator_Prefix);

                //Add down stream by this unit
                newStatelessOp.AddCustomDownStreamOperators(downsStreamUnits.Values.ToList());

                foreach (var op in upperStreamUnits)
                {
                    if (op.Value.OperatorType == OperatorType.Source)
                    {
                        var source = GrainFactory.GetGrain <IStreamSource>(op.Key);
                        source.AddCustomDownStreamOperator(newStatelessOp);
                    }
                }
            }
            else
            {
                throw new ArgumentException("The guid is not a stateless operator!");
            }
            return(Task.CompletedTask);
        }
 public override Task OnActivateAsync()
 {
     batchTracker = GrainFactory.GetGrain <IBatchTracker>(Constants.Tracker);
     operatorSettings.operatorType = OperatorType.Stateless;
     topologyManager = GrainFactory.GetGrain <ITopology>(Constants.Topology_Manager);
     topologyUnit    = new TopologyUnit(OperatorType.Stateless, this.GetPrimaryKey());
     topologyManager.AddUnit(topologyUnit);
     return(base.OnActivateAsync());
 }
Пример #3
0
        public override Task OnActivateAsync()
        {
            var streamProvider = GetStreamProvider(Constants.FaultTolerantStreamProvider);

            stream = streamProvider.GetStream <StreamMessage>(Guid.NewGuid(), Constants.FaultTolerantStreamNameSpace);
            SetUpBatchManager();
            SetUpBatchTracker();
            currentBatchID  = 0;
            topologyManager = GrainFactory.GetGrain <ITopology>(Constants.Topology_Manager);
            topologyUnit    = new TopologyUnit(OperatorType.Source, this.GetPrimaryKey());
            topologyManager.AddUnit(topologyUnit);
            return(base.OnActivateAsync());
        }
        public override Task OnActivateAsync()
        {
            //Add a initial state for testing usage
            currentBatchID = 0;
            //Generate random file name
            var name = @"D:\grainStates\grain" + Guid.NewGuid().ToString() + ".dat";

            batchTracker     = GrainFactory.GetGrain <IBatchTracker>(Constants.Tracker);
            batchCoordinator = GrainFactory.GetGrain <IBatchCoordinator>(Constants.Coordinator);
            operatorSettings.incrementalLogAddress = name;
            operatorSettings.operatorType          = OperatorType.Stateful;
            topologyManager = GrainFactory.GetGrain <ITopology>(Constants.Topology_Manager);
            topologyUnit    = new TopologyUnit(OperatorType.Stateful, this.GetPrimaryKey());
            topologyManager.AddUnit(topologyUnit);
            topologyManager.UpdateOperatorSettings(topologyUnit.PrimaryKey, operatorSettings);
            return(Task.CompletedTask);
        }
Пример #5
0
        public async Task <Task> ReplaceTheOldOperator(Guid oldGuid)
        {
            var oldUnit = topology.GetUnit(oldGuid);
            var newUnit = new TopologyUnit(oldUnit.OperatorType, Guid.NewGuid());
            var newGuid = newUnit.PrimaryKey;



            //Only the stateful load the settings
            if (newUnit.OperatorType == OperatorType.Stateful)
            {
                IStatefulOperator statefulOp = GrainFactory.GetGrain <IStatefulOperator>(newUnit.PrimaryKey, Constants.Stateful_Operator_Prefix);
                await statefulOp.MarkOperatorAsFailed();

                await statefulOp.LoadSettings(oldUnit.GetSettings());
            }

            //Disconnect the old and connect new
            var upperStreamUnits = oldUnit.GetUpperStreamUnits();
            var downsStreamUnits = oldUnit.GetdownStreamUnits();

            PrettyConsole.Line("Number of upperStream : " + upperStreamUnits.Count);
            PrettyConsole.Line("Number of downStream : " + downsStreamUnits.Count);

            //Handle Upper Stream
            if (upperStreamUnits.Count > 0)
            {
                var keyList = upperStreamUnits.Keys.ToList();
                int index   = 0;
                foreach (var item in upperStreamUnits.Values.ToList())
                {
                    await DisConnectUnits(item.PrimaryKey, oldGuid);

                    IOperator op;
                    var       unitList = new List <TopologyUnit>();
                    unitList.Add(newUnit);

                    if (item.OperatorType == OperatorType.Stateless)
                    {
                        op = GrainFactory.GetGrain <IOperator>(keyList[index], Constants.Stateless_Operator_Prefix);
                        await op.AddCustomDownStreamOperators(unitList);

                        await op.RemoveCustomDownStreamOperator(oldGuid);
                    }
                    else if (item.OperatorType == OperatorType.Stateful)
                    {
                        op = GrainFactory.GetGrain <IOperator>(keyList[index], Constants.Stateful_Operator_Prefix);
                        await op.AddCustomDownStreamOperators(unitList);

                        await op.RemoveCustomDownStreamOperator(oldGuid);
                    }
                    else if (item.OperatorType == OperatorType.Source)
                    {
                        var source = GrainFactory.GetGrain <IStreamSource>(item.PrimaryKey);
                        await source.AddCustomDownStreamOperators(unitList);

                        await source.RemoveCustomDownStreamOperator(oldGuid);
                    }
                    index++;
                }
            }

            //Handle Down Stream
            if (downsStreamUnits.Count > 0)
            {
                var       units = downsStreamUnits.Values.ToList();
                IOperator newOp;
                if (newUnit.OperatorType == OperatorType.Stateless)
                {
                    newOp = GrainFactory.GetGrain <IStatelessOperator>(newGuid, Constants.Stateless_Operator_Prefix);
                    await newOp.AddCustomDownStreamOperators(units);
                }
                else if (newUnit.OperatorType == OperatorType.Stateful)
                {
                    newOp = GrainFactory.GetGrain <IStatefulOperator>(newGuid, Constants.Stateful_Operator_Prefix);
                    await newOp.AddCustomDownStreamOperators(units);
                }
                else
                {
                    throw new ArgumentException("Source cannot be down stream operator");
                }
            }

            //Remove the old
            await RemoveUnit(oldGuid);

            //Start Recovery
            var batchCoordinator = GrainFactory.GetGrain <IBatchCoordinator>(Constants.Coordinator);

            batchCoordinator.StartRecovery();

            return(Task.CompletedTask);
        }
Пример #6
0
 public Task AddUnit(TopologyUnit unit)
 {
     topology.AddUnit(unit);
     return(Task.CompletedTask);
 }