예제 #1
0
        private BSONDocument toBSON(ProcessFrame frame)
        {
            var result     = new BSONDocument();
            var t          = frame.GetType();
            var descriptor = frame.Descriptor;
            var pid        = descriptor.PID;

            result.Set(new BSONStringElement(Query._ID, pid.ID));
            result.Set(new BSONStringElement(FLD_PROCESS_ZONE, pid.Zone));
            result.Set(new BSONInt32Element(FLD_PROCESS_PROCESSOR_ID, pid.ProcessorID));
            result.Set(new BSONBooleanElement(FLD_PROCESS_UNIQUE, pid.IsUnique));

            result.Set(new BSONStringElement(FLD_PROCESS_TYPE, frame.Type.ToString()));

            result.Set(elmStr(FLD_PROCESS_DESCRIPTION, descriptor.Description));
            result.Set(new BSONDateTimeElement(FLD_PROCESS_TIMESTAMP, descriptor.Timestamp));
            result.Set(elmStr(FLD_PROCESS_ABOUT, descriptor.About));
            result.Set(new BSONInt32Element(FLD_PROCESS_STATUS, (int)descriptor.Status));
            result.Set(elmStr(FLD_PROCESS_STATUS_DESCRIPTION, descriptor.StatusDescription));
            result.Set(new BSONDateTimeElement(FLD_PROCESS_STATUS_TIMESTAMP, descriptor.StatusTimestamp));
            result.Set(elmStr(FLD_PROCESS_STATUS_ABOUT, descriptor.StatusAbout));

            result.Set(new BSONInt32Element(FLD_PROCESS_SERIALIZER, frame.Serializer));
            result.Set(elmBin(FLD_PROCESS_CONTENT, frame.Content));

            return(result);
        }
예제 #2
0
        public override void Delete(ProcessFrame frame, object transaction)
        {
            if (Disposed)
            {
                return;
            }
            var pid = frame.Descriptor.PID;

            m_Database["P" + pid.ProcessorID].DeleteOne(Query.ID_EQ_String(pid.ID));
        }
예제 #3
0
        public override void Update(ProcessFrame frame, bool sysOnly, object transaction)
        {
            if (Disposed)
            {
                return;
            }
            var pid = frame.Descriptor.PID;
            var doc = toBSONUpdate(frame, sysOnly);

            m_Database["P" + pid.ProcessorID].Update(new UpdateEntry(Query.ID_EQ_String(pid.ID), doc, false, false));
        }
예제 #4
0
        public override void Put(ProcessFrame frame, object transaction)
        {
            if (Disposed)
            {
                return;
            }
            var pid = frame.Descriptor.PID;
            var doc = toBSON(frame);

            m_Database["P" + pid.ProcessorID].Insert(doc);
        }
예제 #5
0
 private void delete(ProcessFrame frame, object transaction = null)
 {
     try
     {
         m_ProcessStore.Delete(frame, transaction);
     }
     catch (Exception e)
     {
         Log(MessageType.Critical, "delete", "{0} Leaked: {1}".Args(frame, e.ToMessageWithType()), e);
         throw;
     }
 }
예제 #6
0
 private void put(ProcessFrame frame, object transaction = null)
 {
     try
     {
         frame.Descriptor = new ProcessDescriptor(frame.Descriptor, ProcessStatus.Started, "Started", App.TimeSource.UTCNow, "@{0}@{1}".Args(App.Name, App.AsSky().HostName));
         m_ProcessStore.Put(frame, transaction);
     }
     catch (Exception e)
     {
         Log(MessageType.Critical, "put", "{0} Leaked: {1}".Args(frame, e.ToMessageWithType()), e);
         throw;
     }
 }
예제 #7
0
        public override bool TryGetByPID(PID pid, out ProcessFrame frame)
        {
            var query = new Query(@"{ '$query': { _id: '$$id' } }", true, new TemplateArg(new BSONStringElement("id", pid.ID)));

            frame = new ProcessFrame();
            var doc = m_Database["P" + pid.ProcessorID].FindOne(query);

            if (doc == null)
            {
                return(false);
            }

            frame = toFrame(doc);
            return(true);
        }
예제 #8
0
        private void spawnCore(ProcessFrame frame, object tx)
        {
            var pid = frame.Descriptor.PID;

            if (pid.IsUnique)
            {
                put(frame, tx);
                return;
            }

            lockProcess(pid.ID);
            try
            {
                var          utcNow = App.TimeSource.UTCNow;
                ProcessFrame existing;
                if (!m_ProcessStore.TryGetByPID(pid, out existing))
                {
                    put(frame, tx);
                    return;
                }

                var app             = App.AsSky();
                var processExisting = existing.Materialize(app.ProcessManager.ProcessTypeResolver);
                var processAnother  = frame.Materialize(app.ProcessManager.ProcessTypeResolver);
                if (processExisting == null || processAnother == null)//safeguard
                {
                    put(frame, tx);
                    return;
                }

                try
                {
                    processExisting.Merge(this, utcNow, processAnother);
                }
                catch (Exception error)
                {
                    // TODO : fix exception
                    throw new WorkersException(StringConsts.TODO_CORRELATED_MERGE_ERROR.Args(processExisting, processAnother, error.ToMessageWithType()), error);
                }
            }
            finally
            {
                releaseProcess(pid.ID);
            }
        }
