← Back to team overview

openstack team mailing list archive

Re: Nova subsystem branches and feature branches

 

Apologies for top posting.  Just wanted to say +1

This all makes sense to me.

Vish

On May 3, 2012, at 4:08 AM, Mark McLoughlin wrote:

> Hey,
> 
> We discussed this during the "baking area for features" design summit
> session. I found that discussion fairly frustrating because there were
> so many of us involved and we all were either wanting to discuss
> slightly different things or had a slightly different understanding of
> what we were discussing. So, here's my attempt to put some more
> structure on the discussion.
> 
> tl;dr - subsystem branches are managed by trusted domain experts and
> feature branches are just temporary rebasing branches on personal github
> forks. We've got a tonne of work to do figuring out how this would all
> work. We should probably pick a single subsystem and start with that.
> 
> ...
> 
> Firstly, problem definition:
> 
>  - Nova is big, complex and has a fairly massive rate of churn. While 
>    the nova-core team is big, there isn't enough careful review going 
>    on by experts in particular areas and there's a consistently large
>    backlog of reviews.
> 
>  - Developers working on features are very keen to have their work 
>    land somewhere and this leads to half-finished features being 
>    merged onto master rather than developers collaborating to get a 
>    feature to a level of completeness and polish before merging into 
>    master.
> 
> Some assumptions about the solution:
> 
>  - There should be a small number of domain experts who can approve 
>    changes to each of major subsystems. This will encourage 
>    specialization and give more clear lines of responsibility.
> 
>  - There should be a small number of project dictators who have final 
>    approval on merge proposals, but who are not expected to review 
>    every patch in great detail. This is good because we need someone 
>    with an overall view of the project who can make sure efforts in 
>    the various subsystems are coordinated, without that someone being 
>    massively overloaded.
> 
>  - New features should be developed on a branch and brought to a level 
>    of completeness before being merged into master. This is good 
>    because we don't want half-baked stuff in master but also because 
>    it encourages developers to break their features into stages where 
>    each stage of the work can be brought to completion and merged 
>    before moving on to the next stage.
> 
>  - In essence, we're assuming some variation of the kernel distributed 
>    development model.
> 
>    (FWIW, my instinct is to avoid the kernel model on projects. Mostly 
>    because it's extremely complex and massive overkill for most 
>    projects. Looking at the kernel history with gitk is enough to send 
>    anyone screaming for the hills. However, Nova seems to be big 
>    enough that we're experiencing the same pressures that drove the 
>    kernel to adopt their model)
> 
> Ok, what are "subsystem branches" and how would they work?
> 
>  - Subsystem branches would have a small number of maintainers who can 
>    approve a change. These would be domain experts providing strong 
>    oversight over a particular area.
> 
>    (In gerrit, this is a branch with a small team or single person who 
>    can +1 approve a review)
> 
>  - Project dictators don't need to do detailed reviews of merge 
>    proposals from subsystem maintainers. The dictator's role is mostly 
>    just to sign off on the merge proposal. However, the dictator can 
>    comment in the proposal on things which could have been done better 
>    and the subsystem maintainer should take note of these comments and 
>    perhaps retroactively fix them up. Ultimately, though, the dictator 
>    can have exercise a veto if the merge proposal is unacceptable or 
>    if the subsystem maintainer is consistently making the same 
>    mistakes.
> 
>  - It would be up to the project dictators to help drive patches 
>    through the right subsystem branches - e.g. they might object if 
>    one subsystem maintainer merged a patch that inappropriately cut 
>    into another subsystem or they might refuse to merge a given patch
>    into the main branch unless it went through the appropriate 
>    subsystem branch.
> 
>    (In gerrit, this would mean a small team or single person who can 
>    +1 approve merge proposals on master. They would -1 proposals
>    submitted against master which should have been submitted against a 
>    subsystem branch.)
> 
>  - Subsystem branches might not necessarily be blessed centrally. It 
>    might be a case that anyone can create such a branch and, over 
>    time, establish trust with the project dictators. Subsystem 
>    branches would come and go. This is the mechanism by which 
>    subsystem maintainership is transferred between people over time.
> 
>    (In gerrit, this means people need to easily be able to create 
>    their own branches)
> 
>    (What's more difficult to imagine in gerrit is how a new, potential 
>    subsystem maintainer comes along, starts hoovering up patches into 
>    her branch and submitting them in batches. Where does she hoover 
>    them up from and how does she say "I've merged this into my branch, 
>    don't merge it via another branch")
> 
>  - Bisectability remains important. Subsystem maintainers don't merge 
>    broken commits into their subsystem branch and the project 
>    dictators can enforce this using their veto. It is not good enough 
>    for subsystem maintainers to consistently merge broken commits into 
>    their branch, fix it up with a later commit and include both 
>    commits their merge proposals.
> 
>    (I don't think we'd use Jenkins to enforce this, but subsystem 
>    maintainers might use it as a tool to help them catch issues. So, 
>    the full set of gating tests would only gate merges into master but 
>    subsystem branches might choose to gate merges into their branch on 
>    the unit tests. Subsystem maintainers might also use Smokestack to 
>    pre-gate merge proposals to the subsystem branch)
> 
>  - Subsystem branches would not rebase unless the project dictator 
>    outright rejects a merge request from the subsystem branch (i.e.
>    "I'm not merging commit abcdef0! Fix it and rebase!"). This means 
>    the subsystem maintainer will need to regularly (probably only when 
>    there are conflicts to be dealt with) merge master back into the
>    subsystem branch.
> 
>  - Plausible subsystem branches are e.g.:
> 
>      - OpenStack APIs
>      - EC2 API
>      - virt
>         - libvirt driver
>         - xenapi driver
>         - vmware driver
>      - networking
>      - volumes
>      - scheduler
>      - RPC
> 
>    Deciding which areas make sense as a subsystem branch is 
>    non-trivial.
> 
>    Should there be a "DB" subsystem? Probably not, because that would 
>    mean every new feature needs to come through this branch or, 
>    alternatively, the DB maintainer would need to accept DB schema 
>    additions without the context of how it's being used higher up the 
>    stack.
> 
>    Ok, so why does it make sense to have an "OpenStack APIs" 
>    subsystem? Don't all features affect that branch too? Well, maybe, 
>    but the APIs really do need strong oversight. Perhaps we can be 
>    confident that we can add e.g. a new scheduler feature through the
>    scheduler branch and then later merge any API additions through the 
>    APIs branch.
> 
> And how about feature branches?
> 
>  - Feature branches are relatively short-lived (i.e. weeks or months
>    rather than years) branches for a specific feature. They are a
>    mechanism for developers to work on a patch series in the open until
>    the feature is complete enough to be merged into a subsystem branch
>    or master.
> 
>    (I'm not sure gerrit is right for this. Why not just do it in 
>    folk's github forks? I think all people are looking for is for 
>    people to be more aware of feature branches. How about if you put 
>    details of your feature branch in the blueprint for the feature?)
> 
>    (If not using gerrit, can developers configure Jenkins to CI their 
>    branch? Or is Smokestack the right tool?)
> 
>  - Feature branches rebase, do not contain merge commits and each 
>    commit on the branch is functional, bisectable and self-contained.
> 
>  - When a feature branch is ready to be merged into a subsystem 
>    branch, the patch series is submitted for review. The subsystem 
>    maintainer will likely require changes to individual patches and 
>    these changes would be made on the feature branch and squashed back 
>    into the appropriate individual patch.
> 
>    (Ideally gerrit's "topic review" feature will get upstream and 
>    we'll use that. This would mean that a patch series could be 
>    proposed for review as a single logical unit while still keeping 
>    individual patches as separate commits)
> 
>  - Because feature branches rebase, active day-to-day collaboration
>    with others is difficult. You certainly can't have multiple people
>    rebasing the same branch, that way lies madness.
> 
>    There are ways to have multiple people work actively on the same 
>    rebasing branch e.g.
> 
>      http://blogs.gnome.org/markmc/2011/02/26/git-rebasing-cont/
> 
>    but, ultimately, feature branches are going to be owned by a single 
>    person who might incorporate patches from others.
> 
>    (Incorporating the work of others, rebasing and squashing means a 
>    patch might have multiple contributors but only one author listed in
>    git. That makes CLA enforcement impossible, but we should drop the 
>    CLA in favour of the kernel-like Signed-off-by: tag. See this 
>    discussion: https://lists.launchpad.net/openstack/msg06544.html )
> 
>  - One option for longer-lived, active collaboration is for a subsystem
>    maintainer to create a feature branch and review the work as it is 
>    ongoing. The idea being that the subsystem maintainer commits to 
>    not requiring the feature branch to be rebased before it is merged 
>    into the subsystem branch.
> 
> Cheers,
> Mark.
> 



Follow ups

References