#1869 - out of order nextId() sequence generation

This commit is contained in:
rob bygrave
2019-11-29 19:58:12 +13:00
parent 1c5d7a97e1
commit 1fc4082abe
2 changed files with 66 additions and 5 deletions
@@ -12,9 +12,10 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.NavigableSet;
import java.util.TreeSet;
/**
* Database sequence based IdGenerator.
@@ -42,7 +43,7 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator {
protected final BackgroundExecutor backgroundExecutor;
protected final ArrayList<Long> idList = new ArrayList<>(50);
protected final NavigableSet<Long> idList = new TreeSet<>();
protected final int allocationSize;
@@ -97,15 +98,13 @@ public abstract class SequenceIdGenerator implements PlatformIdGenerator {
@Override
public Object nextId(Transaction t) {
synchronized (monitor) {
int size = idList.size();
if (size > 0) {
maybeLoadMoreInBackground(size);
} else {
loadMore(allocationSize);
}
return idList.remove(0);
return idList.pollFirst();
}
}
@@ -0,0 +1,62 @@
package io.ebean.config.dbplatform;
import org.junit.Test;
import java.sql.ResultSet;
import java.util.List;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
public class SequenceBatchIdGeneratorTest {
@Test
public void test() {
TD generator = new TD();
// simulate out of order adding of sequence ids
generator.add(asList(1L, 2L));
generator.add(asList(5L, 6L));
generator.add(asList(3L, 4L));
assertThat(generator.nextId(null)).isEqualTo(1L);
assertThat(generator.nextId(null)).isEqualTo(2L);
assertThat(generator.nextId(null)).isEqualTo(3L);
assertThat(generator.nextId(null)).isEqualTo(4L);
assertThat(generator.nextId(null)).isEqualTo(5L);
assertThat(generator.nextId(null)).isEqualTo(6L);
}
private class TD extends SequenceIdGenerator {
protected TD() {
super(null, null, null, 10);
}
void add(List<Long> ids) {
idList.addAll(ids);
}
@Override
public String getSql(int batchSize) {
return "not used";
}
@Override
protected List<Long> readIds(ResultSet resultSet, int loadSize) {
// do nothing
return null;
}
@Override
protected List<Long> getMoreIds(int requestSize) {
return null;
}
@Override
protected void loadInBackground(int requestSize) {
// do nothing
}
}
}