コード例 #1
0
        public Task WriteAndReadManyEventsAcrossCheckpoints(FailureMode persistentStorageFailure, FailureMode volatileStorageFailure)
        {
            var testSize = 5;

            return(RunTest(async(context, stream, _, _) =>
            {
                var requests = Enumerable.Range(0, testSize).Select(idx => new RegisterContentLocationsRequest()
                {
                    MachineId = new MachineId(idx),
                }).ToArray();

                var cursors = new CheckpointLogId[testSize];
                foreach (var indexed in requests.AsIndexed())
                {
                    await stream.WriteEventAsync(context, indexed.Item).SelectResult(r => r.Should().BeTrue());
                    cursors[indexed.Index] = await stream.BeforeCheckpointAsync(context).ThrowIfFailureAsync();

                    // By not calling AfterCheckpointAsync, we stop GC from happening. This should let us read
                    // all events we have posted
                }

                if (volatileStorageFailure == FailureMode.All)
                {
                    await CollectStream(context, stream, cursors[0]).ShouldBeError();
                }
                else
                {
                    var events = await CollectStream(context, stream, cursors[0]).ThrowIfFailureAsync();
                    events.Count.Should().Be(testSize);
                }
            },
                           persistentStorageFailure: persistentStorageFailure,
                           volatileStorageFailure: volatileStorageFailure));
        }
コード例 #2
0
        public Task <Result <bool> > IsSealedAsync(OperationContext context, CheckpointLogId logId)
        {
            if (FailureMode.HasFlag(FailureMode.Read))
            {
                return(Task.FromResult(Result.FromErrorMessage <bool>("Persistent event storage failure")));
            }

            return(InnerStorage.IsSealedAsync(context, logId));
        }
コード例 #3
0
        public Task <BoolResult> GarbageCollectAsync(OperationContext context, CheckpointLogId logId)
        {
            if (FailureMode.HasFlag(FailureMode.SilentWrite))
            {
                return(BoolResult.SuccessTask);
            }
            else if (FailureMode.HasFlag(FailureMode.Write))
            {
                return(Task.FromResult(new BoolResult(errorMessage: "Persistent event storage failure")));
            }

            return(InnerStorage.GarbageCollectAsync(context, logId));
        }
コード例 #4
0
        private Task <Result <List <ServiceRequestBase> > > CollectStream(OperationContext context, ContentMetadataEventStream stream, CheckpointLogId cursor)
        {
            var msg = $"Cursor=[{cursor}]";

            return(context.PerformOperationAsync(Tracer, async() =>
            {
                var events = new List <ServiceRequestBase>();

                await stream.ReadEventsAsync(context, cursor, r =>
                {
                    events.Add(r);
                    return new ValueTask(Task.CompletedTask);
                }).ThrowIfFailureAsync();

                return Result.Success(events);
            }, extraStartMessage: msg, extraEndMessage: _ => msg));
        }