コード例 #1
0
        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.");
                }
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        public void AcquireShouldSucceedIfNoTask()
        {
            var state = _service.Acquire("Foo", _clock.UtcNow.AddDays(1));

            Assert.That(state, Is.EqualTo(String.Empty));
        }
コード例 #5
0
        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.");
                }
            }
        }