diff --git a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java index 9b9316d76..09ab6cd15 100644 --- a/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/StatelessChronicleMap.java @@ -114,6 +114,7 @@ class StatelessChronicleMap implements ChronicleMap, Closeable, Clon PUT_IF_ABSENT, REMOVE_WITH_VALUE, TO_STRING, + VERSION, PUT_ALL, PUT_ALL_WITHOUT_ACC, HASH_CODE, @@ -431,6 +432,11 @@ class StatelessChronicleMap implements ChronicleMap, Closeable, Clon return fetchObject(String.class, TO_STRING); } + @NotNull + public String version() { + return fetchObject(String.class, VERSION); + } + public boolean isEmpty() { return fetchBoolean(IS_EMPTY); } diff --git a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java index 6f64b38dd..5a4364ef0 100644 --- a/src/main/java/net/openhft/chronicle/map/TcpReplicator.java +++ b/src/main/java/net/openhft/chronicle/map/TcpReplicator.java @@ -1485,9 +1485,13 @@ class StatelessServerConnector { case REMOVE_WITH_VALUE: return removeWithValue(reader, writer.in(), sizeLocation, timestamp, identifier); + case TO_STRING: return toString(writer.in(), sizeLocation); + case VERSION: + return version(writer.in(), sizeLocation); + case PUT_ALL: return putAll(reader, writer.in(), sizeLocation, timestamp, identifier); @@ -1609,6 +1613,25 @@ class StatelessServerConnector { return null; } + + @Nullable + private Work version(@NotNull Bytes writer, final long sizeLocation) { + + + final long remaining = writer.remaining(); + try { + String result = map.version(); + writer.writeObject(result); + } catch (Throwable e) { + return sendException(writer, sizeLocation, e); + } + + assert remaining > 4; + + writeSizeAndFlags(sizeLocation, false, writer); + return null; + } + @SuppressWarnings("SameReturnValue") @Nullable private Work sendException(@NotNull Bytes writer, long sizeLocation, @NotNull Throwable e) { diff --git a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java b/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java index b8a04593c..937dd5802 100644 --- a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java +++ b/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java @@ -120,6 +120,7 @@ public class StatelessClientTest { .statelessClient(new InetSocketAddress("localhost", port)).create()) { String actual = statelessMap.getMapped(10, ToString.INSTANCE); + assertEquals("{10=Hello World}", statelessMap.toString()); assertEquals("Hello World", actual); } } @@ -677,6 +678,24 @@ public class StatelessClientTest { } } + @Test(timeout = 10000) + public void testGetServerVersion() throws IOException, InterruptedException { + int port = s_port++; + try (ChronicleMap serverMap = ChronicleMapBuilder + .of(Integer.class, StringBuilder.class) + .replication((byte) 2, TcpTransportAndNetworkConfig.of(port)) + .create()) { + + try (ChronicleMap statelessMap = ChronicleMapBuilder.of(Integer + .class, StringBuilder.class) + .statelessClient(new InetSocketAddress("localhost", port)).create()) { + + assertTrue(!((StatelessChronicleMap) statelessMap).version().isEmpty()); + + } + } + } + }