Пример #1
0
    def f(c, a, b):
        aa = rpc(ip=a.ip, port=a.port)
        bb = rpc(ip=b.ip, port=b.port)

        result = yield aa.identity()
        assert not a.active
        response = yield aa.compute(key='x',
                                    function=dumps(add),
                                    args=dumps([1, 2]),
                                    who_has={},
                                    close=True)
        assert not a.active
        assert response['status'] == 'OK'
        assert a.data['x'] == 3
        assert c.who_has['x'] == {a.address}
        assert isinstance(response['compute-start'], float)
        assert isinstance(response['compute-stop'], float)
        assert isinstance(response['thread'], int)

        response = yield bb.compute(key='y',
                                    function=dumps(add),
                                    args=dumps(['x', 10]),
                                    who_has={'x': [a.address]})
        assert response['status'] == 'OK'
        assert b.data['y'] == 13
        assert c.who_has['y'] == {b.address}
        assert response['nbytes'] == sizeof(b.data['y'])
        assert isinstance(response['transfer-start'], float)
        assert isinstance(response['transfer-stop'], float)

        def bad_func():
            1 / 0

        response = yield bb.compute(key='z',
                                    function=dumps(bad_func),
                                    args=dumps(()),
                                    close=True)
        assert not b.active
        assert response['status'] == 'error'
        assert isinstance(loads(response['exception']), ZeroDivisionError)
        if sys.version_info[0] >= 3:
            assert any('1 / 0' in line
                      for line in pluck(3, traceback.extract_tb(
                          loads(response['traceback'])))
                      if line)

        aa.close_streams()
        yield a._close()

        assert a.address not in c.ncores and b.address in c.ncores

        assert list(c.ncores.keys()) == [b.address]

        assert isinstance(b.address, str)
        assert b.ip in b.address
        assert str(b.port) in b.address

        bb.close_streams()
        yield b._close()
Пример #2
0
def test_dumps_task():
    d = dumps_task((inc, 1))
    assert set(d) == {'function', 'args'}

    f = lambda x, y=2: x + y
    d = dumps_task((apply, f, (1, ), {'y': 10}))
    assert loads(d['function'])(1, 2) == 3
    assert loads(d['args']) == (1, )
    assert loads(d['kwargs']) == {'y': 10}
Пример #3
0
def test_dumps_task():
    d = dumps_task((inc, 1))
    assert set(d) == {'function', 'args'}

    f = lambda x, y=2: x + y
    d = dumps_task((apply, f, (1,), {'y': 10}))
    assert loads(d['function'])(1, 2) == 3
    assert loads(d['args']) == (1,)
    assert loads(d['kwargs']) == {'y': 10}
Пример #4
0
    def f(c, a, b):
        aa = rpc(ip=a.ip, port=a.port)
        bb = rpc(ip=b.ip, port=b.port)

        result = yield aa.identity()
        assert not a.active
        response = yield aa.compute(key='x',
                                    function=dumps(add),
                                    args=dumps([1, 2]),
                                    who_has={},
                                    close=True)
        assert not a.active
        assert response['status'] == 'OK'
        assert a.data['x'] == 3
        assert c.who_has['x'] == {a.address}
        assert isinstance(response['compute-start'], float)
        assert isinstance(response['compute-stop'], float)
        assert isinstance(response['thread'], int)

        response = yield bb.compute(key='y',
                                    function=dumps(add),
                                    args=dumps(['x', 10]),
                                    who_has={'x': [a.address]})
        assert response['status'] == 'OK'
        assert b.data['y'] == 13
        assert c.who_has['y'] == {b.address}
        assert response['nbytes'] == sizeof(b.data['y'])
        assert isinstance(response['transfer-start'], float)
        assert isinstance(response['transfer-stop'], float)

        def bad_func():
            1 / 0

        response = yield bb.compute(key='z',
                                    function=dumps(bad_func),
                                    args=dumps(()),
                                    close=True)
        assert not b.active
        assert response['status'] == 'error'
        assert isinstance(loads(response['exception']), ZeroDivisionError)
        if sys.version_info[0] >= 3:
            assert any('1 / 0' in line for line in pluck(
                3, traceback.extract_tb(loads(response['traceback']))) if line)

        aa.close_streams()
        yield a._close()

        assert a.address not in c.ncores and b.address in c.ncores

        assert list(c.ncores.keys()) == [b.address]

        assert isinstance(b.address, str)
        assert b.ip in b.address
        assert str(b.port) in b.address

        bb.close_streams()
        yield b._close()
