Ensure the chunk size is a multiple of the alignment, closed https://github.com/OpenHFT/Chronicle-Map/issues/169

This commit is contained in:
Peter Lawrey
2019-05-09 12:28:04 +01:00
parent a165c357d1
commit 1a36f1bbc6
4 changed files with 37 additions and 14 deletions
+2 -2
View File
@@ -708,8 +708,8 @@ public abstract class VanillaChronicleHash<K,
// int division is MUCH faster than long on Intel CPUs
if (sizeInBytes <= Integer.MAX_VALUE)
return (((int) sizeInBytes) / (int) chunkSize) + 1;
return (int) (sizeInBytes / chunkSize) + 1;
return (int) (sizeInBytes + chunkSize - 1) / (int) chunkSize;
return Math.toIntExact((sizeInBytes + chunkSize - 1) / chunkSize);
}
public final int size() {
@@ -102,4 +102,9 @@ public class ByteArrayDataAccess extends AbstractData<byte[]> implements DataAcc
// no fields to read
initTransients();
}
@Override
public String toString() {
return new String(array, 0, 0, array.length);
}
}
@@ -730,6 +730,8 @@ public final class ChronicleMapBuilder<K, V> implements
}
if (actualChunkSize <= 0)
throw new IllegalArgumentException("Chunk size must be positive");
if (alignment > 0 && actualChunkSize % alignment != 0)
throw new IllegalArgumentException("The chunk size (" + actualChunkSize + ") must be a multiple of the alignment (" + alignment + ")");
this.actualChunkSize = actualChunkSize;
return this;
}
@@ -928,16 +930,25 @@ public final class ChronicleMapBuilder<K, V> implements
}
if (Jvm.isArm() && alignment < 8)
return this;
validateAlignment(actualChunkSize, actualChunkSize, alignment);
this.alignment = alignment;
return this;
}
public void validateAlignment(int ifSet, int actualChunkSize, int alignment) {
if (ifSet > 0 && actualChunkSize % alignment != 0)
throw new IllegalArgumentException("The chunk size (" + actualChunkSize + ") must be a multiple of the alignment (" + alignment + ")");
}
int valueAlignment() {
if (alignment != UNDEFINED_ALIGNMENT_CONFIG)
return alignment;
try {
if (Values.isValueInterfaceOrImplClass(valueBuilder.tClass)) {
return ValueModel.acquire(valueBuilder.tClass).recommendedOffsetAlignment();
int alignment = ValueModel.acquire(valueBuilder.tClass).recommendedOffsetAlignment();
validateAlignment(alignment, actualChunkSize, alignment);
return alignment;
} else {
return NO_ALIGNMENT;
}