public void Sweep()
        {
            Logger.Debug("Beginning sweep.");

            try {
                // Only allow this task to run on one farm node at a time.
                IDistributedLock @lock;
                if (_distributedLockService.TryAcquireLock(GetType().FullName, TimeSpan.FromHours(1), out @lock))
                {
                    using (@lock) {
                        // We don't need to check the audit trail for events to remove every minute. Let's stick with twice a day.
                        if (!GetIsTimeToTrim())
                        {
                            return;
                        }

                        Logger.Debug("Starting audit trail trimming.");
                        var deletedRecords = _auditTrailManager.Trim(TimeSpan.FromDays(Settings.RetentionPeriod));
                        Logger.Debug("Audit trail trimming completed. {0} records were deleted.", deletedRecords.Count());
                        Settings.LastRunUtc = _clock.UtcNow;
                    }
                }
                else
                {
                    Logger.Debug("Distributed lock could not be acquired; going back to sleep.");
                }
            }
            catch (Exception ex) {
                Logger.Error(ex, "Error during sweep.");
            }
            finally {
                Logger.Debug("Ending sweep.");
            }
        }
コード例 #2
0
        public void Activated()
        {
            EnsureDistributedLockSchemaExists();

            IDistributedLock @lock;

            if (_distributedLockService.TryAcquireLock(GetType().FullName, TimeSpan.FromMinutes(30), TimeSpan.FromMilliseconds(250), out @lock))
            {
                using (@lock)
                {
                    // Let's make sure that the basic set of features is enabled.  If there are any that are not enabled, then let's enable them first.
                    var theseFeaturesShouldAlwaysBeActive = new[] {
                        "Settings", "Shapes",
                    };

                    var enabledFeatures  = _featureManager.GetEnabledFeatures().Select(f => f.Id).ToList();
                    var featuresToEnable = theseFeaturesShouldAlwaysBeActive.Where(shouldBeActive => !enabledFeatures.Contains(shouldBeActive)).ToList();
                    if (featuresToEnable.Any())
                    {
                        _featureManager.EnableFeatures(featuresToEnable, true);
                    }

                    foreach (var feature in _dataMigrationManager.GetFeaturesThatNeedUpdate())
                    {
                        try
                        {
                            _dataMigrationManager.Update(feature);
                        }
                        catch (Exception ex)
                        {
                            if (ex.IsFatal())
                            {
                                throw;
                            }
                            Logger.Error("Could not run migrations automatically on " + feature, ex);
                        }
                    }
                }
            }
        }
