Kanthi, sorry for chiming in, I suggest you may have a chance to take a look at Mistral[1], which is the workflow as a service in OpenStack(or without OpenStack).
[1]: http://docs.openstack.org/developer/mistral/ On Sun, Mar 20, 2016 at 5:35 AM, pnkk <pnkk2...@gmail.com> wrote: > Filed it at https://bugs.launchpad.net/taskflow/+bug/1559496 > > Thanks, > Kanthi > > On Sat, Mar 19, 2016 at 9:30 PM, Joshua Harlow <harlo...@fastmail.com> > wrote: >> >> Interesting error, that could be a bug and perhaps we should ensure >> upgrade is more thread-safe (with a lock on upgrade); can u open a bug @ >> bugs.launchpad.net/taskflow for that and we can try to add said lock (that >> should hopefully resolve what u are seeing, although if it doesn't then the >> bug lies somewhere else). >> >> Thanks much! >> >> -Josh >> >> >> On 03/19/2016 08:45 AM, pnkk wrote: >>> >>> Hi Joshua, >>> >>> Thanks for all your inputs. >>> We are using this feature successfully. But I rarely see an issue >>> related to concurrency. >>> >>> To give you a brief, we use eventlets and every job runs in a separate >>> eventlet thread. >>> >>> In the job execution part, we use taskflow functionality and persist all >>> the details of the job. >>> >>> There we try to get the backend as below. We do upgrade everytime when a >>> job is executed. >>> >>> backend_uri = cfg.CONF.db.sqlalchemy_url >>> conf = { >>> 'connection': backend_uri, >>> } >>> self.backend = backends.fetch(conf) >>> with contextlib.closing(self.backend.get_connection()) as conn: >>> conn.upgrade() >>> >>> Now when two jobs start executing at the same time, I see below error. >>> Failed upgrading database version >>> DBAPIError: (exceptions.RuntimeError) reentrant call inside >>> <_io.BufferedReader name=14> >>> >>> We have monkey patched eventlet, is it not supposed to take care of >>> these concurrency issues? >>> >>> Below are the versions for related modules in use: >>> eventlet==0.17.4 >>> taskflow==1.26.0 >>> SQLAlchemy==1.0.9 >>> >>> Thanks, >>> Kanthi >>> >>> On Fri, Feb 12, 2016 at 1:29 PM, Joshua Harlow <harlo...@fastmail.com >>> <mailto:harlo...@fastmail.com>> wrote: >>> >>> pn kk wrote: >>> >>> Hi Joshua, >>> >>> Yes, sure will do that once I get some window out of my work. >>> >>> One last query(hopefully :) ) , can the factory method be an >>> instance >>> method of a class? >>> >>> >>> Instance methods are particularly hard to use (since they require an >>> instance of an object to be useful); so I think the check u have hit >>> is making sure that if the flow-factory is called to recreate the >>> flow that it can do so without having import issues. Currently I >>> believe it doesn't handle instance methods (due to the complexity of >>> needing an instance attached to that method). >>> >>> Perhaps what u want is to provide a function that can be found like: >>> >>> def make_flow_factory(): >>> return FlowFactory().flow_factory >>> >>> Or make flow_factory a class or static method, which should have the >>> same/similar effect. >>> >>> Hope that makes sense (more queries are fine and welcome!) >>> >>> >>> I tried giving it as "FlowFactory().flow_factory", where >>> FlowFactory is >>> my class name. It failed with below error: >>> ValueError: Flow factory <bound method FlowFactory.flow_factory >>> of >>> <__main__.FlowFactory instance at 0x2b43b48>> is not reimportable >>> by >>> name __builtin__.instance.flow_factory >>> >>> Thanks again >>> -Kanthi >>> >>> >>> On Thu, Jan 28, 2016 at 12:29 AM, Joshua Harlow >>> <harlo...@fastmail.com <mailto:harlo...@fastmail.com> >>> <mailto:harlo...@fastmail.com <mailto:harlo...@fastmail.com>>> >>> wrote: >>> >>> pn kk wrote: >>> >>> Hi, >>> >>> Thanks for the responses. Putting it in a small example >>> >>> def flow_factory(tmp): >>> return lf.Flow('resume from backend example').add( >>> TestTask(name='first', test=tmp), >>> InterruptTask(name='boom'), >>> TestTask(name='second', test="second task")) >>> >>> >>> class TestTask(task.Task): >>> def __init__(self, name, provides=None, test, >>> **kwargs): >>> self.test=test >>> super(TestTask, self).__init__(name, >>> provides, **kwargs) >>> def execute(self, *args, **kwargs): >>> print('executing %s' % self) >>> return 'ok' >>> >>> class InterruptTask(task.Task): >>> def execute(self, *args, **kwargs): >>> # DO NOT TRY THIS AT HOME >>> engine.suspend() >>> >>> I was searching for a way in which I can reload the >>> flow after crash >>> without passing the parameter "tmp" shown above >>> Looks like "load_from_factory" gives this provision. >>> >>> >>> Thanks for the example, ya, this is one such way to do this >>> that u >>> have found, there are a few other ways, but that is the >>> main one >>> that people should be using. >>> >>> >>> >>> engine = >>> >>> taskflow.engines.load_from_factory(flow_factory=flow_factory, >>> factory_kwargs={"tmp":"test_data"}, book=book, >>> backend=backend) >>> engine.run() >>> >>> Now it suspends after running interrupt task, I can now >>> reload >>> the flow >>> from the saved factory method without passing parameter >>> again. >>> for flow_detail_2 in book: >>> engine2 = >>> taskflow.engines.load_from_detail(flow_detail_2, >>> backend=backend) >>> >>> engine2.run() >>> >>> Let me know if this is ok or is there a better approach >>> to >>> achieve this? >>> >>> >>> There are a few other ways, but this one should be the >>> currently >>> recommended one. >>> >>> An idea, do u want to maybe update (submit a review to >>> update) the >>> docs, if u didn't find this very easy to figure out so that >>> others >>> can more easily figure it out. I'm sure that would be >>> appreciated by >>> all. >>> >>> >>> -Thanks >>> >>> >>> On Wed, Jan 27, 2016 at 12:03 AM, Joshua Harlow >>> <harlo...@fastmail.com <mailto:harlo...@fastmail.com> >>> <mailto:harlo...@fastmail.com <mailto:harlo...@fastmail.com>> >>> <mailto:harlo...@fastmail.com >>> <mailto:harlo...@fastmail.com> <mailto:harlo...@fastmail.com >>> <mailto:harlo...@fastmail.com>>>> >>> >>> wrote: >>> >>> Hi there, >>> >>> Michał is correct, it should be saved. >>> >>> Do u have a small example of what u are trying to >>> do >>> because that >>> will help determine if what u are doing will be >>> saved or >>> whether it >>> will not be. >>> >>> Or even possibly explaining what is being done >>> would be fine to >>> (more data/info for me to reason about what should >>> be >>> stored in your >>> case). >>> >>> Thanks, >>> >>> Josh >>> >>> >>> Michał Dulko wrote: >>> >>> On 01/26/2016 10:23 AM, pn kk wrote: >>> >>> Hi, >>> >>> I use taskflow for job management and now >>> trying to >>> persist >>> the state >>> of flows/tasks in mysql to recover incase >>> of >>> process crashes. >>> >>> I could see the state and the task results >>> stored >>> in the >>> database. >>> >>> Now I am looking for some way to store the >>> input >>> parameters >>> of the tasks. >>> >>> Please share your inputs to achieve this. >>> >>> -Thanks >>> >>> I've played with that some time ago and if I >>> recall >>> correctly input >>> parameters should be available in the flow's >>> storage, which >>> means these >>> are also saved to the DB. Take a look on >>> resume_workflows method >>> on my >>> old PoC [1] (hopefully TaskFlow haven't >>> changed much >>> since then). >>> >>> [1] >>> >>> https://review.openstack.org/#/c/152200/4/cinder/scheduler/manager.py >>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for >>> usage >>> questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage >>> questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage >>> questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> >>> <http://openstack-dev-requ...@lists.openstack.org?subject:unsubscribe> >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >>> >>> >>> >>> >>> __________________________________________________________________________ >>> OpenStack Development Mailing List (not for usage questions) >>> Unsubscribe: >>> openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >>> >> >> __________________________________________________________________________ >> OpenStack Development Mailing List (not for usage questions) >> Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > > > > __________________________________________________________________________ > OpenStack Development Mailing List (not for usage questions) > Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > -- Regards! ----------------------------------- Lingxian Kong __________________________________________________________________________ OpenStack Development Mailing List (not for usage questions) Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev