You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flume.apache.org by Juhani Connolly <ju...@cyberagent.co.jp> on 2012/06/06 08:06:03 UTC
Endless loops and lack of interrupts
I've been burrowing into the lifecycle code recently and posted
https://issues.apache.org/jira/browse/FLUME-1257 regarding it(more
specifically, regarding inability to shutdown after a component gets
stuck in a starting loop).
Right now, to put it bluntly, the shutdown model feels incorrect, there
are a lot of places with a loop waiting for changes in state, that have
an exception handler for InterruptedException, but nothing will ever
trigger that interrupt. SIGINT is handled by the shutdown hook, which
requests a clean shutdown. If a clean shutdown doesn't succeed,
everything just hangs in limbo until you forcibly kill it.
I'd like to start some kind of discussion on how to go about handling
this. One argument may be that it's just not a problem... so long as
everything starts and stops in a timely manner. Other simple kludges
would be setting a limit to number of times through each loop. Or we
could just start sending interrupts after a predetermined delay.
Another possibility is adding more lifecycle states to better
communicate state(starting/stopping?) so that actions can be aborted as
necessary. This would likely require all existing components to
communicate these new states.
Feedback/opinions would be appreciated
Re: Endless loops and lack of interrupts
Posted by Juhani Connolly <ju...@cyberagent.co.jp>.
On 06/08/2012 11:25 AM, Eric Sammer wrote:
> On Thu, Jun 7, 2012 at 7:12 PM, Juhani Connolly<
> juhani_connolly@cyberagent.co.jp> wrote:
>
>> Thanks for your input on this.
>>
>> I'm more than happy for misbehaving things to just fail, though I hope
>> that we can leave proper logs so people can know something is wrong.
>>
> Completely agree. +1.
>
>
>> Do you feel the auto restarting behaviour should still remain a part of
>> the lifecycle? I'm not entirely sure if it is something the supervisor
>> should be doing, and the majority of components that fail tend to just keep
>> failing.
>>
> I do like the idea of erlang's always restart policy way of doing things.
> The rationale is that if something is failing due to an outside resource
> (let's say the file channel due to a lack of disk space) correcting the
> external component should effect recovery of flume. In other words, if a
> disk files, I want to delete some files and let flume get back to work
> without needing to figure out if it's still within its retry period. I say
> let it go forever. Maybe we don't log at some point, but I'm inclined to
> just let it go. If users don't want the logs, they can configure log4j
> conservatively and use metrics to track the number of component failures /
> restarts (which should be exposed, IMO).
>
Ok, I'm not familiar with Erlang and its framework, but sounds good to me.
>> With these simplicity needs in mind though, the starting point that Brock
>> has attached to the JIRA looks simple and performs most of what we need.
>> I've been working on something bigger than that, but with more settings for
>> policy(configurable policy restricting number of attempts to start/stop,
>> timeouts, and forced termination). This probably isn't necessary though if
>> we decide on some "correct" behavior for components and enforce it in code
>> reviews.
>
> My general feeling is that the framework (flume, proper) should be dumb;
> restart forever or never, configurable by the user by way of a policy
> (which we don't expose today, admittedly). Sources and sinks should not
> enforce lifecycle decisions; a source should do what it's told, as should a
> sink. Weird magic numbers don't buy you much (e.g. "restart three times and
> then give up").
>
> The one thing I didn't implement from erlang in the supervisor code was
> restart policies that impact other components owned by the same supervisor.
> Ex: erlang's supervisors permit one to say "if you restart component X for
> some reason, also restart Y, Z, and A." This is nice as it allows one to
> discard state associated with a previous incarnation of the lifecycle. I
> didn't have a strong need for it, though. In fact, my gut tells me the
> *best* thing to do is go one step further than discard the instances of the
> components and use the last configuration event and builders to
> re-instantiate the components to prevent state leak after an exception that
> may have left a component in a bad state. That's more complicated though.
>
> Sorry, these are just ideas that have been rolling around that I never got
> to really put out there on the lists. I'm brain-vomitting at you. :)
These ideas sound cool, but not exactly easy to get straight away.
Hopefully I can start with something more simple and we can iterate from
there without adding more complexity than is absolutely necessary. I
plan to put in a rudimentary policy with hooks to inform it of stuff,
and we can if necessary isolate complex logic in there at a later date.
>
>> On 06/07/2012 03:32 PM, Eric Sammer wrote:
>>
>>> I can try and answer any lingering questions about the existing lifecycle
>>> management code. I knew there were outstanding issues in it (which was the
>>> impetus for that JIRA to move to Guava's service model) but I just never
>>> was able to put in the time. I'm in favor of moving to the Guava
>>> implementation.
>>>
>>> More generally, I strongly believe in well defined semantics and simple
>>> contracts. In other words, we should not get into the business of
>>> attempting to deal with byzantine failure. The idea is that the shutdown
>>> handler (in response to SIGINT) should request an orderly shutdown. If the
>>> system is in good working order, it should do so. If, for instance,
>>> something PermGen OOMs or there's incorrect behavior in a LifecycleAware
>>> component (i.e. a component that does not respect the contract), we should
>>> explicitly *not* try and handle that and a forced kill is proper. My vote
>>> is just to avoid insanely complex logic to deal with incorrectly
>>> implemented components; that always leads to insanely complicated code
>>> that
>>> doesn't always work when things are correctly implemented. Not to mention,
>>> process stop events suffer from the halting problem[1] anyway...
>>>
>>> [1] http://bit.ly/Kz5GMJ
>>>
>>> Thanks for taking this on guys. It's not sexy work, but it's super
>>> important.
>>>
>>> On Wed, Jun 6, 2012 at 8:01 PM, Juhani Connolly<
>>> juhani_connolly@cyberagent.co.**jp<ju...@cyberagent.co.jp>>
>>> wrote:
>>>
>>> The biggest barrier to this right now is with the restarting behavior our
>>>> current lifecycle model has, which is not part of the guava lifecycle. It
>>>> means if we're to restart services we need to store everything needed to
>>>> build a new service when the old one dies, and start that. In essence
>>>> we're
>>>> going to need an outer layer to watch the inner(guava layer), which sort
>>>> of
>>>> defeats the purpose.
>>>>
>>>> I'm trying to figure out if there's a way to get around this, or if
>>>> switching from a restarting model to guavas starting/running/stopping/**
>>>> **terminated
>>>>
>>>> model is possible(this would probably require some components to take
>>>> better care of themselves as once they fail they wouldn't auto-restart)
>>>>
>>>>
>>>> On 06/06/2012 05:48 PM, Hari Shreedharan wrote:
>>>>
>>>> Juhani,
>>>>> It would be interesting to see how much of an effort it would be to
>>>>> replace the current system with Guava. It would be nice to see an
>>>>> initial
>>>>> proof of concept, maybe you can post it on the dev list. I think there
>>>>> would be others would also have ideas and feel the need to update the
>>>>> Lifecycle system.
>>>>>
>>>>> Thanks
>>>>> Hari
>>>>>
>>>>>
>>>>>
>
Re: Endless loops and lack of interrupts
Posted by Eric Sammer <es...@cloudera.com>.
On Thu, Jun 7, 2012 at 7:12 PM, Juhani Connolly <
juhani_connolly@cyberagent.co.jp> wrote:
> Thanks for your input on this.
>
> I'm more than happy for misbehaving things to just fail, though I hope
> that we can leave proper logs so people can know something is wrong.
>
Completely agree. +1.
> Do you feel the auto restarting behaviour should still remain a part of
> the lifecycle? I'm not entirely sure if it is something the supervisor
> should be doing, and the majority of components that fail tend to just keep
> failing.
>
I do like the idea of erlang's always restart policy way of doing things.
The rationale is that if something is failing due to an outside resource
(let's say the file channel due to a lack of disk space) correcting the
external component should effect recovery of flume. In other words, if a
disk files, I want to delete some files and let flume get back to work
without needing to figure out if it's still within its retry period. I say
let it go forever. Maybe we don't log at some point, but I'm inclined to
just let it go. If users don't want the logs, they can configure log4j
conservatively and use metrics to track the number of component failures /
restarts (which should be exposed, IMO).
> With these simplicity needs in mind though, the starting point that Brock
> has attached to the JIRA looks simple and performs most of what we need.
> I've been working on something bigger than that, but with more settings for
> policy(configurable policy restricting number of attempts to start/stop,
> timeouts, and forced termination). This probably isn't necessary though if
> we decide on some "correct" behavior for components and enforce it in code
> reviews.
My general feeling is that the framework (flume, proper) should be dumb;
restart forever or never, configurable by the user by way of a policy
(which we don't expose today, admittedly). Sources and sinks should not
enforce lifecycle decisions; a source should do what it's told, as should a
sink. Weird magic numbers don't buy you much (e.g. "restart three times and
then give up").
The one thing I didn't implement from erlang in the supervisor code was
restart policies that impact other components owned by the same supervisor.
Ex: erlang's supervisors permit one to say "if you restart component X for
some reason, also restart Y, Z, and A." This is nice as it allows one to
discard state associated with a previous incarnation of the lifecycle. I
didn't have a strong need for it, though. In fact, my gut tells me the
*best* thing to do is go one step further than discard the instances of the
components and use the last configuration event and builders to
re-instantiate the components to prevent state leak after an exception that
may have left a component in a bad state. That's more complicated though.
Sorry, these are just ideas that have been rolling around that I never got
to really put out there on the lists. I'm brain-vomitting at you. :)
>
> On 06/07/2012 03:32 PM, Eric Sammer wrote:
>
>> I can try and answer any lingering questions about the existing lifecycle
>> management code. I knew there were outstanding issues in it (which was the
>> impetus for that JIRA to move to Guava's service model) but I just never
>> was able to put in the time. I'm in favor of moving to the Guava
>> implementation.
>>
>> More generally, I strongly believe in well defined semantics and simple
>> contracts. In other words, we should not get into the business of
>> attempting to deal with byzantine failure. The idea is that the shutdown
>> handler (in response to SIGINT) should request an orderly shutdown. If the
>> system is in good working order, it should do so. If, for instance,
>> something PermGen OOMs or there's incorrect behavior in a LifecycleAware
>> component (i.e. a component that does not respect the contract), we should
>> explicitly *not* try and handle that and a forced kill is proper. My vote
>> is just to avoid insanely complex logic to deal with incorrectly
>> implemented components; that always leads to insanely complicated code
>> that
>> doesn't always work when things are correctly implemented. Not to mention,
>> process stop events suffer from the halting problem[1] anyway...
>>
>> [1] http://bit.ly/Kz5GMJ
>>
>> Thanks for taking this on guys. It's not sexy work, but it's super
>> important.
>>
>> On Wed, Jun 6, 2012 at 8:01 PM, Juhani Connolly<
>> juhani_connolly@cyberagent.co.**jp <ju...@cyberagent.co.jp>>
>> wrote:
>>
>> The biggest barrier to this right now is with the restarting behavior our
>>> current lifecycle model has, which is not part of the guava lifecycle. It
>>> means if we're to restart services we need to store everything needed to
>>> build a new service when the old one dies, and start that. In essence
>>> we're
>>> going to need an outer layer to watch the inner(guava layer), which sort
>>> of
>>> defeats the purpose.
>>>
>>> I'm trying to figure out if there's a way to get around this, or if
>>> switching from a restarting model to guavas starting/running/stopping/**
>>> **terminated
>>>
>>> model is possible(this would probably require some components to take
>>> better care of themselves as once they fail they wouldn't auto-restart)
>>>
>>>
>>> On 06/06/2012 05:48 PM, Hari Shreedharan wrote:
>>>
>>> Juhani,
>>>>
>>>> It would be interesting to see how much of an effort it would be to
>>>> replace the current system with Guava. It would be nice to see an
>>>> initial
>>>> proof of concept, maybe you can post it on the dev list. I think there
>>>> would be others would also have ideas and feel the need to update the
>>>> Lifecycle system.
>>>>
>>>> Thanks
>>>> Hari
>>>>
>>>>
>>>>
>>
>
--
Eric Sammer
twitter: esammer
data: www.cloudera.com
Re: Endless loops and lack of interrupts
Posted by Juhani Connolly <ju...@cyberagent.co.jp>.
Thanks for your input on this.
I'm more than happy for misbehaving things to just fail, though I hope
that we can leave proper logs so people can know something is wrong.
Do you feel the auto restarting behaviour should still remain a part of
the lifecycle? I'm not entirely sure if it is something the supervisor
should be doing, and the majority of components that fail tend to just
keep failing.
With these simplicity needs in mind though, the starting point that
Brock has attached to the JIRA looks simple and performs most of what
we need. I've been working on something bigger than that, but with more
settings for policy(configurable policy restricting number of attempts
to start/stop, timeouts, and forced termination). This probably isn't
necessary though if we decide on some "correct" behavior for components
and enforce it in code reviews.
On 06/07/2012 03:32 PM, Eric Sammer wrote:
> I can try and answer any lingering questions about the existing lifecycle
> management code. I knew there were outstanding issues in it (which was the
> impetus for that JIRA to move to Guava's service model) but I just never
> was able to put in the time. I'm in favor of moving to the Guava
> implementation.
>
> More generally, I strongly believe in well defined semantics and simple
> contracts. In other words, we should not get into the business of
> attempting to deal with byzantine failure. The idea is that the shutdown
> handler (in response to SIGINT) should request an orderly shutdown. If the
> system is in good working order, it should do so. If, for instance,
> something PermGen OOMs or there's incorrect behavior in a LifecycleAware
> component (i.e. a component that does not respect the contract), we should
> explicitly *not* try and handle that and a forced kill is proper. My vote
> is just to avoid insanely complex logic to deal with incorrectly
> implemented components; that always leads to insanely complicated code that
> doesn't always work when things are correctly implemented. Not to mention,
> process stop events suffer from the halting problem[1] anyway...
>
> [1] http://bit.ly/Kz5GMJ
>
> Thanks for taking this on guys. It's not sexy work, but it's super
> important.
>
> On Wed, Jun 6, 2012 at 8:01 PM, Juhani Connolly<
> juhani_connolly@cyberagent.co.jp> wrote:
>
>> The biggest barrier to this right now is with the restarting behavior our
>> current lifecycle model has, which is not part of the guava lifecycle. It
>> means if we're to restart services we need to store everything needed to
>> build a new service when the old one dies, and start that. In essence we're
>> going to need an outer layer to watch the inner(guava layer), which sort of
>> defeats the purpose.
>>
>> I'm trying to figure out if there's a way to get around this, or if
>> switching from a restarting model to guavas starting/running/stopping/**terminated
>> model is possible(this would probably require some components to take
>> better care of themselves as once they fail they wouldn't auto-restart)
>>
>>
>> On 06/06/2012 05:48 PM, Hari Shreedharan wrote:
>>
>>> Juhani,
>>>
>>> It would be interesting to see how much of an effort it would be to
>>> replace the current system with Guava. It would be nice to see an initial
>>> proof of concept, maybe you can post it on the dev list. I think there
>>> would be others would also have ideas and feel the need to update the
>>> Lifecycle system.
>>>
>>> Thanks
>>> Hari
>>>
>>>
>
Re: Endless loops and lack of interrupts
Posted by Eric Sammer <es...@cloudera.com>.
I can try and answer any lingering questions about the existing lifecycle
management code. I knew there were outstanding issues in it (which was the
impetus for that JIRA to move to Guava's service model) but I just never
was able to put in the time. I'm in favor of moving to the Guava
implementation.
More generally, I strongly believe in well defined semantics and simple
contracts. In other words, we should not get into the business of
attempting to deal with byzantine failure. The idea is that the shutdown
handler (in response to SIGINT) should request an orderly shutdown. If the
system is in good working order, it should do so. If, for instance,
something PermGen OOMs or there's incorrect behavior in a LifecycleAware
component (i.e. a component that does not respect the contract), we should
explicitly *not* try and handle that and a forced kill is proper. My vote
is just to avoid insanely complex logic to deal with incorrectly
implemented components; that always leads to insanely complicated code that
doesn't always work when things are correctly implemented. Not to mention,
process stop events suffer from the halting problem[1] anyway...
[1] http://bit.ly/Kz5GMJ
Thanks for taking this on guys. It's not sexy work, but it's super
important.
On Wed, Jun 6, 2012 at 8:01 PM, Juhani Connolly <
juhani_connolly@cyberagent.co.jp> wrote:
> The biggest barrier to this right now is with the restarting behavior our
> current lifecycle model has, which is not part of the guava lifecycle. It
> means if we're to restart services we need to store everything needed to
> build a new service when the old one dies, and start that. In essence we're
> going to need an outer layer to watch the inner(guava layer), which sort of
> defeats the purpose.
>
> I'm trying to figure out if there's a way to get around this, or if
> switching from a restarting model to guavas starting/running/stopping/**terminated
> model is possible(this would probably require some components to take
> better care of themselves as once they fail they wouldn't auto-restart)
>
>
> On 06/06/2012 05:48 PM, Hari Shreedharan wrote:
>
>> Juhani,
>>
>> It would be interesting to see how much of an effort it would be to
>> replace the current system with Guava. It would be nice to see an initial
>> proof of concept, maybe you can post it on the dev list. I think there
>> would be others would also have ideas and feel the need to update the
>> Lifecycle system.
>>
>> Thanks
>> Hari
>>
>>
>
--
Eric Sammer
twitter: esammer
data: www.cloudera.com
Re: Endless loops and lack of interrupts
Posted by Juhani Connolly <ju...@cyberagent.co.jp>.
The biggest barrier to this right now is with the restarting behavior
our current lifecycle model has, which is not part of the guava
lifecycle. It means if we're to restart services we need to store
everything needed to build a new service when the old one dies, and
start that. In essence we're going to need an outer layer to watch the
inner(guava layer), which sort of defeats the purpose.
I'm trying to figure out if there's a way to get around this, or if
switching from a restarting model to guavas
starting/running/stopping/terminated model is possible(this would
probably require some components to take better care of themselves as
once they fail they wouldn't auto-restart)
On 06/06/2012 05:48 PM, Hari Shreedharan wrote:
> Juhani,
>
> It would be interesting to see how much of an effort it would be to replace the current system with Guava. It would be nice to see an initial proof of concept, maybe you can post it on the dev list. I think there would be others would also have ideas and feel the need to update the Lifecycle system.
>
> Thanks
> Hari
>
Re: Endless loops and lack of interrupts
Posted by Hari Shreedharan <hs...@cloudera.com>.
Juhani,
It would be interesting to see how much of an effort it would be to replace the current system with Guava. It would be nice to see an initial proof of concept, maybe you can post it on the dev list. I think there would be others would also have ideas and feel the need to update the Lifecycle system.
Thanks
Hari
--
Hari Shreedharan
On Wednesday, June 6, 2012 at 1:41 AM, Juhani Connolly wrote:
> I too am willing to work on this, and have a bit of time available at
> the moment. I'm going to fiddle about with a bit and see if I can get
> some proof of concept to post to the issue. Please don't let that stop
> you from doing the same if you're interested, as it would be good to
> spark some discussion.
>
> On 06/06/2012 03:26 PM, Hari Shreedharan wrote:
> > I believe the long term plan was to move to Guava, as Jarcec pointed out. This is probably better than trying to fix and improve the current lifecycle management system. As it is, there are a bunch of issues with our current system, which have noticed and fixed. I am not quite satisfied with the fixes we have made though, most are tacky and break-fix.
> >
> > Also, none of our components really check for interrupts and many(most?) don'g have clean shutdown semantics. Maybe this should be discussed and we should come up with a detailed analysis of the situation. I am willing to look at the migration to Guava if no one else has already looked at it or is looking into it.
> >
> > Thanks
> > Hari
> >
>
>
>
Re: Endless loops and lack of interrupts
Posted by Juhani Connolly <ju...@cyberagent.co.jp>.
I too am willing to work on this, and have a bit of time available at
the moment. I'm going to fiddle about with a bit and see if I can get
some proof of concept to post to the issue. Please don't let that stop
you from doing the same if you're interested, as it would be good to
spark some discussion.
On 06/06/2012 03:26 PM, Hari Shreedharan wrote:
> I believe the long term plan was to move to Guava, as Jarcec pointed out. This is probably better than trying to fix and improve the current lifecycle management system. As it is, there are a bunch of issues with our current system, which have noticed and fixed. I am not quite satisfied with the fixes we have made though, most are tacky and break-fix.
>
> Also, none of our components really check for interrupts and many(most?) don'g have clean shutdown semantics. Maybe this should be discussed and we should come up with a detailed analysis of the situation. I am willing to look at the migration to Guava if no one else has already looked at it or is looking into it.
>
> Thanks
> Hari
>
Re: Endless loops and lack of interrupts
Posted by Juhani Connolly <ju...@cyberagent.co.jp>.
I missed the Guava ticket, I'll go have a look at it and link it from
the new issue I had posted.
And yes, it may well be better to just move across. Sounds like a pretty
epic patch though.
A discussion of shutdown semantics in general would be good. The whole
startup/shutdown system is sorely lacking in documenting intended usage
patterns. There should definitely be some kind of method to the madness
as far as components failing to start is concerned.
On 06/06/2012 03:26 PM, Hari Shreedharan wrote:
> I believe the long term plan was to move to Guava, as Jarcec pointed out. This is probably better than trying to fix and improve the current lifecycle management system. As it is, there are a bunch of issues with our current system, which have noticed and fixed. I am not quite satisfied with the fixes we have made though, most are tacky and break-fix.
>
> Also, none of our components really check for interrupts and many(most?) don'g have clean shutdown semantics. Maybe this should be discussed and we should come up with a detailed analysis of the situation. I am willing to look at the migration to Guava if no one else has already looked at it or is looking into it.
>
> Thanks
> Hari
>
Re: Endless loops and lack of interrupts
Posted by Hari Shreedharan <hs...@cloudera.com>.
I believe the long term plan was to move to Guava, as Jarcec pointed out. This is probably better than trying to fix and improve the current lifecycle management system. As it is, there are a bunch of issues with our current system, which have noticed and fixed. I am not quite satisfied with the fixes we have made though, most are tacky and break-fix.
Also, none of our components really check for interrupts and many(most?) don'g have clean shutdown semantics. Maybe this should be discussed and we should come up with a detailed analysis of the situation. I am willing to look at the migration to Guava if no one else has already looked at it or is looking into it.
Thanks
Hari
--
Hari Shreedharan
On Tuesday, June 5, 2012 at 11:13 PM, Jarek Jarcec Cecho wrote:
> Just a quick question to the idea of adding more lifecycle states - are we still planning to move from our "homemade" lifecycle management to Guava as is describe in FLUME-966?
>
> Jarcec
>
> On Jun 6, 2012, at 8:06 AM, Juhani Connolly wrote:
>
> > I've been burrowing into the lifecycle code recently and posted https://issues.apache.org/jira/browse/FLUME-1257 regarding it(more specifically, regarding inability to shutdown after a component gets stuck in a starting loop).
> >
> > Right now, to put it bluntly, the shutdown model feels incorrect, there are a lot of places with a loop waiting for changes in state, that have an exception handler for InterruptedException, but nothing will ever trigger that interrupt. SIGINT is handled by the shutdown hook, which requests a clean shutdown. If a clean shutdown doesn't succeed, everything just hangs in limbo until you forcibly kill it.
> >
> > I'd like to start some kind of discussion on how to go about handling this. One argument may be that it's just not a problem... so long as everything starts and stops in a timely manner. Other simple kludges would be setting a limit to number of times through each loop. Or we could just start sending interrupts after a predetermined delay.
> >
> > Another possibility is adding more lifecycle states to better communicate state(starting/stopping?) so that actions can be aborted as necessary. This would likely require all existing components to communicate these new states.
> >
> > Feedback/opinions would be appreciated
Re: Endless loops and lack of interrupts
Posted by Jarek Jarcec Cecho <ja...@apache.org>.
Just a quick question to the idea of adding more lifecycle states - are we still planning to move from our "homemade" lifecycle management to Guava as is describe in FLUME-966?
Jarcec
On Jun 6, 2012, at 8:06 AM, Juhani Connolly wrote:
> I've been burrowing into the lifecycle code recently and posted https://issues.apache.org/jira/browse/FLUME-1257 regarding it(more specifically, regarding inability to shutdown after a component gets stuck in a starting loop).
>
> Right now, to put it bluntly, the shutdown model feels incorrect, there are a lot of places with a loop waiting for changes in state, that have an exception handler for InterruptedException, but nothing will ever trigger that interrupt. SIGINT is handled by the shutdown hook, which requests a clean shutdown. If a clean shutdown doesn't succeed, everything just hangs in limbo until you forcibly kill it.
>
> I'd like to start some kind of discussion on how to go about handling this. One argument may be that it's just not a problem... so long as everything starts and stops in a timely manner. Other simple kludges would be setting a limit to number of times through each loop. Or we could just start sending interrupts after a predetermined delay.
>
> Another possibility is adding more lifecycle states to better communicate state(starting/stopping?) so that actions can be aborted as necessary. This would likely require all existing components to communicate these new states.
>
> Feedback/opinions would be appreciated