Beispiel #1
0
 public StoreSnapshots(IMetrics metrics, IStoreEvents store, ISnapshotReader snapshots)
 {
     _metrics   = metrics;
     _store     = store;
     _snapshots = snapshots;
     _streamGen = Configuration.Settings.Generator;
 }
Beispiel #2
0
 public OobWriter(IMessageDispatcher dispatcher, IStoreEvents store, IVersionRegistrar registrar)
 {
     _dispatcher = dispatcher;
     _store      = store;
     _generator  = Configuration.Settings.Generator;
     _registrar  = registrar;
 }
 public ResolveWeaklyConflictResolver(IStoreSnapshots snapstore, IStoreEvents eventstore, IDelayedChannel delay, StreamIdGenerator streamGen)
 {
     _snapstore  = snapstore;
     _eventstore = eventstore;
     _delay      = delay;
     _streamGen  = streamGen;
 }
Beispiel #4
0
 public StoreSnapshots(IMetrics metrics, IStoreEvents store, ISnapshotReader snapshots, StreamIdGenerator streamGen)
 {
     _metrics   = metrics;
     _store     = store;
     _snapshots = snapshots;
     _streamGen = streamGen;
 }
Beispiel #5
0
        public Task takes_snapshot()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Delayes conflicting events to be resolved later
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_snapstore.Object, _eventstore.Object, _channel.Object, streamGen);

            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());
            entity.State.TakeASnapshot = true;

            return(Task.CompletedTask);
            //await resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary<string, string>())
            //    .ConfigureAwait(false);

            //Assert.AreEqual(1, entity.Conflicts);

            //_stream.Verify(x => x.Add(Moq.It.IsAny<IEvent>(), Moq.It.IsAny<IDictionary<string, string>>()),
            //    Moq.Times.Once);

            //_stream.Verify(x => x.AddSnapshot(Moq.It.IsAny<IMemento>()), Moq.Times.Once);

            //_store.Verify(x => x.WriteStream<Entity>(Moq.It.IsAny<Guid>(), Moq.It.IsAny<IEventStream>(),
            //    Moq.It.IsAny<IDictionary<string, string>>()), Moq.Times.Once);
        }
Beispiel #6
0
        public async Task takes_snapshot()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Delayes conflicting events to be resolved later
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_store.Object, _eventstore.Object, _channel.Object, streamGen);

            _stream.Setup(x => x.AddSnapshot(Moq.It.IsAny <IMemento>()));
            _stream.Setup(x => x.StreamVersion).Returns(0);
            _stream.Setup(x => x.CommitVersion).Returns(1);

            var entity = new Entity(_stream.Object, _resolver.Object);

            entity.TakeASnapshot = true;

            await resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(1, entity.Conflicts);

            _stream.Verify(x => x.Add(Moq.It.IsAny <IEvent>(), Moq.It.IsAny <IDictionary <string, string> >()),
                           Moq.Times.Once);

            _stream.Verify(x => x.AddSnapshot(Moq.It.IsAny <IMemento>()), Moq.Times.Once);

            _store.Verify(x => x.WriteStream <Entity>(Moq.It.IsAny <Guid>(), Moq.It.IsAny <IEventStream>(),
                                                      Moq.It.IsAny <IDictionary <string, string> >()), Moq.Times.Once);
        }
Beispiel #7
0
 public StoreStreams(IStoreEvents store, IStreamCache cache, bool cacheStreams, StreamIdGenerator streamGen)
 {
     _store       = store;
     _cache       = cache;
     _shouldCache = cacheStreams;
     _streamGen   = streamGen;
 }
Beispiel #8
0
 public StorePocos(IStoreEvents store, ICache cache, bool shouldCache, StreamIdGenerator streamGen)
 {
     _store       = store;
     _cache       = cache;
     _shouldCache = shouldCache;
     _streamGen   = streamGen;
 }
 public ResolveWeaklyConflictResolver(IStoreStreams eventstore, IDelayedChannel delay, StreamIdGenerator streamGen, int maxPulledDelayed)
 {
     _store            = eventstore;
     _delay            = delay;
     _streamGen        = streamGen;
     _maxPulledDelayed = maxPulledDelayed;
 }
        public DelayedCache(IMetrics metrics, IStoreEvents store, IVersionRegistrar registrar, IRandomProvider random, ITimeProvider time)
        {
            _metrics   = metrics;
            _store     = store;
            _registrar = registrar;
            _random    = random;
            _time      = time;

            _flushInterval = Configuration.Settings.FlushInterval;
            _endpoint      = Configuration.Settings.Endpoint;
            _maxSize       = Configuration.Settings.MaxDelayed;
            _flushSize     = Configuration.Settings.FlushSize;
            _expiration    = Configuration.Settings.DelayedExpiration;
            _streamGen     = Configuration.Settings.Generator;
            _cts           = new CancellationTokenSource();

            _cacheLock = new object();
            _memCache  = new Dictionary <CacheKey, CachedList>(new CacheKey.EqualityComparer());

            _thread = new Thread(Threaded)
            {
                IsBackground = true, Name = $"Delayed Cache Thread"
            };

            // Add a process exit event handler to flush cached delayed events before exiting the app
            // Not perfect in the case of a fatal app error - but something
            AppDomain.CurrentDomain.ProcessExit += (sender, e) => Threaded(this);
            _thread.Start(this);
        }
