def start_send_recv_pool(): with start_transfer_test_pool( address=send_pool_addr, plasma_size=self.plasma_storage_size) as sp: sp.create_actor(SenderActor, uid=SenderActor.default_name()) with start_transfer_test_pool( address=recv_pool_addr, plasma_size=self.plasma_storage_size) as rp: rp.create_actor(MockReceiverActor, uid=ReceiverActor.default_name()) yield sp, rp
def testSender(self): send_pool_addr = 'localhost:%d' % get_next_port() recv_pool_addr = 'localhost:%d' % get_next_port() recv_pool_addr2 = 'localhost:%d' % get_next_port() options.worker.spill_directory = os.path.join( tempfile.gettempdir(), 'mars_spill_%d_%d' % (os.getpid(), id(run_transfer_worker))) session_id = str(uuid.uuid4()) mock_data = np.array([1, 2, 3, 4]) chunk_key1 = str(uuid.uuid4()) chunk_key2 = str(uuid.uuid4()) @contextlib.contextmanager def start_send_recv_pool(): with start_transfer_test_pool( address=send_pool_addr, plasma_size=self.plasma_storage_size) as sp: sp.create_actor(SenderActor, uid=SenderActor.default_name()) with start_transfer_test_pool( address=recv_pool_addr, plasma_size=self.plasma_storage_size) as rp: rp.create_actor(MockReceiverActor, uid=ReceiverActor.default_name()) yield sp, rp with start_send_recv_pool() as (send_pool, recv_pool): chunk_holder_ref = send_pool.actor_ref(ChunkHolderActor.default_name()) sender_ref = send_pool.actor_ref(SenderActor.default_name()) receiver_ref = recv_pool.actor_ref(ReceiverActor.default_name()) sender_mapper_ref = send_pool.actor_ref(PlasmaKeyMapActor.default_name()) store = PlasmaChunkStore(self._plasma_client, sender_mapper_ref) with self.run_actor_test(send_pool) as test_actor: # send when data missing sender_ref_p = test_actor.promise_ref(sender_ref) sender_ref_p.send_data(session_id, str(uuid.uuid4()), recv_pool_addr, _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) with self.assertRaises(DependencyMissing): self.get_result(5) # send data in spill write_spill_file(chunk_key1, mock_data) sender_ref_p.send_data(session_id, chunk_key1, recv_pool_addr, _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) self.get_result(5) assert_array_equal(mock_data, receiver_ref.get_result_data(session_id, chunk_key1)) os.unlink(build_spill_file_name(chunk_key1)) # send data in plasma store store.put(session_id, chunk_key1, mock_data) chunk_holder_ref.register_chunk(session_id, chunk_key1) sender_ref_p.send_data(session_id, chunk_key1, recv_pool_addr, _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) self.get_result(5) assert_array_equal(mock_data, receiver_ref.get_result_data(session_id, chunk_key1)) # send data to multiple targets with start_transfer_test_pool( address=recv_pool_addr2, plasma_size=self.plasma_storage_size) as rp2: recv_ref2 = rp2.create_actor(MockReceiverActor, uid=ReceiverActor.default_name()) sender_ref_p.send_data(session_id, chunk_key1, [recv_pool_addr, recv_pool_addr2], _promise=True) # send data to already transferred / transferring sender_ref_p.send_data(session_id, chunk_key1, [recv_pool_addr, recv_pool_addr2], _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) self.get_result(5) assert_array_equal(mock_data, recv_ref2.get_result_data(session_id, chunk_key1)) # send data to non-exist endpoint which causes error store.put(session_id, chunk_key2, mock_data) chunk_holder_ref.register_chunk(session_id, chunk_key2) sender_ref_p.send_data(session_id, chunk_key2, recv_pool_addr2, _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) with self.assertRaises(BrokenPipeError): self.get_result(5) def mocked_receive_data_part(*_): raise ChecksumMismatch with patch_method(MockReceiverActor.receive_data_part, new=mocked_receive_data_part): sender_ref_p.send_data(session_id, chunk_key2, recv_pool_addr, _promise=True) \ .then(lambda *s: test_actor.set_result(s, destroy=False)) \ .catch(lambda *exc: test_actor.set_result(exc, accept=False, destroy=False)) with self.assertRaises(ChecksumMismatch): self.get_result(5)