You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2014/09/19 03:23:14 UTC

[1/2] git commit: Fixed example frameworks to fail fast on an unexpected status udpate.

Repository: mesos
Updated Branches:
  refs/heads/master 7c51ae38b -> 3636c0ea7


Fixed example frameworks to fail fast on an unexpected status udpate.

Review: https://reviews.apache.org/r/25805


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3636c0ea
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3636c0ea
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3636c0ea

Branch: refs/heads/master
Commit: 3636c0ea787f3cb35788ded624a5fa25c0866166
Parents: 0cd8d64
Author: Vinod Kone <vi...@gmail.com>
Authored: Thu Sep 18 17:05:34 2014 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Thu Sep 18 18:22:57 2014 -0700

----------------------------------------------------------------------
 src/examples/java/TestExecutor.java             |  2 +-
 src/examples/java/TestFramework.java            | 12 +++++++++++-
 src/examples/low_level_scheduler_libprocess.cpp | 11 +++++++++--
 src/examples/low_level_scheduler_pthread.cpp    | 11 +++++++++--
 src/examples/no_executor_framework.cpp          | 10 ++++++++++
 src/examples/python/test_framework.py           | 10 +++++++++-
 src/examples/test_framework.cpp                 | 10 ++++++++++
 7 files changed, 59 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/java/TestExecutor.java
