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)
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)
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)
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)