예제 #9
0
        private ResultSignal dispatch(SignalFrame signalFrame)
        {
            lockProcess(signalFrame.PID.ID);
            try
            {
                ProcessFrame processFrame = m_ProcessStore.GetByPID(signalFrame.PID);

                var process = processFrame.Materialize(AgniSystem.ProcessManager.ProcessTypeResolver);
                var signal  = signalFrame.Materialize(AgniSystem.ProcessManager.SignalTypeResolver);
                if (process == null || signal == null)//safeguard
                {
                    throw new WorkersException("TODO");
                }

                return(process.Accept(this, signal));
            }
            finally
            {
                releaseProcess(signalFrame.PID.ID);
            }
        }
예제 #10
0
        private ProcessFrame toFrame(BSONDocument doc)
        {
            try
            {
                var descriptor = toDescriptor(doc);

                var result = new ProcessFrame();

                result.Type       = Guid.Parse(((BSONStringElement)doc[FLD_PROCESS_TYPE]).Value);
                result.Descriptor = descriptor;

                result.Serializer = ((BSONInt32Element)doc[FLD_PROCESS_SERIALIZER]).Value;
                result.Content    = elmBin(doc[FLD_PROCESS_CONTENT]);

                return(result);
            }
            catch (Exception error)
            {
                throw new MongoWorkersException(StringConsts.PROCESS_BSON_READ_ERROR.Args(error.ToMessageWithType()), error);
            }
        }
예제 #11
0
        public void Finalize(ProcessFrame frame)
        {
            CheckDaemonActive();

            var tx = m_ProcessStore.BeginTransaction();

            try
            {
                delete(frame, tx);
                m_ProcessStore.CommitTransaction(tx);
            }
            catch (Exception error)
            {
                m_ProcessStore.RollbackTransaction(tx);

                Log(MessageType.CatastrophicError, "Finalize", error.ToMessageWithType(), error);

                // TODO fix exception
                throw new WorkersException(StringConsts.TODO_ENQUEUE_TX_BODY_ERROR.Args(error.ToMessageWithType()), error);
            }
        }
예제 #12
0
        public void Update(ProcessFrame frame, bool sysOnly)
        {
            CheckServiceActive();

            var tx = m_ProcessStore.BeginTransaction();

            try
            {
                update(frame, sysOnly, tx);
                m_ProcessStore.CommitTransaction(tx);
            }
            catch (Exception error)
            {
                m_ProcessStore.RollbackTransaction(tx);

                Log(MessageType.CatastrophicError, "Update", error.ToMessageWithType(), error);

                // TODO fix exception
                throw new WorkersException(StringConsts.TODO_ENQUEUE_TX_BODY_ERROR.Args(error.ToMessageWithType()), error);
            }
        }
예제 #13
0
        private BSONDocument toBSONUpdate(ProcessFrame frame, bool sysOnly)
        {
            var setDoc     = new BSONDocument();
            var descriptor = frame.Descriptor;

            setDoc.Set(new BSONInt32Element(FLD_PROCESS_STATUS, (int)descriptor.Status));
            setDoc.Set(elmStr(FLD_PROCESS_STATUS_DESCRIPTION, descriptor.StatusDescription));
            setDoc.Set(new BSONDateTimeElement(FLD_PROCESS_STATUS_TIMESTAMP, descriptor.StatusTimestamp));
            setDoc.Set(elmStr(FLD_PROCESS_STATUS_ABOUT, descriptor.StatusAbout));

            if (!sysOnly)
            {
                setDoc.Set(new BSONInt32Element(FLD_PROCESS_SERIALIZER, frame.Serializer));
                setDoc.Set(elmBin(FLD_PROCESS_CONTENT, frame.Content));
            }

            var result = new BSONDocument();

            result.Set(new BSONDocumentElement("$set", setDoc));

            return(result);
        }
예제 #14
0
 public abstract void Delete(ProcessFrame frame, object transaction);
예제 #15
0
 public abstract bool TryGetByPID(PID pid, out ProcessFrame frame);
예제 #16
0
        public ProcessDescriptor GetDescriptor(PID pid)
        {
            ProcessFrame processFrame = m_ProcessStore.GetByPID(pid);

            return(processFrame.Descriptor);
        }
예제 #17
0
 public abstract void Put(ProcessFrame frame, object transaction);
예제 #18
0
 public abstract void Update(ProcessFrame frame, bool sysOnly, object transaction);
예제 #19
0
 public void Spawn(ProcessFrame frame) => Service.Spawn(frame);
예제 #20
0
 public void Spawn(ProcessFrame frame)
 {
     ProcessControllerService.Instance.Spawn(frame);
 }