From 938d803ee56725889c8729bffee4719222e84c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Herman?= Date: Fri, 18 Aug 2017 11:28:29 +0200 Subject: [PATCH 1/6] Support for Hazelcast v3.9 --- pom.xml | 4 ++-- .../java/com/noctarius/snowcast/impl/ClientSequencer.java | 4 ++-- .../snowcast/impl/ClientSequencerConstructorFunction.java | 2 +- .../com/noctarius/snowcast/impl/InternalSequencerUtils.java | 2 ++ .../com/noctarius/snowcast/impl/NodeSequencerService.java | 5 +++-- .../java/com/noctarius/snowcast/impl/SnowcastConstants.java | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index d15a4ae..4f3a435 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ - 3.7.4 + 3.9-SNAPSHOT ${maven.build.timestamp} yyyy-MM-dd HH:mm @@ -258,7 +258,7 @@ *.impl.* true - http://docs.hazelcast.org/docs/3.7/javadoc/ + http://docs.hazelcast.org/docs/3.8/javadoc/ diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java index 16336b4..5739e99 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java @@ -42,9 +42,9 @@ public class ClientSequencer private final ClientSequencerService sequencerService; ClientSequencer(@Nonnull ClientSequencerService sequencerService, @Nonnull SequencerDefinition definition, - @Nonnull ClientCodec clientCodec) { + @Nonnull ClientCodec clientCodec, @Nonnull ClientContext clientContext) { - super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName()); + super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName(), clientContext); this.sequencerService = sequencerService; this.sequencerContext = new ClientSequencerContext(definition, clientCodec); } diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java index fb42cbe..8eb91fb 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java @@ -48,7 +48,7 @@ final class ClientSequencerConstructorFunction @Override public SequencerProvision createNew(@Nonnull SequencerDefinition definition) { TRACER.trace("create new provision for definition %s", definition); - ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec); + ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec, proxyManager.getContext()); initializeProxy(sequencer); sequencer.attachLogicalNode(); return new SequencerProvision(definition, sequencer); diff --git a/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java b/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java index 350f52e..02d405c 100644 --- a/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java +++ b/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java @@ -166,6 +166,8 @@ static SnowcastConstants.HazelcastVersion getHazelcastVersion() { return SnowcastConstants.HazelcastVersion.V_3_7; } else if (buildInfo.getVersion().startsWith("3.8")) { return SnowcastConstants.HazelcastVersion.V_3_8; + } else if (buildInfo.getVersion().startsWith("3.9")) { + return SnowcastConstants.HazelcastVersion.V_3_9; } return SnowcastConstants.HazelcastVersion.Unknown; } diff --git a/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java b/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java index 857e9e3..471ab25 100644 --- a/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java +++ b/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java @@ -77,7 +77,7 @@ public class NodeSequencerService implements SequencerService, ManagedService, MigrationAwareService, RemoteService, - EventPublishingService { + EventPublishingService { private static final MethodType FUTURE_GET_TYPE = MethodType.methodType(Object.class); private static final MethodType GET_LISTENER_GET_TYPE = MethodType.methodType(Object.class); @@ -376,7 +376,8 @@ private MethodHandle findFutureExecutorMethod() { if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_7) { return getFutureExecutorMethod(buildInfo, "com.hazelcast.spi.InternalCompletableFuture", "getSafely"); - } else if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_8) { + } else if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_8 || + InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_9) { return getFutureExecutorMethod(buildInfo, "java.util.concurrent.Future", "get"); } diff --git a/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java b/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java index 6722483..19844fc 100644 --- a/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java +++ b/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java @@ -98,7 +98,7 @@ public final class SnowcastConstants { private static final String SNOWCAST_LOGO_DISABLE_PROPERTY = "snowcast.logo.disable"; public enum HazelcastVersion { - V_3_7, V_3_8, Unknown + V_3_7, V_3_8, V_3_9, Unknown } static { From 69ac9ecf2e1bf0bd6ddf4966a62b81abe0f45732 Mon Sep 17 00:00:00 2001 From: lukasherman Date: Thu, 24 Aug 2017 17:29:31 +0200 Subject: [PATCH 2/6] Support for Hazelcast v3.9 - fixed backward compatibility issues --- .../snowcast/impl/ClientSequencer.java | 8 +- .../ClientSequencerConstructorFunction.java | 2 +- .../ClientSequencerConstructorFunction39.java | 96 +++++++++++++++++++ .../snowcast/impl/ClientSequencerService.java | 9 +- 4 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java index 5739e99..974c092 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java @@ -42,13 +42,17 @@ public class ClientSequencer private final ClientSequencerService sequencerService; ClientSequencer(@Nonnull ClientSequencerService sequencerService, @Nonnull SequencerDefinition definition, - @Nonnull ClientCodec clientCodec, @Nonnull ClientContext clientContext) { + @Nonnull ClientCodec clientCodec) { - super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName(), clientContext); + super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName()); this.sequencerService = sequencerService; this.sequencerContext = new ClientSequencerContext(definition, clientCodec); } + public void setClientContext(ClientContext clientContext) { + setContext(clientContext); + } + @Nonnull @Override public String getSequencerName() { diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java index 8eb91fb..fb42cbe 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java @@ -48,7 +48,7 @@ final class ClientSequencerConstructorFunction @Override public SequencerProvision createNew(@Nonnull SequencerDefinition definition) { TRACER.trace("create new provision for definition %s", definition); - ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec, proxyManager.getContext()); + ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec); initializeProxy(sequencer); sequencer.attachLogicalNode(); return new SequencerProvision(definition, sequencer); diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java new file mode 100644 index 0000000..cda0b79 --- /dev/null +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2015-2017, Christoph Engelbert (aka noctarius) and + * contributors. All rights reserved. + * + * 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 com.noctarius.snowcast.impl; + +import com.hazelcast.client.spi.ClientContext; +import com.hazelcast.client.spi.ClientProxy; +import com.hazelcast.client.spi.ProxyManager; +import com.hazelcast.util.ConstructorFunction; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import javax.annotation.Nonnull; + +final class ClientSequencerConstructorFunction39 + implements ConstructorFunction { + + private static final Tracer TRACER = TracingUtils.tracer(ClientSequencerConstructorFunction39.class); + + private final ClientCodec clientCodec; + private final ProxyManager proxyManager; + private final ClientSequencerService sequencerService; + private final MethodHandle proxyManagerInitialize; + private final MethodHandle proxyManagerGetContext; + + ClientSequencerConstructorFunction39(@Nonnull ProxyManager proxyManager, @Nonnull ClientSequencerService sequencerService, + @Nonnull ClientCodec clientCodec) { + + this.clientCodec = clientCodec; + this.proxyManager = proxyManager; + this.sequencerService = sequencerService; + this.proxyManagerInitialize = getInitializeMethod(); + this.proxyManagerGetContext = getGetContextMethod(); + } + + @Nonnull + @Override + public SequencerProvision createNew(@Nonnull SequencerDefinition definition) { + TRACER.trace("create new provision for definition %s", definition); + ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec); + sequencer.setClientContext(getClientContext(proxyManager)); + initializeProxy(sequencer); + sequencer.attachLogicalNode(); + return new SequencerProvision(definition, sequencer); + } + + private void initializeProxy(@Nonnull ClientSequencer sequencer) { + //ACCESSIBILITY_HACK + ExceptionUtils.execute(() -> { + TRACER.trace("initialize sequencer proxy %s", sequencer); + return proxyManagerInitialize.invoke(proxyManager, sequencer); + }); + } + + private ClientContext getClientContext(@Nonnull ProxyManager proxyManager) { + //ACCESSIBILITY_HACK + return ExceptionUtils.execute(() -> { + TRACER.trace("get client context %s", proxyManager); + return (ClientContext) proxyManagerGetContext.invoke(proxyManager); + }); + } + + @Nonnull + private MethodHandle getInitializeMethod() { + return ExceptionUtils.execute(() -> { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + Method method = ProxyManager.class.getDeclaredMethod("initialize", ClientProxy.class); + method.setAccessible(true); + return lookup.unreflect(method); + }); + } + + @Nonnull + private MethodHandle getGetContextMethod() { + return ExceptionUtils.execute(() -> { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + Method method = ProxyManager.class.getDeclaredMethod("getContext"); + method.setAccessible(true); + return lookup.unreflect(method); + }); + } +} diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java index 8187bb7..d5bb2e2 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java @@ -17,6 +17,7 @@ package com.noctarius.snowcast.impl; import com.hazelcast.client.spi.ProxyManager; +import com.hazelcast.util.ConstructorFunction; import com.noctarius.snowcast.SnowcastEpoch; import com.noctarius.snowcast.SnowcastSequenceState; import com.noctarius.snowcast.SnowcastSequencer; @@ -36,14 +37,18 @@ class ClientSequencerService private static final Tracer TRACER = TracingUtils.tracer(ClientSequencerService.class); - private final ClientSequencerConstructorFunction sequencerConstructor; + private final ConstructorFunction sequencerConstructor; private final ClientCodec clientCodec; private final ConcurrentMap provisions; ClientSequencerService(@Nonnull ProxyManager proxyManager, @Nonnull ClientCodec clientCodec) { - this.sequencerConstructor = new ClientSequencerConstructorFunction(proxyManager, this, clientCodec); + if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_9) { + this.sequencerConstructor = new ClientSequencerConstructorFunction39(proxyManager, this, clientCodec); + } else { + this.sequencerConstructor = new ClientSequencerConstructorFunction(proxyManager, this, clientCodec); + } this.provisions = new ConcurrentHashMap<>(); this.clientCodec = clientCodec; } From c3eafbf4caf0bc148e9dcc02fb5c16a19baed9b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Herman?= Date: Thu, 21 Sep 2017 10:29:12 +0200 Subject: [PATCH 3/6] Jet compatibility fixes --- src/main/java/com/noctarius/snowcast/SnowcastSystem.java | 3 ++- src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/noctarius/snowcast/SnowcastSystem.java b/src/main/java/com/noctarius/snowcast/SnowcastSystem.java index 39a63bc..b59cf1b 100644 --- a/src/main/java/com/noctarius/snowcast/SnowcastSystem.java +++ b/src/main/java/com/noctarius/snowcast/SnowcastSystem.java @@ -17,6 +17,7 @@ package com.noctarius.snowcast; import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.instance.HazelcastInstanceImpl; import com.hazelcast.instance.HazelcastInstanceProxy; import com.hazelcast.nio.ClassLoaderUtil; import com.noctarius.snowcast.impl.NodeSnowcastFactory; @@ -126,7 +127,7 @@ public static Snowcast snowcast(@Nonnull HazelcastInstance hazelcastInstance, } // Node setup - if (hazelcastInstance instanceof HazelcastInstanceProxy) { + if (hazelcastInstance instanceof HazelcastInstanceProxy || hazelcastInstance instanceof HazelcastInstanceImpl) { snowcast = NodeSnowcastFactory.snowcast(hazelcastInstance, (short) backupCount); } diff --git a/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java b/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java index cd9929e..f1b688a 100644 --- a/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java +++ b/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java @@ -78,6 +78,9 @@ private NodeSequencerService getSequencerService(@Nonnull NodeEngine nodeEngine) @Nonnull private NodeEngine getNodeEngine(@Nonnull HazelcastInstance hazelcastInstance) { return ExceptionUtils.execute(() -> { + if (hazelcastInstance instanceof HazelcastInstanceImpl) { + return ((HazelcastInstanceImpl) hazelcastInstance).node.getNodeEngine(); + } // Ugly hack due to lack in SPI //ACCESSIBILITY_HACK Field originalField = HazelcastInstanceProxy.class.getDeclaredField("original"); From 180c5e6da94bdc742b45b836f20a6d7f67592a18 Mon Sep 17 00:00:00 2001 From: lukasherman Date: Fri, 13 Oct 2017 10:39:46 +0200 Subject: [PATCH 4/6] breaking changes related to 3.9 compatibility --- pom.xml | 2 +- .../java/com/noctarius/snowcast/impl/ClientSnowcast.java | 4 ++-- ...ClientInvocator.java => Hazelcast39ClientInvocator.java} | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/com/noctarius/snowcast/impl/{Hazelcast37ClientInvocator.java => Hazelcast39ClientInvocator.java} (91%) diff --git a/pom.xml b/pom.xml index 4f3a435..5b5927e 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 4.0.0 com.noctarius.snowcast snowcast - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT snowcast is an auto-configuration, distributed, scalable ID generator on top of Hazelcast 2014 http://github.com/noctarius/snowcast diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java index 1bc533f..ba3ca4c 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java @@ -24,11 +24,11 @@ import com.noctarius.snowcast.SnowcastEpoch; import com.noctarius.snowcast.SnowcastSequencer; +import java.lang.reflect.Field; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import java.lang.reflect.Field; import static com.noctarius.snowcast.impl.ExceptionMessages.RETRIEVE_CLIENT_ENGINE_FAILED; import static com.noctarius.snowcast.impl.ExceptionMessages.UNKNOWN_HAZELCAST_VERSION; @@ -85,7 +85,7 @@ private HazelcastClientInstanceImpl getHazelcastClient(@Nonnull HazelcastInstanc @Nonnull private ClientInvocator buildClientInvocator(HazelcastClientInstanceImpl client) { if (InternalSequencerUtils.getHazelcastVersion() != SnowcastConstants.HazelcastVersion.Unknown) { - return new Hazelcast37ClientInvocator(client); + return new Hazelcast39ClientInvocator(client); } throw exception(UNKNOWN_HAZELCAST_VERSION); } diff --git a/src/main/java/com/noctarius/snowcast/impl/Hazelcast37ClientInvocator.java b/src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java similarity index 91% rename from src/main/java/com/noctarius/snowcast/impl/Hazelcast37ClientInvocator.java rename to src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java index 2b7e74c..c4ed278 100644 --- a/src/main/java/com/noctarius/snowcast/impl/Hazelcast37ClientInvocator.java +++ b/src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java @@ -25,12 +25,12 @@ import javax.annotation.Nonnegative; import javax.annotation.Nonnull; -final class Hazelcast37ClientInvocator +final class Hazelcast39ClientInvocator implements ClientInvocator { private final HazelcastClientInstanceImpl client; - Hazelcast37ClientInvocator(@Nonnull HazelcastClientInstanceImpl client) { + Hazelcast39ClientInvocator(@Nonnull HazelcastClientInstanceImpl client) { this.client = client; } @@ -38,7 +38,7 @@ final class Hazelcast37ClientInvocator @Override public ICompletableFuture invoke(@Nonnegative int partitionId, @Nonnull ClientMessage request) { try { - ClientInvocation clientInvocation = new ClientInvocation(client, request, partitionId); + ClientInvocation clientInvocation = new ClientInvocation(client, request, "snowcast", partitionId); return clientInvocation.invoke(); } catch (Exception e) { From f6ef8fb5328f19ad402ef7067c09b5ffbffef914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Herman?= Date: Wed, 8 Nov 2017 15:26:01 +0100 Subject: [PATCH 5/6] breaking changes related to 3.9 compatibility - client snowcast npe --- src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java index ba3ca4c..be63e8e 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java @@ -73,6 +73,9 @@ public void destroySequencer(@Nonnull SnowcastSequencer sequencer) { @Nonnull private HazelcastClientInstanceImpl getHazelcastClient(@Nonnull HazelcastInstance hazelcastInstance) { + if (hazelcastInstance instanceof HazelcastClientInstanceImpl) { + return (HazelcastClientInstanceImpl) hazelcastInstance; + } //ACCESSIBILITY_HACK return ExceptionUtils.execute(() -> { // Ugly hack due to lack in SPI From a4da09d04df3cf42981758d0f5d991fd1b3ff2d4 Mon Sep 17 00:00:00 2001 From: lukasherman Date: Fri, 24 Nov 2017 17:23:36 +0100 Subject: [PATCH 6/6] 3.9 code cleanup --- README.md | 61 +------- pom.xml | 8 +- .../noctarius/snowcast/SnowcastSystem.java | 13 +- .../noctarius/snowcast/impl/ClientCodec.java | 17 +-- .../snowcast/impl/ClientInvocator.java | 30 ---- .../snowcast/impl/ClientSequencer.java | 8 +- .../ClientSequencerConstructorFunction.java | 53 ++++--- .../ClientSequencerConstructorFunction39.java | 96 ------------ .../snowcast/impl/ClientSequencerService.java | 14 +- .../snowcast/impl/ClientSnowcast.java | 32 ++-- .../snowcast/impl/ExceptionUtils.java | 9 ++ .../impl/Hazelcast39ClientInvocator.java | 48 ------ .../snowcast/impl/InternalSequencerUtils.java | 31 +--- .../snowcast/impl/NodeSequencerService.java | 141 ++++-------------- .../noctarius/snowcast/impl/NodeSnowcast.java | 11 +- .../snowcast/impl/SnowcastConstants.java | 2 +- .../clientcodec/ResponseMessageTemplate.java | 7 +- .../com/noctarius/snowcast/BasicTestCase.java | 8 +- .../snowcast/ClientBasicTestCase.java | 2 + .../noctarius/snowcast/MultiNodeTestCase.java | 6 + .../SnowcastTimestampComparatorTestCase.java | 4 +- .../impl/ClientSequencerBackupTestCase.java | 2 + .../impl/LogicalNodeTableTestCase.java | 4 +- .../impl/SequencerBackupTestCase.java | 6 + 24 files changed, 138 insertions(+), 475 deletions(-) delete mode 100644 src/main/java/com/noctarius/snowcast/impl/ClientInvocator.java delete mode 100644 src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java delete mode 100644 src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java diff --git a/README.md b/README.md index 78fbfb7..9177ee8 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ In addition to our `com.noctarius.snowcast.Snowcast` factory, a custom epoch mus ```java Calendar calendar = GregorianCalendar.getInstance(); -calendar.set( 2014, Calendar.JANUARY, 1, 0, 0, 0 ); +calendar.set( 2017, Calendar.JANUARY, 1, 0, 0, 0 ); SnowcastEpoch epoch = SnowcastEpoch.byCalendar( calendar ); ``` @@ -151,62 +151,13 @@ Destroying a sequencer is a cluster operation and will destroy all sequencers re ### Hazelcast Configuration -snowcast 2.0 uses a custom service that is automatically registered with Hazelcast on startup. It supports Hazelcast 3.7.x and 3.8.x. To get started with snowcast simply provide the according JAR file in the classpath of the application. No additional step's necessary. For older snowcast versions see below. - -For snowcast 1.0; Hazelcast requires custom services to be configured upfront using either the Configuration API or by utilizing the, XML based, declarative configuration. +snowcast uses a custom service that is automatically registered with Hazelcast on startup. Snowcast 2.0 supports Hazelcast 3.7.x and 3.8.x. snowcast 2.1 supports 3.9.x. To get started with snowcast simply provide the according JAR file in the classpath of the application. No additional step's necessary. For older snowcast versions see below. snowcast offers three different ways to register the snowcast service with Hazelcast by providing support for the two already named ones and additionally is equipped with a hack to lazily registers itself as a Hazelcast service on first acquisition. This way is not meant to be used in production, the reason will be shown in a bit. -#### Using the Configuration API - -As of snowcast 2.0 no manual configuration is required anymore. This chapter, however, stays for reference of snowcast 1.0. - -The simplest way to configure snowcast is using the Hazelcast Configuration API. snowcast provides the user with a helper class to configure all necessary options. - -If no other configuration is necessary let the snowcast helper create the `com.hazelcast.config.Config` instance for you, using the same way as Hazelcast itself would do it, and retrieve a pre-configured `Config` ready to be used to create a Hazelcast instance. - -```java -Config config = SnowcastNodeConfigurator.buildSnowcastAwareConfig(); -HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance( config ); -``` - -If there is already a `Config` instance this can be passed in and configured to use snowcast. - -```java -Config config = new Config(); -config = SnowcastNodeConfigurator.buildSnowcastAwareConfig( config ); -HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance( config ); -``` - -#### Using the Declarative Configuration - -As of snowcast 2.0 no manual configuration is required anymore. This chapter, however, stays for reference of snowcast 1.0. - -For people configuring Hazelcast using the XML based configuration only, snowcast also supports a configuration based on declarative configuration. As a disadvantage using the declarative configuration the internal classname of the service is bound to the configuration. Whenever the classname might change for any reason instantiating Hazelcast might fail for an non-obvious reason. Using the [Configuration API](#using-the-configuration-api) is recommended. - -```xml - - - - - noctarius::SequencerService - com.noctarius.snowcast.impl.NodeSequencerService - - - -``` - -That way the snowcast service is registered into Hazelcast. - -#### Lazy Configuration Hack (removed) - -The previously available "Lazy Configuration Hack" has been removed from snowcast 1.0.0. - ### Hazelcast Client Configuration -snowcast 2.0 snapshots currently support Hazelcast 3.7.x, 3.8.x. The underlying communication system is automatically registered. +snowcast 2.0 snapshots currently support Hazelcast 3.7.x, 3.8.x. snowcast 2.1 supports Hazelcast 3.9.x. The underlying communication system is automatically registered. For older versions, snowcast 1.0 supports Hazelcast 3.4.x as well as Hazelcast 3.5.x and automatically registers a matching communication system. @@ -229,7 +180,7 @@ snowcast is deployed as a Apache Maven artifact. All release candidates as well com.noctarius.snowcast snowcast - 1.0.0 + 2.1.0 ``` @@ -254,7 +205,7 @@ The Maven coordinates for the snowcast artifacts are: com.noctarius.snowcast snowcast - 2.0.0-SNAPSHOT + 2.1.0-SNAPSHOT ``` @@ -341,7 +292,7 @@ HazelcastInstance hazelcastClient = getHazelcastClient(); Snowcast snowcast = SnowcastSystem.snowcast( hazelcastClient ); Calendar calendar = GregorianCalendar.getInstance(); -calendar.set( 2014, Calendar.JANUARY, 1, 0, 0, 0 ); +calendar.set( 2017, Calendar.JANUARY, 1, 0, 0, 0 ); SnowcastEpoch epoch = SnowcastEpoch.byCalendar( calendar ); SnowcastSequencer sequencer = snowcast.createSequencer( "sequencerName", epoch ); diff --git a/pom.xml b/pom.xml index 5b5927e..06d85a6 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,7 @@ - 3.9-SNAPSHOT + 3.9 ${maven.build.timestamp} yyyy-MM-dd HH:mm @@ -90,13 +90,13 @@ com.hazelcast hazelcast-client-protocol - 1.4.0-7 + 1.5.0 provided com.hazelcast hazelcast-code-generator - 1.4.0-7 + 1.5.0 provided @@ -360,7 +360,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.1 + 1.4 sign-artifacts diff --git a/src/main/java/com/noctarius/snowcast/SnowcastSystem.java b/src/main/java/com/noctarius/snowcast/SnowcastSystem.java index b59cf1b..f20ea79 100644 --- a/src/main/java/com/noctarius/snowcast/SnowcastSystem.java +++ b/src/main/java/com/noctarius/snowcast/SnowcastSystem.java @@ -19,16 +19,14 @@ import com.hazelcast.core.HazelcastInstance; import com.hazelcast.instance.HazelcastInstanceImpl; import com.hazelcast.instance.HazelcastInstanceProxy; -import com.hazelcast.nio.ClassLoaderUtil; +import com.noctarius.snowcast.impl.ClientSnowcastFactory; import com.noctarius.snowcast.impl.NodeSnowcastFactory; -import com.noctarius.snowcast.impl.SequencerService; +import java.util.Map; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.annotation.concurrent.ThreadSafe; import javax.validation.constraints.Max; -import java.lang.reflect.Method; -import java.util.Map; import static com.noctarius.snowcast.impl.ExceptionMessages.BACKUP_COUNT_TOO_HIGH; import static com.noctarius.snowcast.impl.ExceptionMessages.BACKUP_COUNT_TOO_LOW; @@ -133,12 +131,7 @@ public static Snowcast snowcast(@Nonnull HazelcastInstance hazelcastInstance, // Client setup if (snowcast == null) { - snowcast = execute(() -> { - String className = SequencerService.class.getPackage().getName() + ".ClientSnowcastFactory"; - Class clazz = ClassLoaderUtil.loadClass(null, className); - Method snowcastMethod = clazz.getMethod("snowcast", HazelcastInstance.class, short.class); - return (Snowcast) snowcastMethod.invoke(clazz, hazelcastInstance, (short) backupCount); - }); + snowcast = execute(() -> ClientSnowcastFactory.snowcast(hazelcastInstance, (short) backupCount)); } userContext.put(USER_CONTEXT_LOOKUP_NAME, snowcast); diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientCodec.java b/src/main/java/com/noctarius/snowcast/impl/ClientCodec.java index 4f05ec4..b89d059 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientCodec.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientCodec.java @@ -18,12 +18,8 @@ import com.hazelcast.client.impl.HazelcastClientInstanceImpl; import com.hazelcast.client.impl.protocol.ClientMessage; -import com.hazelcast.client.impl.protocol.codec.SnowcastAttachLogicalNodeCodec; -import com.hazelcast.client.impl.protocol.codec.SnowcastCreateSequencerDefinitionCodec; -import com.hazelcast.client.impl.protocol.codec.SnowcastDestroySequencerDefinitionCodec; -import com.hazelcast.client.impl.protocol.codec.SnowcastDetachLogicalNodeCodec; -import com.hazelcast.client.impl.protocol.codec.SnowcastRegisterChannelCodec; -import com.hazelcast.client.impl.protocol.codec.SnowcastRemoveChannelCodec; +import com.hazelcast.client.impl.protocol.codec.*; +import com.hazelcast.client.spi.impl.ClientInvocation; import com.hazelcast.core.Partition; import com.hazelcast.core.PartitionService; import com.noctarius.snowcast.SnowcastEpoch; @@ -32,11 +28,11 @@ final class ClientCodec { - private final ClientInvocator clientInvocator; + private final HazelcastClientInstanceImpl client; private final PartitionService partitionService; - ClientCodec(HazelcastClientInstanceImpl client, ClientInvocator clientInvocator) { - this.clientInvocator = clientInvocator; + ClientCodec(HazelcastClientInstanceImpl client) { + this.client = client; this.partitionService = client.getPartitionService(); } @@ -106,7 +102,8 @@ private int partitionId(@Nonnull String sequencerName) { private ClientMessage invoke(@Nonnull String sequencerName, @Nonnull ClientMessage request) { return ExceptionUtils.execute(() -> { int partitionId = partitionId(sequencerName); - return clientInvocator.invoke(partitionId, request).get(); + ClientInvocation clientInvocation = new ClientInvocation(client, request, "snowcast", partitionId); + return clientInvocation.invoke().get(); }); } diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientInvocator.java b/src/main/java/com/noctarius/snowcast/impl/ClientInvocator.java deleted file mode 100644 index 79b3762..0000000 --- a/src/main/java/com/noctarius/snowcast/impl/ClientInvocator.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2015-2017, Christoph Engelbert (aka noctarius) and - * contributors. All rights reserved. - * - * 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 com.noctarius.snowcast.impl; - -import com.hazelcast.client.impl.protocol.ClientMessage; -import com.hazelcast.core.ICompletableFuture; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -interface ClientInvocator { - - @Nonnull - ICompletableFuture invoke(@Nonnegative int partitionId, @Nonnull ClientMessage request); - -} diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java index 974c092..5739e99 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencer.java @@ -42,17 +42,13 @@ public class ClientSequencer private final ClientSequencerService sequencerService; ClientSequencer(@Nonnull ClientSequencerService sequencerService, @Nonnull SequencerDefinition definition, - @Nonnull ClientCodec clientCodec) { + @Nonnull ClientCodec clientCodec, @Nonnull ClientContext clientContext) { - super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName()); + super(SnowcastConstants.SERVICE_NAME, definition.getSequencerName(), clientContext); this.sequencerService = sequencerService; this.sequencerContext = new ClientSequencerContext(definition, clientCodec); } - public void setClientContext(ClientContext clientContext) { - setContext(clientContext); - } - @Nonnull @Override public String getSequencerName() { diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java index fb42cbe..4d28293 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction.java @@ -16,14 +16,15 @@ */ package com.noctarius.snowcast.impl; -import com.hazelcast.client.spi.ClientProxy; +import com.hazelcast.client.impl.HazelcastClientInstanceImpl; +import com.hazelcast.client.impl.protocol.ClientMessage; +import com.hazelcast.client.impl.protocol.codec.ClientCreateProxyCodec; import com.hazelcast.client.spi.ProxyManager; +import com.hazelcast.client.spi.impl.ClientInvocation; +import com.hazelcast.nio.Address; import com.hazelcast.util.ConstructorFunction; import javax.annotation.Nonnull; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; final class ClientSequencerConstructorFunction implements ConstructorFunction { @@ -33,42 +34,38 @@ final class ClientSequencerConstructorFunction private final ClientCodec clientCodec; private final ProxyManager proxyManager; private final ClientSequencerService sequencerService; - private final MethodHandle proxyManagerInitialize; + private final HazelcastClientInstanceImpl client; - ClientSequencerConstructorFunction(@Nonnull ProxyManager proxyManager, @Nonnull ClientSequencerService sequencerService, + ClientSequencerConstructorFunction(@Nonnull HazelcastClientInstanceImpl client, + @Nonnull ProxyManager proxyManager, + @Nonnull ClientSequencerService sequencerService, @Nonnull ClientCodec clientCodec) { - + this.client = client; this.clientCodec = clientCodec; this.proxyManager = proxyManager; this.sequencerService = sequencerService; - this.proxyManagerInitialize = getInitializeMethod(); } @Nonnull @Override public SequencerProvision createNew(@Nonnull SequencerDefinition definition) { TRACER.trace("create new provision for definition %s", definition); - ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec); - initializeProxy(sequencer); + ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec, proxyManager.getContext()); + + Address initializationTarget = proxyManager.findNextAddressToSendCreateRequest(); + if (initializationTarget == null) { + throw new RuntimeException("Not able to find a member to create proxy on!"); + } else { + ClientMessage clientMessage = ClientCreateProxyCodec.encodeRequest( + definition.getSequencerName(), sequencer.getServiceName(), initializationTarget); + ExceptionUtils.execute(() -> { + new ClientInvocation(client, clientMessage, sequencer.getServiceName(), initializationTarget) + .invoke().get(); + return null; + }); + sequencer.onInitialize(); + } sequencer.attachLogicalNode(); return new SequencerProvision(definition, sequencer); } - - private void initializeProxy(@Nonnull ClientSequencer sequencer) { - //ACCESSIBILITY_HACK - ExceptionUtils.execute(() -> { - TRACER.trace("initialize sequencer proxy %s", sequencer); - return proxyManagerInitialize.invoke(proxyManager, sequencer); - }); - } - - @Nonnull - private MethodHandle getInitializeMethod() { - return ExceptionUtils.execute(() -> { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - Method method = ProxyManager.class.getDeclaredMethod("initialize", ClientProxy.class); - method.setAccessible(true); - return lookup.unreflect(method); - }); - } } diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java deleted file mode 100644 index cda0b79..0000000 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerConstructorFunction39.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2015-2017, Christoph Engelbert (aka noctarius) and - * contributors. All rights reserved. - * - * 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 com.noctarius.snowcast.impl; - -import com.hazelcast.client.spi.ClientContext; -import com.hazelcast.client.spi.ClientProxy; -import com.hazelcast.client.spi.ProxyManager; -import com.hazelcast.util.ConstructorFunction; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; -import javax.annotation.Nonnull; - -final class ClientSequencerConstructorFunction39 - implements ConstructorFunction { - - private static final Tracer TRACER = TracingUtils.tracer(ClientSequencerConstructorFunction39.class); - - private final ClientCodec clientCodec; - private final ProxyManager proxyManager; - private final ClientSequencerService sequencerService; - private final MethodHandle proxyManagerInitialize; - private final MethodHandle proxyManagerGetContext; - - ClientSequencerConstructorFunction39(@Nonnull ProxyManager proxyManager, @Nonnull ClientSequencerService sequencerService, - @Nonnull ClientCodec clientCodec) { - - this.clientCodec = clientCodec; - this.proxyManager = proxyManager; - this.sequencerService = sequencerService; - this.proxyManagerInitialize = getInitializeMethod(); - this.proxyManagerGetContext = getGetContextMethod(); - } - - @Nonnull - @Override - public SequencerProvision createNew(@Nonnull SequencerDefinition definition) { - TRACER.trace("create new provision for definition %s", definition); - ClientSequencer sequencer = new ClientSequencer(sequencerService, definition, clientCodec); - sequencer.setClientContext(getClientContext(proxyManager)); - initializeProxy(sequencer); - sequencer.attachLogicalNode(); - return new SequencerProvision(definition, sequencer); - } - - private void initializeProxy(@Nonnull ClientSequencer sequencer) { - //ACCESSIBILITY_HACK - ExceptionUtils.execute(() -> { - TRACER.trace("initialize sequencer proxy %s", sequencer); - return proxyManagerInitialize.invoke(proxyManager, sequencer); - }); - } - - private ClientContext getClientContext(@Nonnull ProxyManager proxyManager) { - //ACCESSIBILITY_HACK - return ExceptionUtils.execute(() -> { - TRACER.trace("get client context %s", proxyManager); - return (ClientContext) proxyManagerGetContext.invoke(proxyManager); - }); - } - - @Nonnull - private MethodHandle getInitializeMethod() { - return ExceptionUtils.execute(() -> { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - Method method = ProxyManager.class.getDeclaredMethod("initialize", ClientProxy.class); - method.setAccessible(true); - return lookup.unreflect(method); - }); - } - - @Nonnull - private MethodHandle getGetContextMethod() { - return ExceptionUtils.execute(() -> { - MethodHandles.Lookup lookup = MethodHandles.lookup(); - Method method = ProxyManager.class.getDeclaredMethod("getContext"); - method.setAccessible(true); - return lookup.unreflect(method); - }); - } -} diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java index d5bb2e2..ef0c9bb 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSequencerService.java @@ -16,18 +16,19 @@ */ package com.noctarius.snowcast.impl; +import com.hazelcast.client.impl.HazelcastClientInstanceImpl; import com.hazelcast.client.spi.ProxyManager; import com.hazelcast.util.ConstructorFunction; import com.noctarius.snowcast.SnowcastEpoch; import com.noctarius.snowcast.SnowcastSequenceState; import com.noctarius.snowcast.SnowcastSequencer; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import static com.noctarius.snowcast.impl.ExceptionMessages.ILLEGAL_SEQUENCER_TYPE; import static com.noctarius.snowcast.impl.ExceptionUtils.exception; @@ -43,12 +44,9 @@ class ClientSequencerService private final ConcurrentMap provisions; - ClientSequencerService(@Nonnull ProxyManager proxyManager, @Nonnull ClientCodec clientCodec) { - if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_9) { - this.sequencerConstructor = new ClientSequencerConstructorFunction39(proxyManager, this, clientCodec); - } else { - this.sequencerConstructor = new ClientSequencerConstructorFunction(proxyManager, this, clientCodec); - } + ClientSequencerService(@Nonnull HazelcastClientInstanceImpl client, @Nonnull ProxyManager proxyManager, + @Nonnull ClientCodec clientCodec) { + this.sequencerConstructor = new ClientSequencerConstructorFunction(client, proxyManager, this, clientCodec); this.provisions = new ConcurrentHashMap<>(); this.clientCodec = clientCodec; } diff --git a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java index be63e8e..1346799 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java +++ b/src/main/java/com/noctarius/snowcast/impl/ClientSnowcast.java @@ -24,15 +24,12 @@ import com.noctarius.snowcast.SnowcastEpoch; import com.noctarius.snowcast.SnowcastSequencer; -import java.lang.reflect.Field; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import static com.noctarius.snowcast.impl.ExceptionMessages.RETRIEVE_CLIENT_ENGINE_FAILED; -import static com.noctarius.snowcast.impl.ExceptionMessages.UNKNOWN_HAZELCAST_VERSION; -import static com.noctarius.snowcast.impl.ExceptionUtils.exception; import static com.noctarius.snowcast.impl.InternalSequencerUtils.printStartupMessage; import static com.noctarius.snowcast.impl.SnowcastConstants.DEFAULT_MAX_LOGICAL_NODES_13_BITS; @@ -45,10 +42,9 @@ class ClientSnowcast ClientSnowcast(@Nonnull HazelcastInstance hazelcastInstance, @Nonnegative @Max(Short.MAX_VALUE) short backupCount) { this.backupCount = backupCount; HazelcastClientInstanceImpl client = getHazelcastClient(hazelcastInstance); - ClientInvocator clientInvocator = buildClientInvocator(client); - ClientCodec clientCodec = new ClientCodec(client, clientInvocator); + ClientCodec clientCodec = new ClientCodec(client); ProxyManager proxyManager = client.getProxyManager(); - this.sequencerService = new ClientSequencerService(proxyManager, clientCodec); + this.sequencerService = new ClientSequencerService(client, proxyManager, clientCodec); printStartupMessage(true); } @@ -62,7 +58,6 @@ public SnowcastSequencer createSequencer(@Nonnull String sequencerName, @Nonnull @Override public SnowcastSequencer createSequencer(@Nonnull String sequencerName, @Nonnull SnowcastEpoch epoch, @Min(128) @Max(8192) int maxLogicalNodeCount) { - return sequencerService.createSequencer(sequencerName, epoch, maxLogicalNodeCount, backupCount); } @@ -73,23 +68,14 @@ public void destroySequencer(@Nonnull SnowcastSequencer sequencer) { @Nonnull private HazelcastClientInstanceImpl getHazelcastClient(@Nonnull HazelcastInstance hazelcastInstance) { - if (hazelcastInstance instanceof HazelcastClientInstanceImpl) { - return (HazelcastClientInstanceImpl) hazelcastInstance; - } - //ACCESSIBILITY_HACK return ExceptionUtils.execute(() -> { - // Ugly hack due to lack in SPI - Field clientField = HazelcastClientProxy.class.getDeclaredField("client"); - clientField.setAccessible(true); - return (HazelcastClientInstanceImpl) clientField.get(hazelcastInstance); + if (hazelcastInstance instanceof HazelcastClientInstanceImpl) { + return (HazelcastClientInstanceImpl) hazelcastInstance; + } + if (hazelcastInstance instanceof HazelcastClientProxy) { + return ((HazelcastClientProxy) hazelcastInstance).client; + } + throw new InstantiationException(); }, RETRIEVE_CLIENT_ENGINE_FAILED); } - - @Nonnull - private ClientInvocator buildClientInvocator(HazelcastClientInstanceImpl client) { - if (InternalSequencerUtils.getHazelcastVersion() != SnowcastConstants.HazelcastVersion.Unknown) { - return new Hazelcast39ClientInvocator(client); - } - throw exception(UNKNOWN_HAZELCAST_VERSION); - } } diff --git a/src/main/java/com/noctarius/snowcast/impl/ExceptionUtils.java b/src/main/java/com/noctarius/snowcast/impl/ExceptionUtils.java index cea789b..1be4367 100644 --- a/src/main/java/com/noctarius/snowcast/impl/ExceptionUtils.java +++ b/src/main/java/com/noctarius/snowcast/impl/ExceptionUtils.java @@ -19,9 +19,12 @@ import com.noctarius.snowcast.SnowcastException; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; import java.util.function.Function; import java.util.function.Supplier; +import static com.hazelcast.util.ExceptionUtil.rethrow; + public class ExceptionUtils { private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0]; @@ -44,7 +47,13 @@ public static Supplier exceptionParameters(Object... args) { public static V execute(ThrowingCallable callable) { try { return callable.call(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw rethrow(e); } catch (Throwable throwable) { + if (throwable instanceof ExecutionException) { + throwable = throwable.getCause(); + } if (throwable instanceof SnowcastException) { throw (SnowcastException) throwable; } else if (throwable instanceof Error) { diff --git a/src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java b/src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java deleted file mode 100644 index c4ed278..0000000 --- a/src/main/java/com/noctarius/snowcast/impl/Hazelcast39ClientInvocator.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2015-2017, Christoph Engelbert (aka noctarius) and - * contributors. All rights reserved. - * - * 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 com.noctarius.snowcast.impl; - -import com.hazelcast.client.impl.HazelcastClientInstanceImpl; -import com.hazelcast.client.impl.protocol.ClientMessage; -import com.hazelcast.client.spi.impl.ClientInvocation; -import com.hazelcast.core.ICompletableFuture; -import com.hazelcast.util.ExceptionUtil; - -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; - -final class Hazelcast39ClientInvocator - implements ClientInvocator { - - private final HazelcastClientInstanceImpl client; - - Hazelcast39ClientInvocator(@Nonnull HazelcastClientInstanceImpl client) { - this.client = client; - } - - @Nonnull - @Override - public ICompletableFuture invoke(@Nonnegative int partitionId, @Nonnull ClientMessage request) { - try { - ClientInvocation clientInvocation = new ClientInvocation(client, request, "snowcast", partitionId); - return clientInvocation.invoke(); - - } catch (Exception e) { - throw ExceptionUtil.rethrow(e); - } - } -} diff --git a/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java b/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java index 02d405c..ae0b30b 100644 --- a/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java +++ b/src/main/java/com/noctarius/snowcast/impl/InternalSequencerUtils.java @@ -23,34 +23,15 @@ import com.noctarius.snowcast.SnowcastSequenceComparator; import com.noctarius.snowcast.SnowcastSequencer; +import java.util.Comparator; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import java.util.Comparator; -import static com.noctarius.snowcast.impl.ExceptionMessages.ILLEGAL_MAX_LOGICAL_NODE_COUNT; -import static com.noctarius.snowcast.impl.ExceptionMessages.ILLEGAL_MAX_LOGICAL_NODE_ID_BOUNDARY; -import static com.noctarius.snowcast.impl.ExceptionMessages.NEXT_ID_LARGER_THAN_ALLOWED_MAX_COUNTER; +import static com.noctarius.snowcast.impl.ExceptionMessages.*; import static com.noctarius.snowcast.impl.ExceptionUtils.exception; -import static com.noctarius.snowcast.impl.SnowcastConstants.ID_TIMESTAMP_READ_MASK; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_1024; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_128; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_2048; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_256; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_4096; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_512; -import static com.noctarius.snowcast.impl.SnowcastConstants.MAX_LOGICAL_NODE_COUNT_8192; -import static com.noctarius.snowcast.impl.SnowcastConstants.NODE_ID_LOWER_BOUND; -import static com.noctarius.snowcast.impl.SnowcastConstants.NODE_ID_UPPER_BOUND; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_1024; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_128; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_2048; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_256; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_4096; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_512; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_LOGICAL_NODE_ID_8192; -import static com.noctarius.snowcast.impl.SnowcastConstants.SHIFT_TIMESTAMP; +import static com.noctarius.snowcast.impl.SnowcastConstants.*; public final class InternalSequencerUtils { @@ -162,11 +143,7 @@ static SnowcastConstants.HazelcastVersion getHazelcastVersion() { return SnowcastConstants.HazelcastVersion.Unknown; } - if (buildInfo.getVersion().startsWith("3.7")) { - return SnowcastConstants.HazelcastVersion.V_3_7; - } else if (buildInfo.getVersion().startsWith("3.8")) { - return SnowcastConstants.HazelcastVersion.V_3_8; - } else if (buildInfo.getVersion().startsWith("3.9")) { + if (buildInfo.getVersion().startsWith("3.9")) { return SnowcastConstants.HazelcastVersion.V_3_9; } return SnowcastConstants.HazelcastVersion.Unknown; diff --git a/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java b/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java index 471ab25..2d9dc4b 100644 --- a/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java +++ b/src/main/java/com/noctarius/snowcast/impl/NodeSequencerService.java @@ -19,22 +19,9 @@ import com.hazelcast.client.impl.protocol.ClientMessage; import com.hazelcast.client.impl.protocol.codec.SnowcastRegisterChannelCodec; import com.hazelcast.core.DistributedObject; -import com.hazelcast.instance.BuildInfo; -import com.hazelcast.instance.BuildInfoProvider; import com.hazelcast.nio.serialization.Data; -import com.hazelcast.spi.EventPublishingService; -import com.hazelcast.spi.EventRegistration; -import com.hazelcast.spi.EventService; -import com.hazelcast.spi.InternalCompletableFuture; -import com.hazelcast.spi.InvocationBuilder; -import com.hazelcast.spi.ManagedService; -import com.hazelcast.spi.MigrationAwareService; -import com.hazelcast.spi.NodeEngine; -import com.hazelcast.spi.Operation; -import com.hazelcast.spi.OperationService; -import com.hazelcast.spi.PartitionMigrationEvent; -import com.hazelcast.spi.PartitionReplicationEvent; -import com.hazelcast.spi.RemoteService; +import com.hazelcast.spi.*; +import com.hazelcast.spi.impl.eventservice.impl.Registration; import com.hazelcast.spi.partition.IPartitionService; import com.hazelcast.spi.partition.MigrationEndpoint; import com.hazelcast.spi.serialization.SerializationService; @@ -43,21 +30,9 @@ import com.noctarius.snowcast.SnowcastIllegalStateException; import com.noctarius.snowcast.SnowcastSequenceState; import com.noctarius.snowcast.SnowcastSequencer; -import com.noctarius.snowcast.SnowcastSequencerAlreadyRegisteredException; -import com.noctarius.snowcast.impl.operations.AttachLogicalNodeOperation; -import com.noctarius.snowcast.impl.operations.CreateSequencerDefinitionOperation; -import com.noctarius.snowcast.impl.operations.DestroySequencerDefinitionOperation; -import com.noctarius.snowcast.impl.operations.DetachLogicalNodeOperation; -import com.noctarius.snowcast.impl.operations.SequencerReplicationOperation; +import com.noctarius.snowcast.impl.operations.*; import com.noctarius.snowcast.impl.operations.clientcodec.MessageChannel; -import javax.annotation.Nonnegative; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; import java.util.ArrayList; import java.util.Collection; @@ -65,13 +40,14 @@ import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; -import static com.noctarius.snowcast.impl.ExceptionMessages.INTERNAL_SETUP_FAILED; -import static com.noctarius.snowcast.impl.ExceptionMessages.PARAMETER_IS_NOT_SUPPORTED; import static com.noctarius.snowcast.impl.ExceptionMessages.SEQUENCER_ALREADY_REGISTERED; -import static com.noctarius.snowcast.impl.ExceptionMessages.UNKNOWN_HAZELCAST_VERSION; import static com.noctarius.snowcast.impl.ExceptionUtils.exception; -import static com.noctarius.snowcast.impl.ExceptionUtils.exceptionParameters; import static com.noctarius.snowcast.impl.ExceptionUtils.execute; import static com.noctarius.snowcast.impl.SnowcastConstants.SERVICE_NAME; @@ -85,9 +61,6 @@ public class NodeSequencerService private final ConcurrentMap partitions; private final ConcurrentMap provisions; - private final MethodHandle getListenerMethodHandle; - private final MethodHandle futureGetMethodHandle; - private NodeEngine nodeEngine; private EventService eventService; private SerializationService serializationService; @@ -95,8 +68,6 @@ public class NodeSequencerService public NodeSequencerService() { this.provisions = new ConcurrentHashMap<>(); this.partitions = new ConcurrentHashMap<>(); - this.getListenerMethodHandle = findEventRegistrationGetListener(); - this.futureGetMethodHandle = findFutureExecutorMethod(); } @Override @@ -268,25 +239,32 @@ public Collection findClientChannelRegistrations(@Nonnull Str } int attachSequencer(@Nonnull SequencerDefinition definition) { - IPartitionService partitionService = nodeEngine.getPartitionService(); - int partitionId = partitionService.getPartitionId(definition.getSequencerName()); + return execute(() -> { + IPartitionService partitionService = nodeEngine.getPartitionService(); + int partitionId = partitionService.getPartitionId(definition.getSequencerName()); - AttachLogicalNodeOperation operation = new AttachLogicalNodeOperation(definition); - OperationService operationService = nodeEngine.getOperationService(); + AttachLogicalNodeOperation operation = new AttachLogicalNodeOperation(definition); + OperationService operationService = nodeEngine.getOperationService(); - InvocationBuilder invocationBuilder = operationService.createInvocationBuilder(SERVICE_NAME, operation, partitionId); - return completableFutureGet(invocationBuilder.invoke()); + InternalCompletableFuture f = operationService + .createInvocationBuilder(SERVICE_NAME, operation, partitionId).invoke(); + return f.get(); + }); } void detachSequencer(@Nonnull SequencerDefinition definition, @Min(128) @Max(8192) int logicalNodeId) { - IPartitionService partitionService = nodeEngine.getPartitionService(); - int partitionId = partitionService.getPartitionId(definition.getSequencerName()); + execute(() -> { + IPartitionService partitionService = nodeEngine.getPartitionService(); + int partitionId = partitionService.getPartitionId(definition.getSequencerName()); - DetachLogicalNodeOperation operation = new DetachLogicalNodeOperation(definition, logicalNodeId); - OperationService operationService = nodeEngine.getOperationService(); + DetachLogicalNodeOperation operation = new DetachLogicalNodeOperation(definition, logicalNodeId); + OperationService operationService = nodeEngine.getOperationService(); - InvocationBuilder invocationBuilder = operationService.createInvocationBuilder(SERVICE_NAME, operation, partitionId); - completableFutureGet(invocationBuilder.invoke()); + InternalCompletableFuture f = operationService + .createInvocationBuilder(SERVICE_NAME, operation, partitionId).invoke(); + f.get(); + return null; + }); } @Nullable @@ -304,8 +282,8 @@ private T invoke(@Nonnull Operation operation, @Nonnull String sequencerName int partitionId = partitionService.getPartitionId(sequencerName); OperationService operationService = nodeEngine.getOperationService(); - InvocationBuilder invocationBuilder = operationService.createInvocationBuilder(SERVICE_NAME, operation, partitionId); - return completableFutureGet(invocationBuilder.invoke()); + InternalCompletableFuture f = operationService.createInvocationBuilder(SERVICE_NAME, operation, partitionId).invoke(); + return f.get(); }); } @@ -330,67 +308,8 @@ public DistributedObject createDistributedObject(@Nonnull String objectName) { public void destroyDistributedObject(@Nonnull String objectName) { } - private T completableFutureGet(InternalCompletableFuture completableFuture) { - return executeMethodHandle(futureGetMethodHandle, completableFuture); - } - private ClientChannelHandler getClientChannelHandler(EventRegistration registration) { - return executeMethodHandle(getListenerMethodHandle, registration); - } - - private T executeMethodHandle(MethodHandle methodHandle, Object receiver) { - try { - return (T) methodHandle.invoke(receiver); - - } catch (Throwable throwable) { - //VERSION_HACK - if (throwable instanceof SnowcastSequencerAlreadyRegisteredException) { - throw (SnowcastSequencerAlreadyRegisteredException) throwable; - - } else if (throwable.getCause() instanceof SnowcastSequencerAlreadyRegisteredException) { - throw (SnowcastSequencerAlreadyRegisteredException) throwable.getCause(); - } - throw exception(SnowcastSequencerAlreadyRegisteredException::new, PARAMETER_IS_NOT_SUPPORTED, "completableFuture"); - } - } - - private MethodHandle findEventRegistrationGetListener() { - if (InternalSequencerUtils.getHazelcastVersion() != SnowcastConstants.HazelcastVersion.Unknown) { - BuildInfo buildInfo = BuildInfoProvider.getBuildInfo(); - return hz37EventRegistrationGetListener(buildInfo); - } - throw exception(UNKNOWN_HAZELCAST_VERSION); - } - - private MethodHandle hz37EventRegistrationGetListener(BuildInfo buildInfo) { - //ACCESSIBILITY_HACK - return execute(() -> { - Class clazz = Class.forName("com.hazelcast.spi.impl.eventservice.impl.Registration"); - MethodHandles.Lookup lookup = MethodHandles.lookup(); - return lookup.findVirtual(clazz, "getListener", GET_LISTENER_GET_TYPE); - }, INTERNAL_SETUP_FAILED, exceptionParameters(buildInfo.getVersion())); - } - - private MethodHandle findFutureExecutorMethod() { - BuildInfo buildInfo = BuildInfoProvider.getBuildInfo(); - if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_7) { - return getFutureExecutorMethod(buildInfo, "com.hazelcast.spi.InternalCompletableFuture", "getSafely"); - - } else if (InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_8 || - InternalSequencerUtils.getHazelcastVersion() == SnowcastConstants.HazelcastVersion.V_3_9) { - return getFutureExecutorMethod(buildInfo, "java.util.concurrent.Future", "get"); - - } - throw exception(UNKNOWN_HAZELCAST_VERSION); - } - - private MethodHandle getFutureExecutorMethod(BuildInfo buildInfo, String className, String methodName) { - //VERSION_HACK - return execute(() -> { - Class clazz = Class.forName(className); - MethodHandles.Lookup lookup = MethodHandles.lookup(); - return lookup.findVirtual(clazz, methodName, FUTURE_GET_TYPE); - }, INTERNAL_SETUP_FAILED, exceptionParameters(buildInfo.getVersion())); + return (ClientChannelHandler) ((Registration ) registration).getListener(); } private class ClientChannelHandler { diff --git a/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java b/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java index f1b688a..20ab0b3 100644 --- a/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java +++ b/src/main/java/com/noctarius/snowcast/impl/NodeSnowcast.java @@ -28,7 +28,6 @@ import javax.annotation.Nonnull; import javax.validation.constraints.Max; import javax.validation.constraints.Min; -import java.lang.reflect.Field; import static com.noctarius.snowcast.impl.ExceptionMessages.RETRIEVE_NODE_ENGINE_FAILED; import static com.noctarius.snowcast.impl.ExceptionMessages.SERVICE_NOT_REGISTERED; @@ -81,12 +80,10 @@ private NodeEngine getNodeEngine(@Nonnull HazelcastInstance hazelcastInstance) { if (hazelcastInstance instanceof HazelcastInstanceImpl) { return ((HazelcastInstanceImpl) hazelcastInstance).node.getNodeEngine(); } - // Ugly hack due to lack in SPI - //ACCESSIBILITY_HACK - Field originalField = HazelcastInstanceProxy.class.getDeclaredField("original"); - originalField.setAccessible(true); - HazelcastInstanceImpl impl = (HazelcastInstanceImpl) originalField.get(hazelcastInstance); - return impl.node.getNodeEngine(); + if (hazelcastInstance instanceof HazelcastInstanceProxy) { + return ((HazelcastInstanceProxy) hazelcastInstance).getOriginal().node.getNodeEngine(); + } + throw new InstantiationException(); }, RETRIEVE_NODE_ENGINE_FAILED); } } diff --git a/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java b/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java index 19844fc..8a7bdae 100644 --- a/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java +++ b/src/main/java/com/noctarius/snowcast/impl/SnowcastConstants.java @@ -98,7 +98,7 @@ public final class SnowcastConstants { private static final String SNOWCAST_LOGO_DISABLE_PROPERTY = "snowcast.logo.disable"; public enum HazelcastVersion { - V_3_7, V_3_8, V_3_9, Unknown + V_3_9, Unknown } static { diff --git a/src/main/java/com/noctarius/snowcast/impl/operations/clientcodec/ResponseMessageTemplate.java b/src/main/java/com/noctarius/snowcast/impl/operations/clientcodec/ResponseMessageTemplate.java index fa169b7..f6428ee 100644 --- a/src/main/java/com/noctarius/snowcast/impl/operations/clientcodec/ResponseMessageTemplate.java +++ b/src/main/java/com/noctarius/snowcast/impl/operations/clientcodec/ResponseMessageTemplate.java @@ -18,7 +18,6 @@ import com.hazelcast.annotation.GenerateCodec; import com.hazelcast.annotation.Response; -import com.hazelcast.annotation.Since; import com.hazelcast.client.impl.client.DistributedObjectInfo; import com.hazelcast.client.impl.protocol.constants.ResponseMessageConst; import com.hazelcast.core.Member; @@ -27,9 +26,9 @@ import com.hazelcast.nio.Address; import com.hazelcast.nio.serialization.Data; -import javax.annotation.Nullable; import java.util.List; import java.util.Map; +import javax.annotation.Nullable; @GenerateCodec(id = 0, name = "response", ns = "") public interface ResponseMessageTemplate { @@ -99,8 +98,8 @@ public interface ResponseMessageTemplate { */ @Response(ResponseMessageConst.AUTHENTICATION) Object Authentication(byte status, @Nullable Address address, @Nullable String uuid, @Nullable String ownerUuid, - byte serializationVersion, @Since(value = "1.3") String serverHazelcastVersion, - @Since(value = "1.3") @Nullable List clientUnregisteredMembers); + byte serializationVersion, String serverHazelcastVersion, + @Nullable List clientUnregisteredMembers); /** * @param partitions mappings from member address to list of partition id 's that member owns diff --git a/src/test/java/com/noctarius/snowcast/BasicTestCase.java b/src/test/java/com/noctarius/snowcast/BasicTestCase.java index 5674467..de8b913 100644 --- a/src/test/java/com/noctarius/snowcast/BasicTestCase.java +++ b/src/test/java/com/noctarius/snowcast/BasicTestCase.java @@ -19,6 +19,7 @@ import com.hazelcast.config.Config; import com.hazelcast.config.XmlConfigBuilder; import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.HazelcastTestSupport; import com.hazelcast.test.TestHazelcastInstanceFactory; import org.junit.Test; @@ -34,7 +35,12 @@ public class BasicTestCase extends HazelcastTestSupport { - + + static { + System.setProperty("java.net.preferIPv4Stack", "true"); + GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false"); + } + @Test public void test_simple_sequencer_initialization() throws Exception { diff --git a/src/test/java/com/noctarius/snowcast/ClientBasicTestCase.java b/src/test/java/com/noctarius/snowcast/ClientBasicTestCase.java index c64f60c..7fafcd6 100644 --- a/src/test/java/com/noctarius/snowcast/ClientBasicTestCase.java +++ b/src/test/java/com/noctarius/snowcast/ClientBasicTestCase.java @@ -23,6 +23,7 @@ import com.hazelcast.config.XmlConfigBuilder; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.HazelcastTestSupport; import org.junit.Test; @@ -38,6 +39,7 @@ public class ClientBasicTestCase static { System.setProperty("java.net.preferIPv4Stack", "true"); + GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false"); } private final Config config = new XmlConfigBuilder().build(); diff --git a/src/test/java/com/noctarius/snowcast/MultiNodeTestCase.java b/src/test/java/com/noctarius/snowcast/MultiNodeTestCase.java index 60980c4..cf565b9 100644 --- a/src/test/java/com/noctarius/snowcast/MultiNodeTestCase.java +++ b/src/test/java/com/noctarius/snowcast/MultiNodeTestCase.java @@ -17,6 +17,7 @@ package com.noctarius.snowcast; import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.AssertTask; import com.hazelcast.test.HazelcastTestSupport; import com.hazelcast.test.TestHazelcastInstanceFactory; @@ -30,6 +31,11 @@ public class MultiNodeTestCase extends HazelcastTestSupport { + static { + System.setProperty("java.net.preferIPv4Stack", "true"); + GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false"); + } + @Test public void test_simple_sequencer_initialization() throws Exception { diff --git a/src/test/java/com/noctarius/snowcast/SnowcastTimestampComparatorTestCase.java b/src/test/java/com/noctarius/snowcast/SnowcastTimestampComparatorTestCase.java index d6f90e5..07a36fd 100644 --- a/src/test/java/com/noctarius/snowcast/SnowcastTimestampComparatorTestCase.java +++ b/src/test/java/com/noctarius/snowcast/SnowcastTimestampComparatorTestCase.java @@ -19,9 +19,7 @@ import com.noctarius.snowcast.impl.SnowcastConstants; import org.junit.Test; -import static com.noctarius.snowcast.impl.InternalSequencerUtils.calculateBoundedMaxLogicalNodeCount; -import static com.noctarius.snowcast.impl.InternalSequencerUtils.calculateLogicalNodeShifting; -import static com.noctarius.snowcast.impl.InternalSequencerUtils.generateSequenceId; +import static com.noctarius.snowcast.impl.InternalSequencerUtils.*; import static junit.framework.TestCase.assertEquals; public class SnowcastTimestampComparatorTestCase { diff --git a/src/test/java/com/noctarius/snowcast/impl/ClientSequencerBackupTestCase.java b/src/test/java/com/noctarius/snowcast/impl/ClientSequencerBackupTestCase.java index 81fe7bb..42f569f 100644 --- a/src/test/java/com/noctarius/snowcast/impl/ClientSequencerBackupTestCase.java +++ b/src/test/java/com/noctarius/snowcast/impl/ClientSequencerBackupTestCase.java @@ -25,6 +25,7 @@ import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.PartitionService; import com.hazelcast.nio.Address; +import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.AssertTask; import com.hazelcast.test.HazelcastTestSupport; import com.noctarius.snowcast.Snowcast; @@ -44,6 +45,7 @@ public class ClientSequencerBackupTestCase static { System.setProperty("java.net.preferIPv4Stack", "true"); + GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false"); } private final Config config1 = new XmlConfigBuilder().build(); diff --git a/src/test/java/com/noctarius/snowcast/impl/LogicalNodeTableTestCase.java b/src/test/java/com/noctarius/snowcast/impl/LogicalNodeTableTestCase.java index 3e7fe28..22a0e71 100644 --- a/src/test/java/com/noctarius/snowcast/impl/LogicalNodeTableTestCase.java +++ b/src/test/java/com/noctarius/snowcast/impl/LogicalNodeTableTestCase.java @@ -28,9 +28,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicIntegerArray; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; public class LogicalNodeTableTestCase { diff --git a/src/test/java/com/noctarius/snowcast/impl/SequencerBackupTestCase.java b/src/test/java/com/noctarius/snowcast/impl/SequencerBackupTestCase.java index 436fb2c..541264f 100644 --- a/src/test/java/com/noctarius/snowcast/impl/SequencerBackupTestCase.java +++ b/src/test/java/com/noctarius/snowcast/impl/SequencerBackupTestCase.java @@ -19,6 +19,7 @@ import com.hazelcast.core.HazelcastInstance; import com.hazelcast.core.PartitionService; import com.hazelcast.nio.Address; +import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.AssertTask; import com.hazelcast.test.HazelcastTestSupport; import com.hazelcast.test.TestHazelcastInstanceFactory; @@ -36,6 +37,11 @@ public class SequencerBackupTestCase extends HazelcastTestSupport { + static { + System.setProperty("java.net.preferIPv4Stack", "true"); + GroupProperty.PHONE_HOME_ENABLED.setSystemProperty("false"); + } + @Test public void test_simple_backup_create_sequencer_definition_owner() { TestHazelcastInstanceFactory factory = new TestHazelcastInstanceFactory(2);