<div style="font-family: Helvetica; font-size: 13px;">Since you have mentioned that, I'm kind of interested, who else is going to benefit from this transition? <div><br></div><div>I'm asking because everyone tells me that it's essential for us to work together, though my senses tells me that we are starting from different prerequisites, targeting different use cases and taking the entirely different approaches to solve the problem. Actually, I'd say we have more differences than the things we have in common.</div><div><br></div><div>Did you hear the same requests from anyone of your current users? May be we should invite them for discussion, just to make sure we would not have to redo it again.</div></div>
                <div><div><br></div><div>-- </div><div>Kirill Izotov<br></div><div><br></div></div>
                  
                <p style="color: #A0A0A8;">вторник, 15 апреля 2014 г. в 11:13, Joshua Harlow написал:</p><blockquote type="cite"><div>
                    <span><div><div>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">


<div>Sure, its not the fully complete lazy_engine, but piece by piece we can get there.</div>
<div><br>
</div>
<div>Of course code/contributions are welcome, as such things will benefit more than just mistral, but openstack as a whole :-)</div>
<div><br>
</div>
<div>-Josh</div>
<div><br>
</div>
<span>
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Kirill Izotov <<a href="mailto:enykeev@stackstorm.com">enykeev@stackstorm.com</a>><br>
<span style="font-weight:bold">Date: </span>Monday, April 14, 2014 at 9:02 PM<br>
<span style="font-weight:bold">To: </span>Joshua Harlow <<a href="mailto:harlowja@yahoo-inc.com">harlowja@yahoo-inc.com</a>><br>
<span style="font-weight:bold">Cc: </span>"OpenStack Development Mailing List (not for usage questions)" <<a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a>><br>
<span style="font-weight:bold">Subject: </span>Re: [openstack-dev] [mistral] [taskflow] Mistral TaskFlow integration summary<br>
</div>
<div><br>
</div><blockquote style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;">
<div>
<div>
<div style="font-family: Helvetica; font-size: 13px;">Thank for pointing that out, Joshua.</div>
<div style="font-family: Helvetica; font-size: 13px;"><br>
</div>
<div style="font-family: Helvetica; font-size: 13px;">I had a look on [1] and it seems to me that it might actually do the trick to some degree, though I'm afraid this is still not what we are looking for. While Mistral is asynchronous and event-driven, this
 particular design is not and would still force us to store the engine in memory and therefore limit our means of scalability. The lazy engine (or better controller) I have proposed is asynchronous at its core and would fit the needs for both of us (since it's
 much easier to make sync from async, rather than backwards).</div>
<div style="font-family: Helvetica; font-size: 13px;"><br>
</div>
<div style="font-family: Helvetica; font-size: 13px;">Regarding the retries, while it might work with the current flow design, I doubt it would work with conditional transitions. The attempt to build a repeater by incapsulating the tasks into sub-flow will
 basically means that every transition they produce will be in that flow and you can't leave it until they are all finished. The whole idea of sub-flows within the scope of direct conditional transitions is a bit unclear to me (and probably us all) at the moment,
 though I'm trying to rely on them only as a means to lesser the complexity.</div>
<div style="font-family: Helvetica; font-size: 13px;"><br>
</div>
<div style="font-family: Helvetica; font-size: 13px;">[1] <a href="https://review.openstack.org/#/c/86470">https://review.openstack.org/#/c/86470</a></div>
<div>
<div><br>
</div>
<div>-- </div>
<div>Kirill Izotov<br>
</div>
<div><br>
</div>
</div>
<p style="color: #A0A0A8;">пятница, 11 апреля 2014 г. в 23:47, Joshua Harlow написал:</p><blockquote type="cite"><div>
<span>
<div>
<div>
<div>Thanks for the write-up krill.</div>
<div><br>
</div>
<div>Also some adjustments,</div>
<div><br>
</div>
<div>Both points are good, and putting some of this on @ <a href="https://etherpad.openstack.org/p/taskflow-mistral-details">https://etherpad.openstack.org/p/taskflow-mistral-details</a> so that we can have it actively noted (feel free to adjust it).</div>
<div><br>
</div>
<div>I think ivan is working on some docs/code/… for the lazy engine idea, so hopefully we can get back soon with that. Lets see what comes out of that effort and iterate on that.</div>
<div><br>
</div>
<div>For (2), our are mostly correct about unconditional execution although [1] does now change this, and there are a few active reviews that are being worked [3] on to fit this mistral use-case better. I believe [2] can help move in this direction, ivans ideas
 I think will also push it a little farther to. Of course lets work together to make sure they fit the best so that taskflow & mistral & openstack can be the best it can be (pigeons not included).</div>
