From a3674071693f385d64574d74540628f8881769c2 Mon Sep 17 00:00:00 2001 From: "altesse.fredd" Date: Tue, 11 Dec 2018 12:35:36 +0100 Subject: [PATCH 1/2] Add Env.setMapSize(final long mapSize) (fixes #104) --- src/main/java/org/lmdbjava/Env.java | 9 +++++ src/test/java/org/lmdbjava/EnvTest.java | 48 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/main/java/org/lmdbjava/Env.java b/src/main/java/org/lmdbjava/Env.java index 1d9224d7..4c328fff 100644 --- a/src/main/java/org/lmdbjava/Env.java +++ b/src/main/java/org/lmdbjava/Env.java @@ -383,6 +383,15 @@ Pointer pointer() { return ptr; } + /** + * Set the size of the data memory map. + * + * @param mapSize the new size, in bytes + */ + public void setMapSize(final long mapSize) { + checkRc(LIB.mdb_env_set_mapsize(ptr, mapSize)); + } + /** * Object has already been closed and the operation is therefore prohibited. */ diff --git a/src/test/java/org/lmdbjava/EnvTest.java b/src/test/java/org/lmdbjava/EnvTest.java index 1008dc1d..514fc1cb 100644 --- a/src/test/java/org/lmdbjava/EnvTest.java +++ b/src/test/java/org/lmdbjava/EnvTest.java @@ -250,6 +250,54 @@ public void mapFull() throws IOException { } } + @Test + public void setMapSize() throws IOException { + final File path = tmp.newFolder(); + final byte[] k = new byte[500]; + final ByteBuffer key = allocateDirect(500); + final ByteBuffer val = allocateDirect(1_024); + final Random rnd = new Random(); + try (Env env = create().setMapSize(MEBIBYTES.toBytes(1)) + .setMaxDbs(1).open(path)) { + final Dbi db = env.openDbi(DB_1, MDB_CREATE); + + db.put(bb(1), bb(42)); + boolean mapFullExThrown = false; + try { + for (int i = 0; i < 300; i++) { + rnd.nextBytes(k); + key.clear(); + key.put(k).flip(); + val.clear(); + db.put(key, val); + } + } catch (final MapFullException mfE) { + mapFullExThrown = true; + } + assertThat(mapFullExThrown, is(true)); + + env.setMapSize(MEBIBYTES.toBytes(2)); + + try (Txn roTxn = env.txnRead()) { + assertThat(db.get(roTxn, bb(1)), is(bb(42))); + } + + mapFullExThrown = false; + try { + for (int i = 0; i < 300; i++) { + rnd.nextBytes(k); + key.clear(); + key.put(k).flip(); + val.clear(); + db.put(key, val); + } + } catch (final MapFullException mfE) { + mapFullExThrown = true; + } + assertThat(mapFullExThrown, is(false)); + } + } + @Test public void readOnlySupported() throws IOException { final File path = tmp.newFolder(); From 3d26abc0fa8f8b28145c79f02ef9db6ee4ed733c Mon Sep 17 00:00:00 2001 From: altesse Date: Tue, 11 Dec 2018 14:15:44 +0100 Subject: [PATCH 2/2] Fix setMapSize test reliability --- src/test/java/org/lmdbjava/EnvTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/lmdbjava/EnvTest.java b/src/test/java/org/lmdbjava/EnvTest.java index 514fc1cb..7b99b379 100644 --- a/src/test/java/org/lmdbjava/EnvTest.java +++ b/src/test/java/org/lmdbjava/EnvTest.java @@ -257,14 +257,14 @@ public void setMapSize() throws IOException { final ByteBuffer key = allocateDirect(500); final ByteBuffer val = allocateDirect(1_024); final Random rnd = new Random(); - try (Env env = create().setMapSize(MEBIBYTES.toBytes(1)) + try (Env env = create().setMapSize(50_000) .setMaxDbs(1).open(path)) { final Dbi db = env.openDbi(DB_1, MDB_CREATE); db.put(bb(1), bb(42)); boolean mapFullExThrown = false; try { - for (int i = 0; i < 300; i++) { + for (int i = 0; i < 30; i++) { rnd.nextBytes(k); key.clear(); key.put(k).flip(); @@ -276,7 +276,7 @@ public void setMapSize() throws IOException { } assertThat(mapFullExThrown, is(true)); - env.setMapSize(MEBIBYTES.toBytes(2)); + env.setMapSize(500_000); try (Txn roTxn = env.txnRead()) { assertThat(db.get(roTxn, bb(1)), is(bb(42))); @@ -284,7 +284,7 @@ public void setMapSize() throws IOException { mapFullExThrown = false; try { - for (int i = 0; i < 300; i++) { + for (int i = 0; i < 30; i++) { rnd.nextBytes(k); key.clear(); key.put(k).flip();