[PATCH] implement futimes

Rob Landley rob at landley.net
Mon Nov 23 10:12:29 UTC 2009


On Sunday 22 November 2009 21:19:47 Austin Foxley wrote:
> On 11/22/2009 02:21 PM, Rob Landley wrote:
> > Instead, like the proverbial cutting wedge whose edge splits into two
> > points, foreward progress goes to zero.
>
> As a relative newcomer to this project, thanks for the history lesson.

Computer history's a hobby of mine even for projects I _haven't_ been 
following for a decade...

And thanks for your work on the Sparc target.  (I need to get back to testing 
that, it's just wandered a half-dozen items down on my todo list.  Possibly 
todo stack?)

> First step towards sanity: Let me commit the nptl_merge branch to
> master. If you haven't looked at it, I've got all the relevant changes
> for nptl grouped into related commits, and it's up to date with master
> as of today.

Yay!

When this is available as a patch series, I'd love to read it.  (But don't let 
that stop it from going _in_.  It can always be reviewed after the fact.  
We've got the complete history, getting it in will mean there's exactly one 
tree we expect people to _test_.  Splitting your tester base is disastrous, 
splitting what you expect people to test makes the effectiveness of the test 
effort go down exponentially.  There've been studies on this, it's one of them 
network effects things...)

> Second step: I'm fairly sure Bernhard is planning to release a 0.9.30.2
> soon. There are a lot of important fixes that have already made it in to
> that.

I'm all for bugfix-only releases, but they're mostly orthogonal to development 
stabilization releases.

I say "mostly" because without bugfix-only releases you have the "no release is 
ever stable" problem the Linux kernel had for the longest time.  They're 
important because they take patch pressure off the -dev branch, and ironically 
allow it to cycle faster.

--- You can stop reading here (the rest is all history and release management 
theory).

The current Linux "stable series" four level dot-release stuff started in March 
2005, with Linus proposing an even/odd numbering scheme that was just totally 
unworkable:

  http://lkml.indiana.edu/hypermail/linux/kernel/0503.0/0512.html

And then an ENORMOUS thread ensued (which is well worth reading, if you have a 
spare weekend).

Eventually, Linus proposed something workable:

  http://lkml.indiana.edu/hypermail/linux/kernel/0503.0/0910.html

And he got a volunteer:

  http://lkml.indiana.edu/hypermail/linux/kernel/0503.0/0918.html

Luckily, back then kernel-traffic was still in operation and did a _heroic_ job 
summarizing the thread.  Here is why the kernel guys did what they did:

  http://kerneltraffic.osmirror.nl/kernel-traffic/kt20050403_303.html#2

And some follow up:

  http://kerneltraffic.osmirror.nl/kernel-traffic/kt20050402_302.html#8
  http://kerneltraffic.osmirror.nl/kernel-traffic/kt20050402_302.html#11
  http://lkml.indiana.edu/hypermail/linux/kernel/0512.0/0634.html
  http://kerneltraffic.osmirror.nl/kernel-traffic/kt20050403_303.html#9
  http://kerneltraffic.osmirror.nl/kernel-traffic/kt20050612_315.html#5

One little subtlety: people who are fiddling with older versions and want to 
backport fixes actually need one _more_ bugfix release than you'd think, because 
bugs fixed between the last dot-release and the new -dev stabilization were 
getting dropped on the floor.  There was a hole in the kernel -stable series 
for the first few months, which got closed here:
  http://lkml.indiana.edu/hypermail/linux/kernel/0512.0/1327.html

It occurs to me that I've learned a huge amount about release management over 
the years from reading this kind of stuff... and it's probably never been 
written up coherently anywhere.  The open source community's just _evolved_ a 
set of best practices which you pick up via osmosis.

For example, the actual effect of distributed source control on open source 
development is to make short-lived branches cheaper, by allowing patch series 
to be automatically migrated from tree to tree in large batches and in an 
arbitrary order, rather than one at a time in a specific order.  This means you 
can let your local tree diverge for a short development cycle and then flush 
the whole mess back into the original tree fairly easily, without worrying 
about non-structural conflicts with whatever _else_ they've done to the tree in 
the meantime.  (It sets up a sort of funky quantum entanglement between the 
two that allows patches to jump back and forth easily.)