<div><br>
</div>
<div>Can we also make sure the small issues are noted somewhere (maybe in the above etherpad??). Thanks!</div>
<div><br>
</div>
<div>[1] <a href="https://wiki.openstack.org/wiki/TaskFlow#Retries">https://wiki.openstack.org/wiki/TaskFlow#Retries</a></div>
<div>[2] <a href="https://review.openstack.org/#/c/86470">https://review.openstack.org/#/c/86470</a></div>
<div>[3] <a href="https://review.openstack.org/#/q/status:open+project:openstack/taskflow,n,z">https://review.openstack.org/#/q/status:open+project:openstack/taskflow,n,z</a> </div>
<div><br>
</div>
<span>
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>Kirill Izotov <<a href="mailto:enykeev@stackstorm.com">enykeev@stackstorm.com</a>><br>
<span style="font-weight:bold">Reply-To: </span>"OpenStack Development Mailing List (not for usage questions)" <<a href="mailto:openstack-dev@lists.openstack.org">openstack-dev@lists.openstack.org</a>><br>
<span style="font-weight:bold">Date: </span>Thursday, April 10, 2014 at 9:20 PM<br>
<span style="font-weight:bold">To: </span>"<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a>" <<a href="mailto:OpenStack-dev@lists.openstack.org">OpenStack-dev@lists.openstack.org</a>><br>
<span style="font-weight:bold">Subject: </span>[openstack-dev] [mistral] [taskflow] Mistral TaskFlow integration summary<br>
</div>
<div><br>
</div><blockquote style="BORDER-LEFT: #b5c4df 5 solid; PADDING:0 0 0 5; MARGIN:0 0 0 5;">
<div>
<div>
<div>
<div>
<div>Hi everyone,</div>
<div><br>
</div>
<div>This is a summary to the prototype integration we did not too long ago: <a href="http://github.com/enykeev/mistral/pull/1">http://github.com/enykeev/mistral/pull/1</a>. Hope it would shed some light on the aspects of the integration we are struggling with.</div>
<div><br>
</div>
<div>There is a possibility to build Mistral on top of TaskFlow as a library, but in order to meet the requirements dictated by Mistral users and use cases, both Mistral and TaskFlow should change.</div>
<div><br>
</div>
<div>There are two main sides of the story. One is engine. The other is flow control capabilities. </div>
<div><br>
</div>
<div>1) THE ENGINE </div>
<div>The current TaskFlow implementation of engine doesn't fit Mistral needs because it is synchronous, it blocks the thread, it requires us to store the reference to the particular engine to be able to get its status and suspend the execution and it lacks
 long-running task compatibility. To fix this problem in a solid and maintainable way, we need to split the engine into its synchronous and asynchronous counterparts.</div>
<div><br>
</div>
<div>Lazy engine should be async and atomic, it should not have its own state, instead it should rely on some kind of global state (db or in-memory, depending on a type of application). It should have at least two methods: run and task_complete. Run method
 should calculate the first batch of tasks and schedule them for executing (either put them in queue or spawn the threads). Task_complete should mark a certain task to be completed and then schedule the next batch of tasks that became available due to resolution
 of this one.</div>
<div><br>
</div>
<div>The desired use of lazy engine in Mistral is illustrated here: <a href="https://wiki.openstack.org/wiki/Mistral/Blueprints/ActionsDesign#Big_Picture">
https://wiki.openstack.org/wiki/Mistral/Blueprints/ActionsDesign#Big_Picture</a>. It should support long running tasks and survive engine process restart without loosing the state of the running actions. So it must be passive (lazy) and persistent. </div>
<div><br>
</div>
<div>On Mistral side we are using Lazy engine by patching async.run directly to the API (or engine queue) and async.task_complete to the worker queue result channel (and the API for long running tasks). We are still sharing the same graph_analyzer, but instead
 of relying on loop and Futures, we are handling the execution ourselves in a scalable and robust way.</div>
<div><br>
</div>
<div>Then, on top of it you can build a sync engine by introducing Futures. You are using async.run() to schedule tasks by transforming them to Futures and then starting a loop, checking Futures for completion and sending their results to async.task_complete()
 which would produce even more Futures to check over. Just the same way TaskFlow do it right now.</div>
<div><br>
</div>
<div>The reason I'm proposing to extract Futures from async engine is because they won't work if we have multiple engine processes that should handle the task results concurrently (and without that there will be no scalability).</div>
<div><br>
</div>
<div>2) THE FLOW CONTROL CAPABILITIES</div>
<div><br>
</div>
<div>Since we treat TaskFlow as a library we expect them to provide us with a number of primitives to build our workflow with them. Most important of them to us for the moment are Direct Transitions, and Conditional Transitions. </div>
<div><br>
</div>
<div>The current implementation of flow transitions in TaskFlow are built on top of data flow dependencies where each task provides some data to the flow and requires some data to be present prior being executed. In other words, you are starting to build your
 flow tree from the last task through the first one by adding their requirements to the tree. All the tasks of successfully finished flow should be successfully finished too. If one of the tasks finishes with error, the whole flow will be reverted back to its
 initial state unconditionally.</div>
<div><br>
</div>
<div>At the same time, Mistral use cases require direct control on the order of the task execution, with top-to-bottom scheme where the next task will be determined based on the results of the execution of the current one. This way to successfully finish a
 flow you don't have to execute all tasks in it. Besides, the error in execution of a particular task may cause execution of another one. The workflow examples (in pseudo DSL) are here:
<a href="https://github.com/dzimine/mistral-workflows/tree/add-usecases">https://github.com/dzimine/mistral-workflows/tree/add-usecases</a></div>
<div><br>
</div>
<div>There is also a handful of small issues, but these two differences cover most basic parts of TaskFlow thus block us from integration and require substantial changes in TaskFlow engine design. Inability to make such changes will directly result in Mistral
 not being able to meet its requirements and thus rendering the whole project useless for its users.</div>
<div><br>
</div>
</div>
</div>
<div>
<div>-- </div>
<div>Kirill Izotov<br>
</div>
<div><br>
</div>
</div>
</div>
</div>
</blockquote></span></div>
</div>
</span></div></blockquote><div><br>
</div>
</div>
</div>
</blockquote></span>


</div></div></span>
                  
                  
                  
                  
                </div></blockquote><div>
                    <br>
                </div>