Support up to 2PiB file size
This commit is contained in:
parent
952765e4f4
commit
a607eed212
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
package org.warp.filesponge;
|
package org.warp.filesponge;
|
||||||
|
|
||||||
|
import static java.lang.Math.toIntExact;
|
||||||
|
|
||||||
import io.netty5.buffer.api.Buffer;
|
import io.netty5.buffer.api.Buffer;
|
||||||
import io.netty5.buffer.api.Drop;
|
import io.netty5.buffer.api.Drop;
|
||||||
import io.netty5.buffer.api.Owned;
|
import io.netty5.buffer.api.Owned;
|
||||||
@ -54,11 +56,11 @@ public final class DataBlock extends ResourceSupport<DataBlock, DataBlock> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public static DataBlock of(int offset, int length, Send<Buffer> data) {
|
public static DataBlock of(long offset, int length, Send<Buffer> data) {
|
||||||
return new DataBlock(offset, length, data);
|
return new DataBlock(offset, length, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DataBlock(int offset, int length, Send<Buffer> data) {
|
private DataBlock(long offset, int length, Send<Buffer> data) {
|
||||||
super(DROP);
|
super(DROP);
|
||||||
try (data) {
|
try (data) {
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
@ -67,7 +69,7 @@ public final class DataBlock extends ResourceSupport<DataBlock, DataBlock> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final int offset;
|
private final long offset;
|
||||||
private final int length;
|
private final int length;
|
||||||
private final Buffer data;
|
private final Buffer data;
|
||||||
|
|
||||||
@ -81,10 +83,10 @@ public final class DataBlock extends ResourceSupport<DataBlock, DataBlock> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
public int getId() {
|
||||||
return offset / FileSponge.BLOCK_SIZE;
|
return toIntExact(offset / FileSponge.BLOCK_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getOffset() {
|
public long getOffset() {
|
||||||
return this.offset;
|
return this.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +119,8 @@ public final class DataBlock extends ResourceSupport<DataBlock, DataBlock> {
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int PRIME = 59;
|
final int PRIME = 59;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = result * PRIME + this.getOffset();
|
long offset = this.getOffset();
|
||||||
|
result = result * PRIME + (int) (offset ^ (offset >>> 32));
|
||||||
result = result * PRIME + this.getLength();
|
result = result * PRIME + this.getLength();
|
||||||
final Object $data = this.getDataUnsafe();
|
final Object $data = this.getDataUnsafe();
|
||||||
result = result * PRIME + ($data == null ? 43 : $data.hashCode());
|
result = result * PRIME + ($data == null ? 43 : $data.hashCode());
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package org.warp.filesponge;
|
package org.warp.filesponge;
|
||||||
|
|
||||||
|
import static java.lang.Math.toIntExact;
|
||||||
import static org.warp.filesponge.FileSponge.BLOCK_SIZE;
|
import static org.warp.filesponge.FileSponge.BLOCK_SIZE;
|
||||||
|
|
||||||
import io.netty5.buffer.api.Buffer;
|
import io.netty5.buffer.api.Buffer;
|
||||||
@ -208,7 +209,7 @@ public class DiskCache implements URLsDiskHandler, URLsWriter {
|
|||||||
// Get only downloaded blocks
|
// Get only downloaded blocks
|
||||||
.filter(Tuple2::getT2)
|
.filter(Tuple2::getT2)
|
||||||
.flatMapSequential(blockMeta -> {
|
.flatMapSequential(blockMeta -> {
|
||||||
int blockId = Math.toIntExact(blockMeta.getT1());
|
int blockId = toIntExact(blockMeta.getT1());
|
||||||
boolean downloaded = blockMeta.getT2();
|
boolean downloaded = blockMeta.getT2();
|
||||||
if (!downloaded) {
|
if (!downloaded) {
|
||||||
return Mono.empty();
|
return Mono.empty();
|
||||||
@ -218,7 +219,7 @@ public class DiskCache implements URLsDiskHandler, URLsWriter {
|
|||||||
.get(null, blockKeyMono)
|
.get(null, blockKeyMono)
|
||||||
.map(data -> {
|
.map(data -> {
|
||||||
try (data) {
|
try (data) {
|
||||||
int blockOffset = getBlockOffset(blockId);
|
long blockOffset = getBlockOffset(blockId);
|
||||||
int blockLength = data.readableBytes();
|
int blockLength = data.readableBytes();
|
||||||
if (meta.size() != -1) {
|
if (meta.size() != -1) {
|
||||||
if (blockOffset + blockLength >= meta.size()) {
|
if (blockOffset + blockLength >= meta.size()) {
|
||||||
@ -245,8 +246,8 @@ public class DiskCache implements URLsDiskHandler, URLsWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getBlockOffset(int blockId) {
|
private static long getBlockOffset(int blockId) {
|
||||||
return blockId * BLOCK_SIZE;
|
return blockId * (long) BLOCK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
package org.warp.filesponge;
|
package org.warp.filesponge;
|
||||||
|
|
||||||
|
import static java.lang.Math.toIntExact;
|
||||||
|
|
||||||
import io.netty5.buffer.api.Buffer;
|
import io.netty5.buffer.api.Buffer;
|
||||||
import io.netty5.buffer.api.BufferAllocator;
|
import io.netty5.buffer.api.BufferAllocator;
|
||||||
import io.netty5.buffer.api.Send;
|
import io.netty5.buffer.api.Send;
|
||||||
@ -32,7 +34,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
/**
|
/**
|
||||||
* size -1 = unknown size
|
* size -1 = unknown size
|
||||||
*/
|
*/
|
||||||
public record DiskMetadata(int size, BooleanArrayList downloadedBlocks) {
|
public record DiskMetadata(long size, BooleanArrayList downloadedBlocks) {
|
||||||
|
|
||||||
public boolean isDownloadedFully() {
|
public boolean isDownloadedFully() {
|
||||||
boolean downloadedFullyVal;
|
boolean downloadedFullyVal;
|
||||||
@ -57,11 +59,11 @@ public record DiskMetadata(int size, BooleanArrayList downloadedBlocks) {
|
|||||||
return expectedBlocksCount;
|
return expectedBlocksCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getBlocksCount(int size, int blockSize) {
|
public static int getBlocksCount(long size, int blockSize) {
|
||||||
if (size == -1) {
|
if (size == -1L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (size + (blockSize - size % blockSize)) / blockSize;
|
return toIntExact((size + (blockSize - size % blockSize)) / blockSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Metadata asMetadata() {
|
public Metadata asMetadata() {
|
||||||
@ -81,7 +83,13 @@ public record DiskMetadata(int size, BooleanArrayList downloadedBlocks) {
|
|||||||
@Override
|
@Override
|
||||||
public @NotNull DiskMetadata deserialize(@NotNull Buffer serialized) throws SerializationException {
|
public @NotNull DiskMetadata deserialize(@NotNull Buffer serialized) throws SerializationException {
|
||||||
var dis = new BufferDataInputShared(serialized);
|
var dis = new BufferDataInputShared(serialized);
|
||||||
int size = dis.readInt();
|
int legacySize = dis.readInt();
|
||||||
|
long size;
|
||||||
|
if (legacySize == -2) {
|
||||||
|
size = dis.readLong();
|
||||||
|
} else {
|
||||||
|
size = legacySize;
|
||||||
|
}
|
||||||
int blocksCount;
|
int blocksCount;
|
||||||
if (size == -1) {
|
if (size == -1) {
|
||||||
blocksCount = dis.readShort();
|
blocksCount = dis.readShort();
|
||||||
@ -98,7 +106,8 @@ public record DiskMetadata(int size, BooleanArrayList downloadedBlocks) {
|
|||||||
@Override
|
@Override
|
||||||
public void serialize(@NotNull DiskMetadata deserialized, Buffer output) throws SerializationException {
|
public void serialize(@NotNull DiskMetadata deserialized, Buffer output) throws SerializationException {
|
||||||
var dos = new BufferDataOutput(output);
|
var dos = new BufferDataOutput(output);
|
||||||
dos.writeInt(deserialized.size);
|
dos.writeInt(-2);
|
||||||
|
dos.writeLong(deserialized.size);
|
||||||
var blocksCount = deserialized.getBlocksCount();
|
var blocksCount = deserialized.getBlocksCount();
|
||||||
if (deserialized.size == -1) {
|
if (deserialized.size == -1) {
|
||||||
dos.writeShort(blocksCount);
|
dos.writeShort(blocksCount);
|
||||||
@ -110,7 +119,7 @@ public record DiskMetadata(int size, BooleanArrayList downloadedBlocks) {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSerializedSizeHint() {
|
public int getSerializedSizeHint() {
|
||||||
return Integer.BYTES;
|
return Integer.BYTES + Long.BYTES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,4 +22,4 @@ package org.warp.filesponge;
|
|||||||
/**
|
/**
|
||||||
* size -1 = unknown size
|
* size -1 = unknown size
|
||||||
*/
|
*/
|
||||||
public record Metadata(int size) {}
|
public record Metadata(long size) {}
|
||||||
|
Loading…
Reference in New Issue
Block a user