diff --git a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java index c70480efe..2098a25e6 100644 --- a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java @@ -48,6 +48,7 @@ import static net.openhft.chronicle.map.StatelessChronicleMap.EventId.*; */ class StatelessChronicleMap implements ChronicleMap, Closeable { + public static final String START_OF = "Attempt to write "; private static final Logger LOG = LoggerFactory.getLogger(StatelessChronicleMap.class); public static final byte STATELESS_CLIENT_IDENTIFIER = (byte) -127; @@ -1112,12 +1113,23 @@ class StatelessChronicleMap implements ChronicleMap, Closeable { long start = bytes.position(); for (; ; ) { try { - + bytes.limit(bytes.capacity()); keyValueSerializer.writeValue(value, bytes, null); return; } catch (IllegalArgumentException e) { - resizeBuffer((int) (bytes.capacity() + maxEntrySize), start); + String message = e.getMessage(); + if (message.startsWith(START_OF)) { + String substring = message.substring("Attempt to write ".length(), message.length()); + int i = substring.indexOf(' '); + if (i != -1) { + int size = Integer.parseInt(substring.substring(0, i)); + resizeBuffer(size+ maxEntrySize, start); + } else + resizeBuffer((int) (bytes.capacity() + maxEntrySize), start); + } + + } catch (IllegalStateException e) { if (e.getMessage().contains("Not enough available space")) resizeBuffer((int) (bytes.capacity() + maxEntrySize), start); diff --git a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java index a1e48da95..6e55c113e 100644 --- a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java +++ b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java @@ -2019,6 +2019,7 @@ class KeyValueSerializer { } void writeValue(V value, Bytes writer, ThreadLocalCopies threadLocal) { + assert writer.limit() == writer.capacity(); writer.writeBoolean(value == null); diff --git a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java b/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java index 8ba5aa015..50aba3975 100644 --- a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java +++ b/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java @@ -263,13 +263,13 @@ public class StatelessClientTest { final Map data = new HashMap(); - for (int i = 0; i < 60; i++) { - data.put("" + i, new String(new char[10])); + String value = new String(new char[10]); + for (int i = 0; i < 1000; i++) { + data.put("" + i, value); } try (ChronicleMap serverMap = ChronicleMapBuilder.of(String.class, Map .class) - .entrySize(1024) .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create()) { try (ChronicleMap statelessMap = ChronicleMapBuilder.of(String.class, Map