code: def _query(self, sql, *params):
          
          cursor = None
          try:
              cursor = self._cursor()
              cursor.execute(sql, params)
              return cursor
          except psycopg2.Error as e:
              if cursor and cursor.connection.closed == 0:
                  # When connected via unix socket, psycopg2 can't recoginze 'connection lost'
                  # and leaves `_cursor_holder.connection.closed == 0`, but psycopg2.OperationalError
                  # is still raised (what is correct). It doesn't make sense to continiue with existing
                  # connection and we will close it, to avoid its reuse by the `_cursor` method.
                  if isinstance(e, psycopg2.OperationalError):
                      self.close_connection()
                  else:
                      raise e
              if self.state == 'restarting':
                  raise RetryFailedError('cluster is being restarted')
              raise PostgresConnectionException('connection problems')
docs: We are always using the same cursor, therefore this method is not thread-safe!!!
          You can call it from different threads only if you are holding explicit `AsyncExecutor` lock,
          because the main thread is always holding this lock when running HA cycle.