def _process_response(self, read_buffer): assert not self._processing, 'Recursion not supported' self._processing = True ifr = self.in_flight_requests.popleft() # verify send/recv correlation ids match recv_correlation_id = Int32.decode(read_buffer) # 0.8.2 quirk if (self.config['api_version'] == (0, 8, 2) and ifr.response_type is GroupCoordinatorResponse and ifr.correlation_id != 0 and recv_correlation_id == 0): log.warning('Kafka 0.8.2 quirk -- GroupCoordinatorResponse' ' coorelation id does not match request. This' ' should go away once at least one topic has been' ' initialized on the broker') elif ifr.correlation_id != recv_correlation_id: error = Errors.CorrelationIdError( 'Correlation ids do not match: sent %d, recv %d' % (ifr.correlation_id, recv_correlation_id)) ifr.future.failure(error) self.close() self._processing = False return None # decode response response = ifr.response_type.decode(read_buffer) log.debug('%s Response %d: %s', self, ifr.correlation_id, response) ifr.future.success(response) self._processing = False return response
def _process_response(self, read_buffer): assert not self._processing, 'Recursion not supported' self._processing = True ifr = self.in_flight_requests.popleft() # verify send/recv correlation ids match recv_correlation_id = Int32.decode(read_buffer) # 0.8.2 quirk if (self.config['api_version'] == (0, 8, 2) and ifr.response_type is GroupCoordinatorResponse and recv_correlation_id == 0): raise Errors.KafkaError( 'Kafka 0.8.2 quirk -- try creating a topic first') elif ifr.correlation_id != recv_correlation_id: error = Errors.CorrelationIdError( 'Correlation ids do not match: sent %d, recv %d' % (ifr.correlation_id, recv_correlation_id)) ifr.future.fail(error) self.close() self._processing = False return None # decode response response = ifr.response_type.decode(read_buffer) log.debug('%s Response %d: %s', self, ifr.correlation_id, response) ifr.future.success(response) self._processing = False return response
def _read(self): try: while True: resp = yield from self._reader.readexactly(4) size, = self.HEADER.unpack(resp) resp = yield from self._reader.readexactly(size) recv_correlation_id, = self.HEADER.unpack(resp[:4]) correlation_id, resp_type, fut = self._requests.pop(0) if (self._api_version == (0, 8, 2) and resp_type is GroupCoordinatorResponse and correlation_id != 0 and recv_correlation_id == 0): self.log.warning( 'Kafka 0.8.2 quirk -- GroupCoordinatorResponse' ' coorelation id does not match request. This' ' should go away once at least one topic has been' ' initialized on the broker') elif correlation_id != recv_correlation_id: error = Errors.CorrelationIdError( 'Correlation ids do not match: sent {}, recv {}'. format(correlation_id, recv_correlation_id)) if not fut.done(): fut.set_exception(error) self.close() break if not fut.done(): response = resp_type.decode(resp[4:]) self.log.debug('%s Response %d: %s', self, correlation_id, response) fut.set_result(response) # Update idle timer. self._last_action = self._loop.time() except (OSError, EOFError, ConnectionError) as exc: conn_exc = Errors.ConnectionError( "Connection at {0}:{1} broken".format(self._host, self._port)) conn_exc.__cause__ = exc conn_exc.__context__ = exc for _, _, fut in self._requests: fut.set_exception(conn_exc) self.close() except asyncio.CancelledError: pass