예제 #1
0
        public async Task startTest()
        {
            IStreamProvider _provider = base.GetStreamProvider("CollectionStreamProvider");

            var distributedCollection = GetRandomDistributedCollection <int>();
            await distributedCollection.SetNumberOfNodes(4);

            var l = Enumerable.Range(0, 20000).ToList();

            var references = await distributedCollection.BatchAdd(l);

            ActorModel.Assert(!(references.Any(item => item == null)), "Batch add failed!!");

            var consumer = new MultiStreamListConsumer <ContainerHostedElement <int> >(_provider);

            //Modified: split a statement with 2 awaits (AwaitRewriter must be fixed)
            var getStrIds = await distributedCollection.GetStreamIdentities();

            Console.WriteLine(" ====== COUNT: " + getStrIds.Count);
            //await consumer.SetInput(getStrIds);

            //var tid = await distributedCollection.EnumerateToStream();
            //await consumer.TransactionComplete(tid);

            //////CollectionAssert.AreEquivalent(l, consumer.Items.Select(x => x.Item).ToList());
            ////TODO Rashmi: Write equivalent Assert.
        }
예제 #2
0
        public async Task StartTransaction()
        {
            var sender = GrainClient.GrainFactory.GetGrain <ISender>(0);

            ActorModel.Assert(sender != null, "sender proxy is null");
            await sender.Dummy();

            this.State = 0;
            await this.WriteStateAsync();
        }
예제 #3
0
        public async Task TryToStealMoney()
        {
            int numOfPeople = await this.StateManager.GetStateAsync <int>("PeopleInside");

            bool isSafeOpen = await this.StateManager.GetStateAsync <bool>("IsSafeOpen");

            ActorModel.Log("[LOG] Thief is searching for money. Room has {0} people", numOfPeople);

            ActorModel.Assert(!isSafeOpen || numOfPeople > 0, "Thief stole the money.");
        }
예제 #4
0
        private Event WaitOnEvent()
        {
            MachineId mid = ActorModel.Runtime.GetCurrentMachineId();

            Console.WriteLine("Inside WaitOnEvent: " + mid);

            ActorModel.Runtime.Log($"<ActorModelLog> Machine '{mid.Name}' is " +
                                   "waiting to receive a result.");

            ActorModel.Runtime.SendEvent(this.ActorCompletionMachine,
                                         new ActorCompletionMachine.GetResultRequest(mid));

            Event resultEvent    = null;
            bool  receivedResult = false;

            while (!receivedResult)
            {
                resultEvent = ActorModel.Runtime.Receive(
                    Tuple.Create <Type, Func <Event, bool> >(typeof(ActorCompletionMachine.GetResultResponse), (Event e) =>
                {
                    if ((e as ActorCompletionMachine.GetResultResponse).Source.Equals(this.ActorCompletionMachine))
                    {
                        return(true);
                    }

                    return(false);
                }),

                    Tuple.Create <Type, Func <Event, bool> >(typeof(ActorMachine.ActorEvent), (Event e) =>
                {
                    if (ActorModel.Configuration.AllowReentrantCalls &&
                        ActorModel.ReentrantActors.ContainsKey(mid) &&
                        ActorModel.ReentrantActors[mid])
                    {
                        return(true);
                    }

                    ActorModel.Assert(!(e as ActorMachine.ActorEvent).ExecutionContext.Contains(mid),
                                      $"Deadlock detected. {mid.Name} is not reentrant.");

                    return(false);
                }));
                if (resultEvent is ActorCompletionMachine.GetResultResponse)
                {
                    receivedResult = true;
                }
                else
                {
                    var handler = ActorModel.GetReentrantActionHandler(mid);
                    handler(resultEvent as ActorMachine.ActorEvent);
                }
            }
            return(resultEvent);
        }
예제 #5
0
        //IGrainReminder myReminder;
        //public override async Task OnActivateAsync()
        //{
        //var reminderTask = this.RegisterOrUpdateReminder("helloReminder", TimeSpan.FromSeconds(2),
        //    TimeSpan.FromSeconds(0));
        //ActorModel.Wait(reminderTask);
        //myReminder = ActorModel.GetResult<IGrainReminder>(reminderTask);
        ////this.Timer = this.RegisterTimer(HandleTimeout, null,
        ////    TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(0));
        //    await base.OnActivateAsync();
        //}

        public async Task DoSomething(int numberOfItems)
        {
            var receiver = GrainClient.GrainFactory.GetGrain <IReceiver>(1);

            await receiver.StartTransaction();

            for (int i = 0; i < numberOfItems; i++)
            {
                await receiver.TransmitData(new TransactionItems("xyz" + i));
            }

            int transmitted = await receiver.GetCurrentCount();

            ActorModel.Assert(transmitted <= numberOfItems, "Items sent: " + numberOfItems + "; Transmitted: " + transmitted);
        }
