diff --git a/performanceDb/src/main/java/org/lucares/performance/db/PdbWriter.java b/performanceDb/src/main/java/org/lucares/performance/db/PdbWriter.java index 072a96b..fcd1fcf 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/PdbWriter.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/PdbWriter.java @@ -105,6 +105,10 @@ class PdbWriter implements AutoCloseable, Flushable { public OffsetDateTime getDateOffset() { return DateUtils.epochMilliInUTC(lastEpochMilli); } + + public long getDateOffsetAsEpochMilli() { + return lastEpochMilli; + } public void write(final Entry entry) throws WriteException, InvalidValueException { final long epochMilli = entry.getEpochMilli(); diff --git a/performanceDb/src/main/java/org/lucares/performance/db/PdbWriterByTimeAsc.java b/performanceDb/src/main/java/org/lucares/performance/db/PdbWriterByTimeAsc.java index d5cae4c..e5153a5 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/PdbWriterByTimeAsc.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/PdbWriterByTimeAsc.java @@ -1,6 +1,5 @@ package org.lucares.performance.db; -import java.time.OffsetDateTime; import java.util.Comparator; public class PdbWriterByTimeAsc implements Comparator { @@ -11,9 +10,9 @@ public class PdbWriterByTimeAsc implements Comparator { @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); } } diff --git a/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java b/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java index 4722960..4e515ae 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/PerformanceDb.java @@ -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++; diff --git a/performanceDb/src/main/java/org/lucares/performance/db/TagsToFile.java b/performanceDb/src/main/java/org/lucares/performance/db/TagsToFile.java index c29c00b..f4703fd 100644 --- a/performanceDb/src/main/java/org/lucares/performance/db/TagsToFile.java +++ b/performanceDb/src/main/java/org/lucares/performance/db/TagsToFile.java @@ -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 optionalWriter = chooseBestMatchingWriter(writersForTags.getWriters(), date); + final Optional 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 pdbFiles = getFilesMatchingTagsExactly(tags); pdbFiles.removeIf(f -> !f.exists()); @@ -99,10 +98,7 @@ public class TagsToFile implements AutoCloseable { Optional::isPresent); final List 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 optionalFirst = chooseBestMatchingWriter(writers, date); + final Optional 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 chooseBestMatchingWriter(final List writers, final OffsetDateTime date) { + private Optional chooseBestMatchingWriter(final List 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() { diff --git a/performanceDb/src/test/java/org/lucares/performance/db/TagsToFilesTest.java b/performanceDb/src/test/java/org/lucares/performance/db/TagsToFilesTest.java index 10a6673..8eeabf1 100644 --- a/performanceDb/src/test/java/org/lucares/performance/db/TagsToFilesTest.java +++ b/performanceDb/src/test/java/org/lucares/performance/db/TagsToFilesTest.java @@ -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);