Esempio n. 1
0
        public Task <ChangeResult> WriteAsync(Atom ns, Atom queue, Event evt)
        {
            const int MONGO_KEY_VIOLATION = 11000;

            checkRoute(ns, queue);
            var ve = evt.NonNull(nameof(Event)).Validate();

            if (ve != null)
            {
                throw ve;
            }

            //Checkpoint is forced as the time of writing to disk at the client
            var bson       = BsonConvert.ToBson(evt);
            var collection = getQueueCollection(ns, queue);//ensures indexes

            var crud = collection.Insert(bson);

            //need to detect key violation as it is a sign of idempotency retry which should be treated as success
            var success = (crud.WriteErrors == null) ||
                          (crud.WriteErrors.Length > 0 && crud.WriteErrors[0].Code == MONGO_KEY_VIOLATION);

            var result = success ? new ChangeResult(ChangeResult.ChangeType.Inserted, 1, "Affected: " + crud.TotalDocumentsAffected, crud.WriteErrors?.Select(e => new { e.Code, e.Message }))
                           : new ChangeResult(ChangeResult.ChangeType.Undefined, 0, "Error", crud.WriteErrors?.Select(e => new { e.Code, e.Message }));

            return(Task.FromResult(result));
        }
Esempio n. 2
0
        public Task <IEnumerable <Event> > FetchAsync(Atom ns, Atom queue, ulong checkpoint, int skip, int count, bool onlyid)
        {
            checkRoute(ns, queue);

            var collection = getQueueCollection(ns, queue);

            var qry      = BsonConvert.GetFetchQuery(checkpoint);
            var selector = BsonConvert.GetFetchSelector(onlyid);

            IEnumerable <Event> result = null;

            if (skip < 0)
            {
                skip = 0;
            }
            count = count.KeepBetween(1, EventHubClientLogic.FETCH_BY_MAX);
            var fetchBy = Math.Min(count, EventHubClientLogic.FETCH_BY_MAX);

            using (var cursor = collection.Find(qry, skip, fetchBy, selector))
            {
                result = cursor.Take(count)
                         .Select(doc => BsonConvert.FromBson(doc)).ToArray();
            }

            return(Task.FromResult(result));
        }
Esempio n. 3
0
        private Collection getQueueCollection(Atom ns, Atom queue)
        {
            var db         = getNamespaceDatabase(ns);
            var collection = db.GetOrRegister(queue.Value, out var wasAdded);

            if (wasAdded)
            {
                //Create index on CheckpointUtc
                this.DontLeak(
                    () => db.RunCommand(BsonConvert.CreateIndex(queue.Value)),
                    errorLogType: Azos.Log.MessageType.CriticalAlert
                    );
            }
            return(collection);
        }