Repository: asterixdb Updated Branches: refs/heads/master 665e9fe4d -> 36b543d3b
[NO ISSUE][ING] Stop Succeeds When Feed Fails - user model changes: no - storage format changes: no - interface changes: no Details: - Before this change, if a feed fails after stop is issued, it goes to a failure state and the stop request will be stuck waiting for the feed to go to a stopped state. - With this change, a failure in the feed will cause it to go to a stopped state if a stop request was issued. - Test case is added Change-Id: I486e11a339c1dfadc6a2a357c95a83dfc05772a1 Reviewed-on: https://asterix-gerrit.ics.uci.edu/2258 Sonar-Qube: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Contrib: Jenkins <[email protected]> Integration-Tests: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/36b543d3 Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/36b543d3 Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/36b543d3 Branch: refs/heads/master Commit: 36b543d3b8a1e9c178d2c354aa2d544693be0832 Parents: 665e9fe Author: Abdullah Alamoudi <[email protected]> Authored: Wed Jan 3 15:06:30 2018 +0300 Committer: abdullah alamoudi <[email protected]> Committed: Wed Jan 3 06:18:08 2018 -0800 ---------------------------------------------------------------------- .../app/active/ActiveEntityEventsListener.java | 10 ++++++++-- .../test/active/ActiveEventsListenerTest.java | 21 ++++++++++++++++++++ .../org/apache/asterix/test/active/Actor.java | 5 +++++ .../asterix/test/active/TestEventsListener.java | 5 +++-- .../api/util/SingleThreadEventProcessor.java | 2 +- 5 files changed, 38 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/asterixdb/blob/36b543d3/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java index 8cbc109..12bcc0d 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/active/ActiveEntityEventsListener.java @@ -193,9 +193,9 @@ public abstract class ActiveEntityEventsListener implements IActiveEntityControl if (jobStatus.equals(JobStatus.FAILURE)) { jobFailure = exceptions.isEmpty() ? new RuntimeDataException(ErrorCode.UNREPORTED_TASK_FAILURE_EXCEPTION) : exceptions.get(0); - setState(ActivityState.TEMPORARILY_FAILED); + setState((state == ActivityState.STOPPING) ? ActivityState.STOPPED : ActivityState.TEMPORARILY_FAILED); if (prevState != ActivityState.SUSPENDING && prevState != ActivityState.RECOVERING - && prevState != ActivityState.RESUMING) { + && prevState != ActivityState.RESUMING && prevState != ActivityState.STOPPING) { recover(); } } else { @@ -551,4 +551,10 @@ public abstract class ActiveEntityEventsListener implements IActiveEntityControl public String getDisplayName() throws HyracksDataException { return this.getEntityId().toString(); } + + @Override + public String toString() { + return "{\"class\":\"" + getClass().getSimpleName() + "\"" + "\"entityId\":\"" + entityId + "\"" + + "\"state\":\"" + state + "\"" + "}"; + } } http://git-wip-us.apache.org/repos/asf/asterixdb/blob/36b543d3/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java index 40d4f6a..093d150 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/ActiveEventsListenerTest.java @@ -346,6 +346,27 @@ public class ActiveEventsListenerTest { Assert.assertEquals(ActivityState.RUNNING, listener.getState()); } + @Test + public void testStopFromRunningAndJobFails() throws Exception { + testStartWhenStartSucceed(); + Assert.assertEquals(ActivityState.RUNNING, listener.getState()); + listener.onStop(Behavior.STEP_SUCCEED); + Action stopping = users[1].stopActivity(listener); + // wait for notification from listener + synchronized (listener) { + listener.wait(); + } + clusterController.jobFinish(listener.getJobId(), JobStatus.FAILURE, + Collections.singletonList(new HyracksDataException("Runtime Failure"))); + Assert.assertNull(listener.getRecoveryTask()); + listener.allowStep(); + stopping.sync(); + Assert.assertFalse(stopping.hasFailed()); + Assert.assertEquals(ActivityState.STOPPED, listener.getState()); + Assert.assertNull(listener.getRecoveryTask()); + + } + @SuppressWarnings("deprecation") @Test public void testRecovery() throws Exception { http://git-wip-us.apache.org/repos/asf/asterixdb/blob/36b543d3/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java index c50a4a2..fcd18d0 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/Actor.java @@ -34,4 +34,9 @@ public class Actor extends SingleThreadEventProcessor<Action> { protected void handle(Action action) throws Exception { action.execute(actorMdProvider); } + + @Override + public String toString() { + return "{\"name\":\"" + name + "\"}"; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/asterixdb/blob/36b543d3/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java ---------------------------------------------------------------------- diff --git a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java index 1cedc96..7e1bc37 100644 --- a/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java +++ b/asterixdb/asterix-app/src/test/java/org/apache/asterix/test/active/TestEventsListener.java @@ -145,13 +145,14 @@ public class TestEventsListener extends ActiveEntityEventsListener { @SuppressWarnings("deprecation") @Override protected Void doStop(MetadataProvider metadataProvider) throws HyracksDataException { + ActivityState intention = state; step(onStop); failCompile(onStop); try { Set<ActivityState> waitFor; - if (state == ActivityState.STOPPING) { + if (intention == ActivityState.STOPPING) { waitFor = EnumSet.of(ActivityState.STOPPED, ActivityState.PERMANENTLY_FAILED); - } else if (state == ActivityState.SUSPENDING) { + } else if (intention == ActivityState.SUSPENDING) { waitFor = EnumSet.of(ActivityState.SUSPENDED, ActivityState.TEMPORARILY_FAILED); } else { throw new IllegalStateException("stop with what intention??"); http://git-wip-us.apache.org/repos/asf/asterixdb/blob/36b543d3/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java ---------------------------------------------------------------------- diff --git a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java index 9eb3b8e..ccf0163 100644 --- a/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java +++ b/hyracks-fullstack/hyracks/hyracks-api/src/main/java/org/apache/hyracks/api/util/SingleThreadEventProcessor.java @@ -29,7 +29,7 @@ import org.apache.logging.log4j.Logger; public abstract class SingleThreadEventProcessor<T> implements Runnable { private static final Logger LOGGER = LogManager.getLogger(); - private final String name; + protected final String name; private final LinkedBlockingQueue<T> eventInbox; private volatile Thread executorThread; private volatile boolean stopped = false;
