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