diff --git a/src/main/java/org/warp/filesponge/DiskCache.java b/src/main/java/org/warp/filesponge/DiskCache.java index b79dead..64e8a6f 100644 --- a/src/main/java/org/warp/filesponge/DiskCache.java +++ b/src/main/java/org/warp/filesponge/DiskCache.java @@ -89,11 +89,14 @@ public class DiskCache implements URLsDiskHandler, URLsWriter { Mono> keyMono = Mono.fromCallable(() -> serializeUrl(url)); return fileMetadata - .update(keyMono, oldValue -> Objects.requireNonNullElseGet(oldValue, - () -> serializeMetadata(new DiskMetadata(metadata.size(), - BooleanArrayList.wrap(new boolean[DiskMetadata.getBlocksCount(metadata.size(), BLOCK_SIZE)]) - )) - ).receive(), UpdateReturnMode.NOTHING) + .update(keyMono, + oldValue -> Objects.requireNonNullElseGet(oldValue, + () -> serializeMetadata(new DiskMetadata(metadata.size(), + BooleanArrayList.wrap(new boolean[DiskMetadata.getBlocksCount(metadata.size(), BLOCK_SIZE)]) + )).receive() + ), + UpdateReturnMode.NOTHING + ) .then(); } @@ -126,9 +129,9 @@ public class DiskCache implements URLsDiskHandler, URLsWriter { } } - private DiskMetadata deserializeMetadata(Send prevBytes) { - try (var prevBytesBuf = prevBytes.receive()) { - return diskMetadataSerializer.deserialize(prevBytesBuf); + private DiskMetadata deserializeMetadata(Buffer prevBytes) { + try { + return diskMetadataSerializer.deserialize(prevBytes); } catch (SerializationException ex) { throw new IllegalStateException("Failed to deserialize metadata", ex); } @@ -244,7 +247,11 @@ public class DiskCache implements URLsDiskHandler, URLsWriter { Mono> urlKeyMono = Mono.fromCallable(() -> serializeUrl(url)); return fileMetadata .get(null, urlKeyMono) - .map(this::deserializeMetadata); + .map(prevBytesSend -> { + try (var prevBytes = prevBytesSend.receive()) { + return deserializeMetadata(prevBytes); + } + }); } @Override @@ -263,7 +270,10 @@ public class DiskCache implements URLsDiskHandler, URLsWriter { Send::close ) .map(serialized -> { - var diskMeta = deserializeMetadata(serialized); + DiskMetadata diskMeta; + try (var serializedBuf = serialized.receive()) { + diskMeta = deserializeMetadata(serializedBuf); + } var meta = diskMeta.asMetadata(); if (diskMeta.isDownloadedFully()) { return Tuples.of(meta, this.requestContent(url));