Пример #5
0
def test_dumps_function():
    a = dumps_function(inc)
    assert loads(a)(10) == 11

    b = dumps_function(inc)
    assert a is b

    c = dumps_function(dec)
    assert a != c
Пример #6
0
def test_dumps_function():
    a = dumps_function(inc)
    assert loads(a)(10) == 11

    b = dumps_function(inc)
    assert a is b

    c = dumps_function(dec)
    assert a != c
Пример #7
0
def test_run(s):
    pytest.importorskip('psutil')
    n = Nanny(s.ip, s.port, ncores=2, ip='127.0.0.1', loop=s.loop)
    yield n._start()

    nn = rpc(n.address)

    response = yield nn.run(function=dumps(lambda: 1))
    assert response['status'] == 'OK'
    assert loads(response['result']) == 1
Пример #8
0
def test_run(s):
    pytest.importorskip('psutil')
    n = Nanny(s.ip, s.port, ncores=2, ip='127.0.0.1', loop=s.loop)
    yield n._start()

    with rpc(n.address) as nn:
        response = yield nn.run(function=dumps(lambda: 1))
        assert response['status'] == 'OK'
        assert loads(response['result']) == 1

    yield n._close()
Пример #9
0
def test_worker_bad_args(c, a, b):
    aa = rpc(ip=a.ip, port=a.port)
    bb = rpc(ip=b.ip, port=b.port)

    class NoReprObj(object):
        """ This object cannot be properly represented as a string. """
        def __str__(self):
            raise ValueError("I have no str representation.")
        def __repr__(self):
            raise ValueError("I have no repr representation.")

    response = yield aa.compute(key='x',
                                function=dumps(NoReprObj),
                                args=dumps(()),
                                who_has={})
    assert not a.active
    assert response['status'] == 'OK'
    assert a.data['x']
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    def bad_func(*args, **kwargs):
        1 / 0

    class MockLoggingHandler(logging.Handler):
        """Mock logging handler to check for expected logs."""

        def __init__(self, *args, **kwargs):
            self.reset()
            logging.Handler.__init__(self, *args, **kwargs)

        def emit(self, record):
            self.messages[record.levelname.lower()].append(record.getMessage())

        def reset(self):
            self.messages = {
                'debug': [],
                'info': [],
                'warning': [],
                'error': [],
                'critical': [],
            }

    hdlr = MockLoggingHandler()
    old_level = logger.level
    logger.setLevel(logging.DEBUG)
    logger.addHandler(hdlr)
    response = yield bb.compute(key='y',
                                function=dumps(bad_func),
                                args=dumps(['x']),
                                kwargs=dumps({'k': 'x'}),
                                who_has={'x': [a.address]})
    assert not b.active
    assert response['status'] == 'error'
    # Make sure job died because of bad func and not because of bad
    # argument.
    assert isinstance(loads(response['exception']), ZeroDivisionError)
    if sys.version_info[0] >= 3:
        assert any('1 / 0' in line
                  for line in pluck(3, traceback.extract_tb(
                      loads(response['traceback'])))
                  if line)
    assert hdlr.messages['warning'][0] == " Compute Failed\n" \
        "Function: bad_func\n" \
        "args:     (< could not convert arg to str >)\n" \
        "kwargs:   {'k': < could not convert arg to str >}\n"
    assert re.match(r"^Send compute response to scheduler: y, " \
        "\{.*'args': \(< could not convert arg to str >\), .*" \
        "'kwargs': \{'k': < could not convert arg to str >\}.*\}",
        hdlr.messages['debug'][0]) or \
        re.match("^Send compute response to scheduler: y, " \
        "\{.*'kwargs': \{'k': < could not convert arg to str >\}, .*" \
        "'args': \(< could not convert arg to str >\).*\}",
        hdlr.messages['debug'][0])
    logger.setLevel(old_level)

    # Now we check that both workers are still alive.

    assert not a.active
    response = yield aa.compute(key='z',
                                function=dumps(add),
                                args=dumps([1, 2]),
                                who_has={},
                                close=True)
    assert not a.active
    assert response['status'] == 'OK'
    assert a.data['z'] == 3
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    assert not b.active
    response = yield bb.compute(key='w',
                                function=dumps(add),
                                args=dumps([1, 2]),
                                who_has={},
                                close=True)
    assert not b.active
    assert response['status'] == 'OK'
    assert b.data['w'] == 3
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    aa.close_streams()

    bb.close_streams()
