Change JobSteps to a List, Change Register Step function name

This commit is contained in:
Ethan Chiu
2020-06-19 14:29:48 -04:00
parent 941a24ee37
commit 9939cf527e
4 changed files with 20 additions and 65 deletions

View File

@@ -63,7 +63,7 @@ namespace GitHub.Runner.Worker
JobContext JobContext { get; } JobContext JobContext { get; }
// Only job level ExecutionContext has JobSteps // Only job level ExecutionContext has JobSteps
Queue<IStep> JobSteps { get; } List<IStep> JobSteps { get; }
// Only job level ExecutionContext has PostJobSteps // Only job level ExecutionContext has PostJobSteps
Stack<IStep> PostJobSteps { get; } Stack<IStep> PostJobSteps { get; }
@@ -105,8 +105,7 @@ namespace GitHub.Runner.Worker
// others // others
void ForceTaskComplete(); void ForceTaskComplete();
void RegisterPostJobStep(IStep step); void RegisterPostJobStep(IStep step);
IStep RegisterCompositeStep(IStep step, DictionaryContextData inputsData); void RegisterNestedStep(IStep step, DictionaryContextData inputsData, int location);
void EnqueueAllCompositeSteps(Queue<IStep> steps);
} }
public sealed class ExecutionContext : RunnerService, IExecutionContext public sealed class ExecutionContext : RunnerService, IExecutionContext
@@ -161,7 +160,7 @@ namespace GitHub.Runner.Worker
public List<ContainerInfo> ServiceContainers { get; private set; } public List<ContainerInfo> ServiceContainers { get; private set; }
// Only job level ExecutionContext has JobSteps // Only job level ExecutionContext has JobSteps
public Queue<IStep> JobSteps { get; private set; } public List<IStep> JobSteps { get; private set; }
// Only job level ExecutionContext has PostJobSteps // Only job level ExecutionContext has PostJobSteps
public Stack<IStep> PostJobSteps { get; private set; } public Stack<IStep> PostJobSteps { get; private set; }
@@ -267,62 +266,17 @@ namespace GitHub.Runner.Worker
Root.PostJobSteps.Push(step); Root.PostJobSteps.Push(step);
} }
/* /// <summary>
RegisterCompositeStep is a helper function used in CompositeActionHandler::RunAsync to /// Helper function used in CompositeActionHandler::RunAsync to
add a child node, aka a step, to the current job to the front of the queue for processing. /// add a child node, aka a step, to the current job to the Root.JobSteps based on the location.
*/ /// </summary>
public IStep RegisterCompositeStep(IStep step, DictionaryContextData inputsData) public void RegisterNestedStep(IStep step, DictionaryContextData inputsData, int location)
{ {
// ~Brute Force Method~ // TODO: For UI purposes, look at figuring out how to condense steps in one node => maybe use the same previous GUID
// There is no way to put this current job in front of the queue in < O(n) time where n = # of elements in JobSteps
// Everytime we add a new step, you could requeue every item to put those steps from that stack in JobSteps which
// would result in O(n) for each time we add a composite action step where n = number of jobSteps which would compound
// to O(n*m) where m = number of composite steps
// var temp = Root.JobSteps.ToArray();
// Root.JobSteps.Clear();
// Root.JobSteps.Enqueue(step);
// foreach(var s in temp)
// Root.JobSteps.Enqueue(s);
// ~Optimized Method~
// Alterative solution: We add to another temp Queue
// After we add all the transformed composite steps to this temp queue, we requeue the whole JobSteps accordingly in EnqueueAllCompositeSteps()
// where the queued composite steps are at the front of the JobSteps Queue and the rest of the jobs maintain its order and are
// placed after the queued composite steps
// This will take only O(n+m) time which would be just as efficient if we refactored the code of JobSteps to a PriorityQueue
// This temp Queue is created in the CompositeActionHandler.
var newGuid = Guid.NewGuid(); var newGuid = Guid.NewGuid();
step.ExecutionContext = Root.CreateChild(newGuid, step.DisplayName, newGuid.ToString("N"), null, null); step.ExecutionContext = Root.CreateChild(newGuid, step.DisplayName, newGuid.ToString("N"), null, null);
step.ExecutionContext.ExpressionValues["inputs"] = inputsData; step.ExecutionContext.ExpressionValues["inputs"] = inputsData;
return step; Root.JobSteps.Insert(0, step);
}
// Add Composite Steps first and then requeue the rest of the job steps.
public void EnqueueAllCompositeSteps(Queue<IStep> steps)
{
// TODO: For UI purposes, look at figuring out how to condense steps in one node
// maybe use "this" instead of "Root"?
if (Root.JobSteps != null)
{
var temp = Root.JobSteps.ToArray();
Root.JobSteps.Clear();
foreach (var cs in steps)
{
Root.JobSteps.Enqueue(cs);
}
foreach (var s in temp)
{
Root.JobSteps.Enqueue(s);
}
}
else
{
Root.JobSteps = new Queue<IStep>();
foreach (var cs in steps)
{
Root.JobSteps.Enqueue(cs);
}
}
} }
public IExecutionContext CreateChild(Guid recordId, string displayName, string refName, string scopeName, string contextName, Dictionary<string, string> intraActionState = null, int? recordOrder = null) public IExecutionContext CreateChild(Guid recordId, string displayName, string refName, string scopeName, string contextName, Dictionary<string, string> intraActionState = null, int? recordOrder = null)
@@ -719,7 +673,7 @@ namespace GitHub.Runner.Worker
PrependPath = new List<string>(); PrependPath = new List<string>();
// JobSteps for job ExecutionContext // JobSteps for job ExecutionContext
JobSteps = new Queue<IStep>(); JobSteps = new List<IStep>();
// PostJobSteps for job ExecutionContext // PostJobSteps for job ExecutionContext
PostJobSteps = new Stack<IStep>(); PostJobSteps = new Stack<IStep>();

