You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2012/08/07 01:50:08 UTC

svn commit: r1370066 - in /incubator/mesos/trunk/src: java/jni/org_apache_mesos_state_ZooKeeperState.cpp java/src/org/apache/mesos/state/ZooKeeperState.java state/state.hpp tests/state_tests.cpp

Author: benh
Date: Mon Aug  6 23:50:08 2012
New Revision: 1370066

URL: http://svn.apache.org/viewvc?rev=1370066&view=rev
Log:
Made the C++ implementaton of State return an Option<Variable> (rather
than mutate the passed in variable via a pointer)
(https://reviews.apache.org/r/6333).

Modified:
    incubator/mesos/trunk/src/java/jni/org_apache_mesos_state_ZooKeeperState.cpp
    incubator/mesos/trunk/src/java/src/org/apache/mesos/state/ZooKeeperState.java
    incubator/mesos/trunk/src/state/state.hpp
    incubator/mesos/trunk/src/tests/state_tests.cpp

Modified: incubator/mesos/trunk/src/java/jni/org_apache_mesos_state_ZooKeeperState.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/java/jni/org_apache_mesos_state_ZooKeeperState.cpp?rev=1370066&r1=1370065&r2=1370066&view=diff
==============================================================================
--- incubator/mesos/trunk/src/java/jni/org_apache_mesos_state_ZooKeeperState.cpp (original)
+++ incubator/mesos/trunk/src/java/jni/org_apache_mesos_state_ZooKeeperState.cpp Mon Aug  6 23:50:08 2012
@@ -318,9 +318,8 @@ JNIEXPORT jlong JNICALL Java_org_apache_
 
   jfieldID __variable = env->GetFieldID(clazz, "__variable", "J");
 
-  // Create a copy of the old variable to support the immutable Java API.
-  Variable<string>* variable = new Variable<string>(
-      *((Variable<string>*) env->GetLongField(jvariable, __variable)));
+  Variable<string>* variable = (Variable<string>*)
+    env->GetLongField(jvariable, __variable);
 
   clazz = env->GetObjectClass(thiz);
 
@@ -328,10 +327,10 @@ JNIEXPORT jlong JNICALL Java_org_apache_
 
   State<>* state = (State<>*) env->GetLongField(thiz, __state);
 
-  Future<bool>* future = new Future<bool>(state->set(variable));
+  Future<Option<Variable<string> > >* future =
+    new Future<Option<Variable<string> > >(state->set(*variable));
 
-  return (jlong)
-    new std::pair<Variable<string>*, Future<bool>*>(variable, future);
+  return (jlong) future;
 }
 
 
@@ -341,12 +340,10 @@ JNIEXPORT jlong JNICALL Java_org_apache_
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1cancel
-  (JNIEnv* env, jobject thiz, jlong jpair)
+  (JNIEnv* env, jobject thiz, jlong jfuture)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
-
-  Future<bool>* future = pair->second;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
   if (!future->isDiscarded()) {
     future->discard();
@@ -363,12 +360,10 @@ JNIEXPORT jboolean JNICALL Java_org_apac
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1is_1cancelled
-  (JNIEnv* env, jobject thiz, jlong jpair)
+  (JNIEnv* env, jobject thiz, jlong jfuture)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
-
-  Future<bool>* future = pair->second;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
   return (jboolean) future->isDiscarded();
 }
@@ -380,12 +375,10 @@ JNIEXPORT jboolean JNICALL Java_org_apac
  * Signature: (J)Z
  */
 JNIEXPORT jboolean JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1is_1done
-  (JNIEnv* env, jobject thiz, jlong jpair)
+  (JNIEnv* env, jobject thiz, jlong jfuture)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
-
-  Future<bool>* future = pair->second;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
   return (jboolean) !future->isPending();
 }
@@ -397,12 +390,10 @@ JNIEXPORT jboolean JNICALL Java_org_apac
  * Signature: (J)Lorg/apache/mesos/state/Variable;
  */
 JNIEXPORT jobject JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1get
-  (JNIEnv* env, jobject thiz, jlong jpair)
+  (JNIEnv* env, jobject thiz, jlong jfuture)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
-
-  Future<bool>* future = pair->second;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
   future->await();
 
@@ -418,9 +409,8 @@ JNIEXPORT jobject JNICALL Java_org_apach
 
   CHECK(future->isReady());
 
