|
@@ -35,6 +35,7 @@ public class UUIDTests extends ESTestCase {
|
|
|
|
|
|
static UUIDGenerator timeUUIDGen = new TimeBasedUUIDGenerator();
|
|
|
static UUIDGenerator randomUUIDGen = new RandomBasedUUIDGenerator();
|
|
|
+ static UUIDGenerator kOrderedUUIDGen = new TimeBasedKOrderedUUIDGenerator();
|
|
|
|
|
|
public void testRandomUUID() {
|
|
|
verifyUUIDSet(100000, randomUUIDGen);
|
|
@@ -44,14 +45,49 @@ public class UUIDTests extends ESTestCase {
|
|
|
verifyUUIDSet(100000, timeUUIDGen);
|
|
|
}
|
|
|
|
|
|
- public void testThreadedTimeUUID() {
|
|
|
- testUUIDThreaded(timeUUIDGen);
|
|
|
+ public void testKOrderedUUID() {
|
|
|
+ verifyUUIDSet(100000, kOrderedUUIDGen);
|
|
|
}
|
|
|
|
|
|
public void testThreadedRandomUUID() {
|
|
|
testUUIDThreaded(randomUUIDGen);
|
|
|
}
|
|
|
|
|
|
+ public void testThreadedTimeUUID() {
|
|
|
+ testUUIDThreaded(timeUUIDGen);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testThreadedKOrderedUUID() {
|
|
|
+ testUUIDThreaded(kOrderedUUIDGen);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testCompression() throws Exception {
|
|
|
+ Logger logger = LogManager.getLogger(UUIDTests.class);
|
|
|
+
|
|
|
+ assertThat(testCompression(timeUUIDGen, 100000, 10000, 3, logger), Matchers.lessThan(14d));
|
|
|
+ assertThat(testCompression(timeUUIDGen, 100000, 1000, 3, logger), Matchers.lessThan(15d));
|
|
|
+ assertThat(testCompression(timeUUIDGen, 100000, 100, 3, logger), Matchers.lessThan(21d));
|
|
|
+
|
|
|
+ assertThat(testCompression(kOrderedUUIDGen, 100000, 10000, 3, logger), Matchers.lessThan(13d));
|
|
|
+ assertThat(testCompression(kOrderedUUIDGen, 100000, 1000, 3, logger), Matchers.lessThan(14d));
|
|
|
+ assertThat(testCompression(kOrderedUUIDGen, 100000, 100, 3, logger), Matchers.lessThan(19d));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testComparativeCompression() throws Exception {
|
|
|
+ Logger logger = LogManager.getLogger(UUIDTests.class);
|
|
|
+
|
|
|
+ int numDocs = 100000;
|
|
|
+ int docsPerSecond = 1000;
|
|
|
+ int nodes = 3;
|
|
|
+
|
|
|
+ double randomCompression = testCompression(randomUUIDGen, numDocs, docsPerSecond, nodes, logger);
|
|
|
+ double baseCompression = testCompression(timeUUIDGen, numDocs, docsPerSecond, nodes, logger);
|
|
|
+ double kOrderedCompression = testCompression(kOrderedUUIDGen, numDocs, docsPerSecond, nodes, logger);
|
|
|
+
|
|
|
+ assertThat(kOrderedCompression, Matchers.lessThanOrEqualTo(baseCompression));
|
|
|
+ assertThat(kOrderedCompression, Matchers.lessThanOrEqualTo(randomCompression));
|
|
|
+ }
|
|
|
+
|
|
|
Set<String> verifyUUIDSet(int count, UUIDGenerator uuidSource) {
|
|
|
HashSet<String> uuidSet = new HashSet<>();
|
|
|
for (int i = 0; i < count; ++i) {
|
|
@@ -109,49 +145,62 @@ public class UUIDTests extends ESTestCase {
|
|
|
assertEquals(count * uuids, globalSet.size());
|
|
|
}
|
|
|
|
|
|
- public void testCompression() throws Exception {
|
|
|
- Logger logger = LogManager.getLogger(UUIDTests.class);
|
|
|
- // Low number so that the test runs quickly, but the results are more interesting with larger numbers
|
|
|
- // of indexed documents
|
|
|
- assertThat(testCompression(100000, 10000, 3, logger), Matchers.lessThan(14d)); // ~12 in practice
|
|
|
- assertThat(testCompression(100000, 1000, 3, logger), Matchers.lessThan(15d)); // ~13 in practice
|
|
|
- assertThat(testCompression(100000, 100, 3, logger), Matchers.lessThan(21d)); // ~20 in practice
|
|
|
- }
|
|
|
-
|
|
|
- private static double testCompression(int numDocs, int numDocsPerSecond, int numNodes, Logger logger) throws Exception {
|
|
|
- final double intervalBetweenDocs = 1000. / numDocsPerSecond; // milliseconds
|
|
|
+ private static double testCompression(final UUIDGenerator generator, int numDocs, int numDocsPerSecond, int numNodes, Logger logger)
|
|
|
+ throws Exception {
|
|
|
+ final double intervalBetweenDocs = 1000. / numDocsPerSecond;
|
|
|
final byte[][] macAddresses = new byte[numNodes][];
|
|
|
Random r = random();
|
|
|
for (int i = 0; i < macAddresses.length; ++i) {
|
|
|
macAddresses[i] = new byte[6];
|
|
|
random().nextBytes(macAddresses[i]);
|
|
|
}
|
|
|
- UUIDGenerator generator = new TimeBasedUUIDGenerator() {
|
|
|
- double currentTimeMillis = TestUtil.nextLong(random(), 0L, 10000000000L);
|
|
|
|
|
|
- @Override
|
|
|
- protected long currentTimeMillis() {
|
|
|
- currentTimeMillis += intervalBetweenDocs * 2 * r.nextDouble();
|
|
|
- return (long) currentTimeMillis;
|
|
|
+ UUIDGenerator uuidSource = generator;
|
|
|
+ if (generator instanceof TimeBasedUUIDGenerator) {
|
|
|
+ if (generator instanceof TimeBasedKOrderedUUIDGenerator) {
|
|
|
+ uuidSource = new TimeBasedKOrderedUUIDGenerator() {
|
|
|
+ double currentTimeMillis = TestUtil.nextLong(random(), 0L, 10000000000L);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected long currentTimeMillis() {
|
|
|
+ currentTimeMillis += intervalBetweenDocs * 2 * r.nextDouble();
|
|
|
+ return (long) currentTimeMillis;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected byte[] macAddress() {
|
|
|
+ return RandomPicks.randomFrom(r, macAddresses);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ uuidSource = new TimeBasedUUIDGenerator() {
|
|
|
+ double currentTimeMillis = TestUtil.nextLong(random(), 0L, 10000000000L);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected long currentTimeMillis() {
|
|
|
+ currentTimeMillis += intervalBetweenDocs * 2 * r.nextDouble();
|
|
|
+ return (long) currentTimeMillis;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected byte[] macAddress() {
|
|
|
+ return RandomPicks.randomFrom(r, macAddresses);
|
|
|
+ }
|
|
|
+ };
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- protected byte[] macAddress() {
|
|
|
- return RandomPicks.randomFrom(r, macAddresses);
|
|
|
- }
|
|
|
- };
|
|
|
- // Avoid randomization which will slow down things without improving
|
|
|
- // the quality of this test
|
|
|
Directory dir = newFSDirectory(createTempDir());
|
|
|
IndexWriterConfig config = new IndexWriterConfig().setCodec(Codec.forName(Lucene.LATEST_CODEC))
|
|
|
- .setMergeScheduler(new SerialMergeScheduler()); // for reproducibility
|
|
|
+ .setMergeScheduler(new SerialMergeScheduler());
|
|
|
+
|
|
|
IndexWriter w = new IndexWriter(dir, config);
|
|
|
Document doc = new Document();
|
|
|
StringField id = new StringField("_id", "", Store.NO);
|
|
|
doc.add(id);
|
|
|
long start = System.nanoTime();
|
|
|
for (int i = 0; i < numDocs; ++i) {
|
|
|
- id.setStringValue(generator.getBase64UUID());
|
|
|
+ id.setStringValue(uuidSource.getBase64UUID());
|
|
|
w.addDocument(doc);
|
|
|
}
|
|
|
w.forceMerge(1);
|
|
@@ -164,30 +213,25 @@ public class UUIDTests extends ESTestCase {
|
|
|
dir.close();
|
|
|
double bytesPerDoc = (double) size / numDocs;
|
|
|
logger.info(
|
|
|
- numDocs
|
|
|
- + " docs indexed at "
|
|
|
- + numDocsPerSecond
|
|
|
- + " docs/s required "
|
|
|
- + ByteSizeValue.ofBytes(size)
|
|
|
- + " bytes of disk space, or "
|
|
|
- + bytesPerDoc
|
|
|
- + " bytes per document. Took: "
|
|
|
- + new TimeValue(time)
|
|
|
- + "."
|
|
|
+ "{} - {} docs indexed at {} docs/s required {} bytes of disk space, or {} bytes per document. Took: {}.",
|
|
|
+ uuidSource.getClass().getSimpleName(),
|
|
|
+ numDocs,
|
|
|
+ numDocsPerSecond,
|
|
|
+ ByteSizeValue.ofBytes(size),
|
|
|
+ bytesPerDoc,
|
|
|
+ new TimeValue(time)
|
|
|
);
|
|
|
return bytesPerDoc;
|
|
|
}
|
|
|
|
|
|
public void testStringLength() {
|
|
|
assertEquals(UUIDs.RANDOM_BASED_UUID_STRING_LENGTH, getUnpaddedBase64StringLength(RandomBasedUUIDGenerator.SIZE_IN_BYTES));
|
|
|
- assertEquals(UUIDs.RANDOM_BASED_UUID_STRING_LENGTH, UUIDs.randomBase64UUID().length());
|
|
|
- assertEquals(UUIDs.RANDOM_BASED_UUID_STRING_LENGTH, UUIDs.randomBase64UUID(random()).length());
|
|
|
- try (var secureString = UUIDs.randomBase64UUIDSecureString()) {
|
|
|
- assertEquals(UUIDs.RANDOM_BASED_UUID_STRING_LENGTH, secureString.toString().length());
|
|
|
- }
|
|
|
-
|
|
|
assertEquals(UUIDs.TIME_BASED_UUID_STRING_LENGTH, getUnpaddedBase64StringLength(TimeBasedUUIDGenerator.SIZE_IN_BYTES));
|
|
|
- assertEquals(UUIDs.TIME_BASED_UUID_STRING_LENGTH, UUIDs.base64UUID().length());
|
|
|
+ assertEquals(UUIDs.TIME_BASED_UUID_STRING_LENGTH, getUnpaddedBase64StringLength(TimeBasedKOrderedUUIDGenerator.SIZE_IN_BYTES));
|
|
|
+
|
|
|
+ assertEquals(UUIDs.RANDOM_BASED_UUID_STRING_LENGTH, randomUUIDGen.getBase64UUID().length());
|
|
|
+ assertEquals(UUIDs.TIME_BASED_UUID_STRING_LENGTH, timeUUIDGen.getBase64UUID().length());
|
|
|
+ assertEquals(UUIDs.TIME_BASED_UUID_STRING_LENGTH, kOrderedUUIDGen.getBase64UUID().length());
|
|
|
}
|
|
|
|
|
|
private static int getUnpaddedBase64StringLength(int sizeInBytes) {
|