diff --git a/src/main/java/ru/vk/itmo/solnyshkoksenia/State.java b/src/main/java/ru/vk/itmo/solnyshkoksenia/State.java index 57d43ca18..476df582f 100644 --- a/src/main/java/ru/vk/itmo/solnyshkoksenia/State.java +++ b/src/main/java/ru/vk/itmo/solnyshkoksenia/State.java @@ -121,7 +121,7 @@ public Entry get(MemorySegment key, Comparator com } EntryExtended next = iterator.next(); if (comparator.compare(next.key(), key) == 0 && isValidEntry(next)) { - return next; + return next; } return null; } @@ -131,8 +131,9 @@ private boolean isValidEntry(EntryExtended entry) { || entry.expiration().toArray(ValueLayout.JAVA_LONG_UNALIGNED)[0] > System.currentTimeMillis()); } - protected Iterator> getInMemory(NavigableMap> memory, - MemorySegment from, MemorySegment to) { + protected Iterator> getInMemory( + NavigableMap> memory, + MemorySegment from, MemorySegment to) { if (from == null && to == null) { return memory.values().iterator(); } diff --git a/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/DiskStorage.java b/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/DiskStorage.java index 2e8039cbe..e97ba26af 100644 --- a/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/DiskStorage.java +++ b/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/DiskStorage.java @@ -72,22 +72,17 @@ public void save(Iterable> iterable) String newFileName = String.valueOf(existedFiles.size()); final long currentTime = System.currentTimeMillis(); - long dataSize = 0; - long count = 0; + + Entry sizes = new BaseEntry<>(0L, 0L); for (EntryExtended entry : iterable) { MemorySegment expiration = entry.expiration(); if (expiration == null || utils.checkTTL(expiration, currentTime)) { - dataSize += entry.key().byteSize(); - MemorySegment value = entry.value(); - if (value != null) { - dataSize += value.byteSize(); - } - if (expiration != null) { - dataSize += expiration.byteSize(); - } - count++; + sizes = utils.countEntrySize(entry, sizes); } } + long dataSize = sizes.key(); + long count = sizes.value(); + if (count == 0) { return; } @@ -240,7 +235,8 @@ public static List loadOrRecover(Path storagePath, Arena arena) t return result; } - private static Iterator> iterator(MemorySegment page, MemorySegment from, MemorySegment to) { + private static Iterator> iterator(MemorySegment page, + MemorySegment from, MemorySegment to) { long recordIndexFrom = from == null ? 0 : utils.normalize(utils.indexOf(page, from)); long recordIndexTo = to == null ? utils.recordsCount(page) : utils.normalize(utils.indexOf(page, to)); long recordsCount = utils.recordsCount(page); diff --git a/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/StorageUtils.java b/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/StorageUtils.java index 190510313..3100a9304 100644 --- a/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/StorageUtils.java +++ b/src/main/java/ru/vk/itmo/solnyshkoksenia/storage/StorageUtils.java @@ -64,6 +64,20 @@ protected MemorySegment mapFile(FileChannel fileChannel, long size, Arena arena) ); } + protected Entry countEntrySize(EntryExtended entry, Entry sizes) { + long dataSize = sizes.key(); + dataSize += entry.key().byteSize(); + MemorySegment value = entry.value(); + if (value != null) { + dataSize += value.byteSize(); + } + MemorySegment expiration = entry.expiration(); + if (expiration != null) { + dataSize += expiration.byteSize(); + } + return new BaseEntry<>(dataSize, sizes.value() + 1); + } + protected Entry putEntry(MemorySegment fileSegment, Entry offsets, EntryExtended entry) { long dataOffset = offsets.key(); long indexOffset = offsets.value();