mirror of
https://github.com/wassname/ray.git
synced 2026-07-25 13:30:52 +08:00
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:
committed by
Robert Nishihara
parent
ee3718c80c
commit
e6319986ec
@@ -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
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user