コード例 #1
0
        public virtual async Task AbortTransactionExceptionInnerExceptionOnlyContainsOneRootCauseException(string grainStates)
        {
            const int throwGrainCount = 3;
            const int grainCount      = TransactionTestConstants.MaxCoordinatedTransactions - throwGrainCount;
            const int expected        = 5;

            List <ITransactionTestGrain> throwGrains = Enumerable.Range(0, throwGrainCount)
                                                       .Select(i => RandomTestGrain(grainStates))
                                                       .ToList();
            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(throwGrains, expected);

            await coordinator.MultiGrainSet(grains, expected);

            async Task InnerExceptionCheck()
            {
                try
                {
                    await coordinator.MultiGrainAddAndThrow(throwGrains, grains, expected);
                }
                catch (Exception e)
                {
                    e.InnerException.Should().BeOfType <AddAndThrowException>();
                    throw;
                }
            }

            Func <Task> task = () => InnerExceptionCheck();

            task.ShouldThrow <OrleansTransactionAbortedException>();

            grains.AddRange(throwGrains);

            await TestAfterDustSettles(async() =>
            {
                foreach (var grain in grains)
                {
                    int[] actualValues = await grain.Get();
                    foreach (var actual in actualValues)
                    {
                        actual.ShouldBeEquivalentTo(expected);
                    }
                }
            });
        }
コード例 #2
0
        public async Task AbortTransactionExceptionInnerExceptionOnlyContainsOneRootCauseException(string grainStates)
        {
            const int throwGrainCount = 3;
            const int grainCount      = TransactionTestConstants.MaxCoordinatedTransactions - throwGrainCount;
            const int expected        = 5;

            List <ITransactionTestGrain> throwGrains = Enumerable.Range(0, throwGrainCount)
                                                       .Select(i => RandomTestGrain(grainStates))
                                                       .ToList();
            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(throwGrains, expected);

            await coordinator.MultiGrainSet(grains, expected);

            async Task InnerExceptionCheck()
            {
                try
                {
                    await coordinator.MultiGrainAddAndThrow(throwGrains, grains, expected);
                }
                catch (Exception e)
                {
                    Assert.True(e.InnerException is AddAndThrowException);
                    throw e;
                }
            }

            await Assert.ThrowsAsync <OrleansTransactionAbortedException>(() => InnerExceptionCheck());

            grains.AddRange(throwGrains);

            await TestAfterDustSettles(async() =>
            {
                foreach (var grain in grains)
                {
                    int[] actualValues = await grain.Get();
                    foreach (var actual in actualValues)
                    {
                        Assert.Equal(expected, actual);
                    }
                }
            });
        }
コード例 #3
0
        public async Task MultiGrainAbortTransactionOnExceptions(string grainStates)
        {
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions - 1;
            const int expected   = 5;

            ITransactionTestGrain        throwGrain = RandomTestGrain(grainStates);
            List <ITransactionTestGrain> grains     =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await throwGrain.Set(expected);

            await coordinator.MultiGrainSet(grains, expected);

            await Assert.ThrowsAsync <OrleansTransactionAbortedException>(() => coordinator.MultiGrainAddAndThrow(throwGrain, grains, expected));

            grains.Add(throwGrain);

            await TestAfterDustSettles(async() =>
            {
                foreach (var grain in grains)
                {
                    int[] actualValues = await grain.Get();
                    foreach (var actual in actualValues)
                    {
                        Assert.Equal(expected, actual);
                    }
                }
            });
        }
コード例 #4
0
        public virtual async Task MultiGrainReadWriteTransaction(string grainStates)
        {
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            await coordinator.MultiGrainDouble(grains);

            int expected = delta + delta;

            foreach (var grain in grains)
            {
                int[] actualValues = await grain.Get();

                foreach (var actual in actualValues)
                {
                    if (expected != actual)
                    {
                        this.output.WriteLine($"{grain} - failed");
                    }
                    Assert.Equal(expected, actual);
                }
            }
        }
コード例 #5
0
        public virtual async Task MultiGrainReadWriteTransaction(string grainStates, int grainCount)
        {
            const int delta = 5;

            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            await coordinator.MultiGrainDouble(grains);

            int expected = delta + delta;

            foreach (var grain in grains)
            {
                int[] actualValues = await grain.Get();

                foreach (var actual in actualValues)
                {
                    if (expected != actual)
                    {
                        this.testOutput($"{grain} - failed");
                    }
                    actual.ShouldBeEquivalentTo(expected);
                }
            }
        }
コード例 #6
0
        public virtual async Task RepeatGrainReadWriteTransaction(string transactionTestGrainClassName)
        {
            const int repeat     = 10;
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <Guid> grainIds = Enumerable.Range(0, grainCount)
                                   .Select(i => Guid.NewGuid())
                                   .ToList();

            List <ITransactionTestGrain> grains = grainIds
                                                  .Select(id => TestGrain(transactionTestGrainClassName, id))
                                                  .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            for (int i = 0; i < repeat; i++)
            {
                await coordinator.MultiGrainDouble(grains);

                int expected = delta * (int)Math.Pow(2, i + 1);
                foreach (var grain in grains)
                {
                    int actual = await grain.Get();

                    if (expected != actual)
                    {
                        this.output.WriteLine($"{grain} - failed");
                    }
                    Assert.Equal(expected, actual);
                }
            }
        }