コード例 #3
0
        public void Sweep()
        {
            Logger.Debug("Beginning sweep.");

            try {
                if (!_orchardServices.WorkContext.CurrentSite.As <CloudMediaSettingsPart>().IsValid())
                {
                    Logger.Debug("Settings are invalid; going back to sleep.");
                    return;
                }

                // Only allow this task to run on one farm node at a time.
                IDistributedLock @lock;
                if (_distributedLockService.TryAcquireLock(GetType().FullName, TimeSpan.FromHours(1), out @lock))
                {
                    using (@lock) {
                        var jobs = _jobManager.GetActiveJobs().ToDictionary(job => job.WamsJobId);

                        if (!jobs.Any())
                        {
                            Logger.Debug("No open jobs were found; going back to sleep.");
                            return;
                        }

                        Logger.Information("Beginning processing of {0} open jobs.", jobs.Count());

                        var wamsJobs = _wamsClient.GetJobsById(jobs.Keys);

                        foreach (var wamsJob in wamsJobs)
                        {
                            Logger.Information("Processing job '{0}'...", wamsJob.Name);

                            var job       = jobs[wamsJob.Id];
                            var tasks     = job.Tasks.ToDictionary(task => task.WamsTaskId);
                            var wamsTasks = wamsJob.Tasks.ToArray();

                            foreach (var wamsTask in wamsTasks)
                            {
                                var task = tasks[wamsTask.Id];
                                task.Status          = MapWamsJobState(wamsTask.State);
                                task.PercentComplete = (int)wamsTask.Progress;
                            }

                            var previousStatus = job.Status;
                            var wamsJobErrors  = HarvestWamsJobErrors(wamsJob).ToArray();

                            job.CreatedUtc   = wamsJob.Created;
                            job.StartedUtc   = wamsJob.StartTime;
                            job.FinishedUtc  = wamsJob.EndTime;
                            job.Status       = MapWamsJobState(wamsJob.State);
                            job.ErrorMessage = GetAggregateErrorMessage(wamsJobErrors);

                            LogWamsJobErrors(wamsJobErrors);

                            if (job.Status != previousStatus)
                            {
                                if (job.Status == JobStatus.Finished)
                                {
                                    Logger.Information("Job '{0}' was finished in WAMS; creating locators.", wamsJob.Name);

                                    var lastTask               = job.Tasks.Last();
                                    var lastWamsTask           = wamsTasks.Single(task => task.Id == lastTask.WamsTaskId);
                                    var outputAsset            = lastWamsTask.OutputAssets.First();
                                    var outputAssetName        = !String.IsNullOrWhiteSpace(job.OutputAssetName) ? job.OutputAssetName : lastWamsTask.Name;
                                    var outputAssetDescription = job.OutputAssetDescription.TrimSafe();
                                    var encoderMetadataXml     = _wamsClient.GetEncoderMetadataXml(outputAsset).Result;
                                    var cloudVideoPart         = job.CloudVideoPart;
                                    var wamsLocators           = _wamsClient.CreateLocatorsAsync(outputAsset, WamsLocatorCategory.Private).Result;

                                    // HACK: Temporary workaround to disable dynamic packaging for VC1-based assets. In future versions
                                    // this will be implemented more robustly by testing all the dynamic URLs to see which ones work
                                    // and only store and use the working ones.
                                    var forceNonDynamicAsset = lastWamsTask.Configuration.StartsWith("VC1");

                                    if (wamsLocators.OnDemandLocator != null && !forceNonDynamicAsset)
                                    {
                                        _assetManager.CreateAssetFor <DynamicVideoAsset>(cloudVideoPart, asset => {
                                            asset.IncludeInPlayer               = true;
                                            asset.Name                          = outputAssetName;
                                            asset.Description                   = outputAssetDescription;
                                            asset.EncodingPreset                = lastTask.HarvestAssetName;
                                            asset.WamsPrivateLocatorId          = wamsLocators.SasLocator.Id;
                                            asset.WamsPrivateLocatorUrl         = wamsLocators.SasLocator.Url;
                                            asset.WamsPrivateOnDemandLocatorId  = wamsLocators.OnDemandLocator.Id;
                                            asset.WamsPrivateOnDemandLocatorUrl = wamsLocators.OnDemandLocator.Url;
                                            asset.WamsManifestFilename          = wamsLocators.OnDemandManifestFilename;
                                            asset.WamsAssetId                   = outputAsset.Id;
                                            asset.WamsEncoderMetadataXml        = encoderMetadataXml;
                                            asset.UploadState.Status            = AssetUploadStatus.Uploaded;
                                            asset.PublishState.Status           = AssetPublishStatus.None;
                                        });
                                    }
                                    else
                                    {
                                        _assetManager.CreateAssetFor <VideoAsset>(cloudVideoPart, asset => {
                                            asset.IncludeInPlayer        = true;
                                            asset.Name                   = outputAssetName;
                                            asset.Description            = outputAssetDescription;
                                            asset.EncodingPreset         = lastTask.HarvestAssetName;
                                            asset.WamsPrivateLocatorId   = wamsLocators.SasLocator.Id;
                                            asset.WamsPrivateLocatorUrl  = wamsLocators.SasLocator.Url;
                                            asset.WamsAssetId            = outputAsset.Id;
                                            asset.WamsEncoderMetadataXml = encoderMetadataXml;
                                            asset.UploadState.Status     = AssetUploadStatus.Uploaded;
                                            asset.PublishState.Status    = AssetPublishStatus.None;
                                        });
                                    }

                                    try {
                                        if (cloudVideoPart.IsPublished())
                                        {
                                            _assetManager.PublishAssetsFor(cloudVideoPart);
                                        }
                                    }
                                    catch (Exception ex) {
                                        Logger.Warning(ex, "Processing of job '{0}' was completed but an error occurred while publishing the cloud video item with ID {1} after processing.", wamsJob.Name, cloudVideoPart.Id);
                                    }
                                }
                            }

                            Logger.Information("Processing of job '{0}' was successfully completed.", wamsJob.Name);
                        }
                    }
                }
                else
                {
                    Logger.Debug("Distributed lock could not be acquired; going back to sleep.");
                }
            }
            catch (Exception ex) {
                Logger.Error(ex, "Error during sweep.");
            }
            finally {
                Logger.Debug("Ending sweep.");
            }
        }
コード例 #4
0
 /// <summary>
 /// Tries to immediately acquire a named distributed lock with no expiration time within the current tenant.
 /// </summary>
 /// <param name="name">The name of the lock to acquire.</param>
 /// <param name="lock">This out parameter will be assigned the acquired lock if successful.</param>
 /// <returns><c>true</c> if the lock could be immediately acquired, otherwise <c>false</c>.</returns>
 public static bool TryAcquireLock(this IDistributedLockService service, string name, out IDistributedLock @lock)
 {
     return(service.TryAcquireLock(name, null, TimeSpan.Zero, out @lock));
 }