Пример #1
0
        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);
            }
        }
Пример #2
0
 public virtual void Purge()
 {
     Logger.Warn(Messages.PurgingStorage);
     PersistedCommits.Drop();
     PersistedStreamHeads.Drop();
     PersistedSnapshots.Drop();
     Counters.Drop();
 }
Пример #3
0
 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)));
     });
 }
Пример #4
0
 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));
     });
 }
Пример #5
0
        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()));
        }