Ejemplo n.º 1
0
        /// <summary>
        /// nominate itself to be a manager
        /// </summary>
        protected virtual async Task <IWorkerInfo> SetManager(string activityId, IWorkerInfo worker, IWorkerInfo current)
        {
            var tableLock = await _table.AcquireLock();

            _tracer.TraceInformation(activityId, worker, string.Format("Acquire table lock id: {0}", tableLock.Id));
            try
            {
                var manager = await _table.GetManager();

                // other worker already takes up manager position
                if (!ScaleUtils.WorkerEquals(manager, current))
                {
                    return(manager);
                }

                await _table.SetManager(worker);

                _tracer.TraceInformation(activityId, worker, "This worker is set to be a manager.");

                return(worker);
            }
            finally
            {
                await tableLock.Release();

                _tracer.TraceInformation(activityId, worker, string.Format("Release table lock id: {0}", tableLock.Id));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// this routine does ..
        /// - ping and update worker status
        /// - ensure manager
        /// - if manager, make scale decision
        /// - if manager, stale worker management
        /// </summary>
        protected virtual async Task ProcessWorkItem(string activityId)
        {
            // get worker status
            var worker = await _provider.GetWorkerInfo(activityId);

            _worker = worker;

            // update worker status and keep alive
            await PingWorker(activityId, worker);

            // select manager
            var manager = await EnsureManager(activityId, worker);

            // if this is manager, perform scale decision and stale worker management
            if (ScaleUtils.WorkerEquals(worker, manager))
            {
                // perform scale decision
                await MakeScaleDecision(activityId, worker);

                // stale worker management
                await CheckStaleWorker(activityId, worker);
            }
        }