Example #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));
            }
        }
        public static string GetToken()
        {
            if (string.IsNullOrEmpty(_token) || _tokenExpiredUtc < DateTime.UtcNow)
            {
                var expiredUtc = DateTime.UtcNow.Add(TokenValidity);
                var token      = ScaleUtils.GetToken(expiredUtc);
                _token           = WebUtility.UrlEncode(token);
                _tokenExpiredUtc = expiredUtc;
            }

            return(_token);
        }
Example #3
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);
            }
        }