diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/AbstractCharSequenceUtf8DataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/AbstractCharSequenceUtf8DataAccess.java index cea2023fa..d35938ef7 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/AbstractCharSequenceUtf8DataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/AbstractCharSequenceUtf8DataAccess.java @@ -27,6 +27,8 @@ import net.openhft.chronicle.wire.WireIn; import net.openhft.chronicle.wire.WireOut; import org.jetbrains.annotations.NotNull; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; + abstract class AbstractCharSequenceUtf8DataAccess extends AbstractData implements DataAccess, Data { @@ -36,12 +38,12 @@ abstract class AbstractCharSequenceUtf8DataAccess extend /** State field */ transient T cs; - AbstractCharSequenceUtf8DataAccess() { - initTransients(); + AbstractCharSequenceUtf8DataAccess(long bytesCapacity) { + initTransients(bytesCapacity); } - private void initTransients() { - bytes = DefaultElasticBytes.allocateDefaultElasticBytes(); + private void initTransients(long bytesCapacity) { + bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity); } @Override @@ -60,7 +62,7 @@ abstract class AbstractCharSequenceUtf8DataAccess extend @Override public void readMarshallable(@NotNull WireIn wireIn) { // no config fields to read - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/BytesMarshallableDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/BytesMarshallableDataAccess.java index 4aec10627..e9347c330 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/BytesMarshallableDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/BytesMarshallableDataAccess.java @@ -24,6 +24,8 @@ import net.openhft.chronicle.wire.WireIn; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; + public class BytesMarshallableDataAccess extends InstanceCreatingMarshaller implements DataAccess, Data { @@ -36,18 +38,22 @@ public class BytesMarshallableDataAccess private transient T instance; public BytesMarshallableDataAccess(Class tClass) { + this(tClass, DEFAULT_BYTES_CAPACITY); + } + + private BytesMarshallableDataAccess(Class tClass, long bytesCapacity) { super(tClass); - initTransients(); + initTransients(bytesCapacity); } @Override public void readMarshallable(@NotNull WireIn wireIn) { super.readMarshallable(wireIn); - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } - private void initTransients() { - bytes = DefaultElasticBytes.allocateDefaultElasticBytes(); + private void initTransients(long bytesCapacity) { + bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity); targetBytes = VanillaBytes.vanillaBytes(); } @@ -133,6 +139,6 @@ public class BytesMarshallableDataAccess @Override public DataAccess copy() { - return new BytesMarshallableDataAccess<>(tClass()); + return new BytesMarshallableDataAccess<>(tClass(), bytes.realCapacity()); } } diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceSizedWriter.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceSizedWriter.java index f0309e329..1cf042f1b 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceSizedWriter.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceSizedWriter.java @@ -23,7 +23,10 @@ import net.openhft.chronicle.hash.serialization.SizedWriter; import org.jetbrains.annotations.NotNull; /** - * @deprecated use one of {@link AbstractCharSequenceUtf8DataAccess} subclasses instead + * @deprecated use one of {@link AbstractCharSequenceUtf8DataAccess} subclasses instead. This class + * is not removed, because users who created a chronicleMap with older version of the library with + * this class as the key or value writer should be able to read and access the map with the present + * version of the library. */ @Deprecated @SuppressWarnings("deprecation") diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceUtf8DataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceUtf8DataAccess.java index 9a1a8e86f..74f6da962 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceUtf8DataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/CharSequenceUtf8DataAccess.java @@ -23,6 +23,14 @@ import org.jetbrains.annotations.Nullable; public final class CharSequenceUtf8DataAccess extends AbstractCharSequenceUtf8DataAccess { + public CharSequenceUtf8DataAccess() { + this(DefaultElasticBytes.DEFAULT_BYTES_CAPACITY); + } + + private CharSequenceUtf8DataAccess(long bytesCapacity) { + super(bytesCapacity); + } + @Override public CharSequence getUsing(@Nullable CharSequence using) { StringBuilder sb; @@ -38,6 +46,6 @@ public final class CharSequenceUtf8DataAccess @Override public DataAccess copy() { - return new CharSequenceUtf8DataAccess(); + return new CharSequenceUtf8DataAccess(bytes().realCapacity()); } } diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/DefaultElasticBytes.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/DefaultElasticBytes.java index c20fe3079..dc4e52684 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/DefaultElasticBytes.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/DefaultElasticBytes.java @@ -21,8 +21,14 @@ import net.openhft.chronicle.bytes.Bytes; final class DefaultElasticBytes { - public static Bytes allocateDefaultElasticBytes() { - return Bytes.elasticHeapByteBuffer(32); + static final int DEFAULT_BYTES_CAPACITY = 32; + + static Bytes allocateDefaultElasticBytes(long bytesCapacity) { + if (bytesCapacity <= Bytes.MAX_BYTE_BUFFER_CAPACITY) { + return Bytes.elasticHeapByteBuffer((int) bytesCapacity); + } else { + return Bytes.allocateElasticDirect(bytesCapacity); + } } private DefaultElasticBytes() {} diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalBytesMarshallableDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalBytesMarshallableDataAccess.java index 508d8636b..4989277d0 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalBytesMarshallableDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalBytesMarshallableDataAccess.java @@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static net.openhft.chronicle.hash.serialization.StatefulCopyable.copyIfNeeded; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; public class ExternalBytesMarshallableDataAccess extends InstanceCreatingMarshaller implements DataAccess, Data { @@ -45,14 +46,20 @@ public class ExternalBytesMarshallableDataAccess extends InstanceCreatingMars public ExternalBytesMarshallableDataAccess( Class tClass, SizedReader reader, BytesWriter writer) { + this(tClass, reader, writer, DEFAULT_BYTES_CAPACITY); + } + + private ExternalBytesMarshallableDataAccess( + Class tClass, SizedReader reader, BytesWriter writer, + long bytesCapacity) { super(tClass); this.writer = writer; this.reader = reader; - initTransients(); + initTransients(bytesCapacity); } - private void initTransients() { - bytes = DefaultElasticBytes.allocateDefaultElasticBytes(); + private void initTransients(long bytesCapacity) { + bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity); } @Override @@ -115,7 +122,7 @@ public class ExternalBytesMarshallableDataAccess extends InstanceCreatingMars @Override public DataAccess copy() { return new ExternalBytesMarshallableDataAccess<>( - tClass(), copyIfNeeded(reader), copyIfNeeded(writer)); + tClass(), copyIfNeeded(reader), copyIfNeeded(writer), bytes.realCapacity()); } @Override @@ -123,7 +130,7 @@ public class ExternalBytesMarshallableDataAccess extends InstanceCreatingMars super.readMarshallable(wireIn); reader = wireIn.read(() -> "reader").typedMarshallable(); writer = wireIn.read(() -> "writer").typedMarshallable(); - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalizableDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalizableDataAccess.java index 35dcaee15..b03d14cf2 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalizableDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ExternalizableDataAccess.java @@ -29,12 +29,19 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; + public class ExternalizableDataAccess extends SerializableDataAccess { /** Config field */ private Class tClass; public ExternalizableDataAccess(Class tClass) { + this(tClass, DEFAULT_BYTES_CAPACITY); + } + + private ExternalizableDataAccess(Class tClass, long bytesCapacity) { + super(bytesCapacity); this.tClass = tClass; } @@ -80,13 +87,13 @@ public class ExternalizableDataAccess extends Serializ @Override public DataAccess copy() { - return new ExternalizableDataAccess<>(tClass); + return new ExternalizableDataAccess<>(tClass, bytes.realCapacity()); } @Override public void readMarshallable(@NotNull WireIn wireIn) { tClass = wireIn.read(() -> "tClass").typeLiteral(); - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/SerializableDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/SerializableDataAccess.java index 50747b875..7ca2b7763 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/SerializableDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/SerializableDataAccess.java @@ -29,6 +29,8 @@ import org.jetbrains.annotations.Nullable; import java.io.*; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; + public class SerializableDataAccess extends AbstractData implements DataAccess { @@ -41,11 +43,15 @@ public class SerializableDataAccess extends AbstractData transient T instance; public SerializableDataAccess() { - initTransients(); + this(DEFAULT_BYTES_CAPACITY); } - void initTransients() { - bytes = DefaultElasticBytes.allocateDefaultElasticBytes(); + SerializableDataAccess(long bytesCapacity) { + initTransients(bytesCapacity); + } + + void initTransients(long bytesCapacity) { + bytes = DefaultElasticBytes.allocateDefaultElasticBytes(bytesCapacity); out = bytes.outputStream(); in = bytes.inputStream(); } @@ -103,13 +109,13 @@ public class SerializableDataAccess extends AbstractData @Override public DataAccess copy() { - return new SerializableDataAccess<>(); + return new SerializableDataAccess<>(bytes.realCapacity()); } @Override public void readMarshallable(@NotNull WireIn wireIn) { // no fields to read - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/SizedMarshallableDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/SizedMarshallableDataAccess.java index 31515db27..2dbc88378 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/SizedMarshallableDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/SizedMarshallableDataAccess.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static net.openhft.chronicle.hash.serialization.StatefulCopyable.copyIfNeeded; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; public class SizedMarshallableDataAccess extends InstanceCreatingMarshaller implements DataAccess, Data { @@ -47,10 +48,16 @@ public class SizedMarshallableDataAccess extends InstanceCreatingMarshaller tClass, SizedReader sizedReader, SizedWriter sizedWriter) { + this(tClass, sizedReader, sizedWriter, DEFAULT_BYTES_CAPACITY); + } + + private SizedMarshallableDataAccess( + Class tClass, SizedReader sizedReader, SizedWriter sizedWriter, + long bytesCapacity) { super(tClass); this.sizedWriter = sizedWriter; this.sizedReader = sizedReader; - initTransients(); + initTransients(bytesCapacity); } SizedReader sizedReader() { @@ -61,8 +68,8 @@ public class SizedMarshallableDataAccess extends InstanceCreatingMarshaller extends InstanceCreatingMarshaller copy() { return new SizedMarshallableDataAccess<>( - tClass(), copyIfNeeded(sizedReader), copyIfNeeded(sizedWriter)); + tClass(), copyIfNeeded(sizedReader), copyIfNeeded(sizedWriter), + bytes.realCapacity()); } @Override @@ -151,7 +159,7 @@ public class SizedMarshallableDataAccess extends InstanceCreatingMarshaller "sizedReader").typedMarshallable(); sizedWriter = wireIn.read(() -> "sizedWriter").typedMarshallable(); - initTransients(); + initTransients(DEFAULT_BYTES_CAPACITY); } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringBuilderUtf8DataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringBuilderUtf8DataAccess.java index 57178d53a..123a99d04 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringBuilderUtf8DataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringBuilderUtf8DataAccess.java @@ -20,9 +20,19 @@ package net.openhft.chronicle.hash.serialization.impl; import net.openhft.chronicle.hash.serialization.DataAccess; import org.jetbrains.annotations.Nullable; +import static net.openhft.chronicle.hash.serialization.impl.DefaultElasticBytes.DEFAULT_BYTES_CAPACITY; + public final class StringBuilderUtf8DataAccess extends AbstractCharSequenceUtf8DataAccess { + public StringBuilderUtf8DataAccess() { + this(DEFAULT_BYTES_CAPACITY); + } + + private StringBuilderUtf8DataAccess(long bytesCapacity) { + super(bytesCapacity); + } + @Override public StringBuilder getUsing(@Nullable StringBuilder using) { if (using != null) { @@ -36,6 +46,6 @@ public final class StringBuilderUtf8DataAccess @Override public DataAccess copy() { - return new StringBuilderUtf8DataAccess(); + return new StringBuilderUtf8DataAccess(bytes().realCapacity()); } } diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringUtf8DataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringUtf8DataAccess.java index eb7fbe887..96e931175 100644 --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringUtf8DataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/StringUtf8DataAccess.java @@ -22,6 +22,14 @@ import org.jetbrains.annotations.Nullable; public final class StringUtf8DataAccess extends AbstractCharSequenceUtf8DataAccess { + public StringUtf8DataAccess() { + this(DefaultElasticBytes.DEFAULT_BYTES_CAPACITY); + } + + private StringUtf8DataAccess(long bytesCapacity) { + super(bytesCapacity); + } + @Override public String getUsing(@Nullable String using) { return cs; @@ -29,6 +37,6 @@ public final class StringUtf8DataAccess extends AbstractCharSequenceUtf8DataAcce @Override public DataAccess copy() { - return new StringUtf8DataAccess(); + return new StringUtf8DataAccess(bytes().realCapacity()); } }