You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by al...@apache.org on 2018/10/05 06:39:08 UTC

[mesos] 02/02: Waited for TEARDOWN response in v1 Java scheduler shim.

This is an automated email from the ASF dual-hosted git repository.

alexr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit 2588d79eebb755ed8b1dc19374c385f72daf30e4
Author: Alexander Rukletsov <al...@apache.org>
AuthorDate: Thu Sep 27 15:20:52 2018 +0200

    Waited for TEARDOWN response in v1 Java scheduler shim.
    
    Destruction of the library is not always under our control. For
    example, the JVM can call JNI `finalize()` if the Java scheduler
    nullifies its reference to the V1Mesos library immediately after
    sending `TEARDOWN`. We want to make sure that `TEARDOWN` is sent
    before the Mesos library is destructed.
    
    Review: https://reviews.apache.org/r/68866
---
 .../jni/org_apache_mesos_v1_scheduler_V1Mesos.cpp     | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/java/jni/org_apache_mesos_v1_scheduler_V1Mesos.cpp b/src/java/jni/org_apache_mesos_v1_scheduler_V1Mesos.cpp
index 2a5fbd7..e59f364 100644
--- a/src/java/jni/org_apache_mesos_v1_scheduler_V1Mesos.cpp
+++ b/src/java/jni/org_apache_mesos_v1_scheduler_V1Mesos.cpp
@@ -285,7 +285,24 @@ JNIEXPORT void JNICALL Java_org_apache_mesos_v1_scheduler_V1Mesos_send
     return;
   }
 
-  mesos->mesos->send(call);
+  // Destruction of the library is not always under our control. For example,
+  // the JVM can call JNI `finalize()` if the Java scheduler nullifies its
+  // reference to the V1Mesos library immediately after sending `TEARDOWN`,
+  // see MESOS-9274.
+  //
+  // We want to make sure that the `TEARDOWN` message is sent before the
+  // scheduler and the Mesos library are destructed (garbage collected).
+  // However we don't want to block forever if the message is dropped.
+  //
+  // TODO(alexr): Consider adding general support for `call()`.
+  if (call.type() == Call::TEARDOWN) {
+    const Duration timeout = Minutes(10);
+    bool timedout = !mesos->mesos->call(call).await(timeout);
+    LOG_IF(ERROR, timedout)
+      << "Received no response to call " << call.type() << " for " << timeout;
+  } else {
+    mesos->mesos->send(call);
+  }
 }