public void Start() { _cancellationToken = new CancellationTokenSource(); _resetEvent = new ManualResetEvent(false); Task.Factory.StartNew(() => { _logger.Debug("Starting web deploy leasing thread..."); while (true) { try { var blob = AzureRoleEnvironment.WebDeployLeaseBlob(); using (var lease = new AutoRenewLease(_loggerFactory, _logLevel, blob)) { _logger.DebugFormat("Leasing thread checking...HasLease: {0}", lease.HasLease); while (lease.HasLease) { if (_leaseId != lease.LeaseId) { _logger.DebugFormat("This instance ({0}) has the lease, updating blob with the instance ID.", AzureRoleEnvironment.CurrentRoleInstanceId()); blob.Metadata["InstanceId"] = AzureRoleEnvironment.CurrentRoleInstanceId(); blob.SetMetadata(lease.LeaseId); _leaseId = lease.LeaseId; } _resetEvent.WaitOne(TimeSpan.FromSeconds(10)); if (_cancellationToken.IsCancellationRequested) { return; } } if (!_cancellationToken.IsCancellationRequested) { _leaseId = null; } } _resetEvent.WaitOne(TimeSpan.FromSeconds(30)); if (_cancellationToken.IsCancellationRequested) { return; } } catch (Exception ex) { _logger.ErrorFormat(ex, "Failed to manage lease on {0}", AzureRoleEnvironment.CurrentRoleInstanceId()); _resetEvent.WaitOne(TimeSpan.FromSeconds(30)); if (_cancellationToken.IsCancellationRequested) { return; } } } }, _cancellationToken.Token); }
public void UpdateStatus(string webSiteName, SyncInstanceStatus status, Exception lastError = null) { var syncStatus = new SyncStatus { SiteName = webSiteName, RoleInstanceId = AzureRoleEnvironment.CurrentRoleInstanceId(), DeploymentId = AzureRoleEnvironment.DeploymentId(), Status = status, IsOnline = true, LastError = lastError }; _table.AddOrUpdate(syncStatus.ToRow()); }
public static SyncStatusRow ToRow(this SyncStatus model) { if (model == null) { return(null); } var deploymentId = string.IsNullOrWhiteSpace(model.DeploymentId) ? AzureRoleEnvironment.DeploymentId() : model.DeploymentId; var roleInstanceId = string.IsNullOrWhiteSpace(model.RoleInstanceId) ? AzureRoleEnvironment.CurrentRoleInstanceId() : model.RoleInstanceId; return(new SyncStatusRow(deploymentId, roleInstanceId, model.SiteName) { Status = model.Status.ToString(), IsOnline = model.IsOnline, LastError = model.LastError.TraceInformation() }); }
public void Dispose() { foreach (var syncStatus in _syncStatusRepository.RetrieveSyncStatusByInstanceId(AzureRoleEnvironment.CurrentRoleInstanceId())) { syncStatus.IsOnline = false; _syncStatusRepository.Update(syncStatus); } }