コード例 #1
0
        public IEnumerable <ICommit> GetFromTo(long from, long to)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug(Messages.GettingCommitsFromToCheckpoint, from, to);
            }

            return(TryMongo(() =>
            {
                var filters = new List <FilterDefinition <BsonDocument> >()
                {
                    Builders <BsonDocument> .Filter.Ne(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin)
                };
                if (from > 0)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Gt(MongoCommitFields.CheckpointNumber, from)
                        );
                }
                if (to < long.MaxValue)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Lte(MongoCommitFields.CheckpointNumber, to)
                        );
                }

                var query = Builders <BsonDocument> .Filter.And(filters);

                return PersistedCommits
                .Find(query)
                .Sort(SortByAscendingCheckpointNumber)
                .ToEnumerable()
                .Select(x => x.ToCommit(_serializer));
            }));
        }
コード例 #2
0
        public IEnumerable <ICommit> GetFrom(Int64 checkpointToken)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug(Messages.GettingAllCommitsFromCheckpoint, checkpointToken);
            }

            return(TryMongo(() =>
            {
                var query = Builders <BsonDocument> .Filter.Ne(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin);
                if (checkpointToken > 0)
                {
                    query = Builders <BsonDocument> .Filter.And(
                        query,
                        Builders <BsonDocument> .Filter.Gt(MongoCommitFields.CheckpointNumber, checkpointToken)
                        );
                }

                return PersistedCommits
                .Find(query)
                .Sort(SortByAscendingCheckpointNumber)
                .ToEnumerable()
                .Select(x => x.ToCommit(_serializer));
            }));
        }
コード例 #3
0
        public virtual IEnumerable <ICommit> GetFromTo(string bucketId, DateTime start, DateTime end)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug(Messages.GettingAllCommitsFromTo, start, end, bucketId);
            }

            return(TryMongo(() =>
            {
                var filters = new List <FilterDefinition <BsonDocument> >()
                {
                    Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, bucketId)
                };
                if (start > DateTime.MinValue)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Gte(MongoCommitFields.CommitStamp, start)
                        );
                }
                if (end < DateTime.MaxValue)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Lt(MongoCommitFields.CommitStamp, end)
                        );
                }

                var query = Builders <BsonDocument> .Filter.And(filters);

                return PersistedCommits
                .Find(query)
                .Sort(SortByAscendingCheckpointNumber)
                .ToEnumerable()
                .Select(x => x.ToCommit(_serializer));
            }));
        }
        /// <inheritdoc/>
        public virtual IEnumerable <ICommit> GetFrom(string bucketId, string streamId, int minRevision, int maxRevision)
        {
            Logger.LogDebug(Messages.GettingAllCommitsBetween, streamId, bucketId, minRevision, maxRevision);

            return(TryMongo(() =>
            {
                var filters = new List <FilterDefinition <BsonDocument> >()
                {
                    Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, bucketId),
                    Builders <BsonDocument> .Filter.Eq(MongoCommitFields.StreamId, streamId)
                };
                if (minRevision > 0)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Gte(MongoCommitFields.StreamRevisionTo, minRevision)
                        );
                }
                if (maxRevision < int.MaxValue)
                {
                    filters.Add(
                        Builders <BsonDocument> .Filter.Lte(MongoCommitFields.StreamRevisionFrom, maxRevision)
                        );
                }

                var query = Builders <BsonDocument> .Filter.And(filters);

                return PersistedCommits
                .Find(query)
                // .Sort(Builders<BsonDocument>.Sort.Ascending(MongoCommitFields.StreamRevisionFrom))
                .Sort(SortByAscendingCheckpointNumber)
                .ToEnumerable()
                .Select(mc => mc.ToCommit(_serializer));
            }));
        }
コード例 #5
0
        public virtual void Initialize()
        {
            if (Interlocked.Increment(ref _initialized) > 1)
            {
                return;
            }

            Logger.Debug(Messages.InitializingStorage);

            TryMongo(() =>
            {
                PersistedCommits.EnsureIndex(IndexKeys.Ascending("Dispatched").Ascending(MongoFields.CommitStamp),
                                             IndexOptions.SetName("Dispatched_Index").SetUnique(false));

                PersistedCommits.EnsureIndex(IndexKeys.Ascending("_id.BucketId", "_id.StreamId", "Events.StreamRevision"),
                                             IndexOptions.SetName("GetFrom_Index").SetUnique(true));

                PersistedCommits.EnsureIndex(IndexKeys.Ascending(MongoFields.CommitStamp),
                                             IndexOptions.SetName("CommitStamp_Index").SetUnique(false));

                PersistedStreamHeads.EnsureIndex(IndexKeys.Ascending("Unsnapshotted"),
                                                 IndexOptions.SetName("Unsnapshotted_Index").SetUnique(false));

                IMongoQuery query   = Query.EQ("_id", MongoFields.CheckpointNumber);
                IMongoUpdate update = Update.Replace(new BsonDocument {
                    { "_id", "CheckpointNumber" }, { "seq", 0 }
                });
                Counters.Update(query, update, UpdateFlags.Upsert, WriteConcern.Acknowledged);
            });
        }
