public override void Process(ErrorPipelineContext ctx) { if (ctx.IsNew) { return; } int maxErrorsPerStack = 50; Organization organization = _organizationRepository.GetByIdCached(ctx.Error.OrganizationId); if (organization != null) { maxErrorsPerStack = organization.MaxErrorsPerDay > 0 ? organization.MaxErrorsPerDay + Math.Min(50, organization.MaxErrorsPerDay * 2) : Int32.MaxValue; } // get a list of oldest ids that exceed our desired max errors var errors = _errorRepository.Collection.Find(Query.EQ(ErrorRepository.FieldNames.ErrorStackId, new BsonObjectId(new ObjectId(ctx.Error.ErrorStackId)))) .SetSortOrder(SortBy.Descending(ErrorRepository.FieldNames.OccurrenceDate_UTC)) .SetFields(ErrorRepository.FieldNames.Id) .Select(e => new Error { Id = e.Id, OrganizationId = ctx.Error.OrganizationId, ProjectId = ctx.Error.ProjectId, ErrorStackId = ctx.Error.ErrorStackId }) .Skip(maxErrorsPerStack) .Take(150).ToArray(); if (errors.Length > 0) { _errorRepository.Delete(errors); } }