Beispiel #11
0
        public DelayedCache(IMetrics metrics, IStoreEvents store, TimeSpan flushInterval, string endpoint, int maxSize, int flushSize, TimeSpan delayedExpiration, StreamIdGenerator streamGen)
        {
            _metrics       = metrics;
            _store         = store;
            _flushInterval = flushInterval;
            _endpoint      = endpoint;
            _maxSize       = maxSize;
            _flushSize     = flushSize;
            _expiration    = delayedExpiration;
            _streamGen     = streamGen;
            _cts           = new CancellationTokenSource();

            _cacheLock = new object();
            _memCache  = new Dictionary <CacheKey, CachedList>(new CacheKey.EqualityComparer());
            _rand      = new Random();

            _thread = new Thread(Threaded)
            {
                IsBackground = true, Name = $"Delayed Cache Thread"
            };

            // Add a process exit event handler to flush cached delayed events before exiting the app
            // Not perfect in the case of a fatal app error - but something
            AppDomain.CurrentDomain.ProcessExit += (sender, e) => Threaded(this);
            _thread.Start(this);
        }
        public async Task ignore_resolver()
        {
            var store     = new Moq.Mock <IStoreEvents>();
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            var fullevent = new Moq.Mock <IFullEvent>();

            fullevent.Setup(x => x.Event).Returns(new Event());

            _stream.Setup(x => x.Add(Moq.It.IsAny <IEvent>(), Moq.It.IsAny <IDictionary <string, string> >()));
            store.Setup(
                x => x.WriteEvents("test", new[] { fullevent.Object }, Moq.It.IsAny <IDictionary <string, string> >(), null))
            .Returns(Task.FromResult(0L));

            // Ignores conflict, just commits
            var resolver = new IgnoreConflictResolver(store.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);


            await resolver.Resolve(entity, new[] { fullevent.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            _stream.Verify(x => x.Add(Moq.It.IsAny <IEvent>(), Moq.It.IsAny <IDictionary <string, string> >()),
                           Moq.Times.Once);
            store.Verify(
                x => x.WriteEvents("test", new[] { fullevent.Object }, Moq.It.IsAny <IDictionary <string, string> >(), null),
                Moq.Times.Once);
        }
Beispiel #13
0
 public StorePocos(IStoreEvents store, ICache cache, IMessageSerializer serializer, bool shouldCache, StreamIdGenerator streamGen)
 {
     _store       = store;
     _cache       = cache;
     _serializer  = serializer;
     _shouldCache = shouldCache;
     _streamGen   = streamGen;
 }
Beispiel #14
0
 public StoreEvents(IMetrics metrics, IMessageSerializer serializer, IEventMapper mapper, StreamIdGenerator generator, int readsize, Compression compress, IEventStoreConnection[] connections)
 {
     _metrics    = metrics;
     _serializer = serializer;
     _mapper     = mapper;
     _generator  = generator;
     _clients    = connections;
     _readsize   = readsize;
     _compress   = compress;
 }
Beispiel #15
0
 public StoreStreams(ICache cache, IStoreEvents store, IMessagePublisher publisher, IStoreSnapshots snapstore, StreamIdGenerator streamGen, IEnumerable <IEventMutator> mutators)
 {
     _cache     = cache;
     _store     = store;
     _publisher = publisher;
     _snapstore = snapstore;
     _streamGen = streamGen;
     _mutators  = mutators;
     _random    = new Random();
 }
Beispiel #16
0
        public StoreEvents(IMetrics metrics, IMessageSerializer serializer, IEventMapper mapper, IEventStoreConnection[] connections)
        {
            _metrics    = metrics;
            _serializer = serializer;
            _mapper     = mapper;
            _clients    = connections;

            _generator = Configuration.Settings.Generator;
            _readsize  = Configuration.Settings.ReadSize;
            _compress  = Configuration.Settings.Compression;
        }
Beispiel #17
0
        public void dont_catch_frozen_exception()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_store.Object, _eventstore.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);

            _store.Setup(x => x.Freeze <Entity>(Moq.It.IsAny <IEventStream>())).Throws(new VersionException("test"));

            Assert.ThrowsAsync <VersionException>(
                () => resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>()));
        }
