use epoch millis instead of creating a date object

We only have to check if one timestamp is newer than another.
We don't have to create an expensive date object to do that.
This commit is contained in:
ahr
2018-03-09 08:43:37 +01:00
parent 829fddf88c
commit 3387ebc134
5 changed files with 30 additions and 29 deletions

View File

@@ -106,6 +106,10 @@ class PdbWriter implements AutoCloseable, Flushable {
return DateUtils.epochMilliInUTC(lastEpochMilli);
}
public long getDateOffsetAsEpochMilli() {
return lastEpochMilli;
}
public void write(final Entry entry) throws WriteException, InvalidValueException {
final long epochMilli = entry.getEpochMilli();
final long value = entry.getValue();

View File

@@ -1,6 +1,5 @@
package org.lucares.performance.db;
import java.time.OffsetDateTime;
import java.util.Comparator;
public class PdbWriterByTimeAsc implements Comparator<PdbWriter> {
@@ -11,9 +10,9 @@ public class PdbWriterByTimeAsc implements Comparator<PdbWriter> {
@Override
public int compare(final PdbWriter o1, final PdbWriter o2) {
final OffsetDateTime o1From = o1.getDateOffset();
final OffsetDateTime o2From = o2.getDateOffset();
return o1From.compareTo(o2From);
final long o1From = o1.getDateOffsetAsEpochMilli();
final long o2From = o2.getDateOffsetAsEpochMilli();
return Long.compare(o1From, o2From);
}
}

View File

@@ -81,9 +81,9 @@ public class PerformanceDb implements AutoCloseable {
try {
final Tags tags = entry.getTags();
final OffsetDateTime date = entry.getDate();
final long dateAsEpochMilli = entry.getEpochMilli();
final PdbWriter writer = tagsToFile.getWriter(date, tags);
final PdbWriter writer = tagsToFile.getWriter(dateAsEpochMilli, tags);
writer.write(entry);
count++;

View File

@@ -80,17 +80,16 @@ public class TagsToFile implements AutoCloseable {
return result;
}
public PdbWriter getWriter(final OffsetDateTime date, final Tags tags) throws ReadException, WriteException {
public PdbWriter getWriter(final long dateAsEpochMilli, final Tags tags) throws ReadException, WriteException {
final PdbWriter result;
final WriterCache writersForTags = getOrInit(tags);
final Optional<PdbWriter> optionalWriter = chooseBestMatchingWriter(writersForTags.getWriters(), date);
final Optional<PdbWriter> optionalWriter = chooseBestMatchingWriter(writersForTags.getWriters(), dateAsEpochMilli);
if (optionalWriter.isPresent()) {
result = optionalWriter.get();
LOGGER.trace("using existing pdbWriter: {}", result);
} else {
final long start = System.nanoTime();
final List<PdbFile> pdbFiles = getFilesMatchingTagsExactly(tags);
pdbFiles.removeIf(f -> !f.exists());
@@ -99,10 +98,7 @@ public class TagsToFile implements AutoCloseable {
Optional::isPresent);
final List<PdbWriter> writers = CollectionUtils.map(existingWriters, Optional::get);
METRICS_LOGGER_FIND_WRITER.debug("find writers took {}ms for tags {}", (System.nanoTime() - start)
/ 1_000_000.0, tags);
final Optional<PdbWriter> optionalFirst = chooseBestMatchingWriter(writers, date);
final Optional<PdbWriter> optionalFirst = chooseBestMatchingWriter(writers, dateAsEpochMilli);
result = optionalFirst.orElseGet(() -> newPdbWriter(tags));
LOGGER.debug("create new pdbWriter: {}", result);
@@ -110,14 +106,14 @@ public class TagsToFile implements AutoCloseable {
return result;
}
private Optional<PdbWriter> chooseBestMatchingWriter(final List<PdbWriter> writers, final OffsetDateTime date) {
private Optional<PdbWriter> chooseBestMatchingWriter(final List<PdbWriter> writers, final long dateAsEpochMilli) {
Collections.sort(writers, PdbWriterByTimeAsc.REVERSED);
for (final PdbWriter pdbWriter : writers) {
final OffsetDateTime offsetTime = pdbWriter.getDateOffset();
final long offsetTime = pdbWriter.getDateOffsetAsEpochMilli();
if (!date.isBefore(offsetTime)) {
if (dateAsEpochMilli >= offsetTime) {
return Optional.of(pdbWriter);
}
}
@@ -126,11 +122,13 @@ public class TagsToFile implements AutoCloseable {
private WriterCache getOrInit(final Tags tags) {
if (!cachedWriters.containsKey(tags)) {
cachedWriters.put(tags, new WriterCache());
WriterCache result = cachedWriters.get(tags);
if (result == null) {
result = new WriterCache();
cachedWriters.put(tags, result);
}
return cachedWriters.get(tags);
return result;
}
public void clearWriterCache() {

View File

@@ -37,9 +37,9 @@ public class TagsToFilesTest {
final OffsetDateTime date = OffsetDateTime.now(ZoneOffset.UTC);
final Tags tags = Tags.create("myKey", "myValue");
final PdbWriter newFileForTags = tagsToFile.getWriter(date, tags);
final PdbWriter newFileForTags = tagsToFile.getWriter(date.toInstant().toEpochMilli(), tags);
final PdbWriter existingFileForTags = tagsToFile.getWriter(date, tags);
final PdbWriter existingFileForTags = tagsToFile.getWriter(date.toInstant().toEpochMilli(), tags);
Assert.assertSame(newFileForTags, existingFileForTags);
}
@@ -54,9 +54,9 @@ public class TagsToFilesTest {
final Tags tags = Tags.create("myKey", "myValue");
final PdbWriter writerForDay1 = tagsToFile.getWriter(day1, tags);
final PdbWriter writerForDay1 = tagsToFile.getWriter(day1.toInstant().toEpochMilli(), tags);
writerForDay1.write(new Entry(day1, 1, tags));
final PdbWriter writerForDay2 = tagsToFile.getWriter(day2, tags);
final PdbWriter writerForDay2 = tagsToFile.getWriter(day2.toInstant().toEpochMilli(), tags);
writerForDay2.write(new Entry(day2, 2, tags));
Assert.assertSame(writerForDay1, writerForDay2);
@@ -76,22 +76,22 @@ public class TagsToFilesTest {
final Tags tags = Tags.create("myKey", "myValue");
final PdbWriter writerAfternoon = tagsToFile.getWriter(afternoon, tags);
final PdbWriter writerAfternoon = tagsToFile.getWriter(afternoon.toInstant().toEpochMilli(), tags);
writerAfternoon.write(new Entry(afternoon, 1, tags));
final PdbWriter writerMorning = tagsToFile.getWriter(morning, tags);
final PdbWriter writerMorning = tagsToFile.getWriter(morning.toInstant().toEpochMilli(), tags);
writerMorning.write(new Entry(morning, 2, tags));
Assert.assertNotSame(writerAfternoon, writerMorning);
Assert.assertNotEquals(writerAfternoon.getPdbFile(), writerMorning.getPdbFile());
final PdbWriter writerEarlyMorning = tagsToFile.getWriter(earlyMorning, tags);
final PdbWriter writerEarlyMorning = tagsToFile.getWriter(earlyMorning.toInstant().toEpochMilli(), tags);
writerEarlyMorning.write(new Entry(earlyMorning, 3, tags));
Assert.assertNotSame(writerEarlyMorning, writerAfternoon);
Assert.assertNotSame(writerEarlyMorning, writerMorning);
final PdbWriter writerEvening = tagsToFile.getWriter(evening, tags);
final PdbWriter writerEvening = tagsToFile.getWriter(evening.toInstant().toEpochMilli(), tags);
Assert.assertSame(writerEvening, writerAfternoon,
"the evening event can be appended to the afternoon file");
@@ -111,10 +111,10 @@ public class TagsToFilesTest {
final Tags tags = Tags.create("myKey", "myValue");
final PdbWriter fileA = tagsToFile.getWriter(timestamp, tags);
final PdbWriter fileA = tagsToFile.getWriter(timestamp.toInstant().toEpochMilli(), tags);
fileA.write(new Entry(timestamp, 1, tags));
final PdbWriter fileB = tagsToFile.getWriter(timestamp, tags);
final PdbWriter fileB = tagsToFile.getWriter(timestamp.toInstant().toEpochMilli(), tags);
fileA.write(new Entry(timestamp, 2, tags));
Assert.assertEquals(fileA, fileB);