Implement plasma.wait (#12)

* implement wait

* fix wait documentation

* fixes

* More fixes.

* more fixes

* Update test to check if redis-server is present.
This commit is contained in:
Philipp Moritz
2016-10-29 17:30:34 -07:00
committed by Robert Nishihara
parent ee3718c80c
commit e6319986ec
8 changed files with 355 additions and 46 deletions
+2 -1
View File
@@ -186,7 +186,8 @@ TEST request_transfer_timeout_test(void) {
int manager_fd = get_manager_fd(local_mock->plasma_conn);
int nbytes = recv(manager_fd, (uint8_t *) &reply, sizeof(reply), MSG_WAITALL);
ASSERT_EQ(nbytes, sizeof(reply));
ASSERT_EQ(memcmp(&oid, &reply.object_id, sizeof(object_id)), 0);
ASSERT_EQ(reply.num_object_ids, 1);
ASSERT_EQ(memcmp(&oid, &reply.object_ids, sizeof(object_id)), 0);
ASSERT_EQ(reply.has_object, 0);
/* Clean up. */
destroy_plasma_mock(remote_mock);
+70 -15
View File
@@ -10,6 +10,7 @@ import unittest
import random
import time
import tempfile
import threading
import plasma
@@ -52,6 +53,11 @@ def assert_get_object_equal(unit_test, client1, client2, object_id, memory_buffe
unit_test.assertEqual(client1.get_metadata(object_id)[:],
client2.get_metadata(object_id)[:])
# Check if the redis-server binary is present.
redis_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../common/thirdparty/redis-3.2.3/src/redis-server")
if not os.path.exists(redis_path):
raise Exception("You do not have the redis-server binary. Run `make test` in the plasma directory to get it.")
class TestPlasmaClient(unittest.TestCase):
def setUp(self):
@@ -226,17 +232,12 @@ class TestPlasmaManager(unittest.TestCase):
# Start a Redis server.
redis_path = os.path.join(os.path.abspath(os.path.dirname(__file__)), "../../common/thirdparty/redis-3.2.3/src/redis-server")
self.redis_process = None
manager_redis_args = []
if os.path.exists(redis_path):
redis_port = 6379
with open(os.devnull, 'w') as FNULL:
self.redis_process = subprocess.Popen([redis_path,
"--port", str(redis_port)],
stdout=FNULL)
time.sleep(0.1)
manager_redis_args = ["-r", "{addr}:{port}".format(addr="127.0.0.1",
port=redis_port)]
redis_port = 6379
with open(os.devnull, "w") as FNULL:
self.redis_process = subprocess.Popen([redis_path,
"--port", str(redis_port)],
stdout=FNULL)
time.sleep(0.1)
# Start two PlasmaManagers.
self.port1 = random.randint(10000, 50000)
@@ -246,12 +247,16 @@ class TestPlasmaManager(unittest.TestCase):
"-s", store_name1,
"-m", manager_name1,
"-h", "127.0.0.1",
"-p", str(self.port1)] + manager_redis_args
"-p", str(self.port1),
"-r", "{addr}:{port}".format(addr="127.0.0.1",
port=redis_port)]
plasma_manager_command2 = [plasma_manager_executable,
"-s", store_name2,
"-m", manager_name2,
"-h", "127.0.0.1",
"-p", str(self.port2)] + manager_redis_args
"-p", str(self.port2),
"-r", "{addr}:{port}".format(addr="127.0.0.1",
port=redis_port)]
if USE_VALGRIND:
self.p4 = subprocess.Popen(["valgrind", "--track-origins=yes", "--leak-check=full", "--show-leak-kinds=all", "--error-exitcode=1"] + plasma_manager_command1)
@@ -283,8 +288,7 @@ class TestPlasmaManager(unittest.TestCase):
self.p3.kill()
self.p4.kill()
self.p5.kill()
if self.redis_process:
self.redis_process.kill()
self.redis_process.kill()
# def test_fetch(self):
# if self.redis_process is None:
@@ -341,6 +345,57 @@ class TestPlasmaManager(unittest.TestCase):
# assert_get_object_equal(self, self.client2, self.client1, object_id2,
# memory_buffer=memory_buffer2, metadata=metadata2)
def test_wait(self):
# Test timeout.
obj_id0 = random_object_id()
self.client1.wait([obj_id0], timeout=100, num_returns=1)
# If we get here, the test worked.
# Test wait if local objects available.
obj_id1 = random_object_id()
self.client1.create(obj_id1, 1000)
self.client1.seal(obj_id1)
ready, waiting = self.client1.wait([obj_id1], timeout=100, num_returns=1)
self.assertEqual(len(ready), 1)
self.assertEqual(ready[0], obj_id1)
self.assertEqual(len(waiting), 0)
# Test wait if only one object available and only one object waited for.
obj_id2 = random_object_id()
self.client1.create(obj_id2, 1000)
# Don't seal.
ready, waiting = self.client1.wait([obj_id2, obj_id1], timeout=100, num_returns=1)
self.assertEqual(len(ready), 1)
self.assertEqual(ready[0], obj_id1)
self.assertEqual(len(waiting), 1)
self.assertEqual(waiting[0], obj_id2)
# Test wait if object is sealed later.
obj_id3 = random_object_id()
def finish():
self.client2.create(obj_id3, 1000)
self.client2.seal(obj_id3)
self.client2.transfer("127.0.0.1", self.port1, obj_id3)
t = threading.Timer(0.1, finish)
t.start()
ready, waiting = self.client1.wait([obj_id3, obj_id2, obj_id1], timeout=500, num_returns=2)
self.assertEqual(len(ready), 2)
self.assertTrue((ready[0] == obj_id1 and ready[1] == obj_id3) or (ready[0] == obj_id3 and ready[1] == obj_id1))
self.assertEqual(len(waiting), 1)
self.assertTrue(waiting[0] == obj_id2)
# Test if the appropriate number of objects is shown if some objects are not ready
ready, wait = self.client1.wait([obj_id3, obj_id2, obj_id1], 100, 3)
self.assertEqual(len(ready), 2)
self.assertTrue((ready[0] == obj_id1 and ready[1] == obj_id3) or (ready[0] == obj_id3 and ready[1] == obj_id1))
self.assertEqual(len(waiting), 1)
self.assertTrue(waiting[0] == obj_id2)
# Don't forget to seal obj_id2.
self.client1.seal(obj_id2)
def test_transfer(self):
for _ in range(100):
# Create an object.