private string GetTestGrainClassName(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            if (this.distributedTm)
            {
                if (grainStates == TransactionTestConstants.TransactionGrainStates.SingleStateTransaction)
                {
                    return(TransactionTestConstants.SingleStateTransactionalGrainDistributedTM);
                }
                if (grainStates == TransactionTestConstants.TransactionGrainStates.DoubleStateTransaction)
                {
                    return(TransactionTestConstants.DoubleStateTransactionalGrainDistributedTM);
                }
                if (grainStates == TransactionTestConstants.TransactionGrainStates.MaxStateTransaction)
                {
                    return(TransactionTestConstants.MaxStateTransactionalGrainDistributedTM);
                }
                throw new SkipException($"{grainStates} not supported when using distributed transaction manager.");
            }

            if (grainStates == TransactionTestConstants.TransactionGrainStates.SingleStateTransaction)
            {
                return(TransactionTestConstants.SingleStateTransactionalGrain);
            }
            if (grainStates == TransactionTestConstants.TransactionGrainStates.DoubleStateTransaction)
            {
                return(TransactionTestConstants.DoubleStateTransactionalGrain);
            }
            if (grainStates == TransactionTestConstants.TransactionGrainStates.MaxStateTransaction)
            {
                return(TransactionTestConstants.MaxStateTransactionalGrain);
            }
            throw new SkipException($"{grainStates} not supported when using distributed transaction manager.");
        }
        public async Task MultiGrainAbortTransactionOnExceptions(TransactionTestConstants.TransactionGrainStates 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);
                    }
                }
            });
        }
Exemplo n.º 3
0
        public virtual async Task MultiGrainReadWriteTransaction(TransactionTestConstants.TransactionGrainStates 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);
                }
            }
        }
        //For distributedTM
        public virtual async Task TransactionWillRecoverAfterRandomSiloFailure(TransactionTestConstants.TransactionGrainStates transactionTestGrainClassName)
        {
            const int grainCount = 100;
            var       txGrains   = Enumerable.Range(0, grainCount)
                                   .Select(i => RandomTestGrain(transactionTestGrainClassName))
                                   .ToList();
            var txSucceedBeforeInterruption = await AllTxSucceed(txGrains);

            this.logger.LogInformation($"Tx succeed before interruption : {txSucceedBeforeInterruption}");
            //randomly ungraceful shut down one silo
            this.testCluster.KillSilo(this.testCluster.Silos[this.seed.Next(this.testCluster.Silos.Count)]);
            await TestingUtils.WaitUntilAsync(lastTry => CheckTxResult(txGrains, lastTry), RecoveryTimeout);
        }
Exemplo n.º 5
0
        public virtual async Task SingleGrainWriteTransaction(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int             delta = 5;
            ITransactionTestGrain grain = RandomTestGrain(grainStates);
            var original = await grain.Get();

            await grain.Add(delta);

            var expected = original.Select(value => value + delta).ToArray();
            var actual   = await grain.Get();

            Assert.Equal(expected, actual);
        }
Exemplo n.º 6
0
        public virtual async Task SingleGrainReadTransaction(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int expected = 0;

            ITransactionTestGrain grain = RandomTestGrain(grainStates);
            var actualResults           = await grain.Get();

            //each transaction state should all be 0 since no operation was applied yet
            foreach (var actual in actualResults)
            {
                Assert.Equal(expected, actual);
            }
        }
Exemplo n.º 7
0
        public virtual async Task MultiWriteToSingleGrainTransaction(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int delta            = 5;
            const int concurrentWrites = 3;

            ITransactionTestGrain        grain  = RandomTestGrain(grainStates);
            List <ITransactionTestGrain> grains = Enumerable.Repeat(grain, concurrentWrites).ToList();

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

            await coordinator.MultiGrainAdd(grains, delta);

            int expected = delta * concurrentWrites;

            int[] actualValues = await grains[0].Get();
            foreach (var actual in actualValues)
            {
                Assert.Equal(expected, actual);
            }
        }
        public async Task AbortTransactionOnOrphanCalls(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int expected = 5;

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

            await grain.Set(expected);

            await Assert.ThrowsAsync <OrleansOrphanCallException>(() => coordinator.OrphanCallTransaction(grain));

            //await Task.Delay(20000); // give time for GC

            await TestAfterDustSettles(async() =>
            {
                int[] actualValues = await grain.Get();
                foreach (var actual in actualValues)
                {
                    Assert.Equal(expected, actual);
                }
            });
        }
        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);
                }
            });
        }
Exemplo n.º 10
0
        public virtual async Task RepeatGrainReadWriteTransaction(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            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(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.output.WriteLine($"{grain} - failed");
                        }
                        Assert.Equal(expected, actual);
                    }
                }
            }
        }
Exemplo n.º 11
0
        public virtual async Task MultiGrainWriteTransaction(TransactionTestConstants.TransactionGrainStates grainStates)
        {
            const int expected   = 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.MultiGrainAdd(grains, expected);

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

                foreach (var actual in actualValues)
                {
                    Assert.Equal(expected, actual);
                }
            }
        }
 protected virtual ITransactionTestGrain TestGrain(TransactionTestConstants.TransactionGrainStates grainStates, Guid id)
 {
     return(TestGrain(GetTestGrainClassName(grainStates), id));
 }
 protected ITransactionTestGrain RandomTestGrain(TransactionTestConstants.TransactionGrainStates grainStates)
 {
     return(TestGrain(grainStates, Guid.NewGuid()));
 }
Exemplo n.º 14
0
 public Task TransactionWillRecoverAfterRandomSiloFailure(TransactionTestConstants.TransactionGrainStates transactionGrainStates)
 {
     return(this.testRunner.TransactionWillRecoverAfterRandomSiloFailure(transactionGrainStates));
 }