コード例 #6
0
        public virtual void Commit(Commit attempt)
        {
            Logger.Debug(Messages.AttemptingToCommit, attempt.Events.Count, attempt.StreamId, attempt.CommitSequence);

            TryMongo(() =>
            {
                BsonDocument commit = attempt.ToMongoCommit(_serializer);
                try
                {
                    // for concurrency / duplicate commit detection safe mode is required
                    PersistedCommits.Insert(commit, WriteConcern.Acknowledged);
                    UpdateStreamHeadAsync(attempt.BucketId, attempt.StreamId, attempt.StreamRevision, attempt.Events.Count);
                    Logger.Debug(Messages.CommitPersisted, attempt.CommitId);
                }
                catch (MongoException e)
                {
                    if (!e.Message.Contains(ConcurrencyException))
                    {
                        throw;
                    }
                    Commit savedCommit = PersistedCommits.FindOne(attempt.ToMongoCommitIdQuery()).ToCommit(_serializer);
                    if (savedCommit.CommitId == attempt.CommitId)
                    {
                        throw new DuplicateCommitException();
                    }
                    Logger.Debug(Messages.ConcurrentWriteDetected);
                    throw new ConcurrencyException();
                }
            });
        }
 public virtual void Purge()
 {
     Logger.Warn(Messages.PurgingStorage);
     PersistedCommits.RemoveAll();
     PersistedStreamHeads.RemoveAll();
     PersistedSnapshots.RemoveAll();
 }
        public void DeleteStream(string bucketId, string streamId)
        {
            Logger.Warn(Messages.DeletingStream, streamId, bucketId);
            TryMongo(() =>
            {
                PersistedStreamHeads.Remove(
                    Query.EQ(MongoStreamHeadFields.Id, new BsonDocument {
                    { MongoStreamHeadFields.BucketId, bucketId },
                    { MongoStreamHeadFields.StreamId, streamId }
                })
                    );

                PersistedSnapshots.Remove(
                    Query.EQ(MongoShapshotFields.Id, new BsonDocument {
                    { MongoShapshotFields.BucketId, bucketId },
                    { MongoShapshotFields.StreamId, streamId }
                })
                    );

                PersistedCommits.Update(
                    Query.And(
                        Query.EQ(MongoCommitFields.BucketId, bucketId),
                        Query.EQ(MongoCommitFields.StreamId, streamId)
                        ),
                    Update.Set(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin),
                    UpdateFlags.Multi
                    );
            });
        }
 public IEnumerable <ICommit> GetDeletedCommits()
 {
     return(TryMongo(() => PersistedCommits
                     .Find(Query.EQ(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin))
                     .SetSortOrder(MongoCommitFields.CheckpointNumber)
                     .Select(mc => mc.ToCommit(_serializer))));
 }
コード例 #10
0
        public virtual IEnumerable <ICommit> GetFrom(string bucketId, DateTime start)
        {
            if (Logger.IsDebugEnabled)
            {
                Logger.Debug(Messages.GettingAllCommitsFrom, start, bucketId);
            }

            return(TryMongo(() =>
            {
                var query = Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, bucketId);
                if (start != DateTime.MinValue)
                {
                    query = Builders <BsonDocument> .Filter.And(
                        query,
                        Builders <BsonDocument> .Filter.Gte(MongoCommitFields.CommitStamp, start)
                        );
                }

                return PersistedCommits
                .Find(query)
                .Sort(SortByAscendingCheckpointNumber)
                .ToEnumerable()
                .Select(x => x.ToCommit(_serializer));
            }));
        }