This allows better delegation, and _nested_ delegation (ala the Linux kernel's 
"one architect, a dozen lieutenants, hundreds of maintainers, thousands of 
developers" setup, where each level owes the previous one a response and thus 
patches don't get dropped on the floor), which means development can scale to 
larger numbers of developers allowing larger project sizes.

Alas, if two trees don't start from a common base and then take care to 
maintain the correspondence, it fades with time.  Thus a three year fork ain't 
something porting your svn to git is going to fix.  It helps prevent you from 
getting _into_ the unmergeable mess situation, not cleaning up once you're 
there...

How that interacts with bugfix-only releases, and time based releases, and 
"feature freeze" vs "merge window" approaches, and the whole "oral tradition" 
aspect of development communities (you have to scale your development 
community with your code size, which is why big corporate releases of existing 
code bases tend to land with a "splat"...)

Darn it, I need to write documentation again.  Yet another todo item.  DO NOT 
HAVE TIME RIGHT NOW...

Anyway, yay having a bugfix release, but that doesn't stop -dev from becoming 
irrelevant.  It just means people do new development against your -stable 
series and then try to get patches merged into the one they _use_.  Bugfix 
release series that _aren't_ extremely short-lived and ruthless about _not_ 
accepting new features wind up turning into forks.

The reason the Linux kernel changed its development model in 2.6 was because 
of the failed IDE rewrite in 2.5, which had to be reverted:

  http://lwn.net/Articles/7789/

Basically, for about a _year_ the IDE subsystem was completely unstable in 
2.5, so nobody who had IDE drives (about 90% of the developer base) could run 
those kernels, so everyody who had to do any _other_ development did it 
against 2.4.  Remember Dave Jones' full time job porting 2.4 code to 2.5?  Tip 
of the iceberg, most of the patches were never even merged into 2.4.  There 
was an epidemic of out-of-tree code.  Here's a list of a few I collected 
during the cleanup phase: http://lwn.net/Articles/14188/

Thus 2.5 development stalled horribly, and a huge amount of unmerged code 
built up as unmerged out-of-tree patches against _2.4_ (not 2.5), and Alan Cox 
merged most of it in his -ac tree which became the de-facto standard tree (to 
the point Red Hat based their kernels on the -ac tree, not Linus's), and Linus 
got overwhelmed and instituted the Lieutenant system without _telling_ 
anybody, and by the time I brought it to a head with the Patch Penguin 
Proposal Alan Cox realized he was on the verge of rendering Linus 
"irrelevant", and he didn't want to do that (considering Linus the better 
_architect_, patch flow and integration issues and the IDE cul-de-sac aside), 
Alan ended the -ac tree and took a year off to get an MBA to force everybody to 
go back to Linus and fix the problems with the development series.

So once they switched to distributed source control, cleaned up the mess, and 
got 2.6 out, Linus Torvalds basically went "never again" and switched the 
kernel development model to what we have today.

So if you think uClibc's got development problems, the Linux kernel 
development process has nearly melted down on something like three separate 
occasions.  (The previous one was circa the 2.0 release when Linus almost had 
a nervous breakdown and Maddog forced him to delegate to maintainers in the 
first place; before my time really.)  They keep needing to _invent_ new ways to 
make open source development scale, and then everybody else copies them 
because they've gotten darn good at it over the years....

What they learned from 2.5 is that most people don't test stuff they can't use, 
and nobody's going to sit on a patch for a year while you get your act 
together.  They're going to develop against what they're _using_, and 
generally that's the stable tree.  So if your "development branch" diverges 
too far from the stable tree, most developers they won't bother to port it to 
something they can't use that's just going to change out from under them and 
break it again anyway.  Instead they'll maintain it against the stable branch 
(which doesn't change so much), and even push to get it merged into -stable 
and ignore your development branch entirely...

Until your -dev branch has a feature freeze in preparation of becoming the 
next -stable branch.  As soon as you announce a feature freeze, everybody will 
rush to forward-port their patches and you'll get a flood of new feature 
submissions right before deadline, meaning attempts to stabilize the tree wind 
up _destabilizing_ it.  Notice the above link to the "crunch time" series was 
in October 2002, but 2.6.0 didn't come out for over a year after that.  At the 
time I referred to this as the freeze/thaw/slush/slurpee cycle...

  http://lkml.indiana.edu/hypermail/linux/kernel/0207.0/0391.html

And of course nobody's going to accept "you missed the deadline" if it's going 
to be a year or more until the next release, now that they've got the patch 
ported to -dev they don't want to maintain it out of tree through a whole 
'nother development cycle and forward port it again.  No, they want it to go 
in during the -stable series, rendering the idea of "stable" kind of silly....

Time based releases avoid going there.  It means "it's ok to miss this 
release, there'll be another one in 3 months".  It's not the end of the world 
to wait _that_ long.  It also means that the port from stable to -dev is never 
_too_ painful.  (Just accept the fact most new features are developed against 
-stable, not against -dev.  This will never change, and we must cope.  You 
can't do new development against an unstable base, your own new code is buggy 
enough, adding other people's random breakage and daily regressions to the mix 
is just unworkable unless you're doing no new development and _just_ fixing 
bugs...)

I'll stop now.  I could probably write a book on this crud...

Rob
-- 
Latency is more important than throughput. It's that simple. - Linus Torvalds


More information about the uClibc mailing list