示例#1
0
        public async Task TestResourceManagerCancellationPreferenceMultiple()
        {
            ProcessResourceManager resourceManager = new ProcessResourceManager();

            // Highest RAM, but oldest pip so it is not cancelled
            var workItem1 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 10000);

            var workItem2 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 1002);

            var workItem3 = CreateWorkItem(resourceManager, estimatedRamUsage: 1000, reportedRamUsage: 2000);

            var workItem4 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 1);

            var workItem3Cancelled = workItem3.WaitForCancellation();
            var workItem2Cancelled = workItem2.WaitForCancellation();
            var workItem4Cancelled = workItem4.WaitForCancellation();

            // Attempt to free more RAM than occupied by all work items (oldest pips should be retained even though
            // it must be freed to attempt to meet resource requirements)
            resourceManager.TryFreeResources(requiredRamMb: 20000);

            // Ensure only work item 2 AND 3 were cancelled since that is all that is required to free necessary RAM
            XAssert.IsTrue(await workItem2Cancelled);
            XAssert.IsTrue(await workItem3Cancelled);
            XAssert.IsTrue(await workItem4Cancelled);
            workItem1.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem2.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);
            workItem3.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);
            workItem4.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);
        }
示例#2
0
 private ResourceManagerWorkItemTracker CreateWorkItem(ProcessResourceManager resourceManager, int estimatedRamUsage = 0, bool allowCancellation = true, int reportedRamUsage = 1)
 {
     return(new ResourceManagerWorkItemTracker(resourceManager, (uint)Interlocked.Increment(ref m_nextId), estimatedRamUsage, allowCancellation)
     {
         RamUsage = reportedRamUsage
     });
 }
 private ResourceManagerWorkItemTracker CreateWorkItem(ProcessResourceManager resourceManager, int estimatedRamUsage = 0, bool allowCancellation = true, int reportedRamUsage = 1)
 {
     return(new ResourceManagerWorkItemTracker(
                LoggingContext,
                resourceManager,
                (uint)Interlocked.Increment(ref m_nextId),
                estimatedRamUsage,
                allowCancellation)
     {
         RamUsage = ProcessMemoryCountersSnapshot.CreateFromMB(reportedRamUsage, reportedRamUsage, reportedRamUsage, reportedRamUsage, reportedRamUsage)
     });
 }
            public ResourceManagerWorkItemTracker(LoggingContext loggingContext, ProcessResourceManager resourceManager, uint id, int estimatedRamUsage, bool allowCancellation)
            {
                ExecutionCompletionSource      = TaskSourceSlim.Create <int>();
                m_cancellationCompletionSource = TaskSourceSlim.Create <Unit>();
                var context = BuildXLContext.CreateInstanceForTesting();

                m_execute = () => ExecutionTask = resourceManager.ExecuteWithResourcesAsync(
                    OperationContext.CreateUntracked(loggingContext),
                    SchedulerTest.CreateDummyProcess(context, new PipId(id)),
                    ProcessMemoryCounters.CreateFromMb(estimatedRamUsage, estimatedRamUsage, estimatedRamUsage, estimatedRamUsage),
                    allowCancellation,
                    async(resourceScope) =>
                {
                    m_startSemaphore.Release();
                    resourceScope.RegisterQueryRamUsageMb(() => RamUsage);

                    ExecutionCount++;
                    var currrentCancellationCompletionSource = m_cancellationCompletionSource;
                    resourceScope.Token.Register(() =>
                    {
                        XAssert.IsTrue(m_startSemaphore.Wait(millisecondsTimeout: 100000));

                        CancellationCount++;
                        m_cancellationCompletionSource = TaskSourceSlim.Create <Unit>();
                        currrentCancellationCompletionSource.TrySetResult(Unit.Void);
                    });

                    var result = await Task.WhenAny(currrentCancellationCompletionSource.Task, ExecutionCompletionSource.Task);

                    resourceScope.Token.ThrowIfCancellationRequested();

                    XAssert.IsTrue(ExecutionCompletionSource.Task.IsCompleted, "This task should be completed since the cancellation task implies the cancellation token would throw in the preceding line of code.");

                    return(ExecutionCompletionSource.Task.Result);
                });

                StartExecute();
            }
示例#5
0
        public async Task TestResourceManagerCancellationPreference()
        {
            ProcessResourceManager resourceManager = new ProcessResourceManager();

            var workItem1 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 1);

            // Highest RAM usage over estimate
            var workItem2 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 1002);

            // Higest overall RAM usage, second most recently executed (cancelled second)
            var workItem3 = CreateWorkItem(resourceManager, estimatedRamUsage: 1000, reportedRamUsage: 2000);

            // Most recently executed (Cancelled second)
            var workItem4 = CreateWorkItem(resourceManager, estimatedRamUsage: 1, reportedRamUsage: 1);

            var workItem4Cancelled = workItem4.WaitForCancellation();

            resourceManager.TryFreeResources(requiredRamMb: 1);

            // Ensure only work item 4 was cancelled since that is all that is required to free necessary RAM
            XAssert.IsTrue(await workItem4Cancelled);
            workItem1.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem2.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem3.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem4.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);

            var workItem3Cancelled = workItem3.WaitForCancellation();

            resourceManager.TryFreeResources(requiredRamMb: 1000);

            // Ensure only work item 3 was cancelled since that is all that is required to free necessary RAM
            XAssert.IsTrue(await workItem3Cancelled);
            workItem1.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem2.Verify(expectedCancellationCount: 0, expectedExecutionCount: 1, expectedCompleted: false);
            workItem3.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);
            workItem4.Verify(expectedCancellationCount: 1, expectedExecutionCount: 1, expectedCompleted: false);
        }
            public ResourceManagerWorkItemTracker(ProcessResourceManager resourceManager, uint id, int estimatedRamUsage, bool allowCancellation)
            {
                ExecutionCompletionSource      = TaskSourceSlim.Create <int>();
                m_cancellationCompletionSource = TaskSourceSlim.Create <Unit>();
                m_execute = () => ExecutionTask = resourceManager.ExecuteWithResources(
                    OperationContext.CreateUntracked(Events.StaticContext),
                    new PipId(id),
                    estimatedRamUsage,
                    allowCancellation,
                    async(cancellationToken, registerQueryRamUsage) =>
                {
                    m_startSemaphore.Release();
                    registerQueryRamUsage(() => RamUsage);

                    ExecutionCount++;
                    var currrentCancellationCompletionSource = m_cancellationCompletionSource;
                    cancellationToken.Register(() =>
                    {
                        XAssert.IsTrue(m_startSemaphore.Wait(millisecondsTimeout: 100000));

                        CancellationCount++;
                        m_cancellationCompletionSource = TaskSourceSlim.Create <Unit>();
                        currrentCancellationCompletionSource.TrySetResult(Unit.Void);
                    });

                    var result = await Task.WhenAny(currrentCancellationCompletionSource.Task, ExecutionCompletionSource.Task);

                    cancellationToken.ThrowIfCancellationRequested();

                    XAssert.IsTrue(ExecutionCompletionSource.Task.IsCompleted, "This task should be completed since the cancellation task implies the cancellation token would throw in the preceding line of code.");

                    return(ExecutionCompletionSource.Task.Result);
                });

                StartExecute();
            }
 private void RunResourceManager(ProcessResourceManager resourceManager, int requiredSizeMb, ManageMemoryMode mode)
 {
     resourceManager.RefreshMemoryCounters();
     resourceManager.TryManageResources(requiredSizeMb, mode);
 }