コード例 #11
0
        public void DeleteStream(string bucketId, string streamId)
        {
            if (Logger.IsWarnEnabled)
            {
                Logger.Warn(Messages.DeletingStream, streamId, bucketId);
            }
            TryMongo(() =>
            {
                PersistedStreamHeads.DeleteOne(
                    Builders <BsonDocument> .Filter.Eq(MongoStreamHeadFields.Id, new BsonDocument {
                    { MongoStreamHeadFields.BucketId, bucketId },
                    { MongoStreamHeadFields.StreamId, streamId }
                })
                    );

                PersistedSnapshots.DeleteMany(
                    Builders <BsonDocument> .Filter.Eq(MongoShapshotFields.Id, new BsonDocument {
                    { MongoShapshotFields.BucketId, bucketId },
                    { MongoShapshotFields.StreamId, streamId }
                })
                    );

                PersistedCommits.UpdateMany(
                    Builders <BsonDocument> .Filter.And(
                        Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, bucketId),
                        Builders <BsonDocument> .Filter.Eq(MongoCommitFields.StreamId, streamId)
                        ),
                    Builders <BsonDocument> .Update.Set(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin)
                    );
            });
        }
        public virtual void Initialize()
        {
            if (Interlocked.Increment(ref _initialized) > 1)
            {
                return;
            }

            Logger.Debug(Messages.InitializingStorage);

            TryMongo(() =>
            {
                PersistedCommits.CreateIndex(
                    IndexKeys
                    .Ascending(MongoCommitFields.Dispatched)
                    .Ascending(MongoCommitFields.CommitStamp),
                    IndexOptions.SetName(MongoCommitIndexes.Dispatched).SetUnique(false)
                    );

                PersistedCommits.CreateIndex(
                    IndexKeys.Ascending(
                        MongoCommitFields.BucketId,
                        MongoCommitFields.StreamId,
                        MongoCommitFields.StreamRevisionFrom,
                        MongoCommitFields.StreamRevisionTo
                        //,MongoCommitFields.FullqualifiedStreamRevision
                        ),
                    IndexOptions.SetName(MongoCommitIndexes.GetFrom).SetUnique(true)
                    );

                PersistedCommits.CreateIndex(
                    IndexKeys.Ascending(
                        MongoCommitFields.BucketId,
                        MongoCommitFields.StreamId,
                        MongoCommitFields.CommitSequence
                        ),
                    IndexOptions.SetName(MongoCommitIndexes.LogicalKey).SetUnique(true)
                    );

                PersistedCommits.CreateIndex(
                    IndexKeys.Ascending(MongoCommitFields.CommitStamp),
                    IndexOptions.SetName(MongoCommitIndexes.CommitStamp).SetUnique(false)
                    );

                PersistedStreamHeads.CreateIndex(
                    IndexKeys.Ascending(MongoStreamHeadFields.Unsnapshotted),
                    IndexOptions.SetName(MongoStreamIndexes.Unsnapshotted).SetUnique(false)
                    );

                if (_options.ServerSideOptimisticLoop)
                {
                    PersistedCommits.Database.GetCollection("system.js").Save(new BsonDocument {
                        { "_id", "insertCommit" },
                        { "value", new BsonJavaScript(_options.GetInsertCommitScript()) }
                    });
                }

                EmptyRecycleBin();
            });
        }
コード例 #13
0
 public IEnumerable <ICommit> GetDeletedCommits()
 {
     return(TryMongo(() => PersistedCommits
                     .Find(Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin))
                     .Sort(SortByAscendingCheckpointNumber)
                     .ToEnumerable()
                     .Select(mc => mc.ToCommit(_serializer))));
 }
コード例 #14
0
 public virtual void Purge()
 {
     Logger.Warn(Messages.PurgingStorage);
     PersistedCommits.Drop();
     PersistedStreamHeads.Drop();
     PersistedSnapshots.Drop();
     Counters.Drop();
 }
 /// <inheritdoc/>
 public virtual void Purge()
 {
     Logger.LogWarning(Messages.PurgingStorage);
     // @@review -> drop & create?
     PersistedCommits.DeleteMany(Builders <BsonDocument> .Filter.Empty);
     PersistedStreamHeads.DeleteMany(Builders <BsonDocument> .Filter.Empty);
     PersistedSnapshots.DeleteMany(Builders <BsonDocument> .Filter.Empty);
 }
コード例 #16
0
        public virtual IEnumerable <Commit> GetFrom(DateTime start)
        {
            Logger.Debug(Messages.GettingAllCommitsFrom, start);

            return
                (TryMongo(
                     () =>
                     PersistedCommits.Find(Query.GTE("CommitStamp", start)).SetSortOrder("_id").Select(x => x.ToCommit(_serializer))));
        }
