public virtual bool AddSnapshot(ISnapshot snapshot) { if (snapshot == null) { return(false); } Logger.Debug(Messages.AddingSnapshot, snapshot.StreamId, snapshot.BucketId, snapshot.StreamRevision); try { BsonDocument mongoSnapshot = snapshot.ToMongoSnapshot(_serializer); IMongoQuery query = Query.EQ(MongoFields.Id, mongoSnapshot[MongoFields.Id]); UpdateBuilder update = Update.Set(MongoFields.Payload, mongoSnapshot[MongoFields.Payload]); // Doing an upsert instead of an insert allows us to overwrite an existing snapshot and not get stuck with a // stream that needs to be snapshotted because the insert fails and the SnapshotRevision isn't being updated. PersistedSnapshots.Update(query, update, UpdateFlags.Upsert); // More commits could have been made between us deciding that a snapshot is required and writing it so just // resetting the Unsnapshotted count may be a little off. Adding snapshots should be a separate process so // this is a good chance to make sure the numbers are still in-sync - it only adds a 'read' after all ... BsonDocument streamHeadId = GetStreamHeadId(snapshot.BucketId, snapshot.StreamId); StreamHead streamHead = PersistedStreamHeads.FindOneById(streamHeadId).ToStreamHead(); int unsnapshotted = streamHead.HeadRevision - snapshot.StreamRevision; PersistedStreamHeads.Update( Query.EQ(MongoFields.Id, streamHeadId), Update.Set(MongoFields.SnapshotRevision, snapshot.StreamRevision).Set(MongoFields.Unsnapshotted, unsnapshotted)); return(true); } catch (Exception) { return(false); } }
public virtual void Purge() { Logger.Warn(Messages.PurgingStorage); PersistedCommits.Drop(); PersistedStreamHeads.Drop(); PersistedSnapshots.Drop(); Counters.Drop(); }
public void DeleteStream(string bucketId, string streamId) { Logger.Warn(Messages.DeletingStream, streamId, bucketId); TryMongo(() => { PersistedStreamHeads.Remove(Query.And(Query.EQ("_id.BucketId", bucketId), Query.EQ("_id.StreamId", streamId))); PersistedSnapshots.Remove(Query.And(Query.EQ("_id.BucketId", bucketId), Query.EQ("_id.StreamId", streamId))); PersistedCommits.Remove(Query.And(Query.EQ("_id.BucketId", bucketId), Query.EQ("_id.StreamId", streamId))); }); }
public void Purge(string bucketId) { Logger.Warn(Messages.PurgingBucket, bucketId); TryMongo(() => { PersistedStreamHeads.Remove(Query.EQ("_id.BucketId", bucketId)); PersistedSnapshots.Remove(Query.EQ("_id.BucketId", bucketId)); PersistedCommits.Remove(Query.EQ("_id.BucketId", bucketId)); }); }
public virtual ISnapshot GetSnapshot(string bucketId, string streamId, int maxRevision) { Logger.Debug(Messages.GettingRevision, streamId, maxRevision); return(TryMongo(() => PersistedSnapshots .Find(ExtensionMethods.GetSnapshotQuery(bucketId, streamId, maxRevision)) .SetSortOrder(SortBy.Descending(MongoFields.Id)) .SetLimit(1) .Select(mc => mc.ToSnapshot(_serializer)) .FirstOrDefault())); }