Beispiel #18
0
        public void no_route_exception()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_store.Object, _eventstore.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);

            _resolver.Setup(x => x.Conflict(Moq.It.IsAny <Entity>(), typeof(Event))).Throws <NoRouteException>();

            Assert.ThrowsAsync <ConflictResolutionFailedException>(
                () => resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>()));
        }
Beispiel #19
0
        public void dont_catch_abandon_resolution()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Delayes conflicting events to be resolved later
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_store.Object, _eventstore.Object, _channel.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);

            _resolver.Setup(x => x.Conflict(Moq.It.IsAny <Entity>(), typeof(Event))).Throws <AbandonConflictException>();

            Assert.ThrowsAsync <AbandonConflictException>(
                () => resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>()));
        }
Beispiel #20
0
        public void no_route_exception()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Delayes conflicting events to be resolved later
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_snapstore.Object, _eventstore.Object, _channel.Object, streamGen);

            var entity = new FakeEntity();

            //_resolver.Setup(x => x.Conflict(Moq.It.IsAny<Entity>(), typeof(Event))).Throws<NoRouteException>();

            //Assert.ThrowsAsync<ConflictResolutionFailedException>(
            //    () => resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary<string, string>()));
        }
Beispiel #21
0
        public void dont_catch_abandon_resolution()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_snapstore.Object, _eventstore.Object, streamGen);

            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());
            entity.State.ThrowAbandon = true;

            Assert.ThrowsAsync <AbandonConflictException>(
                () => resolver.Resolve <FakeEntity, FakeState>(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>()));
        }
Beispiel #22
0
        public void no_route_exception()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_snapstore.Object, _eventstore.Object, streamGen);

            _event.Setup(x => x.Event).Returns(new FakeUnknownEvent());
            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());

            Assert.ThrowsAsync <ConflictResolutionFailedException>(
                () => resolver.Resolve <FakeEntity, FakeState>(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>()));
        }
Beispiel #23
0
        public EventStoreDelayed(IStoreEvents store, string endpoint, int maxSize, int readSize, TimeSpan flushInterval, StreamIdGenerator streamGen)
        {
            _store     = store;
            _streamGen = streamGen;
            _endpoint  = endpoint;

            if (_flusher == null)
            {
                // Add a process exit event handler to flush cached delayed events before exiting the app
                // Not perfect in the case of a fatal app error - but something
                AppDomain.CurrentDomain.ProcessExit += (sender, e) => Flush(new FlushState {
                    Store = store, StreamGen = streamGen, Endpoint = endpoint, MaxSize = maxSize, ReadSize = readSize, Expiration = flushInterval
                }, all: true).Wait();
                _flusher = Timer.Repeat((s) => Flush(s), new FlushState {
                    Store = store, StreamGen = streamGen, Endpoint = endpoint, MaxSize = maxSize, ReadSize = readSize, Expiration = flushInterval
                }, flushInterval, "delayed flusher");
            }
        }
        public async Task strong_resolve_conflict()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_snapstore.Object, _eventstore.Object, streamGen);

            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());

            await resolver.Resolve <FakeEntity, FakeState>(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(1, entity.State.Conflicts);

            _eventstore.Verify(x => x.WriteEvents <FakeEntity>(Moq.It.IsAny <string>(), Moq.It.IsAny <Id>(), Moq.It.IsAny <Id[]>(), Moq.It.IsAny <IFullEvent[]>(), Moq.It.IsAny <IDictionary <string, string> >(), Moq.It.IsAny <long?>()), Moq.Times.Once);
        }
        public async Task oob_events_not_conflict_resolved()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            _event.Setup(x => x.Descriptor.Headers[Defaults.OobHeaderKey]).Returns("test");
            _event.Setup(x => x.Descriptor.StreamType).Returns(StreamTypes.OOB);

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_snapstore.Object, _eventstore.Object, streamGen);

            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());

            await resolver.Resolve <FakeEntity, FakeState>(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(0, entity.State.Conflicts);
        }
