diff --git a/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksMetadata.java b/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksMetadata.java index 038190e..7a48e4c 100644 --- a/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksMetadata.java +++ b/src/main/java/it/cavallium/strangedb/database/blocks/DatabaseBlocksMetadata.java @@ -43,6 +43,9 @@ public class DatabaseBlocksMetadata implements IBlocksMetadata { long position = blockId * BLOCK_META_BYTES_COUNT; int size = BLOCK_META_READS_AT_EVERY_READ * BLOCK_META_BYTES_COUNT; long currentFirstFreeBlock = this.firstFreeBlock.get(); + if (blockId > currentFirstFreeBlock) { + return EMPTY_BLOCK_INFO; + } if (blockId + (size - 1) / BLOCK_META_BYTES_COUNT >= currentFirstFreeBlock) { size = (int) ((currentFirstFreeBlock - blockId) * BLOCK_META_BYTES_COUNT); } diff --git a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java index ef528d1..1fc0647 100644 --- a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java +++ b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesIO.java @@ -33,9 +33,9 @@ public class DatabaseReferencesIO implements IReferencesIO { @Override public void writeToReference(long reference, byte cleanerId, int size, ByteBuffer data) throws IOException { + long blockId = (size == 0) ? EMPTY_BLOCK_ID : blocksIO.newBlock(size, data); lock.writeLock().lock(); try { - long blockId = (size == 0) ? EMPTY_BLOCK_ID : blocksIO.newBlock(size, data); referencesMetadata.editReference(reference, cleanerId, blockId); } finally { lock.writeLock().unlock(); diff --git a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesMetadata.java b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesMetadata.java index 5d4a04f..ce3c3ab 100644 --- a/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesMetadata.java +++ b/src/main/java/it/cavallium/strangedb/database/references/DatabaseReferencesMetadata.java @@ -58,6 +58,9 @@ public class DatabaseReferencesMetadata implements IReferencesMetadata { } long position = reference * REF_META_BYTES_COUNT; int size = REF_META_READS_AT_EVERY_READ * REF_META_BYTES_COUNT; + if (reference > firstFreeReference) { + return EMPTY_BLOCK_ID; + } if (reference + (size - 1) / REF_META_BYTES_COUNT >= firstFreeReference) { size = (int) ((firstFreeReference - reference) * REF_META_BYTES_COUNT); }