add method isEmpty to PersistentMap

This commit is contained in:
2021-10-16 16:59:58 +02:00
parent 3d72231415
commit cce2c052f2
2 changed files with 38 additions and 0 deletions

View File

@@ -188,6 +188,13 @@ public class PersistentMap<K, V> implements AutoCloseable {
private long version; private long version;
/**
*
* @param path file relative to {@code storageBasePath}
* @param storageBasePath base path
* @param keyEncoder encoder for keys
* @param valueEncoder encoder for values
*/
public PersistentMap(final Path path, final Path storageBasePath, final EncoderDecoder<K> keyEncoder, public PersistentMap(final Path path, final Path storageBasePath, final EncoderDecoder<K> keyEncoder,
final EncoderDecoder<V> valueEncoder) { final EncoderDecoder<V> valueEncoder) {
this.path = path; this.path = path;
@@ -633,6 +640,14 @@ public class PersistentMap<K, V> implements AutoCloseable {
return stats; return stats;
} }
public synchronized boolean isEmpty() {
final long rootNodeOffset = readNodeOffsetOfRootNode();
final PersistentMapDiskNode node = getNode(rootNodeOffset);
final List<NodeEntry> entries = node.getEntries();
return entries.size() == 1; // the empty map has a single NodeEntry for the PersistentMapDiskNode.MAX_KEY
}
private void swapFiles(final Path newFile) throws IOException { private void swapFiles(final Path newFile) throws IOException {
final Path backupFile = path.getParent().resolve(path.getFileName() + "." final Path backupFile = path.getParent().resolve(path.getFileName() + "."
+ DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss").format(OffsetDateTime.now()) + ".backup"); + DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss").format(OffsetDateTime.now()) + ".backup");

View File

@@ -375,6 +375,29 @@ public class PersistentMapTest {
} }
} }
@Test
public void testIsEmpty() throws IOException {
final Path file = dataDirectory.resolve("map.db");
try (final PersistentMap<Long, Long> map = new PersistentMap<>(file, dataDirectory, PersistentMap.LONG_CODER,
PersistentMap.LONG_CODER)) {
Assertions.assertTrue(map.isEmpty(), "new created map is empty");
}
try (final PersistentMap<Long, Long> map = new PersistentMap<>(file, dataDirectory, PersistentMap.LONG_CODER,
PersistentMap.LONG_CODER)) {
Assertions.assertTrue(map.isEmpty(), "map is empty after reading an empty map from disk");
map.putValue(1L, 2L);
Assertions.assertFalse(map.isEmpty(), "map is empty after putting a value");
}
try (final PersistentMap<Long, Long> map = new PersistentMap<>(file, dataDirectory, PersistentMap.LONG_CODER,
PersistentMap.LONG_CODER)) {
Assertions.assertFalse(map.isEmpty(), "map is empty when reading a non empty map from disk");
}
}
private void assertValuesInMap(final Map<Long, Long> insertedValues, final PersistentMap<Long, Long> map) { private void assertValuesInMap(final Map<Long, Long> insertedValues, final PersistentMap<Long, Long> map) {
final AtomicInteger counter = new AtomicInteger(); final AtomicInteger counter = new AtomicInteger();
final AtomicInteger maxDepth = new AtomicInteger(); final AtomicInteger maxDepth = new AtomicInteger();