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..7b99b379 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(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 < 30; 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(500_000); + + try (Txn roTxn = env.txnRead()) { + assertThat(db.get(roTxn, bb(1)), is(bb(42))); + } + + mapFullExThrown = false; + try { + for (int i = 0; i < 30; 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();