コード例 #17
0
        public virtual IEnumerable <Commit> GetFromTo(string bucketId, DateTime start, DateTime end)
        {
            Logger.Debug(Messages.GettingAllCommitsFromTo, start, end);

            return(TryMongo(() => PersistedCommits
                            .Find(Query.And(Query.GTE(MongoFields.CommitStamp, start), Query.LT(MongoFields.CommitStamp, end)))
                            .SetSortOrder(MongoFields.Id)
                            .Select(x => x.ToCommit(_serializer))));
        }
        public virtual IEnumerable <ICommit> GetUndispatchedCommits()
        {
            Logger.Debug(Messages.GettingUndispatchedCommits);

            return(TryMongo(() => PersistedCommits
                            .Find(Query.EQ("Dispatched", false))
                            .SetSortOrder(MongoCommitFields.CheckpointNumber)
                            .Select(mc => mc.ToCommit(_serializer))));
        }
コード例 #19
0
        public virtual IEnumerable <ICommit> GetFrom(string bucketId, DateTime start)
        {
            Logger.Debug(Messages.GettingAllCommitsFrom, start, bucketId);

            return(TryMongo(() => PersistedCommits
                            .Find(Query.And(Query.EQ("_id.BucketId", bucketId), Query.GTE(MongoFields.CommitStamp, start)))
                            .SetSortOrder(MongoFields.CheckpointNumber)
                            .Select(x => x.ToCommit(_serializer))));
        }
コード例 #20
0
        public IEnumerable <ICommit> GetFrom(string checkpointToken)
        {
            var intCheckpoint = IntCheckpoint.Parse(checkpointToken);

            Logger.Debug(Messages.GettingAllCommitsFromCheckpoint, intCheckpoint.Value);
            return(TryMongo(() => PersistedCommits
                            .Find(Query.GTE(MongoFields.CheckpointNumber, intCheckpoint.IntValue)))
                   .SetSortOrder(MongoFields.CheckpointNumber)
                   .Select(x => x.ToCommit(_serializer)));
        }
 /// <inheritdoc/>
 public void Purge(string bucketId)
 {
     Logger.LogWarning(Messages.PurgingBucket, bucketId);
     TryMongo(() =>
     {
         PersistedStreamHeads.DeleteMany(Builders <BsonDocument> .Filter.Eq(MongoStreamHeadFields.FullQualifiedBucketId, bucketId));
         PersistedSnapshots.DeleteMany(Builders <BsonDocument> .Filter.Eq(MongoShapshotFields.FullQualifiedBucketId, bucketId));
         PersistedCommits.DeleteMany(Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, bucketId));
     });
 }
コード例 #22
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));
     });
 }
 public void Purge(string bucketId)
 {
     Logger.Warn(Messages.PurgingBucket, bucketId);
     TryMongo(() =>
     {
         PersistedStreamHeads.Remove(Query.EQ(MongoStreamHeadFields.FullQualifiedBucketId, bucketId));
         PersistedSnapshots.Remove(Query.EQ(MongoShapshotFields.FullQualifiedBucketId, bucketId));
         PersistedCommits.Remove(Query.EQ(MongoCommitFields.BucketId, bucketId));
     });
 }
