From c54feabfafaab64d56cf275fb1a474f0e830eba9 Mon Sep 17 00:00:00 2001 From: liamfallon Date: Fri, 15 Nov 2019 13:40:08 +0000 Subject: Fix JRuby interpreter shutdown issue The new version of JRuby fixes this issue. Also amended unit test to check for shutdown and immediate recreation of JRuby interpreter. Issue-ID: POLICY-1276 Change-Id: I723e0396985d3163b483e52fdaceb4b4fab7274b Signed-off-by: liamfallon --- .../jruby/JrubyStateFinalizerExecutor.java | 18 ++++++++------- .../plugins/executor/jruby/JrubyTaskExecutor.java | 18 ++++++++------- .../executor/jruby/JrubyTaskSelectExecutor.java | 19 ++++++++++------ .../executor/jruby/JrubyTaskExecutorTest.java | 26 +++++++++++++++++++--- 4 files changed, 55 insertions(+), 26 deletions(-) (limited to 'plugins/plugins-executor/plugins-executor-jruby/src') diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyStateFinalizerExecutor.java b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyStateFinalizerExecutor.java index d6e9f4d07..28e61b6da 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyStateFinalizerExecutor.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyStateFinalizerExecutor.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,8 +45,8 @@ public class JrubyStateFinalizerExecutor extends StateFinalizerExecutor { private static final XLogger LOGGER = XLoggerFactory.getXLogger(JrubyStateFinalizerExecutor.class); // Jruby container - private ScriptingContainer container = - new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true); + private ScriptingContainer container = new ScriptingContainer(LocalContextScope.CONCURRENT, + LocalVariableBehavior.TRANSIENT, true); private EmbedEvalUnit parsedjruby = null; /** @@ -60,10 +61,11 @@ public class JrubyStateFinalizerExecutor extends StateFinalizerExecutor { // Set up the JRuby engine container = (container == null) - ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) - : container; - container.setError(System.err); - container.setOutput(System.out); + ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) + : container; + + // Use the container.setError(System.err) and container.setOutput(System.out) method calls to redirect output + // and error to standard output and error for debugging container.put("executor", getExecutionContext()); // needed for the compile parsedjruby = container.parse(getSubject().getLogic()); } @@ -80,7 +82,7 @@ public class JrubyStateFinalizerExecutor extends StateFinalizerExecutor { */ @Override public String execute(final long executionId, final Properties executionProperties, - final Map incomingFields) throws StateMachineException, ContextException { + final Map incomingFields) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingFields); @@ -112,7 +114,7 @@ public class JrubyStateFinalizerExecutor extends StateFinalizerExecutor { @Override public void cleanUp() throws StateMachineException { LOGGER.debug("cleanUp:" + getSubject().getKey().getId() + "," + getSubject().getLogicFlavour() + "," - + getSubject().getLogic()); + + getSubject().getLogic()); container.terminate(); container = null; } diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java index c805597e9..3944aab50 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutor.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,8 +45,8 @@ public class JrubyTaskExecutor extends TaskExecutor { private static final XLogger LOGGER = XLoggerFactory.getXLogger(JrubyTaskExecutor.class); // Jruby container - private ScriptingContainer container = - new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true); + private ScriptingContainer container = new ScriptingContainer(LocalContextScope.CONCURRENT, + LocalVariableBehavior.TRANSIENT, true); private EmbedEvalUnit parsedjruby = null; /** @@ -60,10 +61,11 @@ public class JrubyTaskExecutor extends TaskExecutor { // Set up the JRuby engine container = (container == null) - ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) - : container; - container.setError(System.err); - container.setOutput(System.out); + ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) + : container; + + // Use the container.setError(System.err) and container.setOutput(System.out) method calls to redirect output + // and error to standard output and error for debugging container.put("executor", getExecutionContext()); // needed for the compile parsedjruby = container.parse(getSubject().getTaskLogic().getLogic()); } @@ -80,7 +82,7 @@ public class JrubyTaskExecutor extends TaskExecutor { */ @Override public Map execute(final long executionId, final Properties executionProperties, - final Map incomingFields) throws StateMachineException, ContextException { + final Map incomingFields) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingFields); @@ -112,7 +114,7 @@ public class JrubyTaskExecutor extends TaskExecutor { @Override public void cleanUp() throws StateMachineException { LOGGER.debug("cleanUp:" + getSubject().getKey().getId() + "," + getSubject().getTaskLogic().getLogicFlavour() - + "," + getSubject().getTaskLogic().getLogic()); + + "," + getSubject().getTaskLogic().getLogic()); container.terminate(); container = null; } diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskSelectExecutor.java b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskSelectExecutor.java index 274acbed1..2655aa195 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskSelectExecutor.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/main/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskSelectExecutor.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2016-2018 Ericsson. All rights reserved. + * Modifications Copyright (C) 2019 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,8 +48,8 @@ public class JrubyTaskSelectExecutor extends TaskSelectExecutor { private static final XLogger LOGGER = XLoggerFactory.getXLogger(JrubyTaskSelectExecutor.class); // Jruby container - private ScriptingContainer container = - new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true); + private ScriptingContainer container = new ScriptingContainer(LocalContextScope.CONCURRENT, + LocalVariableBehavior.TRANSIENT, true); private EmbedEvalUnit parsedjruby = null; /** @@ -63,8 +64,12 @@ public class JrubyTaskSelectExecutor extends TaskSelectExecutor { // Set up the JRuby engine container = (container == null) - ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) - : container; + ? new ScriptingContainer(LocalContextScope.CONCURRENT, LocalVariableBehavior.TRANSIENT, true) + : container; + + // Use the container.setError(System.err) and container.setOutput(System.out) method calls to redirect output + // and error to standard output and error for debugging + container.put("executor", getExecutionContext()); // needed for compile as a placeholder parsedjruby = container.parse(getSubject().getTaskSelectionLogic().getLogic()); } @@ -81,7 +86,7 @@ public class JrubyTaskSelectExecutor extends TaskSelectExecutor { */ @Override public AxArtifactKey execute(final long executionId, final Properties executionProperties, - final EnEvent incomingEvent) throws StateMachineException, ContextException { + final EnEvent incomingEvent) throws StateMachineException, ContextException { // Do execution pre work executePre(executionId, executionProperties, incomingEvent); @@ -113,8 +118,8 @@ public class JrubyTaskSelectExecutor extends TaskSelectExecutor { @Override public void cleanUp() throws StateMachineException { LOGGER.debug("cleanUp:" + getSubject().getKey().getId() + "," - + getSubject().getTaskSelectionLogic().getLogicFlavour() + "," - + getSubject().getTaskSelectionLogic().getLogic()); + + getSubject().getTaskSelectionLogic().getLogicFlavour() + "," + + getSubject().getTaskSelectionLogic().getLogic()); container.terminate(); container = null; } diff --git a/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java b/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java index 8b58c38d8..2309c1e29 100644 --- a/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java +++ b/plugins/plugins-executor/plugins-executor-jruby/src/test/java/org/onap/policy/apex/plugins/executor/jruby/JrubyTaskExecutorTest.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2019 Nordix Foundation. + * Modifications Copyright (C) 2019 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,8 +70,18 @@ public class JrubyTaskExecutorTest { @Test public void testJrubyTaskExecutor() { + // Run test twice to check for incorrect shutdown activity + jrubyExecutorTest(); + jrubyExecutorTest(); + } + + /** + * Test the JRuby executor. + */ + private void jrubyExecutorTest() { JrubyTaskExecutor jte = new JrubyTaskExecutor(); assertNotNull(jte); + try { Field fieldContainer = JrubyTaskExecutor.class.getDeclaredField("container"); fieldContainer.setAccessible(true); @@ -101,11 +112,11 @@ public class JrubyTaskExecutorTest { fail("test should throw an exception here"); } catch (Exception jteException) { assertEquals("execute-post: task logic execution failure on task \"NULL\" in model NULL:0.0.0", - jteException.getMessage()); + jteException.getMessage()); } - final String jrubyLogic = - "if executor.executionId == -1" + "\n return false" + "\n else " + "\n return true" + "\n end"; + final String jrubyLogic = "if executor.executionId == -1" + "\n return false" + "\n else " + "\n return true" + + "\n end"; task.getTaskLogic().setLogic(jrubyLogic); try { @@ -116,5 +127,14 @@ public class JrubyTaskExecutorTest { } catch (Exception jteException) { fail("test should not throw an exception here"); } + + try { + jte.prepare(); + Map returnMap = jte.execute(0, new Properties(), incomingParameters); + assertEquals(0, returnMap.size()); + jte.cleanUp(); + } catch (Exception jteException) { + fail("test should not throw an exception here"); + } } } -- cgit 1.2.3-korg