提交 1ede3e98 编写于 作者: J Jesse Glick

Defend against out-of-order builds even if nextBuildNumber is wrong.

上级 2ca95503
......@@ -172,6 +172,7 @@ public final class RunMap<R extends Run<?,R>> extends AbstractLazyLoadRunMap<R>
if (rootDir.isDirectory()) {
throw new IllegalStateException(rootDir + " already existed; will not overwite with " + r);
}
proposeNewNumber(r.getNumber());
rootDir.mkdirs();
return super._put(r);
}
......
......@@ -356,6 +356,12 @@ public abstract class AbstractLazyLoadRunMap<R> extends AbstractMap<Integer,R> i
return load(n, null);
}
protected final synchronized void proposeNewNumber(int number) throws IllegalStateException {
if (numberOnDisk.isInRange(numberOnDisk.ceil(number))) {
throw new IllegalStateException("cannot create a build with number " + number + " since that (or higher) is already in use among " + numberOnDisk);
}
}
public R put(R value) {
return _put(value);
}
......
package jenkins.model.lazy;
import static org.junit.Assert.*;
import org.junit.Test;
/**
......@@ -12,6 +13,25 @@ public class SortedIntListTest {
l.add(0);
l.add(5);
l.add(10);
System.out.println(l.lower(Integer.MAX_VALUE));
assertEquals(2, l.lower(Integer.MAX_VALUE));
}
@Test public void ceil() {
SortedIntList l = new SortedIntList(5);
l.add(1);
l.add(3);
l.add(5);
assertEquals(0, l.ceil(0));
assertEquals(0, l.ceil(1));
assertEquals(1, l.ceil(2));
assertEquals(1, l.ceil(3));
assertEquals(2, l.ceil(4));
assertEquals(2, l.ceil(5));
assertEquals(3, l.ceil(6));
assertTrue(l.isInRange(0));
assertTrue(l.isInRange(1));
assertTrue(l.isInRange(2));
assertFalse(l.isInRange(3));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册