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]);
}