Repository: reef Updated Branches: refs/heads/master 99f768e3b -> fa16b8db0
[REEF-769] Implement IFailedEvaluator * Implement FailedEvaluator. * Fixed up bridge code for FailedContext and FailedTask to handle the null case. JIRA: [REEF-769]https://issues.apache.org/jira/browse/REEF-769 Pull Request: Closes #882 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/fa16b8db Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/fa16b8db Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/fa16b8db Branch: refs/heads/master Commit: fa16b8db0602e76ae6dabb7e0635c23284b073d3 Parents: 99f768e Author: Andrew Chung <[email protected]> Authored: Mon Mar 7 16:57:54 2016 -0800 Committer: Julia Wang <[email protected]> Committed: Wed Mar 9 23:35:15 2016 -0800 ---------------------------------------------------------------------- lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h | 6 ++ .../FailedContextClr2Java.cpp | 7 ++- .../FailedEvaluatorClr2Java.cpp | 66 ++++++++++++++++++++ .../FailedTaskClr2Java.cpp | 5 ++ .../Bridge/Clr2java/IFailedEvaluatorClr2Java.cs | 7 +++ .../Bridge/Events/FailedEvaluator.cs | 22 +++++-- .../Bridge/Events/FailedTask.cs | 8 ++- .../Evaluator/EvaluatorException.cs | 45 ++++--------- .../Evaluator/IFailedEvaluator.cs | 3 - .../Bridge/TestFailedEvaluatorEventHandler.cs | 34 +++++++++- .../reef/javabridge/FailedContextBridge.java | 7 +++ .../reef/javabridge/FailedEvaluatorBridge.java | 58 ++++++++++++++--- .../reef/javabridge/generic/JobDriver.java | 2 +- 13 files changed, 213 insertions(+), 57 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h b/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h index 530d14a..3a2c60c 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h +++ b/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h @@ -155,6 +155,12 @@ namespace Org { virtual void OnError(String^ message); virtual IEvaluatorRequestorClr2Java^ GetEvaluatorRequestor(); virtual String^ GetId(); + virtual EvaluatorException^ GetException(); + virtual array<IFailedContextClr2Java^>^ GetFailedContextsClr2Java(); + virtual IFailedTaskClr2Java^ GetFailedTaskClr2Java(); + private: + String^ GetCause(); + String^ GetStackTrace(); }; public ref class HttpServerClr2Java : public IHttpServerBridgeClr2Java { http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Bridge/FailedContextClr2Java.cpp ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/FailedContextClr2Java.cpp b/lang/cs/Org.Apache.REEF.Bridge/FailedContextClr2Java.cpp index 50aaf68..7efb2b1 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/FailedContextClr2Java.cpp +++ b/lang/cs/Org.Apache.REEF.Bridge/FailedContextClr2Java.cpp @@ -34,13 +34,18 @@ namespace Org { if (env->GetJavaVM(pJavaVm) != 0) { ManagedLog::LOGGER->LogError("Failed to get JavaVM", nullptr); } + ManagedLog::LOGGER->LogStart("FailedContextClr2Java::FailedContextClr2Java"); _jobjectFailedContext = reinterpret_cast<jobject>(env->NewGlobalRef(jobjectFailedContext)); jclass jclassFailedContext = env->GetObjectClass(_jobjectFailedContext); + ManagedLog::LOGGER->LogStart("FailedContextClr2Java::FailedContextClr2Java"); - jmethodID jmidGetParentId = env->GetMethodID(jclassFailedContext, "getParentId", "()Ljava/lang/String;"); + jmethodID jmidGetParentId = env->GetMethodID(jclassFailedContext, "getParentIdString", "()Ljava/lang/String;"); + ManagedLog::LOGGER->LogStart("FailedContextClr2Java::FailedContextClr2Java"); _jstringContextId = CommonUtilities::GetJObjectId(env, jobjectFailedContext, jclassFailedContext); + ManagedLog::LOGGER->LogStart("FailedContextClr2Java::FailedContextClr2Java"); _jstringEvaluatorId = CommonUtilities::GetJObjectEvaluatorId(env, jobjectFailedContext, jclassFailedContext); + ManagedLog::LOGGER->LogStart("FailedContextClr2Java::FailedContextClr2Java"); _jstringParentContextId = reinterpret_cast<jstring>(env->NewGlobalRef(env->CallObjectMethod(_jobjectFailedContext, jmidGetParentId))); ManagedLog::LOGGER->LogStop("FailedContextClr2Java::FailedContextClr2Java"); http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Bridge/FailedEvaluatorClr2Java.cpp ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/FailedEvaluatorClr2Java.cpp b/lang/cs/Org.Apache.REEF.Bridge/FailedEvaluatorClr2Java.cpp index 053152d..9f0c8f5 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/FailedEvaluatorClr2Java.cpp +++ b/lang/cs/Org.Apache.REEF.Bridge/FailedEvaluatorClr2Java.cpp @@ -76,11 +76,77 @@ namespace Org { return ManagedStringFromJavaString(env, _jstringId); } + EvaluatorException^ FailedEvaluatorClr2Java::GetException() { + String^ cause = this->GetCause(); + String^ stackTrace = this->GetStackTrace(); + return gcnew EvaluatorException(this->GetId(), cause, stackTrace); + } + + array<IFailedContextClr2Java^>^ FailedEvaluatorClr2Java::GetFailedContextsClr2Java() { + JNIEnv *env = RetrieveEnv(_jvm); + jclass jclassFailedEvaluator = env->GetObjectClass(_jobjectFailedEvaluator); + jmethodID jmidGetFailedContexts = + env->GetMethodID(jclassFailedEvaluator, "getFailedContexts", "()[Lorg/apache/reef/javabridge/FailedContextBridge;"); + jobjectArray failedContexts = reinterpret_cast<jobjectArray>(env->CallObjectMethod(_jobjectFailedEvaluator, jmidGetFailedContexts)); + + const int arrLen = env->GetArrayLength(failedContexts); + + array<IFailedContextClr2Java^>^ failedContextsArray = gcnew array<IFailedContextClr2Java^>(arrLen); + for (int i = 0; i < arrLen; i++) { + jobject failedContext = env->GetObjectArrayElement(failedContexts, i); + failedContextsArray[i] = gcnew FailedContextClr2Java(env, failedContext); + } + + return failedContextsArray; + } + + IFailedTaskClr2Java^ FailedEvaluatorClr2Java::GetFailedTaskClr2Java() { + ManagedLog::LOGGER->Log("FailedEvaluatorClr2Java::GetFailedTaskClr2Java"); + JNIEnv *env = RetrieveEnv(_jvm); + jclass jclassFailedEvaluator = env->GetObjectClass(_jobjectFailedEvaluator); + + jmethodID jmidGetFailedTask = + env->GetMethodID(jclassFailedEvaluator, "getFailedTask", "()Lorg/apache/reef/javabridge/FailedTaskBridge;"); + + jobject failedTask = env->CallObjectMethod(_jobjectFailedEvaluator, jmidGetFailedTask); + if (failedTask == NULL) { + return nullptr; + } + + return gcnew FailedTaskClr2Java(env, failedTask); + } + void FailedEvaluatorClr2Java::OnError(String^ message) { ManagedLog::LOGGER->Log("FailedEvaluatorClr2Java::OnError"); JNIEnv *env = RetrieveEnv(_jvm); HandleClr2JavaError(env, message, _jobjectFailedEvaluator); } + + String^ FailedEvaluatorClr2Java::GetCause() { + JNIEnv *env = RetrieveEnv(_jvm); + jclass jclassFailedEvaluator = env->GetObjectClass(_jobjectFailedEvaluator); + jmethodID jmidGetCause = env->GetMethodID(jclassFailedEvaluator, "getCause", "()Ljava/lang/String;"); + jobject methodCallReturn = env->CallObjectMethod(_jobjectFailedEvaluator, jmidGetCause); + if (methodCallReturn == NULL) { + return nullptr; + } + + jstring cause = reinterpret_cast<jstring>(methodCallReturn); + return ManagedStringFromJavaString(env, cause); + } + + String^ FailedEvaluatorClr2Java::GetStackTrace() { + JNIEnv *env = RetrieveEnv(_jvm); + jclass jclassFailedEvaluator = env->GetObjectClass(_jobjectFailedEvaluator); + jmethodID jmidGetStackTrace = env->GetMethodID(jclassFailedEvaluator, "getStackTrace", "()Ljava/lang/String;"); + jobject methodCallReturn = env->CallObjectMethod(_jobjectFailedEvaluator, jmidGetStackTrace); + if (methodCallReturn == NULL) { + return nullptr; + } + + jstring stackTrace = reinterpret_cast<jstring>(methodCallReturn); + return ManagedStringFromJavaString(env, stackTrace); + } } } } http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Bridge/FailedTaskClr2Java.cpp ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/FailedTaskClr2Java.cpp b/lang/cs/Org.Apache.REEF.Bridge/FailedTaskClr2Java.cpp index c02edfa..887c7a9 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/FailedTaskClr2Java.cpp +++ b/lang/cs/Org.Apache.REEF.Bridge/FailedTaskClr2Java.cpp @@ -59,6 +59,11 @@ namespace Org { jobject jobjectActiveContext = env->CallObjectMethod(_jobjectFailedTask, jmidGetActiveContext); ManagedLog::LOGGER->LogStop("FailedTaskClr2Java::GetActiveContext"); + + if (jobjectActiveContext == NULL) { + return nullptr; + } + return gcnew ActiveContextClr2Java(env, jobjectActiveContext); } http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IFailedEvaluatorClr2Java.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IFailedEvaluatorClr2Java.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IFailedEvaluatorClr2Java.cs index a22bb17..19b51b8 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IFailedEvaluatorClr2Java.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Clr2java/IFailedEvaluatorClr2Java.cs @@ -15,6 +15,7 @@ // specific language governing permissions and limitations // under the License. +using Org.Apache.REEF.Driver.Evaluator; using Org.Apache.REEF.Utilities.Attributes; namespace Org.Apache.REEF.Driver.Bridge.Clr2java @@ -25,5 +26,11 @@ namespace Org.Apache.REEF.Driver.Bridge.Clr2java IEvaluatorRequestorClr2Java GetEvaluatorRequestor(); string GetId(); + + IFailedContextClr2Java[] GetFailedContextsClr2Java(); + + IFailedTaskClr2Java GetFailedTaskClr2Java(); + + EvaluatorException GetException(); } } http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedEvaluator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedEvaluator.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedEvaluator.cs index 484df3b..3e30fb4 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedEvaluator.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedEvaluator.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Runtime.Serialization; using Org.Apache.REEF.Driver.Bridge.Clr2java; using Org.Apache.REEF.Driver.Context; @@ -32,12 +33,16 @@ namespace Org.Apache.REEF.Driver.Bridge.Events { private static readonly Logger LOGGER = Logger.GetLogger(typeof(FailedEvaluator)); private readonly string _id; + private readonly IList<IFailedContext> _failedContexts; public FailedEvaluator(IFailedEvaluatorClr2Java clr2Java) { InstanceId = Guid.NewGuid().ToString("N"); FailedEvaluatorClr2Java = clr2Java; _id = FailedEvaluatorClr2Java.GetId(); + _failedContexts = new List<IFailedContext>( + FailedEvaluatorClr2Java.GetFailedContextsClr2Java().Select(clr2JavaFailedContext => + new FailedContext(clr2JavaFailedContext))); } [DataMember] @@ -51,22 +56,27 @@ namespace Org.Apache.REEF.Driver.Bridge.Events get { return _id; } } - // TODO[REEF-769]: Implement public EvaluatorException EvaluatorException { - get { return null; } + get { return FailedEvaluatorClr2Java.GetException(); } } - // TODO[REEF-769]: Implement public IList<IFailedContext> FailedContexts { - get { return new List<IFailedContext>(0); } + get { return _failedContexts; } } - // TODO[REEF-769]: Implement public Optional<IFailedTask> FailedTask { - get { return Optional<IFailedTask>.Empty(); } + get + { + if (FailedEvaluatorClr2Java.GetFailedTaskClr2Java() == null) + { + return Optional<IFailedTask>.Empty(); + } + + return Optional<IFailedTask>.Of(new FailedTask(FailedEvaluatorClr2Java.GetFailedTaskClr2Java())); + } } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedTask.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedTask.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedTask.cs index 888ee76..f208df9 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedTask.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/FailedTask.cs @@ -71,8 +71,12 @@ namespace Org.Apache.REEF.Driver.Bridge.Events /// </summary> public Optional<IActiveContext> GetActiveContext() { - IActiveContext activeContext = new ActiveContext(ActiveContextClr2Java); - return ActiveContextClr2Java == null ? Optional<IActiveContext>.Empty() : Optional<IActiveContext>.Of(activeContext); + if (ActiveContextClr2Java == null) + { + return Optional<IActiveContext>.Empty(); + } + + return Optional<IActiveContext>.Of(new ActiveContext(ActiveContextClr2Java)); } public Exception AsError() http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Driver/Evaluator/EvaluatorException.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Evaluator/EvaluatorException.cs b/lang/cs/Org.Apache.REEF.Driver/Evaluator/EvaluatorException.cs index 1741f4c..c21a113 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Evaluator/EvaluatorException.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Evaluator/EvaluatorException.cs @@ -16,58 +16,35 @@ // under the License. using System; -using Org.Apache.REEF.Driver.Task; using Org.Apache.REEF.Utilities; +using Org.Apache.REEF.Utilities.Attributes; namespace Org.Apache.REEF.Driver.Evaluator { - //// Public only such that it can be used in the bridge. - - /// <summary> - /// </summary> - public sealed class EvaluatorException : Exception, IIdentifiable + public sealed class EvaluatorException : Exception { private readonly string _evaluatorId; - private readonly IRunningTask _runningTask; - - internal EvaluatorException(string evaluatorId, IRunningTask runningTask = null) - { - _evaluatorId = evaluatorId; - _runningTask = runningTask; - } + private readonly Optional<string> _javaStackTrace; - internal EvaluatorException(string evaluatorId, string message, Exception cause, IRunningTask runningTask = null) - : base(message, cause) - { - _evaluatorId = evaluatorId; - _runningTask = runningTask; - } - - internal EvaluatorException(string evaluatorId, string message, IRunningTask runningTask = null) + [Private] + public EvaluatorException(string evaluatorId, string message, string javaStackTrace) : base(message) { _evaluatorId = evaluatorId; - _runningTask = runningTask; + _javaStackTrace = Optional<string>.OfNullable(javaStackTrace); } - internal EvaluatorException(string evaluatorId, Exception cause, IRunningTask runningTask = null) - : base(string.Empty, cause) + public string EvaluatorId { - _evaluatorId = evaluatorId; - _runningTask = runningTask; + get { return _evaluatorId; } } /// <summary> - /// The task that was running on the Evaluator or null if none was running exists. + /// The Java stack trace of the Evaluator failure. /// </summary> - public IRunningTask RunningTask + public Optional<string> JavaStackTrace { - get { return _runningTask; } - } - - public string Id - { - get { return _evaluatorId; } + get { return _javaStackTrace; } } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Driver/Evaluator/IFailedEvaluator.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Evaluator/IFailedEvaluator.cs b/lang/cs/Org.Apache.REEF.Driver/Evaluator/IFailedEvaluator.cs index f787588..8a81de0 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Evaluator/IFailedEvaluator.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Evaluator/IFailedEvaluator.cs @@ -26,9 +26,6 @@ namespace Org.Apache.REEF.Driver.Evaluator /// <summary> /// Represents an Evaluator that became unavailable. /// </summary> - /// <remarks> - /// As per REEF-769, this interface isn't actually implemented beyond the Id property. - /// </remarks> public interface IFailedEvaluator : IIdentifiable { /// <summary> http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedEvaluatorEventHandler.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedEvaluatorEventHandler.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedEvaluatorEventHandler.cs index c7a01c0..4c94781 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedEvaluatorEventHandler.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedEvaluatorEventHandler.cs @@ -16,10 +16,14 @@ // under the License. using System; +using System.Text; +using System.Threading; using Org.Apache.REEF.Common.Tasks; +using Org.Apache.REEF.Common.Tasks.Events; using Org.Apache.REEF.Driver; using Org.Apache.REEF.Driver.Bridge; using Org.Apache.REEF.Driver.Evaluator; +using Org.Apache.REEF.Driver.Task; using Org.Apache.REEF.Tang.Annotations; using Org.Apache.REEF.Tang.Implementations.Tang; using Org.Apache.REEF.Tang.Interface; @@ -33,6 +37,9 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge public sealed class TestFailedEvaluatorEventHandler : ReefFunctionalTest { private const string FailedEvaluatorMessage = "I have succeeded in seeing a failed evaluator."; + private const string RightFailedTaskMessage = "I have succeeded in seeing the right failed task."; + private const string FailSignal = "Fail"; + private const string TaskId = "1234567"; public TestFailedEvaluatorEventHandler() { @@ -51,6 +58,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge TestRun(DriverConfigurations(), typeof(FailedEvaluatorDriver), 1, "failedEvaluatorTest", "local", testFolder); ValidateSuccessForLocalRuntime(0, numberOfEvaluatorsToFail: 1, testFolder: testFolder); ValidateMessageSuccessfullyLoggedForDriver(FailedEvaluatorMessage, testFolder); + ValidateMessageSuccessfullyLoggedForDriver(RightFailedTaskMessage, testFolder); CleanUp(testFolder); } @@ -61,6 +69,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge .Set(DriverConfiguration.OnEvaluatorAllocated, GenericType<FailedEvaluatorDriver>.Class) .Set(DriverConfiguration.OnEvaluatorCompleted, GenericType<FailedEvaluatorDriver>.Class) .Set(DriverConfiguration.OnEvaluatorFailed, GenericType<FailedEvaluatorDriver>.Class) + .Set(DriverConfiguration.OnTaskRunning, GenericType<FailedEvaluatorDriver>.Class) .Build(); return TangFactory.GetTang().NewConfigurationBuilder(driverConfig) @@ -69,7 +78,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge } private sealed class FailedEvaluatorDriver : IObserver<IDriverStarted>, IObserver<IAllocatedEvaluator>, - IObserver<ICompletedEvaluator>, IObserver<IFailedEvaluator> + IObserver<ICompletedEvaluator>, IObserver<IFailedEvaluator>, IObserver<IRunningTask> { private static readonly Logger Logger = Logger.GetLogger(typeof(FailedEvaluatorDriver)); @@ -89,11 +98,17 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge public void OnNext(IAllocatedEvaluator value) { value.SubmitTask(TaskConfiguration.ConfigurationModule - .Set(TaskConfiguration.Identifier, "1234567") + .Set(TaskConfiguration.Identifier, TaskId) .Set(TaskConfiguration.Task, GenericType<FailEvaluatorTask>.Class) + .Set(TaskConfiguration.OnMessage, GenericType<FailEvaluatorTask>.Class) .Build()); } + public void OnNext(IRunningTask value) + { + value.Send(Encoding.UTF8.GetBytes(FailSignal)); + } + public void OnNext(ICompletedEvaluator value) { throw new Exception("Did not expect completed evaluator."); @@ -102,6 +117,11 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge public void OnNext(IFailedEvaluator value) { Logger.Log(Level.Error, FailedEvaluatorMessage); + Assert.True(value.FailedTask.IsPresent()); + Assert.Equal(value.FailedTask.Value.Id, TaskId); + Assert.Equal(value.FailedContexts.Count, 1); + Assert.Equal(value.EvaluatorException.EvaluatorId, value.Id); + Logger.Log(Level.Error, RightFailedTaskMessage); } public void OnError(Exception error) @@ -115,8 +135,10 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge } } - private sealed class FailEvaluatorTask : ITask + private sealed class FailEvaluatorTask : ITask, IDriverMessageHandler { + private readonly CountdownEvent _countdownEvent = new CountdownEvent(1); + [Inject] private FailEvaluatorTask() { @@ -129,9 +151,15 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge public byte[] Call(byte[] memento) { + _countdownEvent.Wait(); Environment.Exit(1); return null; } + + public void Handle(IDriverMessage message) + { + _countdownEvent.Signal(); + } } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedContextBridge.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedContextBridge.java b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedContextBridge.java index 314146b..e748e64 100644 --- a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedContextBridge.java +++ b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedContextBridge.java @@ -88,6 +88,13 @@ public final class FailedContextBridge extends NativeBridge implements ContextBa } /** + * Used by InterOp code. + */ + public String getParentIdString() { + return this.parentContextId; + } + + /** * @return the parent {@link ActiveContextBridge}. */ public ActiveContextBridge getParentContext() { http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedEvaluatorBridge.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedEvaluatorBridge.java b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedEvaluatorBridge.java index 22b8491..ec84c88 100644 --- a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedEvaluatorBridge.java +++ b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/FailedEvaluatorBridge.java @@ -18,6 +18,7 @@ */ package org.apache.reef.javabridge; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.reef.annotations.audience.Interop; import org.apache.reef.annotations.audience.Private; import org.apache.reef.driver.evaluator.EvaluatorRequestor; @@ -34,18 +35,21 @@ import java.util.logging.Logger; @Interop(CppFiles = { "FailedEvaluatorClr2Java.cpp" }, CsFiles = { "IFailedEvaluatorClr2Java", "FailedEvaluator" }) public final class FailedEvaluatorBridge extends NativeBridge implements Identifiable { private static final Logger LOG = Logger.getLogger(FailedEvaluatorBridge.class.getName()); - private FailedEvaluator jfailedEvaluator; - private EvaluatorRequestorBridge evaluatorRequestorBridge; - private String evaluatorId; + private final FailedEvaluator jfailedEvaluator; + private final EvaluatorRequestorBridge evaluatorRequestorBridge; + private final String evaluatorId; + private final ActiveContextBridgeFactory activeContextBridgeFactory; public FailedEvaluatorBridge(final FailedEvaluator failedEvaluator, final EvaluatorRequestor evaluatorRequestor, final boolean blockedForAdditionalEvaluator, - final LoggingScopeFactory loggingScopeFactory) { - jfailedEvaluator = failedEvaluator; - evaluatorId = failedEvaluator.getId(); - evaluatorRequestorBridge = + final LoggingScopeFactory loggingScopeFactory, + final ActiveContextBridgeFactory activeContextBridgeFactory) { + this.jfailedEvaluator = failedEvaluator; + this.evaluatorId = failedEvaluator.getId(); + this.evaluatorRequestorBridge = new EvaluatorRequestorBridge(evaluatorRequestor, blockedForAdditionalEvaluator, loggingScopeFactory); + this.activeContextBridgeFactory = activeContextBridgeFactory; } public int getNewlyRequestedEvaluatorNumber() { @@ -56,6 +60,46 @@ public final class FailedEvaluatorBridge extends NativeBridge implements Identif return evaluatorRequestorBridge; } + public String getCause() { + if (jfailedEvaluator.getEvaluatorException() != null) { + return jfailedEvaluator.getEvaluatorException().getCause().getLocalizedMessage(); + } + + return null; + } + + public String getStackTrace() { + if (jfailedEvaluator.getEvaluatorException() != null) { + return ExceptionUtils.getStackTrace(jfailedEvaluator.getEvaluatorException()); + } + + return null; + } + + public FailedContextBridge[] getFailedContexts() { + if (jfailedEvaluator.getFailedContextList() == null) { + return new FailedContextBridge[0]; + } + + final FailedContextBridge[] failedContextBridges = + new FailedContextBridge[jfailedEvaluator.getFailedContextList().size()]; + + for (int i = 0; i < jfailedEvaluator.getFailedContextList().size(); i++) { + failedContextBridges[i] = new FailedContextBridge( + jfailedEvaluator.getFailedContextList().get(i), activeContextBridgeFactory); + } + + return failedContextBridges; + } + + public FailedTaskBridge getFailedTask() { + if (!jfailedEvaluator.getFailedTask().isPresent()) { + return null; + } + + return new FailedTaskBridge(jfailedEvaluator.getFailedTask().get(), activeContextBridgeFactory); + } + @Override public void close() { } http://git-wip-us.apache.org/repos/asf/reef/blob/fa16b8db/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/generic/JobDriver.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/generic/JobDriver.java b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/generic/JobDriver.java index 39f2428..5bb2c2b 100644 --- a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/generic/JobDriver.java +++ b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/generic/JobDriver.java @@ -295,7 +295,7 @@ public final class JobDriver { LOG.log(Level.INFO, message); final FailedEvaluatorBridge failedEvaluatorBridge = new FailedEvaluatorBridge(eval, JobDriver.this.evaluatorRequestor, - JobDriver.this.isRestarted, loggingScopeFactory); + JobDriver.this.isRestarted, loggingScopeFactory, activeContextBridgeFactory); if (isRestartFailed) { NativeInterop.clrSystemDriverRestartFailedEvaluatorHandlerOnNext( JobDriver.this.handlerManager.getDriverRestartFailedEvaluatorHandler(),