예제 #6
0
        public Task DoSomething(int numberOfItems)
        {
            var receiverProxy = ActorProxy.Create <IReceiver>(new ActorId(1), "ReceiverProxy");

            receiverProxy.StartTransaction();
            for (int i = 0; i < numberOfItems; i++)
            {
                receiverProxy.TransmitData("xyz" + i);
            }

            int transmitted = ActorModel.GetResult <int>(receiverProxy.GetCurrentCount());

            ActorModel.Assert(transmitted <= numberOfItems, "Items sent: " + numberOfItems + "; Transmitted: " + transmitted);

            return(Task.FromResult(true));
        }
예제 #7
0
        /// <summary>
        /// Gets the actor type from the specified
        /// interface and assembly path.
        /// </summary>
        /// <param name="interfaceType">Type</param>
        /// <param name="assemblyPath">Assembly path</param>
        /// <returns>Type</returns>
        private Type GetActorType(Type interfaceType, string assemblyPath)
        {
            List <Assembly> allAssemblies = new List <Assembly>();

            allAssemblies.AddRange(this.GetAllAssemblies(assemblyPath, "exe"));
            allAssemblies.AddRange(this.GetAllAssemblies(assemblyPath, "dll"));

            var types = new List <Type>();

            foreach (var asm in allAssemblies)
            {
                try
                {
                    types.AddRange(asm.GetTypes());
                }
                catch
                {
                    continue;
                }
            }

            IEnumerable <Type> actorTypes = null;

            if (interfaceType.IsGenericType)
            {
                var potentialTypes = types.Where(p => !p.IsInterface);
                foreach (var pType in potentialTypes)
                {
                    foreach (var potentialInterfaceType in pType.GetInterfaces())
                    {
                        if (potentialInterfaceType.IsGenericType && potentialInterfaceType.GetGenericTypeDefinition() == interfaceType.GetGenericTypeDefinition())
                        {
                            return(pType);
                        }
                    }
                }
            }
            else
            {
                actorTypes = types.Where(p => interfaceType.IsAssignableFrom(p) && !p.IsInterface);
            }
            ActorModel.Assert(actorTypes.Any(), "No implementation found for actor " +
                              $"type '{interfaceType}'.");

            return(actorTypes.First());
        }
예제 #8
0
        /// <summary>
        /// Unregisters the specified reminder.
        /// </summary>
        /// <param name="reminder">IActorReminder</param>
        /// <returns>Task</returns>
        protected Task UnregisterReminderAsync(IActorReminder reminder)
        {
            ActorModel.Assert(reminder != null, "Cannot unregister a 'null' reminder.");
            var reminders           = ActorModel.GetReminders(ActorModel.Runtime.GetCurrentMachineId());
            var reminderToBeRemoved = reminders.SingleOrDefault(val
                                                                => ((ActorReminder)val).Name.Equals(reminder.Name));

            if (reminderToBeRemoved != null)
            {
                reminderToBeRemoved.Dispose();
            }

            var task = new ActorCompletionTask <object>();
            var actorCompletionMachine = task.ActorCompletionMachine;

            ActorModel.Runtime.SendEvent(actorCompletionMachine,
                                         new ActorCompletionMachine.SetResultRequest(true));
            return(task);
        }
예제 #9
0
        /// <summary>
        /// Serializes the specified payload.
        /// </summary>
        /// <param name="payload">Payload</param>
        /// <returns>Serialized payload</returns>
        public static object[] Serialize(params object[] payload)
        {
            object[] serializedPayload = new object[payload.Length];
            for (int idx = 0; idx < payload.Length; idx++)
            {
                Type type = payload[idx].GetType();

                //if (type.GetCustomAttribute(typeof(SerializableAttribute), false) != null)
                //{
                //    MemoryStream stream = new MemoryStream();
                //    BinaryFormatter bf = new BinaryFormatter();
                //    bf.Serialize(stream, payload[idx]);

                //    stream.Seek(0, SeekOrigin.Begin);
                //    serializedPayload[idx] = bf.Deserialize(stream);
                //}
                if (type.GetInterfaces().Any(val => val == typeof(ICloneable)))
                {
                    serializedPayload[idx] = ((ICloneable)payload[idx]).Clone();
                }
                else
                {
                    try
                    {
                        serializedPayload[idx] = Serialization.DeepClone(payload[idx]);
                    }
                    catch
                    {
                        ActorModel.Assert(false, $"Payload of type '{type}' " +
                                          "cannot be serialized.");
                    }
                }
            }

            return(serializedPayload);
        }