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)); }
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)); }
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)); }
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)); }