Upstart 1.0 Design discussion
Casey Dahlin
cdahlin at redhat.com
Sat Sep 12 23:59:23 BST 2009
On 09/11/2009 10:13 PM, Scott James Remnant wrote:
> On Fri, 2009-09-11 at 17:03 -0400, Casey Dahlin wrote:
>
>> I've had some suggestions for the Upstart 1.0 design which came up
>> when I spoke to Scott on IRC the other day. I would like to post them
>> here, but for continuity's sake, I figured I'd simply post the 1.0
>> design as Scott described it (and I understood it), and then work from
>> there.
>>
> I'll try and describe things in my own words, since the behaviour is
> about right but not how I think that it'll work under the hood.
>
It was a lot clearer this time :)
>
> Upstart will have, as it has now, a primary first-class object that it
> tracks. I tend towards dislike calling these "states" since these
> things themselves have states; Casey suggested "conditions" but that has
> implications I don't like.
>
> Upstart internally calls them jobs. Let's just call them that, because
> I doubt that the code will ever call them anything but ;-)
>
meh. 2 minutes with sed if we ever find a word we like :).
> Jobs can represent conditions, they can represent states, they can
> represent services and they can represent tasks. They may have attached
> processes, but they also may not.
>
> (If we use "services" and "tasks" to only ever refer
> to jobs with attached processes, then I think it's
> not confusing.)
>
>
> Jobs have two principal properties: their state, and their goal. But I
> think that this is an implementation detail. From a theoretical
> standpoint, we should instead say that Jobs have two Levels.
>
> Transition between these levels is not necessarily instantaneous, Jobs
> may be in transition from the ground state to the active state. Here's
> a picture.
>
>
> ________ started
> / \
> / \
> ________/ | | \________ stopped
> | |
> starting stopping
>
>
> I strongly dislike these terms. I actually spent almost a day this week
> tracking down a bug in Ubuntu's upstart-native boot caused by using
> "start on starting udev" when I meant "start on started udev".
>
You use the term "levels." That term draws from electrical engineering,
when talking about logic graphs (that look a lot like the line you drew
above :). From there we'd get the terms "high," "low," "rising," and
"falling." That's a bit too vocabulary-intensive for your style I think
but its a start :) If we wanted to improve iteratively from there I'd
probably recommend "up" and "down" rather than "high" and "low." These
are general enough to work for non-jobs, but their roots are more in
sysadmin-land than academia, which is good for our userbase.
> It's also worth pointing out that in practice, these labels should be at
> the transition points and not apply to the transitions as a whole. But
> meh, theory vs. implementation.
>
[Snip]
>
>
> This is all well and good for automatic jobs, but we also want jobs that
> still respond to good old "events". "while" ensures an instance exists,
> but if the job uses an "on" stanza that instance is not automatically
> started.
>
> on some-event
>
> You can use multiple "on" stanzas, any one will start that instance.
>
>
> What are these events? Well, it's still useful to be able to do this
> based on the state transitions of other jobs. Take a "postgresql backup
> script" as an example:
>
> while filesystem
> on postgresql post-stop
>
> This shows how the "while" and "on" are distinct. We want this to be
> stopped should the filesystem go away, but don't want any stopping to
> happen based on the state of postgresql - just starting.
>
>
> I forsee being able to nest any level of sub-jobs like this; for
> example:
>
> samba nmbd post-stop
>
>
> This assumes that events are generated by the state transitions in jobs,
> and are named exactly for them and carry the same environment. I think
> that's perfect.
>
> I also think we still need stand-alone events for things like
> "control-alt-delete" and "reboot", etc.
>
>
> Scott
>
This comes off much less radical sounding than it did on IRC :)
I'll save my follow-up for LPC. It may take some intense explanation.
The crux of it is that we might be able to implement a few more stanzas
that don't outwardly make sense, and, with the addition of being able to
#include other files within job definitions, be able to eliminate large
quantities of upstart's code in favor of a job state machine described
in job definition syntax. Freaky huh?
--CJD
More information about the upstart-devel
mailing list