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