Пример #1
0
 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_uid())
         with start_transfer_test_pool(
                 address=recv_pool_addr, plasma_size=self.plasma_storage_size) as rp:
             rp.create_actor(MockReceiverWorkerActor, uid=ReceiverWorkerActor.default_uid())
             yield sp, rp
Пример #2
0
    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 = tempfile.mkdtemp(
            prefix='mars_test_sender_')
        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_uid())
                with start_transfer_test_pool(
                        address=recv_pool_addr,
                        plasma_size=self.plasma_storage_size) as rp:
                    rp.create_actor(MockReceiverActor,
                                    uid=ReceiverActor.default_uid())
                    yield sp, rp

        with start_send_recv_pool() as (send_pool, recv_pool):
            chunk_holder_ref = send_pool.actor_ref(
                ChunkHolderActor.default_uid())
            sender_ref = send_pool.actor_ref(SenderActor.default_uid())
            receiver_ref = recv_pool.actor_ref(ReceiverActor.default_uid())

            sender_mapper_ref = send_pool.actor_ref(
                PlasmaKeyMapActor.default_uid())
            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)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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_uid())

                    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)) \
                        .catch(lambda *exc: test_actor.set_result(exc, accept=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)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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)) \
                        .catch(lambda *exc: test_actor.set_result(exc, accept=False))
                    with self.assertRaises(ChecksumMismatch):
                        self.get_result(5)
