From 4ae9441b596115d1b2a8df426c49e3973953772c Mon Sep 17 00:00:00 2001 From: "David M. Lloyd" Date: Wed, 6 Sep 2017 16:23:08 -0500 Subject: [PATCH 1/2] [EJBCLIENT-262] Fix assertion issue --- .../client/DiscoveryEJBClientInterceptor.java | 14 ++++++++++---- .../ejb/client/NamingEJBClientInterceptor.java | 18 +++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jboss/ejb/client/DiscoveryEJBClientInterceptor.java b/src/main/java/org/jboss/ejb/client/DiscoveryEJBClientInterceptor.java index a856730ec..c156e2567 100644 --- a/src/main/java/org/jboss/ejb/client/DiscoveryEJBClientInterceptor.java +++ b/src/main/java/org/jboss/ejb/client/DiscoveryEJBClientInterceptor.java @@ -81,6 +81,11 @@ public DiscoveryEJBClientInterceptor() { } public void handleInvocation(final EJBClientInvocationContext context) throws Exception { + if (context.getDestination() != null) { + // already discovered! + context.sendRequest(); + return; + } List problems = executeDiscovery(context); try { context.sendRequest(); @@ -131,6 +136,10 @@ public Object handleInvocationResult(final EJBClientInvocationContext context) t } public SessionID handleSessionCreation(final EJBSessionCreationInvocationContext context) throws Exception { + if (context.getDestination() != null) { + // already discovered! + return context.proceed(); + } List problems = executeDiscovery(context); SessionID sessionID; try { @@ -222,10 +231,7 @@ Discovery getDiscovery() { } private List executeDiscovery(AbstractInvocationContext context) { - if (context.getDestination() != null) { - // Someone else discovered already! - return null; - } + assert context.getDestination() == null; final EJBLocator locator = context.getLocator(); final Affinity affinity = locator.getAffinity(); final Affinity weakAffinity = context.getWeakAffinity(); diff --git a/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java b/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java index 7d68a2d4a..707a2c761 100644 --- a/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java +++ b/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java @@ -44,12 +44,15 @@ public final class NamingEJBClientInterceptor implements EJBClientInterceptor { */ public static final int PRIORITY = ClientInterceptorPriority.JBOSS_AFTER + 50; + private static final AttachmentKey SKIP_MISSING_TARGET = new AttachmentKey<>(); + public NamingEJBClientInterceptor() { } public void handleInvocation(final EJBClientInvocationContext context) throws Exception { final NamingProvider namingProvider = context.getProxyAttachment(EJBRootContext.NAMING_PROVIDER_ATTACHMENT_KEY); - if (namingProvider == null) { + if (namingProvider == null || context.getDestination() != null) { + context.putAttachment(SKIP_MISSING_TARGET, Boolean.TRUE); context.sendRequest(); } else { if (setDestination(context, namingProvider)) try { @@ -67,14 +70,18 @@ public Object handleInvocationResult(final EJBClientInvocationContext context) t try { return context.getResult(); } catch (NoSuchEJBException | RequestSendFailedException e) { - processMissingTarget(context); + if (context.getAttachment(SKIP_MISSING_TARGET) != Boolean.TRUE) { + processMissingTarget(context); + } throw e; + } finally { + context.removeAttachment(SKIP_MISSING_TARGET); } } public SessionID handleSessionCreation(final EJBSessionCreationInvocationContext context) throws Exception { final NamingProvider namingProvider = context.getAttachment(EJBRootContext.NAMING_PROVIDER_ATTACHMENT_KEY); - if (namingProvider == null) { + if (namingProvider == null || context.getDestination() != null) { return context.proceed(); } else { if (setDestination(context, namingProvider)) try { @@ -123,11 +130,8 @@ private static boolean setDestination(final AbstractInvocationContext context, f private void processMissingTarget(final AbstractInvocationContext context) { final URI destination = context.getDestination(); + assert destination != null; - if (destination == null) { - // nothing we can/should do. - return; - } // Oops, we got some wrong information! addBlackListedDestination(context, destination); From 03ce83f92f6247efc2babbd56e3facae83a55916 Mon Sep 17 00:00:00 2001 From: "David M. Lloyd" Date: Tue, 12 Sep 2017 08:35:36 -0500 Subject: [PATCH 2/2] [EJBCLIENT-262] Reset "strong" affinity when it is set as a part of discovery --- .../ejb/client/NamingEJBClientInterceptor.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java b/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java index 707a2c761..f3541d695 100644 --- a/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java +++ b/src/main/java/org/jboss/ejb/client/NamingEJBClientInterceptor.java @@ -51,7 +51,7 @@ public NamingEJBClientInterceptor() { public void handleInvocation(final EJBClientInvocationContext context) throws Exception { final NamingProvider namingProvider = context.getProxyAttachment(EJBRootContext.NAMING_PROVIDER_ATTACHMENT_KEY); - if (namingProvider == null || context.getDestination() != null) { + if (namingProvider == null || context.getDestination() != null || ! isNoneOrCluster(context.getLocator().getAffinity())) { context.putAttachment(SKIP_MISSING_TARGET, Boolean.TRUE); context.sendRequest(); } else { @@ -66,6 +66,10 @@ public void handleInvocation(final EJBClientInvocationContext context) throws Ex } } + private boolean isNoneOrCluster(final Affinity affinity) { + return affinity == Affinity.NONE || affinity instanceof ClusterAffinity; + } + public Object handleInvocationResult(final EJBClientInvocationContext context) throws Exception { try { return context.getResult(); @@ -81,7 +85,7 @@ public Object handleInvocationResult(final EJBClientInvocationContext context) t public SessionID handleSessionCreation(final EJBSessionCreationInvocationContext context) throws Exception { final NamingProvider namingProvider = context.getAttachment(EJBRootContext.NAMING_PROVIDER_ATTACHMENT_KEY); - if (namingProvider == null || context.getDestination() != null) { + if (namingProvider == null || context.getDestination() != null || ! isNoneOrCluster(context.getLocator().getAffinity())) { return context.proceed(); } else { if (setDestination(context, namingProvider)) try { @@ -130,11 +134,19 @@ private static boolean setDestination(final AbstractInvocationContext context, f private void processMissingTarget(final AbstractInvocationContext context) { final URI destination = context.getDestination(); - assert destination != null; + if (destination == null) { + // some later interceptor cleared it out on us + return; + } // Oops, we got some wrong information! addBlackListedDestination(context, destination); + final EJBLocator locator = context.getLocator(); + if (! (locator.getAffinity() instanceof ClusterAffinity)) { + // it *was* "none" affinity, but it has been relocated; locate it back again + context.setLocator(locator.withNewAffinity(Affinity.NONE)); + } // clear the weak affinity so that cluster invocations can be re-targeted. context.setWeakAffinity(Affinity.NONE); context.setTargetAffinity(null);