[ISSUE] `get_api_error` fails with `TypeError: object of type '_io.BufferedReader' has no len()¨`
メンテナーはふだん 1 日以内に返信
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 76/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 静か
- 技術スタック
- python
調査の方向性
databricks/sdk/logger/round_trip_logger.py の _redacted_dump から始め、databricks/sdk/errors/parser.py からの呼び出しを追跡します。body がローカルファイルのストリームである PUT リクエストの API エラーを再現し、その後、エラーパーサーとロガーが TypeError を発生させずに BufferedReader を処理できることを確認します。
索引モデルが issue の本文から書いたものです。
説明
Description
When the HTTP PUT request body is streamed from a local file, request.body is not a string but a _io.BufferedReader.
In case of API error, _BaseClient._error_parser.get_api_error(response) will try to return the error and the associated query.
Unfortunately, response.request.body is still a BufferedReader, not necessarily a string. When this body is passed to the logger, it fails
eventually calls self._redacted_dump("> ", request.body) but the latter is not meant to handle streams
Full strack trace :
Traceback (most recent call last):
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\generic.py", line 350, in transfer
_try_links(
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\generic.py", line 281, in _try_links
return copy(
^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\generic.py", line 88, in copy
return _put(
^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\generic.py", line 161, in _put
_put_one(from_paths[0], to_paths[0])
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\generic.py", line 151, in _put_one
return to_fs.put_file(
^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_objects\fs\base.py", line 673, in put_file
self.fs.put_file(os.fspath(from_file), to_info, callback=callback, **kwargs)
File "C:\_dev\my_proj\.venv\Lib\site-packages\dvc_databricks\filesystem.py", line 308, in put_file
self._client.files.upload(rpath, fh, overwrite=True)
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\mixins\files.py", line 1430, in upload
self._upload_single_thread_with_known_size(ctx, contents)
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\mixins\files.py", line 1513, in _upload_single_thread_with_known_size
return self._single_thread_single_shot_upload(ctx, contents)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\mixins\files.py", line 1521, in _single_thread_single_shot_upload
return super().upload(file_path=ctx.target_path, contents=contents, overwrite=ctx.overwrite)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\service\files.py", line 1027, in upload
self._api.do(
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\core.py", line 95, in do
return self._api_client.do(
^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\_base_client.py", line 197, in do
response = call(
^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\retries.py", line 59, in wrapper
raise err
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\retries.py", line 38, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\_base_client.py", line 297, in _perform
error = self._error_parser.get_api_error(response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\errors\parser.py", line 95, in get_api_error
{"message": "unable to parse response. " + _unknown_error(response, self._debug_headers)},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\errors\parser.py", line 45, in _unknown_error
request_log = RoundTrip(response, debug_headers=debug_headers, debug_truncate_bytes=10 * 1024).generate()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\logger\round_trip_logger.py", line 47, in generate
sb.append("> [raw stream]" if self._raw else self._redacted_dump("> ", request.body))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\_dev\my_proj\.venv\Lib\site-packages\databricks\sdk\logger\round_trip_logger.py", line 113, in _redacted_dump
if len(body) == 0:
^^^^^^^^^
TypeError: object of type '_io.BufferedReader' has no len()
A suggested fix could be :
def _redacted_dump(self, prefix: str, body: str) -> str:
if isinstance(body, io.IOBase):
# Read the stream into a string-like
body.seek(0)
body = body.read().decode("utf-8")
if len(body) == 0:
return ""
- 主要言語
- Python
- スター
- 577
- フォーク
- 229
- 平均マージ
- 40分
- マージ済み PR(30日)
- 12
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
databricks/databricks-sdk-py のほかの issue
-
難易度 1/5 1〜3時間 初心者へのやさしさ 62/100
databricks/databricks-sdk-py#1602 · リアクション 2 件 ·
メンテナーはふだん 1 日以内に返信
-
[ISSUE] Docs state serving endpoints support at most ten served entities; actual limit is 15対応中かも @divya0709 が 95 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
databricks/databricks-sdk-py#1496 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
databricks/databricks-sdk-py#1495 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
databricks/databricks-sdk-py#1451 ·
メンテナーはふだん 1 日以内に返信
-
[ISSUE] TypeError in _unknown_error() when API returns unparseable error on streaming request対応中かも @davwil が 269 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
databricks/databricks-sdk-py#1264 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
databricks/databricks-sdk-py の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
FinanceFlash/unvibecode#699 ·
メンテナーはふだん 1 日以内に返信
-
enhancement Website
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
OWASP/OWASP-Hunting#96 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
micropython/micropython#19942 ·
メンテナーはふだん 1 日以内に返信
-
A rebuild posts "not part of this build" success to the commit's failed `nix-build` gate and effects対応中かも @Padraic-O-Mhuiris が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
`epoch.Integer` raises a raw OverflowError for integers too large to convert to a float対応中かも @arindam77 が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
pydantic/pydantic-extra-types#479 ·
メンテナーはふだん 1 日以内に返信