Пример #3
0
    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 = tempfile.mkdtemp(
            prefix='mars_test_sender_')
        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_uid())
                with start_transfer_test_pool(
                        address=recv_pool_addr,
                        plasma_size=self.plasma_storage_size) as rp:
                    rp.create_actor(MockReceiverActor,
                                    uid=ReceiverActor.default_uid())
                    yield sp, rp

        with start_send_recv_pool() as (send_pool, recv_pool):
            sender_ref = send_pool.actor_ref(SenderActor.default_uid())
            receiver_ref = recv_pool.actor_ref(ReceiverActor.default_uid())

            with self.run_actor_test(send_pool) as test_actor:
                storage_client = test_actor.storage_client

                # 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)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=False))
                with self.assertRaises(DependencyMissing):
                    self.get_result(5)

                # send data in spill
                serialized = dataserializer.serialize(mock_data)
                self.waitp(
                    storage_client.create_writer(
                        session_id, chunk_key1, serialized.total_bytes,
                        [DataStorageDevice.DISK
                         ]).then(lambda writer: promise.finished().then(
                             lambda *_: writer.write(serialized)).then(
                                 lambda *_: writer.close())))

                sender_ref_p.send_data(session_id, chunk_key1, recv_pool_addr, _promise=True) \
                    .then(lambda *s: test_actor.set_result(s)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=False))
                self.get_result(5)
                assert_array_equal(
                    mock_data,
                    receiver_ref.get_result_data(session_id, chunk_key1))
                storage_client.delete(session_id, chunk_key1)

                # send data in plasma store
                self.waitp(
                    storage_client.put_object(
                        session_id, chunk_key1, mock_data,
                        [DataStorageDevice.SHARED_MEMORY]))

                sender_ref_p.send_data(session_id, chunk_key1, recv_pool_addr, _promise=True) \
                    .then(lambda *s: test_actor.set_result(s)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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_uid())

                    self.waitp(
                        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)) \
                        .catch(lambda *exc: test_actor.set_result(exc, accept=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
                self.waitp(
                    storage_client.put_object(
                        session_id, chunk_key2, mock_data,
                        [DataStorageDevice.SHARED_MEMORY]))

                sender_ref_p.send_data(session_id, chunk_key2, recv_pool_addr2, _promise=True) \
                    .then(lambda *s: test_actor.set_result(s)) \
                    .catch(lambda *exc: test_actor.set_result(exc, accept=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)) \
                        .catch(lambda *exc: test_actor.set_result(exc, accept=False))
                    with self.assertRaises(ChecksumMismatch):
                        self.get_result(5)
Пример #4
0
    def testSender(self):
        send_pool_addr = f'localhost:{get_next_port()}'
        recv_pool_addr = f'localhost:{get_next_port()}'
        recv_pool_addr2 = f'localhost:{get_next_port()}'

        options.worker.spill_directory = tempfile.mkdtemp(
            prefix='mars_test_sender_')
        session_id = str(uuid.uuid4())

        mock_data = np.array([1, 2, 3, 4])
        chunk_key1 = str(uuid.uuid4())
        chunk_key2 = str(uuid.uuid4())
        chunk_key3 = str(uuid.uuid4())
        chunk_key4 = str(uuid.uuid4())
        chunk_key5 = str(uuid.uuid4())
        chunk_key6 = 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_uid())
                with start_transfer_test_pool(
                        address=recv_pool_addr,
                        plasma_size=self.plasma_storage_size) as rp:
                    rp.create_actor(MockReceiverWorkerActor,
                                    uid=ReceiverWorkerActor.default_uid())
                    yield sp, rp

        with start_send_recv_pool() as (send_pool, recv_pool), \
                self.run_actor_test(send_pool) as test_actor:
            sender_ref = send_pool.actor_ref(SenderActor.default_uid())

            storage_client = test_actor.storage_client
            sender_ref_p = test_actor.promise_ref(sender_ref)

            # SCENARIO 1: send when data missing
            with self.assertRaises(DependencyMissing):
                self.waitp(
                    sender_ref_p.send_data(session_id, ['non_exist'],
                                           [recv_pool_addr],
                                           _promise=True))

            # SCENARIO 2: send data to non-exist endpoint which causes error
            self.waitp(
                storage_client.put_objects(session_id, [chunk_key1],
                                           [mock_data],
                                           [DataStorageDevice.SHARED_MEMORY]))
            with self.assertRaises((BrokenPipeError, ConnectionRefusedError)):
                self.waitp(
                    sender_ref_p.send_data(session_id, [chunk_key1],
                                           [recv_pool_addr2],
                                           _promise=True))

            with start_transfer_test_pool(
                    address=recv_pool_addr2,
                    plasma_size=self.plasma_storage_size) as rp2:
                mock_recv_ref2 = rp2.create_actor(
                    MockReceiverWorkerActor,
                    uid=ReceiverWorkerActor.default_uid())

                # SCENARIO 3: send data to multiple targets
                self.waitp(
                    storage_client.put_objects(
                        session_id, [chunk_key2], [mock_data],
                        [DataStorageDevice.SHARED_MEMORY]))
                self.waitp(
                    sender_ref_p.send_data(session_id, [chunk_key2],
                                           [recv_pool_addr, recv_pool_addr2],
                                           block_size=128,
                                           _promise=True))
                # send data to already transferred / transferring
                self.waitp(
                    sender_ref_p.send_data(session_id, [chunk_key2],
                                           [recv_pool_addr, recv_pool_addr2],
                                           _promise=True))
                assert_array_equal(
                    mock_data,
                    mock_recv_ref2.get_result_data(session_id, chunk_key2))

                # SCENARIO 4: send multiple data at one time
                self.waitp(
                    storage_client.put_objects(
                        session_id, [chunk_key3, chunk_key4], [mock_data] * 2,
                        [DataStorageDevice.SHARED_MEMORY]))
                self.waitp(
                    sender_ref_p.send_data(session_id,
                                           [chunk_key3, chunk_key4],
                                           [recv_pool_addr2],
                                           _promise=True))
                assert_array_equal(
                    mock_data,
                    mock_recv_ref2.get_result_data(session_id, chunk_key3))
                assert_array_equal(
                    mock_data,
                    mock_recv_ref2.get_result_data(session_id, chunk_key4))

                # SCENARIO 5: send chunks already under transfer
                self.waitp(
                    storage_client.put_objects(
                        session_id, [chunk_key5], [mock_data],
                        [DataStorageDevice.SHARED_MEMORY]))
                mock_recv_ref2.set_receive_delay_key(session_id, chunk_key5, 1)
                sender_ref_p.send_data(session_id, [chunk_key2, chunk_key5],
                                       [recv_pool_addr2],
                                       _promise=True)
                self.waitp(
                    sender_ref_p.send_data(session_id, [chunk_key5],
                                           [recv_pool_addr2],
                                           _promise=True))
                assert_array_equal(
                    mock_data,
                    mock_recv_ref2.get_result_data(session_id, chunk_key5))

                # SCENARIO 6: send chunks already under transfer
                self.waitp(
                    storage_client.put_objects(
                        session_id, [chunk_key6], [mock_data],
                        [DataStorageDevice.SHARED_MEMORY]))
                mock_recv_ref2.set_receive_error_key(session_id, chunk_key6)
                with self.assertRaises(ValueError):
                    self.waitp(
                        sender_ref_p.send_data(session_id, [chunk_key6],
                                               [recv_pool_addr2],
                                               _promise=True))