Beispiel #26
0
        public Task oob_events_not_conflict_resolved()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            _event.Setup(x => x.Descriptor.Headers[Defaults.OobHeaderKey]).Returns("test");
            _event.Setup(x => x.Descriptor.StreamType).Returns(StreamTypes.OOB);

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_snapstore.Object, _eventstore.Object, _channel.Object, streamGen);

            var entity = new FakeEntity();

            return(Task.CompletedTask);
            //await resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary<string, string>())
            //    .ConfigureAwait(false);

            //Assert.AreEqual(0, entity.Conflicts);

            //_stream.Verify(x => x.AddOob(Moq.It.IsAny<IEvent>(), "test", Moq.It.IsAny<IDictionary<string, string>>()),
            //    Moq.Times.Once);
        }
Beispiel #27
0
        public async Task strong_resolve_conflict()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_store.Object, _eventstore.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);

            await resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(1, entity.Conflicts);

            _stream.Verify(x => x.Add(Moq.It.IsAny <IEvent>(), Moq.It.IsAny <IDictionary <string, string> >()),
                           Moq.Times.Once);

            _store.Verify(
                x => x.WriteStream <Entity>(Moq.It.IsAny <Guid>(), Moq.It.IsAny <IEventStream>(),
                                            Moq.It.IsAny <IDictionary <string, string> >()),
                Moq.Times.Once);
        }
Beispiel #28
0
        public async Task conflict_no_resolve()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            _channel.Setup(x => x.Age(Moq.It.IsAny <string>(), Moq.It.IsAny <string>()))
            .Returns(Task.FromResult((TimeSpan?)TimeSpan.FromSeconds(1)));

            // Delays conflicting events to be resolved later
            var resolver = new Aggregates.Internal.ResolveWeaklyConflictResolver(_store.Object, _eventstore.Object, _channel.Object, streamGen);

            var entity = new Entity(_stream.Object, _resolver.Object);

            await resolver.Resolve(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(0, entity.Conflicts);

            _stream.Verify(x => x.Add(Moq.It.IsAny <IEvent>(), Moq.It.IsAny <IDictionary <string, string> >()),
                           Moq.Times.Never);

            _store.Verify(x => x.WriteStream <Entity>(Moq.It.IsAny <Guid>(), Moq.It.IsAny <IEventStream>(),
                                                      Moq.It.IsAny <IDictionary <string, string> >()), Moq.Times.Never);
        }
Beispiel #29
0
        public async Task ignore_resolver()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            var fullevent = new Moq.Mock <IFullEvent>();

            fullevent.Setup(x => x.Event).Returns(new Event());

            _store.Setup(x => x.WriteEvents <FakeEntity>(Moq.It.IsAny <string>(), Moq.It.IsAny <Id>(), Moq.It.IsAny <Id[]>(), Moq.It.IsAny <IFullEvent[]>(), Moq.It.IsAny <IDictionary <string, string> >(), Moq.It.IsAny <long?>()))
            .Returns(Task.FromResult(0L));

            // Ignores conflict, just commits
            var resolver = new IgnoreConflictResolver(_store.Object, streamGen);

            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());


            await resolver.Resolve <FakeEntity, FakeState>(entity, new[] { fullevent.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            _store.Verify(x => x.WriteEvents <FakeEntity>(Moq.It.IsAny <string>(), Moq.It.IsAny <Id>(), Moq.It.IsAny <Id[]>(), Moq.It.IsAny <IFullEvent[]>(), Moq.It.IsAny <IDictionary <string, string> >(), Moq.It.IsAny <long?>()), Moq.Times.Once);
        }
Beispiel #30
0
        public async Task doesnt_take_snapshot()
        {
            var streamGen = new StreamIdGenerator((type, stream, bucket, id, parents) => "test");

            // Runs all conflicting events back through a re-hydrated entity
            var resolver = new Aggregates.Internal.ResolveStronglyConflictResolver(_snapstore.Object, _eventstore.Object, streamGen);

            var uow    = new Moq.Mock <IDomainUnitOfWork>();
            var entity = new FakeEntity();

            (entity as IEntity <FakeState>).Instantiate(new FakeState());
            (entity as INeedDomainUow).Uow = uow.Object;
            entity.State.TakeASnapshot     = true;

            _snapstore.Setup(x => x.WriteSnapshots <FakeEntity>(Moq.It.IsAny <IState>(), Moq.It.IsAny <IDictionary <string, string> >()))
            .Returns(Task.CompletedTask);

            await resolver.Resolve <FakeEntity, FakeState>(entity, new[] { _event.Object }, Guid.NewGuid(), new Dictionary <string, string>())
            .ConfigureAwait(false);

            Assert.AreEqual(1, entity.State.Conflicts);

            _snapstore.Verify(x => x.WriteSnapshots <FakeEntity>(Moq.It.IsAny <IState>(), Moq.It.IsAny <IDictionary <string, string> >()), Moq.Times.Never);
        }