[openstack-dev] [TaskFlow] TaskFlow persistence

pnkk pnkk2016 at gmail.com
Sat Mar 19 16:35:49 UTC 2016


Filed it at https://bugs.launchpad.net/taskflow/+bug/1559496

Thanks,
Kanthi

On Sat, Mar 19, 2016 at 9:30 PM, Joshua Harlow <harlowja at 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 <harlowja at fastmail.com
>> <mailto:harlowja at 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
>>         <harlowja at fastmail.com <mailto:harlowja at fastmail.com>
>>         <mailto:harlowja at fastmail.com <mailto:harlowja at 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
>>                  <harlowja at fastmail.com <mailto:harlowja at fastmail.com>
>>         <mailto:harlowja at fastmail.com <mailto:harlowja at fastmail.com>>
>>                  <mailto:harlowja at fastmail.com
>>         <mailto:harlowja at fastmail.com> <mailto:harlowja at fastmail.com
>>         <mailto:harlowja at 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-request at lists.openstack.org?subject:unsubscribe
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@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-request at lists.openstack.org?subject:unsubscribe
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@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-request at lists.openstack.org?subject:unsubscribe
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@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-request at lists.openstack.org?subject:unsubscribe
>>         <
>> http://OpenStack-dev-request@lists.openstack.org?subject:unsubscribe>
>>
>>         <
>> http://OpenStack-dev-request@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-request at lists.openstack.org?subject:unsubscribe
>>         <
>> http://OpenStack-dev-request@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-request at lists.openstack.org?subject:unsubscribe
>>     <http://OpenStack-dev-request@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-request at 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-request at lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20160319/e3d58127/attachment.html>


More information about the OpenStack-dev mailing list