From fa4ecf828d73c33401b8a97b341efdae4300da0a Mon Sep 17 00:00:00 2001 From: Peter Lawrey Date: Thu, 13 Nov 2014 00:09:11 +0000 Subject: [PATCH] Improve closing of resources on windows system. --- .../chronicle/map/CloseablesManager.java | 22 +- .../chronicle/map/VanillaChronicleMap.java | 2 +- .../chronicle/map/ChronicleMapTest.java | 4 + .../chronicle/map/StatelessClientTest.java | 441 ------------------ .../TCPSocketReplication3VoidValueTest.java | 8 +- ...cketReplication3wayPutReturnsNullTest.java | 8 +- .../map/TCPSocketReplication3wayTest.java | 8 +- 7 files changed, 25 insertions(+), 468 deletions(-) mode change 100644 => 100755 src/main/java/net/openhft/chronicle/map/CloseablesManager.java mode change 100644 => 100755 src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java mode change 100644 => 100755 src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java delete mode 100755 src/test/java/net/openhft/chronicle/map/StatelessClientTest.java mode change 100644 => 100755 src/test/java/net/openhft/chronicle/map/TCPSocketReplication3VoidValueTest.java mode change 100644 => 100755 src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayPutReturnsNullTest.java mode change 100644 => 100755 src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayTest.java diff --git a/src/main/java/net/openhft/chronicle/map/CloseablesManager.java b/src/main/java/net/openhft/chronicle/map/CloseablesManager.java old mode 100644 new mode 100755 index adb89ed18..a2024a95d --- a/src/main/java/net/openhft/chronicle/map/CloseablesManager.java +++ b/src/main/java/net/openhft/chronicle/map/CloseablesManager.java @@ -23,38 +23,31 @@ import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; final class CloseablesManager implements Closeable { private static final Logger LOG = LoggerFactory.getLogger(CloseablesManager.class.getName()); - - private final Set closeables = new LinkedHashSet(); + private final List closeables = new ArrayList<>(); public synchronized void add(Closeable closeable) { if (closeable == null) throw new NullPointerException(); - closeables.add(closeable); + if (!closeables.contains(closeable)) + closeables.add(closeable); } public synchronized void close(Closeable closeable) throws IOException { - - for (Iterator iterator = closeables.iterator(); iterator.hasNext(); ) { - if (iterator.next() == closeable) - iterator.remove(); - } + closeables.remove(closeable); closeable.close(); } public synchronized void closeQuietly(Closeable closeable) { try { close(closeable); - } catch (IllegalStateException e) { - // this can occur if already closed ( for example closed is called from another thread ) } catch (IOException e) { LOG.error("", e); } @@ -63,7 +56,8 @@ final class CloseablesManager implements Closeable { @Override public synchronized void close() throws IOException { IOException ex = null; - for (Closeable closeable : closeables) { + for (int i = closeables.size() - 1; i >= 0; i--) { + Closeable closeable = closeables.get(i); try { closeable.close(); } catch (IOException e) { diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java old mode 100644 new mode 100755 index 192e76cc6..d8e45fb3a --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -945,7 +945,7 @@ class VanillaChronicleMap, } } - private V putWithoutLock(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V value, long hash2, boolean replaceIfPresent) { + V putWithoutLock(ThreadLocalCopies copies, MKI metaKeyInterop, KI keyInterop, K key, V value, long hash2, boolean replaceIfPresent) { long keySize = metaKeyInterop.size(keyInterop, key); hashLookup.startSearch(hash2); for (long pos; (pos = hashLookup.nextPos()) >= 0L; ) { diff --git a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java old mode 100644 new mode 100755 index cb4d827cf..941a1cf87 --- a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java @@ -758,6 +758,10 @@ public class ChronicleMapTest { for (long j = t % independence; j < entries + independence - 1; j += independence) { key.setValue(j * factor); long n; +/* + map.acquireUsing(key, value); + n = value.addAtomicValue(1); +*/ try (WriteContext wc = map.acquireUsingLocked(key, value)) { n = value.addValue(1); } diff --git a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java b/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java deleted file mode 100755 index f8db94e04..000000000 --- a/src/test/java/net/openhft/chronicle/map/StatelessClientTest.java +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright 2014 Higher Frequency Trading - * - * http://www.higherfrequencytrading.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.openhft.chronicle.map; - -import net.openhft.chronicle.hash.replication.TcpTransportAndNetworkConfig; -import org.junit.Assert; -import org.junit.Test; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - - -/** - * @author Rob Austin. - */ -public class StatelessClientTest { - public static final int SIZE = 100000; - - @Test(timeout = 5000) - public void testBufferOverFlowPutAllAndEntrySet() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - } - - - Map payload = new HashMap(); - - for (int i = 0; i < SIZE; i++) { - payload.put(i, "some value=" + i); - } - - - statelessMap.putAll(payload); - - - Set> entries = statelessMap.entrySet(); - - Map.Entry next = entries.iterator().next(); - Assert.assertEquals("some value=" + next.getKey(), next.getValue()); - - Assert.assertEquals(entries.size(), SIZE); - - serverMap.close(); - statelessMap.close(); - } - - - @Test - public void testBufferOverFlowPutAllAndValues() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - } - - - Map payload = new HashMap(); - - for (int i = 0; i < SIZE; i++) { - payload.put(i, "some value=" + i); - } - - - statelessMap.putAll(payload); - - - Collection values = statelessMap.values(); - - - Assert.assertEquals(values.size(), SIZE); - - serverMap.close(); - statelessMap.close(); - } - - - @Test - public void testBufferOverFlowPutAllAndKeySet() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - } - - - Map payload = new HashMap(); - - for (int i = 0; i < SIZE; i++) { - payload.put(i, "some value=" + i); - } - - - statelessMap.putAll(payload); - - - final Set keys = statelessMap.keySet(); - - Assert.assertEquals(keys.size(), payload.size()); - - - serverMap.close(); - statelessMap.close(); - } - - - @Test - public void test() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - - serverMap.put(10, "EXAMPLE-10"); - } - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - - Assert.assertEquals("EXAMPLE-10", statelessMap.get(10)); - Assert.assertEquals(1, statelessMap.size()); - } - - serverMap.close(); - statelessMap.close(); - - } - - - @Test - public void testClientCreatedBeforeServer() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - - serverMap.put(10, "EXAMPLE-10"); - } - - - Assert.assertEquals("EXAMPLE-10", statelessMap.get(10)); - Assert.assertEquals(1, statelessMap.size()); - - serverMap.close(); - statelessMap.close(); - - } - - - @Test - public void testBufferOverFlowPutAll() throws IOException, InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - } - - - Map payload = new HashMap(); - - for (int i = 0; i < SIZE; i++) { - payload.put(i, "some value=" + i); - } - - - statelessMap.putAll(payload); - - int value = SIZE - 10; - - Assert.assertEquals("some value=" + value, statelessMap.get(value)); - Assert.assertEquals(SIZE, statelessMap.size()); - - serverMap.close(); - statelessMap.close(); - - } - - - @Test - public void testBufferOverFlowPutAllWherePutReturnsNull() throws IOException, - InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .putReturnsNull(true) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)) - .putReturnsNull(true) - .create(); - } - - - Map payload = new HashMap(); - - for (int i = 0; i < SIZE; i++) { - payload.put(i, "some value=" + i); - } - - - statelessMap.putAll(payload); - - int value = SIZE - 10; - - Assert.assertEquals("some value=" + value, statelessMap.get(value)); - Assert.assertEquals(SIZE, statelessMap.size()); - - serverMap.close(); - statelessMap.close(); - - } - - - @Test - public void testPutWherePutReturnsNull() throws IOException, - InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .putReturnsNull(true) - .removeReturnsNull(true) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)) - .putReturnsNull(true) - .removeReturnsNull(true) - .create(); - } - - - statelessMap.put(1, "some value"); - - Assert.assertEquals("some value", statelessMap.get(1)); - Assert.assertEquals(1, statelessMap.size()); - - - serverMap.close(); - statelessMap.close(); - - } - - - @Test - public void testRemoveWhereRemoveReturnsNull() throws IOException, - InterruptedException { - - final ChronicleMap serverMap; - final ChronicleMap statelessMap; - - - // stateless client - { - statelessMap = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .putReturnsNull(true) - .removeReturnsNull(true) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - } - - // server - { - serverMap = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)) - .putReturnsNull(true) - .removeReturnsNull(true) - .create(); - } - - - statelessMap.put(1, "some value"); - - Assert.assertEquals("some value", statelessMap.get(1)); - Assert.assertEquals(1, statelessMap.size()); - - statelessMap.remove(1); - - Assert.assertEquals(null, statelessMap.get(1)); - Assert.assertEquals(0, statelessMap.size()); - - serverMap.close(); - statelessMap.close(); - - } - - @Test - public void testEquals() throws IOException, InterruptedException { - - final ChronicleMap serverMap1; - final ChronicleMap serverMap2; - final ChronicleMap statelessMap1; - final ChronicleMap statelessMap2; - - // stateless client - { - statelessMap1 = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8056)).create(); - statelessMap2 = ChronicleMapBuilder.of(Integer - .class, CharSequence.class) - .statelessClient(new InetSocketAddress("localhost", 8077)).create(); - } - - // server - { - serverMap1 = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8056)).create(); - serverMap2 = ChronicleMapBuilder.of(Integer.class, CharSequence.class) - .replication((byte) 2, TcpTransportAndNetworkConfig.of(8077)).create(); - - } - - - Map payload = new HashMap(); - for (int i = 0; i < 1000; i++) { - payload.put(i, "some value=" + i); - } - - statelessMap1.putAll(payload); - Assert.assertTrue(statelessMap1.equals(payload)); - - - statelessMap1.close(); - statelessMap2.close(); - - serverMap1.close(); - serverMap2.close(); - - } - - -} - diff --git a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3VoidValueTest.java b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3VoidValueTest.java old mode 100644 new mode 100755 index a1bd1d062..9a4dcee0a --- a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3VoidValueTest.java +++ b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3VoidValueTest.java @@ -44,10 +44,10 @@ public class TCPSocketReplication3VoidValueTest { @Before public void setup() throws IOException { - map1 = newMapVoid((byte) 1, 8086, new InetSocketAddress("localhost", 8087), - new InetSocketAddress("localhost", 8089)); - map2 = newMapVoid((byte) 2, 8087, new InetSocketAddress("localhost", 8089)); - map3 = newMapVoid((byte) 3, 8089); + map1 = newMapVoid((byte) 1, 8036, new InetSocketAddress("localhost", 8037), + new InetSocketAddress("localhost", 8039)); + map2 = newMapVoid((byte) 2, 8037, new InetSocketAddress("localhost", 8039)); + map3 = newMapVoid((byte) 3, 8039); } @After diff --git a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayPutReturnsNullTest.java b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayPutReturnsNullTest.java old mode 100644 new mode 100755 index 4eb220d96..02b00f377 --- a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayPutReturnsNullTest.java +++ b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayPutReturnsNullTest.java @@ -58,10 +58,10 @@ public class TCPSocketReplication3wayPutReturnsNullTest { @Before public void setup() throws IOException { - map1 = newTcpSocketShmIntString((byte) 1, 8076, new InetSocketAddress("localhost", 8077), - new InetSocketAddress("localhost", 8078)); - map2 = newTcpSocketShmIntString((byte) 2, 8077, new InetSocketAddress("localhost", 8078)); - map3 = newTcpSocketShmIntString((byte) 3, 8078); + map1 = newTcpSocketShmIntString((byte) 1, 8026, new InetSocketAddress("localhost", 8027), + new InetSocketAddress("localhost", 8028)); + map2 = newTcpSocketShmIntString((byte) 2, 8027, new InetSocketAddress("localhost", 8028)); + map3 = newTcpSocketShmIntString((byte) 3, 8028); } @After diff --git a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayTest.java b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayTest.java old mode 100644 new mode 100755 index 9892f0404..7c359968b --- a/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayTest.java +++ b/src/test/java/net/openhft/chronicle/map/TCPSocketReplication3wayTest.java @@ -44,10 +44,10 @@ public class TCPSocketReplication3wayTest { @Before public void setup() throws IOException { - map1 = newTcpSocketShmIntString((byte) 1, 8076, new InetSocketAddress("localhost", 8077), - new InetSocketAddress("localhost", 8079)); - map2 = newTcpSocketShmIntString((byte) 2, 8077, new InetSocketAddress("localhost", 8079)); - map3 = newTcpSocketShmIntString((byte) 3, 8079); + map1 = newTcpSocketShmIntString((byte) 1, 8026, new InetSocketAddress("localhost", 8027), + new InetSocketAddress("localhost", 8029)); + map2 = newTcpSocketShmIntString((byte) 2, 8027, new InetSocketAddress("localhost", 8029)); + map3 = newTcpSocketShmIntString((byte) 3, 8029); } @After