Example #1
0
def test_nanny_worker_port_range(loop):
    with popen(["dask-scheduler", "--port", "9359",
                "--no-dashboard"]) as sched:
        nprocs = 3
        worker_port = "9684:9686"
        nanny_port = "9688:9690"
        with popen([
                "dask-worker",
                "127.0.0.1:9359",
                "--nprocs",
                f"{nprocs}",
                "--host",
                "127.0.0.1",
                "--worker-port",
                worker_port,
                "--nanny-port",
                nanny_port,
                "--no-dashboard",
        ]) as worker:
            with Client("127.0.0.1:9359", loop=loop) as c:
                start = time()
                while len(c.scheduler_info()["workers"]) < nprocs:
                    sleep(0.1)
                    assert time() - start < 60

                def get_port(dask_worker):
                    return dask_worker.port

                expected_worker_ports = set(parse_ports(worker_port))
                worker_ports = c.run(get_port)
                assert set(worker_ports.values()) == expected_worker_ports

                expected_nanny_ports = set(parse_ports(nanny_port))
                nanny_ports = c.run(get_port, nanny=True)
                assert set(nanny_ports.values()) == expected_nanny_ports
Example #2
0
async def test_nanny_port_range(cleanup):
    async with Scheduler() as s:
        async with Client(s.address, asynchronous=True) as client:
            nanny_port = "9867:9868"
            worker_port = "9869:9870"
            async with Nanny(s.address,
                             port=nanny_port,
                             worker_port=worker_port) as n1:
                assert n1.port == 9867  # Selects first port in range
                async with Nanny(s.address,
                                 port=nanny_port,
                                 worker_port=worker_port) as n2:
                    assert n2.port == 9868  # Selects next port in range
                    with pytest.raises(ValueError,
                                       match="Could not start Nanny"
                                       ):  # No more ports left
                        async with Nanny(s.address,
                                         port=nanny_port,
                                         worker_port=worker_port):
                            pass

                    # Ensure Worker ports are in worker_port range
                    def get_worker_port(dask_worker):
                        return dask_worker.port

                    worker_ports = await client.run(get_worker_port)
                    assert list(
                        worker_ports.values()) == parse_ports(worker_port)
Example #3
0
def test_parse_ports():
    assert parse_ports(None) == [None]
    assert parse_ports(23) == [23]
    assert parse_ports("45") == [45]
    assert parse_ports("100:103") == [100, 101, 102, 103]

    with pytest.raises(ValueError, match="port_stop must be greater than port_start"):
        parse_ports("103:100")
Example #4
0
    async def start(self):
        """Start nanny, start local process, start watching"""

        await super().start()

        ports = parse_ports(self._start_port)
        for port in ports:
            start_address = address_from_user_args(
                host=self._start_host,
                port=port,
                interface=self._interface,
                protocol=self._protocol,
                security=self.security,
            )
            try:
                await self.listen(start_address,
                                  **self.security.get_listen_args("worker"))
            except OSError as e:
                if len(ports) > 1 and e.errno == errno.EADDRINUSE:
                    continue
                else:
                    raise
            else:
                self._start_address = start_address
                break
        else:
            raise ValueError(
                f"Could not start Nanny on host {self._start_host}"
                f"with port {self._start_port}")

        self.ip = get_address_host(self.address)

        for preload in self.preloads:
            await preload.start()

        msg = await self.scheduler.register_nanny()
        for name, plugin in msg["nanny-plugins"].items():
            await self.plugin_add(plugin=plugin, name=name)

        logger.info("        Start Nanny at: %r", self.address)
        response = await self.instantiate()
        if response == Status.running:
            assert self.worker_address
            self.status = Status.running
        else:
            await self.close()

        self.start_periodic_callbacks()

        return self