/// <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); }
/// <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); } }