From a5d948d207e52d862f58ea118ee66035fd3d6b50 Mon Sep 17 00:00:00 2001 From: axothy Date: Wed, 3 Jan 2024 17:19:10 +0500 Subject: [PATCH] Fixed MurmurHash --- .../ru/vk/itmo/chebotinalexandr/MurmurHash.java | 5 ++--- .../chebotinalexandr/NotOnlyInMemoryDao.java | 17 +++++++++++++++-- src/test/java/ru/vk/itmo/BasicTest.java | 4 ++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/vk/itmo/chebotinalexandr/MurmurHash.java b/src/main/java/ru/vk/itmo/chebotinalexandr/MurmurHash.java index c3a6c4fb4..e758ab8e2 100644 --- a/src/main/java/ru/vk/itmo/chebotinalexandr/MurmurHash.java +++ b/src/main/java/ru/vk/itmo/chebotinalexandr/MurmurHash.java @@ -16,6 +16,7 @@ */ public final class MurmurHash { public static final int DEFAULT_SEED = 104729; + public static final VarHandle LITTLE_ENDIAN_LONG = MethodHandles.memorySegmentViewVarHandle(ValueLayout.JAVA_LONG_UNALIGNED); private MurmurHash() { @@ -136,9 +137,7 @@ private static long getBlock(MemorySegment key, int offset, int index) { int i16 = index << 4; //blocks are 16 bytes int blockOffset = offset + i16; - ByteBuffer buffer = key.asByteBuffer().order(ByteOrder.nativeOrder()); - buffer.position(blockOffset); - return buffer.getLong(); + return (long) LITTLE_ENDIAN_LONG.get(key, blockOffset); } private static long rotl64(long v, int n) { diff --git a/src/main/java/ru/vk/itmo/chebotinalexandr/NotOnlyInMemoryDao.java b/src/main/java/ru/vk/itmo/chebotinalexandr/NotOnlyInMemoryDao.java index ba1c0d887..ce0def877 100644 --- a/src/main/java/ru/vk/itmo/chebotinalexandr/NotOnlyInMemoryDao.java +++ b/src/main/java/ru/vk/itmo/chebotinalexandr/NotOnlyInMemoryDao.java @@ -98,7 +98,13 @@ public Entry get(MemorySegment key) { return result.value() == null ? null : result; } - for (MemorySegment sstable : currState.sstables) { + return getFromDisk(key, currState); + } + + private Entry getFromDisk(MemorySegment key, State state) { + Entry result; + + for (MemorySegment sstable : state.sstables) { if (BloomFilter.sstableMayContain(key, sstable)) { result = SSTableUtils.get(sstable, key); @@ -124,7 +130,13 @@ public Entry getNoBloomFilter(MemorySegment key) { return result.value() == null ? null : result; } - for (MemorySegment sstable : currState.sstables) { + return getFromDiskNoBloomFilter(key, currState); + } + + private Entry getFromDiskNoBloomFilter(MemorySegment key, State state) { + Entry result; + + for (MemorySegment sstable : state.sstables) { result = SSTableUtils.get(sstable, key); if (result != null) { @@ -135,6 +147,7 @@ public Entry getNoBloomFilter(MemorySegment key) { return null; } + private PeekingIterator> range( Iterator> firstIterator, Iterator> secondIterator, diff --git a/src/test/java/ru/vk/itmo/BasicTest.java b/src/test/java/ru/vk/itmo/BasicTest.java index 11a882ffd..ca15edf45 100644 --- a/src/test/java/ru/vk/itmo/BasicTest.java +++ b/src/test/java/ru/vk/itmo/BasicTest.java @@ -1,11 +1,14 @@ package ru.vk.itmo; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Timeout; import org.opentest4j.AssertionFailedError; +import ru.vk.itmo.test.DaoFactory; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Random; /** * @author incubos @@ -152,4 +155,5 @@ void testHugeData(Dao> dao) throws Exception { assertSame(dao.get(keyAt(entry)), entryAt(entry)); } } + }