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); return DateUtils.epochMilliInUTC(lastEpochMilli);
} }
public long getDateOffsetAsEpochMilli() {
return lastEpochMilli;
}
public void write(final Entry entry) throws WriteException, InvalidValueException { public void write(final Entry entry) throws WriteException, InvalidValueException {
final long epochMilli = entry.getEpochMilli(); final long epochMilli = entry.getEpochMilli();
final long value = entry.getValue(); final long value = entry.getValue();

View File

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

View File

@@ -81,9 +81,9 @@ public class PerformanceDb implements AutoCloseable {
try { try {
final Tags tags = entry.getTags(); 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); writer.write(entry);
count++; count++;

View File

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

View File

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