Repository: reef Updated Branches: refs/heads/master c2cca4945 -> 23f7386b3
[REEF-762] Implement ClosedContext.ParentContext JIRA: [REEF-762] https://issues.apache.org/jira/browse/REEF-762 Pull Request: Closes #853 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/23f7386b Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/23f7386b Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/23f7386b Branch: refs/heads/master Commit: 23f7386b333a137fda278416f4b04c08a89d8963 Parents: c2cca49 Author: Andrew Chung <[email protected]> Authored: Tue Feb 23 14:40:55 2016 -0800 Committer: Dongjoon Hyun <[email protected]> Committed: Tue Feb 23 16:41:46 2016 -0800 ---------------------------------------------------------------------- .../ClosedContextClr2Java.cpp | 22 +++++++------------- lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h | 1 + .../Runtime/Evaluator/Task/CloseEventImpl.cs | 6 +----- .../Tasks/Events/ICloseEvent.cs | 2 +- .../Bridge/Events/ClosedContext.cs | 16 +++++++------- .../Functional/Bridge/TestContextStack.cs | 22 ++++++++++++++++---- .../Bridge/TestFailedTaskEventHandler.cs | 2 +- .../Functional/ReefFunctionalTest.cs | 4 ++-- .../reef/javabridge/ClosedContextBridge.java | 11 +++++++++- 9 files changed, 50 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Bridge/ClosedContextClr2Java.cpp ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Bridge/ClosedContextClr2Java.cpp b/lang/cs/Org.Apache.REEF.Bridge/ClosedContextClr2Java.cpp index 9292789..358e5e6 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/ClosedContextClr2Java.cpp +++ b/lang/cs/Org.Apache.REEF.Bridge/ClosedContextClr2Java.cpp @@ -43,6 +43,13 @@ namespace Org { _jstringContextId = CommonUtilities::GetJObjectId(env, _jobjectClosedContext, jclassClosedContext); _jstringEvaluatorId = CommonUtilities::GetJObjectEvaluatorId(env, _jobjectClosedContext, jclassClosedContext); + jmethodID jmidGetParentContextMid = env->GetMethodID( + jclassClosedContext, "getParentContextBridge", "()Lorg/apache/reef/javabridge/ActiveContextBridge;"); + + jobject parentContext = env->CallObjectMethod(_jobjectClosedContext, jmidGetParentContextMid); + + _parentContext = gcnew ActiveContextClr2Java(env, parentContext); + ManagedLog::LOGGER->LogStop("ClosedContextClr2Java::ClosedContextClr2Java"); } @@ -69,20 +76,7 @@ namespace Org { * Gets the Parent context of the closed context through a JNI call to Java. */ IActiveContextClr2Java^ ClosedContextClr2Java::GetParentContext() { - ManagedLog::LOGGER->LogStart("ClosedContextClr2Java::GetParentContext"); - - JNIEnv *env = RetrieveEnv(_jvm); - jclass jclassClosedContext = env->GetObjectClass(_jobjectClosedContext); - jmethodID jmidGetParentContext = env->GetMethodID(jclassClosedContext, "getParentContext", "()Lorg/apache/reef/javabridge/ActiveContextBridge;"); - if (jmidGetParentContext == NULL) { - ManagedLog::LOGGER->Log("jmidGetParentContext is NULL"); - return nullptr; - } - - jobject jobjectParentContext = CommonUtilities::CallGetMethodNewGlobalRef<jobject>(env, _jobjectClosedContext, jmidGetParentContext); - ManagedLog::LOGGER->LogStop("ClosedContextClr2Java::GetParentContext"); - - return gcnew ActiveContextClr2Java(env, jobjectParentContext); + return _parentContext; } /** http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/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 bfb04ab..6cd897d 100644 --- a/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h +++ b/lang/cs/Org.Apache.REEF.Bridge/Clr2JavaImpl.h @@ -216,6 +216,7 @@ namespace Org { JavaVM* _jvm; jstring _jstringContextId = NULL; jstring _jstringEvaluatorId = NULL; + ActiveContextClr2Java^ _parentContext = nullptr; public: ClosedContextClr2Java(JNIEnv *env, jobject jobjectClosedContext); ~ClosedContextClr2Java(); http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Common/Runtime/Evaluator/Task/CloseEventImpl.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Common/Runtime/Evaluator/Task/CloseEventImpl.cs b/lang/cs/Org.Apache.REEF.Common/Runtime/Evaluator/Task/CloseEventImpl.cs index ae722a9..940d381 100644 --- a/lang/cs/Org.Apache.REEF.Common/Runtime/Evaluator/Task/CloseEventImpl.cs +++ b/lang/cs/Org.Apache.REEF.Common/Runtime/Evaluator/Task/CloseEventImpl.cs @@ -32,11 +32,7 @@ namespace Org.Apache.REEF.Common.Runtime.Evaluator.Task Value = Optional<byte[]>.OfNullable(bytes); } - public Optional<byte[]> Value - { - get { return Value; } - set { value = Value; } - } + public Optional<byte[]> Value { get; private set; } public override string ToString() { http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Common/Tasks/Events/ICloseEvent.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Common/Tasks/Events/ICloseEvent.cs b/lang/cs/Org.Apache.REEF.Common/Tasks/Events/ICloseEvent.cs index 4a5c493..6f008fd 100644 --- a/lang/cs/Org.Apache.REEF.Common/Tasks/Events/ICloseEvent.cs +++ b/lang/cs/Org.Apache.REEF.Common/Tasks/Events/ICloseEvent.cs @@ -21,6 +21,6 @@ namespace Org.Apache.REEF.Common.Tasks.Events { public interface ICloseEvent { - Optional<byte[]> Value { get; set; } + Optional<byte[]> Value { get; } } } http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ClosedContext.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ClosedContext.cs b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ClosedContext.cs index abe8cc2..f5bc007 100644 --- a/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ClosedContext.cs +++ b/lang/cs/Org.Apache.REEF.Driver/Bridge/Events/ClosedContext.cs @@ -29,7 +29,7 @@ namespace Org.Apache.REEF.Driver.Bridge.Events /// </summary> internal sealed class ClosedContext : IClosedContext { - private readonly IActiveContextClr2Java _parentContextClr2Java; + private readonly ActiveContext _parentContext; internal ClosedContext(IClosedContextClr2Java clr2java) { @@ -37,9 +37,7 @@ namespace Org.Apache.REEF.Driver.Bridge.Events Id = clr2java.GetId(); EvaluatorId = clr2java.GetEvaluatorId(); EvaluatorDescriptor = clr2java.GetEvaluatorDescriptor(); - - // TODO[JIRA REEF-762]: populate this - _parentContextClr2Java = null; + _parentContext = clr2java.GetParentContext() == null ? null : new ActiveContext(clr2java.GetParentContext()); } /// <summary> @@ -63,8 +61,11 @@ namespace Org.Apache.REEF.Driver.Bridge.Events /// </summary> public Optional<string> ParentId { - // TODO[REEF-762]: Implement - get { return Optional<string>.Empty(); } + get + { + return ParentContext == null ? + Optional<string>.Empty() : Optional<string>.Of(ParentContext.Id); + } } /// <summary> @@ -79,8 +80,7 @@ namespace Org.Apache.REEF.Driver.Bridge.Events /// </summary> public IActiveContext ParentContext { - // TODO[JIRA REEF-762]: make sure this doesn't fail. - get { return new ActiveContext(_parentContextClr2Java); } + get { return _parentContext; } } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs index 273718c..2c2daa6 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestContextStack.cs @@ -56,7 +56,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge string testFolder = DefaultRuntimeFolder + Guid.NewGuid().ToString("N").Substring(0, 4); CleanUp(testFolder); TestRun(DriverConfigurations(), typeof(ContextStackHandlers), 1, "testContextStack", "local", testFolder); - ValidateSuccessForLocalRuntime(1, testFolder: testFolder); + ValidateSuccessForLocalRuntime(2, testFolder: testFolder); ValidateMessageSuccessfullyLogged(TaskValidationMessage, testFolder); ValidateMessageSuccessfullyLogged(ClosedContextValidationMessage, testFolder); CleanUp(testFolder); @@ -85,6 +85,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge { private readonly IEvaluatorRequestor _requestor; private IAllocatedEvaluator _evaluator; + private bool _contextTwoClosed = false; [Inject] private ContextStackHandlers(IEvaluatorRequestor evaluatorRequestor) @@ -148,11 +149,24 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge public void OnNext(IClosedContext value) { - // TODO[JIRA REEF-762]: Inspect closing order of contexts. Logger.Log(Level.Info, ClosedContextValidationMessage); - // TODO[JIRA REEF-762]: Remove disposal of Evaluator, since it should naturally be closed if no contexts. - _evaluator.Dispose(); + if (_contextTwoClosed == false) + { + Assert.Equal(value.Id, ContextTwoId); + Assert.True(value.ParentId.IsPresent()); + Assert.Equal(value.ParentId.Value, ContextOneId); + Assert.Equal(value.ParentContext.Id, ContextOneId); + _contextTwoClosed = true; + } + else + { + Assert.Equal(value.Id, ContextOneId); + Assert.False(value.ParentId.IsPresent()); + Assert.Equal(value.ParentContext, null); + } + + value.ParentContext.Dispose(); } public void OnError(Exception error) http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedTaskEventHandler.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedTaskEventHandler.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedTaskEventHandler.cs index 74fb5df..82e796a 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedTaskEventHandler.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/Bridge/TestFailedTaskEventHandler.cs @@ -50,7 +50,7 @@ namespace Org.Apache.REEF.Tests.Functional.Bridge string testFolder = DefaultRuntimeFolder + Guid.NewGuid().ToString("N").Substring(0, 4); CleanUp(testFolder); TestRun(DriverConfigurations(), typeof(FailedTaskDriver), 1, "failedTaskTest", "local", testFolder); - ValidateSuccessForLocalRuntime(numberOfEvaluatorsToClose: 1, numberOfTasksToFail: 1, testFolder: testFolder); + ValidateSuccessForLocalRuntime(numberOfContextsToClose: 1, numberOfTasksToFail: 1, testFolder: testFolder); ValidateMessageSuccessfullyLogged(FailedTaskMessage, testFolder); CleanUp(testFolder); } http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/cs/Org.Apache.REEF.Tests/Functional/ReefFunctionalTest.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tests/Functional/ReefFunctionalTest.cs b/lang/cs/Org.Apache.REEF.Tests/Functional/ReefFunctionalTest.cs index 29c1f99..e547988 100644 --- a/lang/cs/Org.Apache.REEF.Tests/Functional/ReefFunctionalTest.cs +++ b/lang/cs/Org.Apache.REEF.Tests/Functional/ReefFunctionalTest.cs @@ -138,7 +138,7 @@ namespace Org.Apache.REEF.Tests.Functional CleanUp(); } - protected void ValidateSuccessForLocalRuntime(int numberOfEvaluatorsToClose, int numberOfTasksToFail = 0, int numberOfEvaluatorsToFail = 0, string testFolder = DefaultRuntimeFolder) + protected void ValidateSuccessForLocalRuntime(int numberOfContextsToClose, int numberOfTasksToFail = 0, int numberOfEvaluatorsToFail = 0, string testFolder = DefaultRuntimeFolder) { const string successIndication = "EXIT: ActiveContextClr2Java::Close"; const string failedTaskIndication = "Java_org_apache_reef_javabridge_NativeInterop_clrSystemFailedTaskHandlerOnNext"; @@ -163,7 +163,7 @@ namespace Org.Apache.REEF.Tests.Functional string[] successIndicators = lines.Where(s => s.Contains(successIndication)).ToArray(); string[] failedTaskIndicators = lines.Where(s => s.Contains(failedTaskIndication)).ToArray(); string[] failedIndicators = lines.Where(s => s.Contains(failedEvaluatorIndication)).ToArray(); - Assert.Equal(numberOfEvaluatorsToClose, successIndicators.Length); + Assert.Equal(numberOfContextsToClose, successIndicators.Length); Assert.Equal(numberOfTasksToFail, failedTaskIndicators.Length); Assert.Equal(numberOfEvaluatorsToFail, failedIndicators.Length); } http://git-wip-us.apache.org/repos/asf/reef/blob/23f7386b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ClosedContextBridge.java ---------------------------------------------------------------------- diff --git a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ClosedContextBridge.java b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ClosedContextBridge.java index bba73e8..869b723 100644 --- a/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ClosedContextBridge.java +++ b/lang/java/reef-bridge-java/src/main/java/org/apache/reef/javabridge/ClosedContextBridge.java @@ -48,7 +48,12 @@ public final class ClosedContextBridge extends NativeBridge implements ClosedCon public ClosedContextBridge(final ClosedContext closedContext, final ActiveContextBridgeFactory activeContextBridgeFactory) { jcloseContext = closedContext; - parentContext = activeContextBridgeFactory.getActiveContextBridge(closedContext.getParentContext()); + if (closedContext.getParentContext() != null) { + parentContext = activeContextBridgeFactory.getActiveContextBridge(closedContext.getParentContext()); + } else { + parentContext = null; + } + contextId = closedContext.getId(); evaluatorId = closedContext.getEvaluatorId(); evaluatorDescriptor = closedContext.getEvaluatorDescriptor(); @@ -84,6 +89,10 @@ public final class ClosedContextBridge extends NativeBridge implements ClosedCon return descriptorString; } + public ActiveContextBridge getParentContextBridge() { + return parentContext; + } + @Override public ActiveContext getParentContext() { return jcloseContext.getParentContext();