Пример #10
0
def test_worker_bad_args(c, a, b):
    aa = rpc(ip=a.ip, port=a.port)
    bb = rpc(ip=b.ip, port=b.port)

    class NoReprObj(object):
        """ This object cannot be properly represented as a string. """
        def __str__(self):
            raise ValueError("I have no str representation.")
        def __repr__(self):
            raise ValueError("I have no repr representation.")

    response = yield aa.compute(key='x',
                                function=dumps(NoReprObj),
                                args=dumps(()),
                                who_has={})
    assert not a.active
    assert response['status'] == 'OK'
    assert a.data['x']
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    def bad_func(*args, **kwargs):
        1 / 0

    class MockLoggingHandler(logging.Handler):
        """Mock logging handler to check for expected logs."""

        def __init__(self, *args, **kwargs):
            self.reset()
            logging.Handler.__init__(self, *args, **kwargs)

        def emit(self, record):
            self.messages[record.levelname.lower()].append(record.getMessage())

        def reset(self):
            self.messages = {
                'debug': [],
                'info': [],
                'warning': [],
                'error': [],
                'critical': [],
            }

    hdlr = MockLoggingHandler()
    old_level = logger.level
    logger.setLevel(logging.DEBUG)
    logger.addHandler(hdlr)
    response = yield bb.compute(key='y',
                                function=dumps(bad_func),
                                args=dumps(['x']),
                                kwargs=dumps({'k': 'x'}),
                                who_has={'x': [a.address]})
    assert not b.active
    assert response['status'] == 'error'
    # Make sure job died because of bad func and not because of bad
    # argument.
    assert isinstance(loads(response['exception']), ZeroDivisionError)
    if sys.version_info[0] >= 3:
        assert any('1 / 0' in line
                  for line in pluck(3, traceback.extract_tb(
                      loads(response['traceback'])))
                  if line)
    assert hdlr.messages['warning'][0] == " Compute Failed\n" \
        "Function: bad_func\n" \
        "args:     (< could not convert arg to str >)\n" \
        "kwargs:   {'k': < could not convert arg to str >}\n"
    assert re.match(r"^Send compute response to scheduler: y, " \
        "\{.*'args': \(< could not convert arg to str >\), .*" \
        "'kwargs': \{'k': < could not convert arg to str >\}.*\}",
        hdlr.messages['debug'][0]) or \
        re.match("^Send compute response to scheduler: y, " \
        "\{.*'kwargs': \{'k': < could not convert arg to str >\}, .*" \
        "'args': \(< could not convert arg to str >\).*\}",
        hdlr.messages['debug'][0])
    logger.setLevel(old_level)

    # Now we check that both workers are still alive.

    assert not a.active
    response = yield aa.compute(key='z',
                                function=dumps(add),
                                args=dumps([1, 2]),
                                who_has={},
                                close=True)
    assert not a.active
    assert response['status'] == 'OK'
    assert a.data['z'] == 3
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    assert not b.active
    response = yield bb.compute(key='w',
                                function=dumps(add),
                                args=dumps([1, 2]),
                                who_has={},
                                close=True)
    assert not b.active
    assert response['status'] == 'OK'
    assert b.data['w'] == 3
    assert isinstance(response['compute_start'], float)
    assert isinstance(response['compute_stop'], float)
    assert isinstance(response['thread'], Integral)

    aa.close_streams()

    bb.close_streams()