Could you expand a bit on the “number of issues” that remain if it’s functionally complete? Is there a published list of things that need to be in place for something to be mainlined, in general, or are these issues only for Rxk5?

Marcus has pointed out that you were asking a more general question, and it occurred to me that, whilst I've talked about these issues at both the Stanford and Rome Workshops, there are folks who won't have been to either. So, here's a rough summary of what I think the process of getting code upstream is. Bear in mind that I'm very much a single voice here, and what I say has no more weight they anyone else - but I've said this lot a few times now without getting shouted down...

Firstly, any changes to the protocol have to go past the afs3- standardisation list. This effectively means anything on the wire, but may also extend to (for example) the pioctl interfaces when there are multiple implementations of these. Proposals should be presented in the form of an internet draft. We're still coming up to speed on how these get dealt with - at present, the level of comment generally depends on the scale of the change. If the proposal is for a minor tweak to a debugging interface, it's likely to get through easily. If it's a wholescale change to a fundamental bit of AFS, then things will take longer, and probably involve actively soliciting responses.

Secondly, any major changes should be discussed before they're implemented. The openafs-devel list is the best place to do this. It is of course up to an author what to do with the feedback they receive. My general advice would be to listen carefully if there are suggestions that the fundamental approach is wrong, but to be cautious of demands for feature creep. One key point is that the people commenting now are the people who'll be reviewing the finished code. If nobody agrees that an approach is the best solution now, finding reviewers when it comes to getting it into the tree is likelyto be difficult. It's at this point that it'll also be possible to get an idea of when merge windows are available for this kind of change. Typically, large scale changes won't be accepted, even into the development branch, around branch points for stable releases.

Thirdly, code gets written, with steps one and two repeating as required. If it's a large project, please keep the community informed, especially if you are significantly changing previously discussed designs. When coding, bear in mind that the tree has a documented coding style, which should be followed as far as possible. Try and keep your code as small modular chunks. Consider, as you write it, how it would make sense to split it for an upstream contribution. If your code requires interface changes, then split off these changes, and make them separate commits. Avoid bundling unrelated changes in with your core work - if you need to fix bugs in existing code, then make those changes as separate patches, and contribute them as you work. Cutting down the size of you main code drop will make the final integration steps much much easier.

At the end of all of this, there will be a collection of code to contribute as a set of patches. The rough guidance here is that there should be one patch per change, and one change per patch - but good judgement is necessary as 10,000 individual 10 line patches are no more manageable than a single 100,000 line patch.

The key thing to consider when splitting code into patches is that the people who review them are volunteering their time to do so - there's no commitment upon them to spend time evaluating any code, so contributors should make it as easy for them as possible. This is one reason why breaking large changes up makes life easier - it's a lot easier for reviewers to find spare hours here and there, than it is to contemplate looking at something that's obviously going to take days to get through. Also, a set of sensibly created patches is far easier to review, and to test, than a single monolithic change. Providing reviewers with a guide to the code is hugely helpful - either through commit comments, in-tree design documentation, or a separate document.

Contributors should expect that their code won't be accepted first time round. There are likely to be nits picked up by the review process, although the more communication that's occurred at the beginning, the less significant those nits are likely to be.

The final issue I'd like to address is that of _when_ code should make its way into the development branches. Maintaining code out of tree is hard - keeping it up to date is a pain - and people will often break code that's not in the tree (or even that is in the tree, but on a different branch) simply because they don't realise its there, or don't test against it. This leads to a general desire by contributors to get code in as quicky as possible. However, there is a flip side. There are a lot of developers working off the main branch, and committing code that breaks the tree or the build is a bad thing. Once code has gone in, the longer it remains in the tree, the harder it becomes to remove it. This is a real problem when a new 'stable' branch is required - if the development branch is broken, how do you create the new stable branch. This is exactly the state of affairs that demand attach left us in - with a development branch that was too broken to even consider creating a 1.6 from, but with a set of changes that it would be hugely timeconsuming to unpick from the rest of the code. There is, of course, the question of branching earlier - you have 'stable', 'development' and 'very bleeding edge'. But this just shifts the problem slightly sideways. Additionally, each new branch creates significantly more work for everyone - as patches need to be created, tested, and committed against each new branch.

So, I think the best answer is 'when its ready' and 'not near proposed branch points'. Lots of projects have clearer answers to these particular questions - for example, Linux has its merge windows, and Mozilla has code freezes around releases, where no feature commits are permitted. I'd argue that OpenAFS probably wants to adopt something along these lines too, along with a clearer set of data driven targets for stable release. But that's an argument for another email.

I should round off by saying that absolutely none of this is specific to OpenAFS - they're all just part of a functioning Open Source eco system. If you're interested, I'd highly recommend reading:

How to Participate in the Linux Community (A Guide to the Kernel Development Process)
http://ldn.linuxfoundation.org/how-participate-linux-community

Mozilla Hacker's Getting Started Guide
https://developer.mozilla.org/en/Mozilla_Hacker's_Getting_Started_Guide

or any other big projects' developer guidelines - we're all struggling with the same problems!

Hope that helps,

Simon.

_______________________________________________
OpenAFS-info mailing list
[email protected]
https://lists.openafs.org/mailman/listinfo/openafs-info

Reply via email to