コード例 #7
0
        public virtual async Task MultiGrainReadWriteTransaction(string transactionTestGrainClassName)
        {
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <Guid> grainIds = Enumerable.Range(0, grainCount)
                                   .Select(i => Guid.NewGuid())
                                   .ToList();
            List <ITransactionTestGrain> grains = grainIds
                                                  .Select(id => TestGrain(transactionTestGrainClassName, id))
                                                  .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            await coordinator.MultiGrainDouble(grains);

            foreach (var grain in grains)
            {
                await grain.Get();
            }
            foreach (var grainId in grainIds)
            {
                await CheckReport(grainId, 3, 0, 3);
            }
        }
コード例 #8
0
        public virtual async Task MultiGrainReadWriteTransaction(string transactionTestGrainClassName)
        {
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(transactionTestGrainClassName))
                .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            await coordinator.MultiGrainDouble(grains);

            int expected = delta + delta;

            foreach (var grain in grains)
            {
                int actual = await grain.Get();

                Assert.Equal(expected, actual);
            }
        }
コード例 #9
0
        public virtual void MultiTransactionGrainsThrowWhenTransactions(string transactionTestGrainClassName)
        {
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(transactionTestGrainClassName))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            Func <Task> task     = () => coordinator.MultiGrainSet(grains, delta);
            var         response = task.ShouldThrow <OrleansTransactionsDisabledException>();
        }
コード例 #10
0
        public async Task AbortTransactionOnExceptions(string transactionTestGrainClassName)
        {
            const int expected = 5;

            ITransactionTestGrain        grain       = RandomTestGrain(transactionTestGrainClassName);
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(new List <ITransactionTestGrain> {
                grain
            }, expected);

            await Assert.ThrowsAsync <OrleansTransactionAbortedException>(() => coordinator.AddAndThrow(grain, expected));

            await TestAfterDustSettles(async() =>
            {
                int actual = await grain.Get();
                Assert.Equal(expected, actual);
            });
        }
コード例 #11
0
        public async Task AbortTransactionOnExceptions(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int expected = 5;

            ITransactionTestGrain        grain       = RandomTestGrain(grainStates);
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(new List <ITransactionTestGrain> {
                grain
            }, expected);

            await Assert.ThrowsAsync <OrleansTransactionAbortedException>(() => coordinator.AddAndThrow(grain, expected));

            await TestAfterDustSettles(async() =>
            {
                int[] actualValues = await grain.Get();
                foreach (var actual in actualValues)
                {
                    Assert.Equal(expected, actual);
                }
            });
        }
コード例 #12
0
        public virtual async Task AbortTransactionOnExceptions(string grainStates)
        {
            const int expected = 5;

            ITransactionTestGrain        grain       = RandomTestGrain(grainStates);
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(new List <ITransactionTestGrain> {
                grain
            }, expected);

            Func <Task> task = () => coordinator.AddAndThrow(grain, expected);
            await task.Should().ThrowAsync <OrleansTransactionAbortedException>();

            await TestAfterDustSettles(async() =>
            {
                int[] actualValues = await grain.Get();
                foreach (var actual in actualValues)
                {
                    actual.Should().Be(expected);
                }
            });
        }
コード例 #13
0
        public virtual async Task RepeatGrainReadWriteTransaction(string grainStates, int grainCount)
        {
            const int repeat = 10;
            const int delta  = 5;

            List <Guid> grainIds = Enumerable.Range(0, grainCount)
                                   .Select(i => Guid.NewGuid())
                                   .ToList();

            List <ITransactionTestGrain> grains = grainIds
                                                  .Select(id => TestGrain(grainStates, id))
                                                  .ToList();

            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await coordinator.MultiGrainSet(grains, delta);

            for (int i = 0; i < repeat; i++)
            {
                await coordinator.MultiGrainDouble(grains);

                int expected = delta * (int)Math.Pow(2, i + 1);
                foreach (var grain in grains)
                {
                    int[] actualValues = await grain.Get();

                    foreach (var actual in actualValues)
                    {
                        if (expected != actual)
                        {
                            this.testOutput($"{grain} - failed");
                        }
                        actual.ShouldBeEquivalentTo(expected);
                    }
                }
            }
        }
コード例 #14
0
        public virtual async Task MultiGrainAbortTransactionOnExceptions(string grainStates)
        {
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions - 1;
            const int expected   = 5;

            ITransactionTestGrain        throwGrain = RandomTestGrain(grainStates);
            List <ITransactionTestGrain> grains     =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(grainStates))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            await throwGrain.Set(expected);

            await coordinator.MultiGrainSet(grains, expected);

            Func <Task> task = () => coordinator.MultiGrainAddAndThrow(new List <ITransactionTestGrain>()
            {
                throwGrain
            }, grains, expected);

            task.ShouldThrow <OrleansTransactionAbortedException>();
            grains.Add(throwGrain);

            await TestAfterDustSettles(async() =>
            {
                foreach (var grain in grains)
                {
                    int[] actualValues = await grain.Get();
                    foreach (var actual in actualValues)
                    {
                        actual.ShouldBeEquivalentTo(expected);
                    }
                }
            });
        }
コード例 #15
0
        public virtual async Task MultiTransactionGrainsThrowWhenTransactions(string transactionTestGrainClassName)
        {
            const int delta      = 5;
            const int grainCount = TransactionTestConstants.MaxCoordinatedTransactions;

            List <ITransactionTestGrain> grains =
                Enumerable.Range(0, grainCount)
                .Select(i => RandomTestGrain(transactionTestGrainClassName))
                .ToList();
            ITransactionCoordinatorGrain coordinator = this.grainFactory.GetGrain <ITransactionCoordinatorGrain>(Guid.NewGuid());

            OrleansStartTransactionFailedException exception = await Assert.ThrowsAsync <OrleansStartTransactionFailedException>(() => coordinator.MultiGrainSet(grains, delta));

            Assert.IsAssignableFrom <OrleansTransactionsDisabledException>(exception.InnerException);
        }