コード例 #24
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)));
     });
 }
        private ICommit PersistWithServerSideOptimisticLoop(CommitAttempt attempt)
        {
            BsonDocument commitDoc = attempt.ToMongoCommit(_checkpointZero, _serializer);

            return(TryMongo(() =>
            {
                var result = PersistedCommits.Database.Eval(new EvalArgs()
                {
                    Code = _updateScript,
                    Lock = false,
                    Args = new BsonValue[] { commitDoc }
                });

                if (!result.IsBsonDocument)
                {
                    throw new Exception("Invalid response. Check server side js");
                }

                if (result.AsBsonDocument.Contains("id"))
                {
                    commitDoc["_id"] = result["id"];
                    UpdateStreamHeadAsync(attempt.BucketId, attempt.StreamId, attempt.StreamRevision, attempt.Events.Count);
                    Logger.Debug(Messages.CommitPersisted, attempt.CommitId);
                }
                else if (result.AsBsonDocument.Contains("err"))
                {
                    var errorDocument = result.AsBsonDocument;

                    if (errorDocument["code"] != ConcurrencyExceptionCode)
                    {
                        throw new Exception(errorDocument["err"].AsString);
                    }

                    ICommit savedCommit = PersistedCommits.FindOne(attempt.ToMongoCommitIdQuery()).ToCommit(_serializer);

                    if (savedCommit.CommitId == attempt.CommitId)
                    {
                        throw new DuplicateCommitException(String.Format(
                                                               "Duplicated Commit: bucketId [{0}]: commitId [{1}] - streamId [{2}] - streamRevision [{3}]",
                                                               attempt.BucketId, attempt.CommitId, attempt.StreamId, attempt.StreamRevision));
                    }
                    Logger.Debug(Messages.ConcurrentWriteDetected);
                    throw new ConcurrencyException(String.Format(
                                                       "Concurrency exception forbucketId [{0}]: commitId [{1}] - streamId [{2}] - streamRevision [{3}]\n Inner provider error: {4}",
                                                       attempt.BucketId, attempt.CommitId, attempt.StreamId, attempt.StreamRevision, errorDocument["err"].AsString));
                }
                else
                {
                    throw new Exception("Invalid response. Check server side js");
                }

                return commitDoc.ToCommit(_serializer);
            }));
        }
        public virtual void MarkCommitAsDispatched(ICommit commit)
        {
            Logger.Debug(Messages.MarkingCommitAsDispatched, commit.CommitId);

            TryMongo(() =>
            {
                IMongoQuery query    = commit.ToMongoCommitIdQuery();
                UpdateBuilder update = Update.Set(MongoCommitFields.Dispatched, true);
                PersistedCommits.Update(query, update);
            });
        }
        public void EmptyRecycleBin()
        {
            var lastCheckpointNumber = _getLastCheckPointNumber();

            TryMongo(() =>
            {
                PersistedCommits.Remove(Query.And(
                                            Query.EQ(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin),
                                            Query.LT(MongoCommitFields.CheckpointNumber, lastCheckpointNumber)
                                            ));
            });
        }
コード例 #28
0
        public void EmptyRecycleBin()
        {
            var lastCheckpointNumber = GetLastCommittedCheckPointNumber();

            TryMongo(() =>
            {
                PersistedCommits.DeleteMany(Builders <BsonDocument> .Filter.And(
                                                Builders <BsonDocument> .Filter.Eq(MongoCommitFields.BucketId, MongoSystemBuckets.RecycleBin),
                                                Builders <BsonDocument> .Filter.Lt(MongoCommitFields.CheckpointNumber, lastCheckpointNumber)
                                                ));
            });
        }
コード例 #29
0
        public virtual IEnumerable <Commit> GetFrom(Guid streamId, int minRevision, int maxRevision)
        {
            Logger.Debug(Messages.GettingAllCommitsBetween, streamId, minRevision, maxRevision);

            return(TryMongo(() =>
            {
                IMongoQuery query = Query.And(Query.EQ("_id.StreamId", streamId),
                                              Query.GTE("Events.StreamRevision", minRevision),
                                              Query.LTE("Events.StreamRevision", maxRevision));

                return PersistedCommits.Find(query).SetSortOrder("Events.StreamRevision").Select(mc => mc.ToCommit(_serializer));
            }));
        }
コード例 #30
0
        private ICommit PersistWithClientSideOptimisticLoop(CommitAttempt attempt)
        {
            return(TryMongo(() =>
            {
                BsonDocument commitDoc = attempt.ToMongoCommit(
                    _getNextCheckpointNumber(),
                    _serializer
                    );

                bool retry = true;
                while (retry)
                {
                    try
                    {
                        // for concurrency / duplicate commit detection safe mode is required
                        PersistedCommits.Insert(commitDoc, _insertCommitWriteConcern);

                        retry = false;
                        UpdateStreamHeadAsync(attempt.BucketId, attempt.StreamId, attempt.StreamRevision, attempt.Events.Count);
                        Logger.Debug(Messages.CommitPersisted, attempt.CommitId);
                    }
                    catch (MongoException e)
                    {
                        if (!e.Message.Contains(ConcurrencyException))
                        {
                            throw;
                        }

                        // checkpoint index?
                        if (e.Message.Contains(MongoCommitIndexes.CheckpointNumberMMApV1) ||
                            e.Message.Contains(MongoCommitIndexes.CheckpointNumberWiredTiger))
                        {
                            commitDoc[MongoCommitFields.CheckpointNumber] = _getNextCheckpointNumber().LongValue;
                        }
                        else
                        {
                            ICommit savedCommit = PersistedCommits.FindOne(attempt.ToMongoCommitIdQuery()).ToCommit(_serializer);

                            if (savedCommit.CommitId == attempt.CommitId)
                            {
                                throw new DuplicateCommitException();
                            }
                            Logger.Debug(Messages.ConcurrentWriteDetected);
                            throw new ConcurrencyException();
                        }
                    }
                }

                return commitDoc.ToCommit(_serializer);
            }));
        }