amazon-redshift-python-driver: Driver is unable to handle response from RedShift

Driver version

2.0.903

Redshift version

PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.49676

Client Operating System

AWS Lambda (Amazon Linux)

Python version

3.10

Table schema

Doesn’t matter

Problem description

Getting UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9d in position 122: invalid start byte when simply connecting to RedShift. THIS IS VERY RARE OCCURENCE, in our case - 7 times out of 5000 invocations. I’m guessing, that RedShift is too busy and driver is unable to handle such event

Python Driver trace logs

  self.connection = self.engine.connect()
  File "/var/task/sqlalchemy/engine/base.py", line 3204, in connect
    return self._connection_cls(self, close_with_result=close_with_result)
  File "/var/task/sqlalchemy/engine/base.py", line 96, in __init__
    else engine.raw_connection()
  File "/var/task/sqlalchemy/engine/base.py", line 3283, in raw_connection
    return self._wrap_pool_connect(self.pool.connect, _connection)
  File "/var/task/sqlalchemy/engine/base.py", line 3250, in _wrap_pool_connect
    return fn()
  File "/var/task/sqlalchemy/pool/base.py", line 310, in connect
    return _ConnectionFairy._checkout(self)
  File "/var/task/sqlalchemy/pool/base.py", line 868, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/var/task/sqlalchemy/pool/base.py", line 476, in checkout
    rec = pool._do_get()
  File "/var/task/sqlalchemy/pool/impl.py", line 256, in _do_get
    return self._create_connection()
  File "/var/task/sqlalchemy/pool/base.py", line 256, in _create_connection
    return _ConnectionRecord(self)
  File "/var/task/sqlalchemy/pool/base.py", line 371, in __init__
    self.__connect()
  File "/var/task/sqlalchemy/pool/base.py", line 677, in __connect
    pool.dispatch.connect.for_modify(
  File "/var/task/sqlalchemy/event/attr.py", line 329, in _exec_w_sync_on_first_run
    self(*args, **kw)
  File "/var/task/sqlalchemy/event/attr.py", line 343, in __call__
    fn(*args, **kw)
  File "/var/task/sqlalchemy/util/langhelpers.py", line 1691, in go
    return once_fn(*arg, **kw)
  File "/var/task/sqlalchemy/engine/create.py", line 686, in first_connect
    dialect.initialize(c)
  File "/var/task/sqlalchemy/dialects/postgresql/base.py", line 3241, in initialize
    super(PGDialect, self).initialize(connection)
  File "/var/task/sqlalchemy/engine/default.py", line 407, in initialize
    self.server_version_info = self._get_server_version_info(
  File "/var/task/sqlalchemy/dialects/postgresql/base.py", line 3487, in _get_server_version_info
    v = connection.exec_driver_sql("select pg_catalog.version()").scalar()
  File "/var/task/sqlalchemy/engine/base.py", line 1669, in exec_driver_sql
    return self._exec_driver_sql(
  File "/var/task/sqlalchemy/engine/base.py", line 1578, in _exec_driver_sql
    ret = self._execute_context(
  File "/var/task/sqlalchemy/engine/base.py", line 1845, in _execute_context
    self._handle_dbapi_exception(
  File "/var/task/sqlalchemy/engine/base.py", line 2030, in _handle_dbapi_exception
    util.raise_(exc_info[1], with_traceback=exc_info[2])
  File "/var/task/sqlalchemy/util/compat.py", line 207, in raise_
    raise exception
  File "/var/task/sqlalchemy/engine/base.py", line 1802, in _execute_context
    self.dialect.do_execute(
  File "/var/task/sqlalchemy/engine/default.py", line 732, in do_execute
    cursor.execute(statement, parameters)
  File "/var/task/redshift_connector/cursor.py", line 211, in execute
    self._c.execute(self, operation, args)
  File "/var/task/redshift_connector/core.py", line 1279, in execute
    self.handle_messages(cursor)
  File "/var/task/redshift_connector/core.py", line 1359, in handle_messages
    self.message_types[code](self._read(data_len - 4), cursor)
  File "/var/task/redshift_connector/core.py", line 1350, in handle_DATA_ROW
    row.append(desc[0](data, data_idx, vlen))
  File "/var/task/redshift_connector/utils/type_utils.py", line 131, in text_recv
    return str(data[offset : offset + length], _client_encoding)

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Reactions: 1
  • Comments: 19 (7 by maintainers)

Most upvoted comments

Hi, We managed to resolve this issue by upgrading our version of Amazon Redshit to 1.0.54899.

Hi folks, a fix for this issue is anticipated in Redshift server P178

Yes, we have retry mechanism as well. Usually query works in 1-2 retry attempts