public void Sweep() { if (Monitor.TryEnter(_sweepLock)) { try { Logger.Debug("Beginning sweep."); // Only allow this task to run on one farm node at a time. if (_taskLeaseService.Acquire(GetType().FullName, _clock.UtcNow.AddHours(1)) != null) { // 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; } } catch (Exception ex) { Logger.Error(ex, "Error during sweep."); } finally { Monitor.Exit(_sweepLock); Logger.Debug("Ending sweep."); } } }
public string Acquire(string taskName, DateTime expiredUtc) { var cacheKey = MakeCacheKey(taskName); var machineName = _applicationEnvironment.GetEnvironmentIdentifier(); var existingLease = _cacheService.Get(cacheKey); if (existingLease != null && ((string)existingLease) != machineName) { return(null); } _cacheService.Put(cacheKey, machineName, expiredUtc - _clock.UtcNow); return(_decorated.Acquire(taskName, expiredUtc)); }
public string Acquire(string taskName, DateTime expiredUtc) { var cacheKey = MakeCacheKey(taskName); var machineName = _machineNameProvider.GetMachineName(); var existingLease = _cacheService.Get(cacheKey); if (existingLease != null && ((string)existingLease) != machineName) { return(null); } _cacheService.Put(cacheKey, machineName, expiredUtc - _clock.UtcNow); return(_decorated.Acquire(taskName, expiredUtc)); }
public void AcquireShouldSucceedIfNoTask() { var state = _service.Acquire("Foo", _clock.UtcNow.AddDays(1)); Assert.That(state, Is.EqualTo(String.Empty)); }
public void Sweep() { if (Monitor.TryEnter(_sweepLock)) { try { Logger.Debug("Beginning sweep."); 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. if (_taskLeaseService.Acquire(GetType().FullName, _clock.UtcNow.AddHours(1)) != null) { 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.Where(task => task.Id == lastTask.WamsTaskId).Single(); 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); } } } catch (Exception ex) { Logger.Error(ex, "Error during sweep."); } finally { Monitor.Exit(_sweepLock); Logger.Debug("Ending sweep."); } } }