public void given() { //given _cache = new PartitionStateCache(); _cachedAtCheckpointTag = CheckpointTag.FromPosition(1000, 900); _cache.CacheAndLockPartitionState("partition", new PartitionStateCache.State("data", _cachedAtCheckpointTag), _cachedAtCheckpointTag); _relockedData = _cache.TryGetAndLockPartitionState("partition", CheckpointTag.FromPosition(2000, 1900)); }
private void OnLoadPartitionStateReadStreamEventsBackwardCompleted( ClientMessage.ReadStreamEventsBackwardCompleted message, CheckpointTag requestedStateCheckpointTag, Action<PartitionStateCache.State> loadCompleted, string partitionStreamName, string stateEventType) { //NOTE: the following remove may do nothing in tests as completed is raised before we return from publish. _loadStateRequests.Remove(message.CorrelationId); _readRequestsInProgress--; if (message.Events.Length == 1) { EventRecord @event = message.Events[0].Event; if (@event.EventType == stateEventType) { var loadedStateCheckpointTag = @event.Metadata.ParseJson<CheckpointTag>(); // always recovery mode? skip until state before current event //TODO: skip event processing in case we know i has been already processed if (loadedStateCheckpointTag < requestedStateCheckpointTag) { var state = new PartitionStateCache.State(Encoding.UTF8.GetString(@event.Data), loadedStateCheckpointTag); loadCompleted(state); return; } } } if (message.NextEventNumber == -1) { var state = new PartitionStateCache.State("", _positionTagger.MakeZeroCheckpointTag()); loadCompleted(state); return; } _readRequestsInProgress++; var requestId = _readDispatcher.Publish( new ClientMessage.ReadStreamEventsBackward( Guid.NewGuid(), _readDispatcher.Envelope, partitionStreamName, message.NextEventNumber, 1, resolveLinks: false, validationStreamVersion: null), m => OnLoadPartitionStateReadStreamEventsBackwardCompleted(m, requestedStateCheckpointTag, loadCompleted, partitionStreamName, stateEventType)); if (requestId != Guid.Empty) _loadStateRequests.Add(requestId); }