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(),

Reply via email to