And if we can arrange for addIndexes(Directory...) to throw that too, that would complete the cycle I think. addIndexes(IndexReader) is not a problem, since if IR will detect that upon open(), you shouldn't reach addIndexes(IR) at all.
To record here your proposal from
LUCENE-2618 - one way to achieve that is to let segments_N record the oldest version it contains. This is fine for 3.1 and onwards indexes, however what do we do w/ 3.0 ones? We will need to distinguish >=3.1 and <3.1. However, <3.1 covers both 3.0 (which we should support by 4.0) and 2.9 (which we shouldn't). Maybe this isn't a problem because you cannot upgrade from 2.9 to 4.0 directly - you have to go through 3.x.
BTW Mike, I think we should track the version per-segment because only when all segments of version X are gone, can the minimum version Y be recorded in segments_N. That is, if you have several segments from version 1, and the index is on version 2, and you merge some of the ver1 segments, the index's oldest version is still 1. However, if you record it only in segments_N, how would you know when all ver1 segments are gone?