-  if (future->get()) {
-    // Copy our copy of the old variable to support the immutable Java API.
-    Variable<string>* variable = new Variable<string>(*pair->first);
+  if (future->get().isSome()) {
+    Variable<string>* variable = new Variable<string>(future->get().get());
 
     // Variable variable = new Variable();
     jclass clazz = env->FindClass("org/apache/mesos/state/Variable");
@@ -444,12 +434,10 @@ JNIEXPORT jobject JNICALL Java_org_apach
  * Signature: (JJLjava/util/concurrent/TimeUnit;)Lorg/apache/mesos/state/Variable;
  */
 JNIEXPORT jobject JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1get_1timeout
-  (JNIEnv* env, jobject thiz, jlong jpair, jlong jtimeout, jobject junit)
+  (JNIEnv* env, jobject thiz, jlong jfuture, jlong jtimeout, jobject junit)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
-
-  Future<bool>* future = pair->second;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
   jclass clazz = env->GetObjectClass(junit);
 
@@ -473,9 +461,8 @@ JNIEXPORT jobject JNICALL Java_org_apach
 
     CHECK(future->isReady());
 
-    if (future->get()) {
-      // Copy our copy of the old variable to support the immutable Java API.
-      Variable<string>* variable = new Variable<string>(*pair->first);
+    if (future->get().isSome()) {
+      Variable<string>* variable = new Variable<string>(future->get().get());
 
       // Variable variable = new Variable();
       clazz = env->FindClass("org/apache/mesos/state/Variable");
@@ -505,17 +492,12 @@ JNIEXPORT jobject JNICALL Java_org_apach
  * Signature: (J)V
  */
 JNIEXPORT void JNICALL Java_org_apache_mesos_state_ZooKeeperState__1_1set_1finalize
-  (JNIEnv* env, jobject thiz, jlong jpair)
+  (JNIEnv* env, jobject thiz, jlong jfuture)
 {
-  std::pair<Variable<string>*, Future<bool>*>* pair =
-    (std::pair<Variable<string>*, Future<bool>*>*) jpair;
+  Future<Option<Variable<string> > >* future =
+    (Future<Option<Variable<string> > >*) jfuture;
 
-  // We can delete the "variable" (i.e., pair->first) because we gave
-  // copies (on the heap) to each of the Java Variable objects.
-
-  delete pair->first;
-  delete pair->second;
-  delete pair;
+  delete future;
 }
 
 
@@ -533,7 +515,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_
 
   State<>* state = (State<>*) env->GetLongField(thiz, __state);
 
-
   Future<vector<string> >* future = new Future<vector<string> >(state->names());
 
   return (jlong) future;

Modified: incubator/mesos/trunk/src/java/src/org/apache/mesos/state/ZooKeeperState.java
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/java/src/org/apache/mesos/state/ZooKeeperState.java?rev=1370066&r1=1370065&r2=1370066&view=diff
==============================================================================
--- incubator/mesos/trunk/src/java/src/org/apache/mesos/state/ZooKeeperState.java (original)
+++ incubator/mesos/trunk/src/java/src/org/apache/mesos/state/ZooKeeperState.java Mon Aug  6 23:50:08 2012
@@ -114,40 +114,40 @@ class ZooKeeperState implements State {
 
   @Override
   public Future<Variable> set(Variable variable) {
-    final long pair = __set(variable); // Asynchronously start the operation.
+    final long future = __set(variable); // Asynchronously start the operation.
     return new Future<Variable>() {
       @Override
       public boolean cancel(boolean mayInterruptIfRunning) {
         if (mayInterruptIfRunning) {
-          return __set_cancel(pair);
+          return __set_cancel(future);
         }
         return false; // Should not interrupt and already running (or finished).
       }
 
       @Override
       public boolean isCancelled() {
-        return __set_is_cancelled(pair);
+        return __set_is_cancelled(future);
       }
 
       @Override
       public boolean isDone() {
-        return __set_is_done(pair);
+        return __set_is_done(future);
       }
 
       @Override
       public Variable get() throws InterruptedException, ExecutionException {
-        return __set_get(pair);
+        return __set_get(future);
       }
 
       @Override
       public Variable get(long timeout, TimeUnit unit)
         throws InterruptedException, ExecutionException, TimeoutException {
-        return __set_get_timeout(pair, timeout, unit);
+        return __set_get_timeout(future, timeout, unit);
       }
 
       @Override
       protected void finalize() {
-        __set_finalize(pair);
+        __set_finalize(future);
       }
     };
   }
@@ -217,13 +217,13 @@ class ZooKeeperState implements State {
   private native void __get_finalize(long future);
 
   private native long __set(Variable variable);
-  private native boolean __set_cancel(long pair);
-  private native boolean __set_is_cancelled(long pair);
-  private native boolean __set_is_done(long pair);
-  private native Variable __set_get(long pair);
+  private native boolean __set_cancel(long future);
+  private native boolean __set_is_cancelled(long future);
+  private native boolean __set_is_done(long future);
+  private native Variable __set_get(long future);
   private native Variable __set_get_timeout(
-      long pair, long timeout, TimeUnit unit);
-  private native void __set_finalize(long pair);
+      long future, long timeout, TimeUnit unit);
+  private native void __set_finalize(long future);
 
   private native long __names();
   private native boolean __names_cancel(long future);

Modified: incubator/mesos/trunk/src/state/state.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/state/state.hpp?rev=1370066&r1=1370065&r2=1370066&view=diff
==============================================================================
--- incubator/mesos/trunk/src/state/state.hpp (original)
+++ incubator/mesos/trunk/src/state/state.hpp Mon Aug  6 23:50:08 2012
@@ -102,7 +102,7 @@ public:
   // otherwise false if the version of the variable was no longer
   // valid (or an error if one occurs).
   template <typename T>
-  process::Future<bool> set(Variable<T>* variable);
+  process::Future<Option<Variable<T> > > set(const Variable<T>& variable);
 
   // Returns the collection of variable names in the state.
   virtual process::Future<std::vector<std::string> > names() = 0;
@@ -114,21 +114,25 @@ protected:
   virtual process::Future<bool> swap(const Entry& entry, const UUID& uuid) = 0;
 
 private:
-  // Helper to convert an Entry into some Variable<T> (or create a
-  // default Entry in the event no Entry was found). We make this a
-  // static member of State for friend access to Variable's
+  // Helpers to handle future results from fetch and swap. We make
+  // these static members of State for friend access to Variable's
   // constructor.
   template <typename T>
-  static process::Future<Variable<T> > convert(
+  static process::Future<Variable<T> > _get(
       const std::string& name,
       const Option<Entry>& option);
 
+  template <typename T>
+  static process::Future<Option<Variable<T> > > _set(
+      const Entry& entry,
+      const T& t,
+      const bool& b); // TODO(benh): Remove 'const &' after fixing libprocess.
 };
 
 
 template <typename Serializer>
 template <typename T>
-process::Future<Variable<T> > State<Serializer>::convert(
+process::Future<Variable<T> > State<Serializer>::_get(
     const std::string& name,
     const Option<Entry>& option)
 {
@@ -165,38 +169,66 @@ process::Future<Variable<T> > State<Seri
 
 template <typename Serializer>
 template <typename T>
+process::Future<Option<Variable<T> > > State<Serializer>::_set(
+    const Entry& entry,
+    const T& t,
+    const bool& b) // TODO(benh): Remove 'const &' after fixing libprocess.
+{
+  if (b) {
+    return Option<Variable<T> >::some(Variable<T>(entry, t));
+  }
+
+  return Option<Variable<T> >::none();
+}
+
+
+template <typename Serializer>
+template <typename T>
 process::Future<Variable<T> > State<Serializer>::get(const std::string& name)
 {
   std::tr1::function<
-  process::Future<Variable<T> >(const Option<Entry>&)> convert =
-    std::tr1::bind(&State<Serializer>::template convert<T>,
+  process::Future<Variable<T> >(const Option<Entry>&)> _get =
+    std::tr1::bind(&State<Serializer>::template _get<T>,
                    name,
                    std::tr1::placeholders::_1);
 
-  return fetch(name).then(convert);
+  return fetch(name).then(_get);
 }
 
 
 template <typename Serializer>
 template <typename T>
-process::Future<bool> State<Serializer>::set(Variable<T>* variable)
+process::Future<Option<Variable<T> > > State<Serializer>::set(
+      const Variable<T>& variable)
 {
-  Try<std::string> value = Serializer::template serialize<T>(variable->t);
+  Try<std::string> value = Serializer::template serialize<T>(variable.t);
 
   if (value.isError()) {
-    return process::Future<bool>::failed(value.error());
+    return process::Future<Option<Variable<T> > >::failed(value.error());
   }
 
   // Note that we try and swap an entry even if the value didn't change!
-  UUID uuid = UUID::fromBytes(variable->entry.uuid());
+  UUID uuid = UUID::fromBytes(variable.entry.uuid());
 
-  // Update the UUID and value of the entry.
-  variable->entry.set_uuid(UUID::random().toBytes());
-  variable->entry.set_value(value.get());
+  // Create a new entry that should be replace the existing entry
+  // provided the UUID matches.
+  Entry entry;
+  entry.set_name(variable.entry.name());
+  entry.set_uuid(UUID::random().toBytes());
+  entry.set_value(value.get());
+
+  std::tr1::function<
+  process::Future<Option<Variable<T> > >(const bool&)> _set =
+    std::tr1::bind(&State<Serializer>::template _set<T>,
+                   entry,
+                   variable.t,
+                   std::tr1::placeholders::_1);
 
-  return swap(variable->entry, uuid);
+  return swap(entry, uuid).then(_set);
 }
 
+
+
 } // namespace state {
 } // namespace internal {
 } // namespace mesos {

Modified: incubator/mesos/trunk/src/tests/state_tests.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/tests/state_tests.cpp?rev=1370066&r1=1370065&r2=1370066&view=diff
==============================================================================
--- incubator/mesos/trunk/src/tests/state_tests.cpp (original)
+++ incubator/mesos/trunk/src/tests/state_tests.cpp Mon Aug  6 23:50:08 2012
@@ -70,12 +70,12 @@ void GetSetGet(State<ProtobufSerializer>
 
   slaves1->add_infos()->MergeFrom(info);
 
-  Future<bool> result = state->set(&slaves1);
+  Future<Option<Variable<Slaves> > > result = state->set(slaves1);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_TRUE(result.get());
+  ASSERT_TRUE(result.get().isSome());
 
   variable = state->get<Slaves>("slaves");
 
@@ -109,19 +109,21 @@ void GetSetSetGet(State<ProtobufSerializ
 
   slaves1->add_infos()->MergeFrom(info);
 
-  Future<bool> result = state->set(&slaves1);
+  Future<Option<Variable<Slaves> > > result = state->set(slaves1);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_TRUE(result.get());
+  ASSERT_TRUE(result.get().isSome());
 
-  result = state->set(&slaves1);
+  slaves1 = result.get().get();
+
+  result = state->set(slaves1);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_TRUE(result.get());
+  ASSERT_TRUE(result.get().isSome());
 
   variable = state->get<Slaves>("slaves");
 
@@ -165,12 +167,12 @@ void GetGetSetSetGet(State<ProtobufSeria
 
   slaves2->add_infos()->MergeFrom(info2);
 
-  Future<bool> result = state->set(&slaves2);
+  Future<Option<Variable<Slaves> > > result = state->set(slaves2);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_TRUE(result.get());
+  ASSERT_TRUE(result.get().isSome());
 
   SlaveInfo info1;
   info1.set_hostname("localhost1");
@@ -178,12 +180,12 @@ void GetGetSetSetGet(State<ProtobufSeria
 
   slaves1->add_infos()->MergeFrom(info1);
 
-  result = state->set(&slaves1);
+  result = state->set(slaves1);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_FALSE(result.get());
+  EXPECT_TRUE(result.get().isNone());
 
   variable = state->get<Slaves>("slaves");
 
@@ -217,19 +219,18 @@ void Names(State<ProtobufSerializer>* st
 
   slaves1->add_infos()->MergeFrom(info);
 
-  Future<bool> result = state->set(&slaves1);
+  Future<Option<Variable<Slaves> > > result = state->set(slaves1);
 
   result.await();
 
   ASSERT_TRUE(result.isReady());
-  EXPECT_TRUE(result.get());
+  EXPECT_TRUE(result.get().isSome());
 
   Future<std::vector<std::string> > names = state->names();
 
   names.await();
 
   ASSERT_TRUE(names.isReady());
-
   ASSERT_TRUE(names.get().size() == 1);
   EXPECT_EQ("slaves", names.get()[0]);
 }