View File

@@ -45,7 +45,7 @@ namespace GitHub.Runner.Worker.Handlers
} }
// Add each composite action step to the front of the queue // Add each composite action step to the front of the queue
var compositeActionSteps = new Queue<IStep>(); int location = 0;
foreach (Pipelines.ActionStep aStep in actionSteps) foreach (Pipelines.ActionStep aStep in actionSteps)
{ {
// Ex: // Ex:
@@ -63,7 +63,7 @@ namespace GitHub.Runner.Worker.Handlers
// - run echo hello world 3 (d) // - run echo hello world 3 (d)
// - run echo hello world 4 (e) // - run echo hello world 4 (e)
// //
// Stack (LIFO) [Bottom => Middle => Top]: // Steps processed as follow:
// | a | // | a |
// | a | => | d | // | a | => | d |
// (Run step d) // (Run step d)
@@ -86,9 +86,9 @@ namespace GitHub.Runner.Worker.Handlers
// TODO: Do we need to add any context data from the job message? // TODO: Do we need to add any context data from the job message?
// (See JobExtension.cs ~line 236) // (See JobExtension.cs ~line 236)
compositeActionSteps.Enqueue(ExecutionContext.RegisterCompositeStep(actionRunner, inputsData)); ExecutionContext.RegisterNestedStep(actionRunner, inputsData, location);
location++;
} }
ExecutionContext.EnqueueAllCompositeSteps(compositeActionSteps);
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@@ -152,7 +152,7 @@ namespace GitHub.Runner.Worker
{ {
foreach (var step in jobSteps) foreach (var step in jobSteps)
{ {
jobContext.JobSteps.Enqueue(step); jobContext.JobSteps.Add(step);
} }
await stepsRunner.RunAsync(jobContext); await stepsRunner.RunAsync(jobContext);

View File

@@ -59,14 +59,15 @@ namespace GitHub.Runner.Worker
checkPostJobActions = true; checkPostJobActions = true;
while (jobContext.PostJobSteps.TryPop(out var postStep)) while (jobContext.PostJobSteps.TryPop(out var postStep))
{ {
jobContext.JobSteps.Enqueue(postStep); jobContext.JobSteps.Add(postStep);
} }
continue; continue;
} }
var step = jobContext.JobSteps.Dequeue(); var step = jobContext.JobSteps[0];
var nextStep = jobContext.JobSteps.Count > 0 ? jobContext.JobSteps.Peek() : null; jobContext.JobSteps.RemoveAt(0);
var nextStep = jobContext.JobSteps.Count > 0 ? jobContext.JobSteps[0] : null;
// TODO: Fix this temporary workaround for Composite Actions // TODO: Fix this temporary workaround for Composite Actions
if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA")))
{ {