Exemple #1
0
        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()
            });
        }
Exemple #4
0
 public void Dispose()
 {
     foreach (var syncStatus in _syncStatusRepository.RetrieveSyncStatusByInstanceId(AzureRoleEnvironment.CurrentRoleInstanceId()))
     {
         syncStatus.IsOnline = false;
         _syncStatusRepository.Update(syncStatus);
     }
 }