----------------------------------------------------------------------
diff --git a/src/examples/java/TestExecutor.java b/src/examples/java/TestExecutor.java
index 014bc97..3f385fb 100644
--- a/src/examples/java/TestExecutor.java
+++ b/src/examples/java/TestExecutor.java
@@ -47,7 +47,7 @@ public class TestExecutor implements Executor {
 
         driver.sendStatusUpdate(status);
 
-        System.out.println("Running task " + task.getTaskId());
+        System.out.println("Running task " + task.getTaskId().getValue());
 
         // This is where one would perform the requested task.
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/java/TestFramework.java
----------------------------------------------------------------------
diff --git a/src/examples/java/TestFramework.java b/src/examples/java/TestFramework.java
index ad2884b..bc593d0 100644
--- a/src/examples/java/TestFramework.java
+++ b/src/examples/java/TestFramework.java
@@ -117,7 +117,7 @@ public class TestFramework {
     @Override
     public void statusUpdate(SchedulerDriver driver, TaskStatus status) {
       System.out.println("Status update: task " + status.getTaskId().getValue() +
-                         " is in state " + status.getState());
+                         " is in state " + status.getState().getValueDescriptor().getName());
       if (status.getState() == TaskState.TASK_FINISHED) {
         finishedTasks++;
         System.out.println("Finished tasks: " + finishedTasks);
@@ -125,6 +125,16 @@ public class TestFramework {
           driver.stop();
         }
       }
+
+      if (status.getState() == TaskState.TASK_LOST ||
+          status.getState() == TaskState.TASK_KILLED ||
+          status.getState() == TaskState.TASK_FAILED) {
+        System.err.println("Aborting because task " + status.getTaskId().getValue() +
+                           " is in unexpected state " +
+                           status.getState().getValueDescriptor().getName() +
+                           " with message '" + status.getMessage() + "'");
+        driver.abort();
+      }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/low_level_scheduler_libprocess.cpp
----------------------------------------------------------------------
diff --git a/src/examples/low_level_scheduler_libprocess.cpp b/src/examples/low_level_scheduler_libprocess.cpp
index eb7f8bf..7ef5ea7 100644
--- a/src/examples/low_level_scheduler_libprocess.cpp
+++ b/src/examples/low_level_scheduler_libprocess.cpp
@@ -263,8 +263,7 @@ private:
 
   void statusUpdate(const string& uuid, const TaskStatus& status)
   {
-    cout << "Task " << status.task_id().value() << " is in state "
-         << TaskState_Name(status.state());
+    cout << "Task " << status.task_id() << " is in state " << status.state();
 
     if (status.has_message()) {
       cout << " with message '" << status.message() << "'";
@@ -286,6 +285,14 @@ private:
       ++tasksFinished;
     }
 
+    if (status.state() == TASK_LOST ||
+        status.state() == TASK_KILLED ||
+        status.state() == TASK_FAILED) {
+      EXIT(1) << "Exiting because task " << status.task_id()
+              << " is in unexpected state " << status.state()
+              << " with message '" << status.message() << "'";
+    }
+
     if (tasksFinished == totalTasks) {
       process::terminate(self());
     }

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/low_level_scheduler_pthread.cpp
----------------------------------------------------------------------
diff --git a/src/examples/low_level_scheduler_pthread.cpp b/src/examples/low_level_scheduler_pthread.cpp
index f5e669f..6e233a1 100644
--- a/src/examples/low_level_scheduler_pthread.cpp
+++ b/src/examples/low_level_scheduler_pthread.cpp
@@ -313,8 +313,7 @@ private:
 
   void statusUpdate(const string& uuid, const TaskStatus& status)
   {
-    cout << "Task " << status.task_id().value() << " is in state "
-         << TaskState_Name(status.state());
+    cout << "Task " << status.task_id() << " is in state " << status.state();
 
     if (status.has_message()) {
       cout << " with message '" << status.message() << "'";
@@ -336,6 +335,14 @@ private:
       ++tasksFinished;
     }
 
+    if (status.state() == TASK_LOST ||
+        status.state() == TASK_KILLED ||
+        status.state() == TASK_FAILED) {
+      EXIT(1) << "Exiting because task " << status.task_id()
+              << " is in unexpected state " << status.state()
+              << " with message '" << status.message() << "'";
+    }
+
     if (tasksFinished == totalTasks) {
       finalize();
     }

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/no_executor_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/no_executor_framework.cpp b/src/examples/no_executor_framework.cpp
index ddc7cab..f98a073 100644
--- a/src/examples/no_executor_framework.cpp
+++ b/src/examples/no_executor_framework.cpp
@@ -121,6 +121,16 @@ public:
     if (status.state() == TASK_FINISHED)
       tasksFinished++;
 
+    if (status.state() == TASK_LOST ||
+        status.state() == TASK_KILLED ||
+        status.state() == TASK_FAILED) {
+      cout << "Aborting because task " << taskId
+           << " is in unexpected state " << status.state()
+           << " with message '" << status.message() << "'"
+           << endl;
+      driver->abort();
+    }
+
     if (tasksFinished == totalTasks)
       driver->stop();
   }

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/python/test_framework.py
----------------------------------------------------------------------
diff --git a/src/examples/python/test_framework.py b/src/examples/python/test_framework.py
index 761c04e..aad6d77 100755
--- a/src/examples/python/test_framework.py
+++ b/src/examples/python/test_framework.py
@@ -93,7 +93,8 @@ class TestScheduler(mesos.interface.Scheduler):
             driver.launchTasks(offer.id, tasks)
 
     def statusUpdate(self, driver, update):
-        print "Task %s is in state %d" % (update.task_id.value, update.state)
+        print "Task %s is in state %s" % \
+            (update.task_id.value, mesos_pb2.TaskState.Name(update.state))
 
         # Ensure the binary data came through.
         if update.data != "data with a \0 byte":
@@ -115,6 +116,13 @@ class TestScheduler(mesos.interface.Scheduler):
                 slave_id,
                 'data with a \0 byte')
 
+        if update.state == mesos_pb2.TASK_LOST or \
+           update.state == mesos_pb2.TASK_KILLED or \
+           update.state == mesos_pb2.TASK_FAILED:
+            print "Aborting because task %s is in unexpected state %s with message '%s'" \
+                % (update.task_id.value, mesos_pb2.TaskState.Name(update.state), update.message)
+            driver.abort()
+
     def frameworkMessage(self, driver, executorId, slaveId, message):
         self.messagesReceived += 1
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3636c0ea/src/examples/test_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/test_framework.cpp b/src/examples/test_framework.cpp
index e6c0d33..187a611 100644
--- a/src/examples/test_framework.cpp
+++ b/src/examples/test_framework.cpp
@@ -128,6 +128,16 @@ public:
     if (status.state() == TASK_FINISHED)
       tasksFinished++;
 
+    if (status.state() == TASK_LOST ||
+        status.state() == TASK_KILLED ||
+        status.state() == TASK_FAILED) {
+      cout << "Aborting because task " << taskId
+           << " is in unexpected state " << status.state()
+           << " with message '" << status.message() << "'"
+           << endl;
+      driver->abort();
+    }
+
     if (tasksFinished == totalTasks)
       driver->stop();
   }


[2/2] git commit: Fixed example frameworks to launch tasks based on offered resources.

Posted by vi...@apache.org.
Fixed example frameworks to launch tasks based on offered resources.

Review: https://reviews.apache.org/r/25801


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/0cd8d64b
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/0cd8d64b
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/0cd8d64b

Branch: refs/heads/master
Commit: 0cd8d64b35d0f32cf1dcded7564e19411d872d9c
Parents: 7c51ae3
Author: Vinod Kone <vi...@gmail.com>
Authored: Thu Sep 18 16:09:00 2014 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Thu Sep 18 18:22:57 2014 -0700

----------------------------------------------------------------------
 src/examples/java/TestFramework.java            | 34 +++++++++--
 src/examples/low_level_scheduler_libprocess.cpp | 12 ++--
 src/examples/low_level_scheduler_pthread.cpp    | 12 ++--
 src/examples/no_executor_framework.cpp          | 63 ++++++++------------
 src/examples/python/test_framework.py           | 30 ++++++++--
 src/examples/test_framework.cpp                 | 14 +++--
 src/tests/java_framework_test.sh                |  3 +
 .../low_level_scheduler_libprocess_test.sh      |  3 +
 src/tests/low_level_scheduler_pthread_test.sh   |  3 +
 src/tests/no_executor_framework_test.sh         |  3 +
 src/tests/python_framework_test.sh              |  3 +
 src/tests/test_framework_test.sh                |  3 +
 12 files changed, 118 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/java/TestFramework.java
----------------------------------------------------------------------
diff --git a/src/examples/java/TestFramework.java b/src/examples/java/TestFramework.java
index e01b27c..ad2884b 100644
--- a/src/examples/java/TestFramework.java
+++ b/src/examples/java/TestFramework.java
@@ -56,13 +56,35 @@ public class TestFramework {
     @Override
     public void resourceOffers(SchedulerDriver driver,
                                List<Offer> offers) {
+      double CPUS_PER_TASK = 1;
+      double MEM_PER_TASK = 128;
+
       for (Offer offer : offers) {
         List<TaskInfo> tasks = new ArrayList<TaskInfo>();
-        if (launchedTasks < totalTasks) {
+        double offerCpus = 0;
+        double offerMem = 0;
+        for (Resource resource : offer.getResourcesList()) {
+          if (resource.getName().equals("cpus")) {
+            offerCpus += resource.getScalar().getValue();
+          } else if (resource.getName().equals("mem")) {
+            offerMem += resource.getScalar().getValue();
+          }
+        }
+
+        System.out.println(
+            "Received offer " + offer.getId().getValue() + " with cpus: " + offerCpus +
+            " and mem: " + offerMem);
+
+        double remainingCpus = offerCpus;
+        double remainingMem = offerMem;
+        while (launchedTasks < totalTasks &&
+               remainingCpus >= CPUS_PER_TASK &&
+               remainingMem >= MEM_PER_TASK) {
           TaskID taskId = TaskID.newBuilder()
             .setValue(Integer.toString(launchedTasks++)).build();
 
-          System.out.println("Launching task " + taskId.getValue());
+          System.out.println("Launching task " + taskId.getValue() +
+                             " using offer " + offer.getId().getValue());
 
           TaskInfo task = TaskInfo.newBuilder()
             .setName("task " + taskId.getValue())
@@ -71,14 +93,18 @@ public class TestFramework {
             .addResources(Resource.newBuilder()
                           .setName("cpus")
                           .setType(Value.Type.SCALAR)
-                          .setScalar(Value.Scalar.newBuilder().setValue(1)))
+                          .setScalar(Value.Scalar.newBuilder().setValue(CPUS_PER_TASK)))
             .addResources(Resource.newBuilder()
                           .setName("mem")
                           .setType(Value.Type.SCALAR)
-                          .setScalar(Value.Scalar.newBuilder().setValue(128)))
+                          .setScalar(Value.Scalar.newBuilder().setValue(MEM_PER_TASK)))
             .setExecutor(ExecutorInfo.newBuilder(executor))
             .build();
+
           tasks.add(task);
+
+          remainingCpus -= CPUS_PER_TASK;
+          remainingMem -= MEM_PER_TASK;
         }
         Filters filters = Filters.newBuilder().setRefuseSeconds(1).build();
         driver.launchTasks(offer.getId(), tasks, filters);

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/low_level_scheduler_libprocess.cpp
----------------------------------------------------------------------
diff --git a/src/examples/low_level_scheduler_libprocess.cpp b/src/examples/low_level_scheduler_libprocess.cpp
index 9e93bb4..eb7f8bf 100644
--- a/src/examples/low_level_scheduler_libprocess.cpp
+++ b/src/examples/low_level_scheduler_libprocess.cpp
@@ -43,6 +43,8 @@
 #include <stout/os.hpp>
 #include <stout/stringify.hpp>
 
+#include "common/type_utils.hpp"
+
 #include "logging/flags.hpp"
 
 using namespace mesos;
@@ -61,7 +63,7 @@ using mesos::scheduler::Call;
 using mesos::scheduler::Event;
 
 const int32_t CPUS_PER_TASK = 1;
-const int32_t MEM_PER_TASK = 32;
+const int32_t MEM_PER_TASK = 128;
 
 class LowLevelScheduler : public process::Process<LowLevelScheduler>
 {
@@ -210,8 +212,8 @@ private:
   void resourceOffers(const vector<Offer>& offers)
   {
     foreach (const Offer& offer, offers) {
-      cout << "Offer '" << offer.id().value() << "' has "
-           << offer.resources() << endl;
+      cout << "Received offer " << offer.id() << " with " << offer.resources()
+           << endl;
 
       static const Resources TASK_RESOURCES = Resources::parse(
           "cpus:" + stringify(CPUS_PER_TASK) +
@@ -225,8 +227,8 @@ private:
              TASK_RESOURCES <= remaining.flatten()) {
         int taskId = tasksLaunched++;
 
-        cout << "Starting task " << taskId << " on "
-             << offer.hostname() << endl;
+        cout << "Launching task " << taskId << " using offer "
+             << offer.id() << endl;
 
         TaskInfo task;
         task.set_name("Task " + lexical_cast<string>(taskId));

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/low_level_scheduler_pthread.cpp
----------------------------------------------------------------------
diff --git a/src/examples/low_level_scheduler_pthread.cpp b/src/examples/low_level_scheduler_pthread.cpp
index a408571..f5e669f 100644
--- a/src/examples/low_level_scheduler_pthread.cpp
+++ b/src/examples/low_level_scheduler_pthread.cpp
@@ -42,6 +42,8 @@
 #include <stout/os.hpp>
 #include <stout/stringify.hpp>
 
+#include "common/type_utils.hpp"
+
 #include "logging/flags.hpp"
 
 using namespace mesos;
@@ -60,7 +62,7 @@ using mesos::scheduler::Call;
 using mesos::scheduler::Event;
 
 const int32_t CPUS_PER_TASK = 1;
-const int32_t MEM_PER_TASK = 32;
+const int32_t MEM_PER_TASK = 128;
 
 class LowLevelScheduler
 {
@@ -261,8 +263,8 @@ private:
   void resourceOffers(const vector<Offer>& offers)
   {
     foreach (const Offer& offer, offers) {
-      cout << "Offer '" << offer.id().value() << "' has "
-           << offer.resources() << endl;
+      cout << "Received offer " << offer.id() << " with " << offer.resources()
+           << endl;
 
       static const Resources TASK_RESOURCES = Resources::parse(
           "cpus:" + stringify(CPUS_PER_TASK) +
@@ -276,8 +278,8 @@ private:
              TASK_RESOURCES <= remaining.flatten()) {
         int taskId = tasksLaunched++;
 
-        cout << "Starting task " << taskId << " on "
-             << offer.hostname() << endl;
+        cout << "Launching task " << taskId << " using offer "
+             << offer.id() << endl;
 
         TaskInfo task;
         task.set_name("Task " + lexical_cast<string>(taskId));

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/no_executor_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/no_executor_framework.cpp b/src/examples/no_executor_framework.cpp
index 1dd2b99..ddc7cab 100644
--- a/src/examples/no_executor_framework.cpp
+++ b/src/examples/no_executor_framework.cpp
@@ -23,11 +23,16 @@
 
 #include <boost/lexical_cast.hpp>
 
+#include <mesos/resources.hpp>
 #include <mesos/scheduler.hpp>
 
+#include <stout/check.hpp>
 #include <stout/exit.hpp>
 #include <stout/numify.hpp>
 #include <stout/os.hpp>
+#include <stout/stringify.hpp>
+
+#include "common/type_utils.hpp"
 
 using namespace mesos;
 
@@ -40,8 +45,10 @@ using std::flush;
 using std::string;
 using std::vector;
 
+using mesos::Resources;
+
 const int32_t CPUS_PER_TASK = 1;
-const int32_t MEM_PER_TASK = 32;
+const int32_t MEM_PER_TASK = 128;
 
 class NoExecutorScheduler : public Scheduler
 {
@@ -65,36 +72,24 @@ public:
   virtual void resourceOffers(SchedulerDriver* driver,
                               const vector<Offer>& offers)
   {
-    cout << "." << flush;
-    for (size_t i = 0; i < offers.size(); i++) {
-      const Offer& offer = offers[i];
-
-      // Lookup resources we care about.
-      // TODO(benh): It would be nice to ultimately have some helper
-      // functions for looking up resources.
-      double cpus = 0;
-      double mem = 0;
-
-      for (int i = 0; i < offer.resources_size(); i++) {
-        const Resource& resource = offer.resources(i);
-        if (resource.name() == "cpus" &&
-            resource.type() == Value::SCALAR) {
-          cpus = resource.scalar().value();
-        } else if (resource.name() == "mem" &&
-                   resource.type() == Value::SCALAR) {
-          mem = resource.scalar().value();
-        }
-      }
+    foreach (const Offer& offer, offers) {
+      cout << "Received offer " << offer.id() << " with " << offer.resources()
+           << endl;
+
+      static const Resources TASK_RESOURCES = Resources::parse(
+          "cpus:" + stringify(CPUS_PER_TASK) +
+          ";mem:" + stringify(MEM_PER_TASK)).get();
+
+      Resources remaining = offer.resources();
 
       // Launch tasks.
       vector<TaskInfo> tasks;
       while (tasksLaunched < totalTasks &&
-             cpus >= CPUS_PER_TASK &&
-             mem >= MEM_PER_TASK) {
+             TASK_RESOURCES <= remaining.flatten()) {
         int taskId = tasksLaunched++;
 
-        cout << "Starting task " << taskId << " on "
-             << offer.hostname() << endl;
+        cout << "Launching task " << taskId << " using offer "
+             << offer.id() << endl;
 
         TaskInfo task;
         task.set_name("Task " + lexical_cast<string>(taskId));
@@ -102,22 +97,12 @@ public:
         task.mutable_slave_id()->MergeFrom(offer.slave_id());
         task.mutable_command()->set_value("echo hello");
 
-        Resource* resource;
-
-        resource = task.add_resources();
-        resource->set_name("cpus");
-        resource->set_type(Value::SCALAR);
-        resource->mutable_scalar()->set_value(CPUS_PER_TASK);
-
-        resource = task.add_resources();
-        resource->set_name("mem");
-        resource->set_type(Value::SCALAR);
-        resource->mutable_scalar()->set_value(MEM_PER_TASK);
+        Option<Resources> resources = remaining.find(TASK_RESOURCES);
+        CHECK_SOME(resources);
+        task.mutable_resources()->MergeFrom(resources.get());
+        remaining -= resources.get();
 
         tasks.push_back(task);
-
-        cpus -= CPUS_PER_TASK;
-        mem -= MEM_PER_TASK;
       }
 
       driver->launchTasks(offer.id(), tasks);

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/python/test_framework.py
----------------------------------------------------------------------
diff --git a/src/examples/python/test_framework.py b/src/examples/python/test_framework.py
index 75ca509..761c04e 100755
--- a/src/examples/python/test_framework.py
+++ b/src/examples/python/test_framework.py
@@ -27,7 +27,7 @@ import mesos.native
 TOTAL_TASKS = 5
 
 TASK_CPUS = 1
-TASK_MEM = 32
+TASK_MEM = 128
 
 class TestScheduler(mesos.interface.Scheduler):
     def __init__(self, executor):
@@ -42,16 +42,30 @@ class TestScheduler(mesos.interface.Scheduler):
         print "Registered with framework ID %s" % frameworkId.value
 
     def resourceOffers(self, driver, offers):
-        print "Got %d resource offers" % len(offers)
         for offer in offers:
             tasks = []
-            print "Got resource offer %s" % offer.id.value
-            if self.tasksLaunched < TOTAL_TASKS:
+            offerCpus = 0
+            offerMem = 0
+            for resource in offer.resources:
+                if resource.name == "cpus":
+                    offerCpus += resource.scalar.value
+                elif resource.name == "mem":
+                    offerMem += resource.scalar.value
+
+            print "Received offer %s with cpus: %s and mem: %s" \
+                  % (offer.id.value, offerCpus, offerMem)
+
+            remainingCpus = offerCpus
+            remainingMem = offerMem
+
+            while self.tasksLaunched < TOTAL_TASKS and \
+                  remainingCpus >= TASK_CPUS and \
+                  remainingMem >= TASK_MEM:
                 tid = self.tasksLaunched
                 self.tasksLaunched += 1
 
-                print "Accepting offer on %s to start task %d" \
-                      % (offer.hostname, tid)
+                print "Launching task %d using offer %s" \
+                      % (tid, offer.id.value)
 
                 task = mesos_pb2.TaskInfo()
                 task.task_id.value = str(tid)
@@ -72,6 +86,10 @@ class TestScheduler(mesos.interface.Scheduler):
                 tasks.append(task)
                 self.taskData[task.task_id.value] = (
                     offer.slave_id, task.executor.executor_id)
+
+                remainingCpus -= TASK_CPUS
+                remainingMem -= TASK_MEM
+
             driver.launchTasks(offer.id, tasks)
 
     def statusUpdate(self, driver, update):

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/examples/test_framework.cpp
----------------------------------------------------------------------
diff --git a/src/examples/test_framework.cpp b/src/examples/test_framework.cpp
index e6e7137..e6c0d33 100644
--- a/src/examples/test_framework.cpp
+++ b/src/examples/test_framework.cpp
@@ -33,6 +33,8 @@
 #include <stout/os.hpp>
 #include <stout/stringify.hpp>
 
+#include "common/type_utils.hpp"
+
 #include "logging/flags.hpp"
 
 using namespace mesos;
@@ -49,7 +51,7 @@ using std::vector;
 using mesos::Resources;
 
 const int32_t CPUS_PER_TASK = 1;
-const int32_t MEM_PER_TASK = 32;
+const int32_t MEM_PER_TASK = 128;
 
 class TestScheduler : public Scheduler
 {
@@ -77,9 +79,9 @@ public:
   virtual void resourceOffers(SchedulerDriver* driver,
                               const vector<Offer>& offers)
   {
-    cout << "." << flush;
-    for (size_t i = 0; i < offers.size(); i++) {
-      const Offer& offer = offers[i];
+    foreach (const Offer& offer, offers) {
+      cout << "Received offer " << offer.id() << " with " << offer.resources()
+           << endl;
 
       static const Resources TASK_RESOURCES = Resources::parse(
           "cpus:" + stringify(CPUS_PER_TASK) +
@@ -93,8 +95,8 @@ public:
              TASK_RESOURCES <= remaining.flatten()) {
         int taskId = tasksLaunched++;
 
-        cout << "Starting task " << taskId << " on "
-             << offer.hostname() << endl;
+        cout << "Launching task " << taskId << " using offer "
+             << offer.id() << endl;
 
         TaskInfo task;
         task.set_name("Task " + lexical_cast<string>(taskId));

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/java_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/java_framework_test.sh b/src/tests/java_framework_test.sh
index 95a05a6..955fd8e 100755
--- a/src/tests/java_framework_test.sh
+++ b/src/tests/java_framework_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves.
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the Java test framework executes without crashing (returns 0).
 exec $MESOS_BUILD_DIR/src/examples/java/test-framework local

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/low_level_scheduler_libprocess_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/low_level_scheduler_libprocess_test.sh b/src/tests/low_level_scheduler_libprocess_test.sh
index eb1736a..7984559 100755
--- a/src/tests/low_level_scheduler_libprocess_test.sh
+++ b/src/tests/low_level_scheduler_libprocess_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the C++ low level scheduler executes without crashing (returns 0).
 exec ${MESOS_BUILD_DIR}/src/low-level-scheduler-libprocess --master=local

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/low_level_scheduler_pthread_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/low_level_scheduler_pthread_test.sh b/src/tests/low_level_scheduler_pthread_test.sh
index 839e8eb..c6e7115 100755
--- a/src/tests/low_level_scheduler_pthread_test.sh
+++ b/src/tests/low_level_scheduler_pthread_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the C++ low level scheduler executes without crashing (returns 0).
 exec ${MESOS_BUILD_DIR}/src/low-level-scheduler-pthread --master=local

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/no_executor_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/no_executor_framework_test.sh b/src/tests/no_executor_framework_test.sh
index e8d72a3..d2d3955 100755
--- a/src/tests/no_executor_framework_test.sh
+++ b/src/tests/no_executor_framework_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the C++ test framework executes without crashing (returns 0).
 exec ${MESOS_BUILD_DIR}/src/no-executor-framework local

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/python_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/python_framework_test.sh b/src/tests/python_framework_test.sh
index a1e36df..2a322da 100755
--- a/src/tests/python_framework_test.sh
+++ b/src/tests/python_framework_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the Python test framework executes without crashing (returns 0).
 exec $MESOS_BUILD_DIR/src/examples/python/test-framework local

http://git-wip-us.apache.org/repos/asf/mesos/blob/0cd8d64b/src/tests/test_framework_test.sh
----------------------------------------------------------------------
diff --git a/src/tests/test_framework_test.sh b/src/tests/test_framework_test.sh
index 277245d..209e9d8 100755
--- a/src/tests/test_framework_test.sh
+++ b/src/tests/test_framework_test.sh
@@ -24,5 +24,8 @@ export MESOS_WORK_DIR=${MESOS_WORK_DIR}
 # Set local Mesos runner to use 3 slaves
 export MESOS_NUM_SLAVES=3
 
+# Set resources for the slave.
+export MESOS_RESOURCES="cpus:2;mem:10240"
+
 # Check that the C++ test framework executes without crashing (returns 0).
 exec ${MESOS_BUILD_DIR}/src/test-framework --master=local