Exemplo n.º 1
0
    def connect(self, add_to_free=True, callback=None):
        retries = self.reconnect_retries

        while True:
            try:
                log.info('trying to connect in connection %s. Retry #%d', self.idx,
                         self.reconnect_retries-retries+1)
                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
                sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
                sock.settimeout(self.timeout)
                sock.connect((self.host, self.port))
                self._stream = BrukvaStream(sock, io_loop=self._io_loop)
                self._stream.set_close_callback(self.on_stream_close)
                break
            except socket.error, e:
                log.error('Exception during connection %s!: %s', self.idx, str(e))

                retries -= 1

                log.debug('Retries: %d', retries)

                if retries <= 0:
                    log.info('No more retries to connect for connection %s', self.idx)
                    callback(ConnectionError("Exceeded retries to connect in connection %s" % self.idx))
                    return

                log.debug('sleeping %s sec during reconnect_timeout in connection %s',
                          self.reconnect_timeout, self.idx)
                if self._io_loop.running():
                    instance = self._io_loop.instance()
                    yield async(partial(instance.add_timeout, time() + self.reconnect_timeout))()
                else:
                    sleep(self.reconnect_timeout)

                log.debug('sleeping finished in connection %s', self.idx)
Exemplo n.º 2
0
class TestBrukvaStream(AsyncTestCase):

    def setUp(self):
        super(TestBrukvaStream, self).setUp()
        self.socket = mock.Mock()
        self.socket.fileno.return_value = stdin
        self.stream = BrukvaStream(self.socket, io_loop=self.io_loop)

    def test_read_bytes(self):
        string = 'hello world'
        len = 5
        self.socket.recv.return_value = string
        self.stream.read_bytes(len, self.stop)
        response = self.wait()
        eq_(response, string[:5])

    def test_read_until_times(self):
        string = 'hash:dsd:dsda:dsd'
        times = 2
        self.socket.recv.return_value = string
        delimiter = ':'
        self.stream.read_until_times(delimiter,times, self.stop)
        response = self.wait()
        eq_(response, ':'.join(string.split(delimiter, times)[:-1])+':')

    def test_read_multibulk(self):
        # test reply with nil
        num_answers = 3
        answer = '$3\r\nfoo\r\n$-1\r\n$3\r\nbar\r\n'
        string = answer + '*1\r\n$3\r\nboo\r\n'
        self.socket.recv.return_value = string
        self.stream.read_multibulk(num_answers, self.stop)
        response = self.wait()
        eq_(response, answer)
        self.stream._read_buffer  = collections.deque()

        #test reply without nil
        num_answers = 8
        answers_list = [':1', ':1', '$1', '1', '$1', '2', ':0', ':1', '*4', '$1', 'a', '$1', '1', '$1', 'b', '$1', '2', '*2', '$1', 'a', '$1', 'b']
        answer = '\r\n'.join(answers_list) + '\r\n'
        string = answer
        self.socket.recv.return_value = string
        self.stream.read_multibulk(num_answers, self.stop)
        response = self.wait()
        eq_(response, answer)
Exemplo n.º 3
0
 def setUp(self):
     super(TestBrukvaStream, self).setUp()
     self.socket = mock.Mock()
     self.socket.fileno.return_value = stdin
     self.stream = BrukvaStream(self.socket, io_loop=self.io_loop)
Exemplo n.º 4
0
class Connection(object):
    def __init__(self, host, port, idx,
                 on_connect, on_disconnect,
                 timeout=None, io_loop=None,
                 retries = None,
                 reconnect_timeout=None,
                 reconnect_retries=None):
        self.host = host
        self.port = port
        self.idx = idx

        self.on_connect = on_connect
        self.on_disconnect = on_disconnect

        self.reconnect_timeout = reconnect_timeout or 0.3
        self.reconnect_retries = reconnect_retries or 1

        self.timeout = timeout
        self._io_loop = io_loop or IOLoop.instance()

        self._stream = None
        self.retries = retries or 2
        self._consume_buffer = ""
        self.is_initialized = False
        self.in_progress = False
        self.read_queue = []
        self.read_callbacks = []

    @async
    @process
    def connect(self, add_to_free=True, callback=None):
        retries = self.reconnect_retries

        while True:
            try:
                log.info('trying to connect in connection %s. Retry #%d', self.idx,
                         self.reconnect_retries-retries+1)
                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
                sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
                sock.settimeout(self.timeout)
                sock.connect((self.host, self.port))
                self._stream = BrukvaStream(sock, io_loop=self._io_loop)
                self._stream.set_close_callback(self.on_stream_close)
                break
            except socket.error, e:
                log.error('Exception during connection %s!: %s', self.idx, str(e))

                retries -= 1

                log.debug('Retries: %d', retries)

                if retries <= 0:
                    log.info('No more retries to connect for connection %s', self.idx)
                    callback(ConnectionError("Exceeded retries to connect in connection %s" % self.idx))
                    return

                log.debug('sleeping %s sec during reconnect_timeout in connection %s',
                          self.reconnect_timeout, self.idx)
                if self._io_loop.running():
                    instance = self._io_loop.instance()
                    yield async(partial(instance.add_timeout, time() + self.reconnect_timeout))()
                else:
                    sleep(self.reconnect_timeout)

                log.debug('sleeping finished in connection %s', self.idx)

        self.on_connect(weakref.proxy(self), add_to_free=add_to_free)
        callback(True)