public void CanCleanUpAfterAWorkflow() { var db = _mux.GetDatabase(); db.ScriptEvaluate("print(\"CanCleanUpAfterAWorkflow\")"); db.ScriptEvaluate("redis.call(\"flushdb\")"); var th = new TestTaskHandler(); var complete = new ManualResetEvent(false); var wh = new WorkflowHandler(); wh.WorkflowComplete += (s, w) => { complete.Set(); }; using (var wm = new WorkflowManagement(_mux, th, wh, new WorkflowManagementId("test"), null, new Lua())) { var t1 = new TaskName("TestNode1"); var t2 = new TaskName("TestNode2"); var t3 = new TaskName("TestNode3"); var t4 = new TaskName("TestNode4"); var t5 = new TaskName("TestNode5"); var t6 = new TaskName("TestNode6"); var workflow = new Workflow(new WorkflowName("TestWorkflow")); workflow.AddTask(t1, new Payload("Node1"), NoType, SimplePriority, EmptyTaskList, new[] { t2 }); workflow.AddTask(t2, new Payload("Node2"), NoType, SimplePriority, new[] { t1 }, new[] { t3, t4, t5, t6 }); workflow.AddTask(t3, new Payload("Node3"), NoType, SimplePriority, new[] { t2 }, EmptyTaskList); workflow.AddTask(t4, new Payload("Node4"), NoType, SimplePriority, new[] { t2 }, EmptyTaskList); workflow.AddTask(t5, new Payload("Node5"), NoType, SimplePriority, new[] { t2 }, EmptyTaskList); workflow.AddTask(t6, new Payload("Node6"), NoType, SimplePriority, new[] { t2 }, EmptyTaskList); var workflowId = wm.PushWorkflow(workflow); var workflowCompleted = complete.WaitOne(2000); // machine-performance dependent, but 2 seconds is a long time Assert.IsTrue(workflowCompleted); var info = wm.FetchWorkflowInformation(workflowId.ToString()); Assert.AreEqual("1", info.Id); Assert.AreEqual(6, info.Tasks.Count); wm.CleanUp(workflowId.ToString()); db = _mux.GetDatabase(); for (var t = 0; t < 6; t++) { Assert.IsFalse(db.KeyExists("task:" + t)); Assert.IsFalse(db.KeyExists("parents-" + t)); Assert.IsFalse(db.KeyExists("children-" + t)); Assert.IsFalse(db.SetContains("tasks", t)); Assert.IsFalse(db.SetContains("submitted", t)); Assert.IsFalse(db.SetContains("complete", t)); Assert.IsFalse(db.SetContains("failed", t)); Assert.IsFalse(db.SetContains("abandoned", t)); Assert.AreEqual(0, db.ListRemove("running", t)); } Assert.AreEqual(0, db.ListRemove("workflowComplete", "1")); Assert.AreEqual(0, db.ListRemove("workflowFailed", "1")); Assert.IsFalse(db.KeyExists("workflow-tasks-1")); Assert.IsFalse(db.KeyExists("workflow-remaining-1")); Assert.IsFalse(db.SetContains("workflows", "1")); Assert.IsFalse(db.KeyExists("submitted:1")); Assert.IsFalse(db.KeyExists("running:1")); } }
public void CanCleanUpAfterAWorkflow() { var db = _mux.GetDatabase(); db.ScriptEvaluate("print(\"CanCleanUpAfterAWorkflow\")"); db.ScriptEvaluate("redis.call(\"flushdb\")"); var th = new TestTaskHandler(); var complete = new ManualResetEvent(false); var wh = new WorkflowHandler(); wh.WorkflowComplete += (s, w) => { complete.Set(); }; using (var wm = new WorkflowManagement(_mux, th, wh, "test", null, new Lua())) { var workflowName = "TestWorkflow"; var tasks = new List<Task>(); tasks.Add(new Task { Type = "", Name = "TestNode1", Payload = "Node1", Parents = new string[] { }, Children = new string[] { "TestNode2" }, Workflow = workflowName }); tasks.Add(new Task { Type = "", Name = "TestNode2", Payload = "Node2", Parents = new string[] { "TestNode1" }, Children = new string[] { "TestNode3", "TestNode4", "TestNode5", "TestNode6" }, Workflow = workflowName }); tasks.Add(new Task { Type = "", Name = "TestNode3", Payload = "Node3", Parents = new string[] { "TestNode2" }, Children = new string[] { }, Workflow = workflowName }); tasks.Add(new Task { Type = "", Name = "TestNode4", Payload = "Node4", Parents = new string[] { "TestNode2" }, Children = new string[] { }, Workflow = workflowName }); tasks.Add(new Task { Type = "", Name = "TestNode5", Payload = "Node5", Parents = new string[] { "TestNode2" }, Children = new string[] { }, Workflow = workflowName }); tasks.Add(new Task { Type = "", Name = "TestNode6", Payload = "Node6", Parents = new string[] { "TestNode2" }, Children = new string[] { }, Workflow = workflowName }); var workflow = new Workflow { Name = workflowName, Tasks = tasks }; var workflowId = wm.PushWorkflow(workflow); var workflowCompleted = complete.WaitOne(2000); // machine-performance dependent, but 2 seconds is a long time Assert.IsTrue(workflowCompleted); var info = wm.FetchWorkflowInformation(workflowId.ToString()); Assert.AreEqual("1", info.Id); Assert.AreEqual(6, info.Tasks.Count); wm.CleanUp(workflowId.ToString()); db = _mux.GetDatabase(); for (var t = 0; t < 6; t++) { Assert.IsFalse(db.KeyExists("task:" + t)); Assert.IsFalse(db.KeyExists("parents-" + t)); Assert.IsFalse(db.KeyExists("children-" + t)); Assert.IsFalse(db.SetContains("tasks", t)); Assert.IsFalse(db.SetContains("submitted", t)); Assert.IsFalse(db.SetContains("complete", t)); Assert.IsFalse(db.SetContains("failed", t)); Assert.IsFalse(db.SetContains("abandoned", t)); Assert.AreEqual(0, db.ListRemove("running", t)); } Assert.AreEqual(0, db.ListRemove("workflowComplete", "1")); Assert.AreEqual(0, db.ListRemove("workflowFailed", "1")); Assert.IsFalse(db.KeyExists("workflow-tasks-1")); Assert.IsFalse(db.KeyExists("workflow-remaining-1")); Assert.IsFalse(db.SetContains("workflows", "1")); Assert.IsFalse(db.KeyExists("submitted:1")); Assert.IsFalse(db.KeyExists("running:1")); } }
private static void ExportWorkflowCompletion(int workflows, WorkflowManagement wm, DateTime startTime) { using (var w = new StreamWriter("redisWorkflowCompletion.txt")) { for (int i = 1; i <= workflows; i++) { var details = wm.FetchWorkflowInformation(i.ToString()); w.WriteLine(new TimeSpan(DateTime.Parse(details.Complete).Ticks - startTime.Ticks).TotalSeconds); } } }
private static void ExportTaskData(int workflows, WorkflowManagement wm, DateTime startTime) { using (var w = new StreamWriter("redisTaskData.txt")) { for (int i = 1; i <= workflows; i++) { var details = wm.FetchWorkflowInformation(i.ToString()); foreach (var task in details.Tasks) { w.WriteLine( new TimeSpan(DateTime.Parse(task.submitted).Ticks - startTime.Ticks).TotalSeconds + "\t" + new TimeSpan(DateTime.Parse(task.complete).Ticks - startTime.Ticks).TotalSeconds); } } } }