kevinjqliu commented on issue #864:
URL: https://github.com/apache/iceberg-python/issues/864#issuecomment-2224351547

   @HonahX Ok so I've found a way to reproduce this. Requires a bit of a setup.
   I found this while working on 
https://github.com/kevinjqliu/iceberg-rest-catalog and testing its integration 
with Spark. 
   
   ### Setup
   Have pyiceberg's integration test docker running 
   ```
   make test-integration
   ```
   
   Pull the `kevinjqliu/iceberg-rest-catalog` repo and run the fastapi server 
locally
   ```
   poetry install
   poetry run fastapi dev src/iceberg_rest/main.py
   ```
   
   It requires an on-disk sqlite db located in `/tmp/warehouse` so you also 
need to create the dir
   ```
   mkdir /tmp/warehouse
   ```
   
   Reset the `iceberg-python` vendor folder to refer to main branch (tracking 
the official project's main branch), instead of the branch with the fixes. 
   ```
   cd vendor/iceberg-python
   git checkout main
   git pull 
   ```
   
   ### Run Spark test
   Have fastapi server running in one terminal. 
   ```
   poetry run fastapi dev src/iceberg_rest/main.py
   ```
   
   In another terminal, run the spark test
   ```
   poetry run python tests/pyspark_test.py
   ```
   
   The fastapi server will error, sending HTTP 500 request. 
   
   Here's the stack trace
   
   ```
   INFO:     127.0.0.1:55910 - "POST 
/v1/namespaces/default/tables/test_null_nan HTTP/1.1" 500 Internal Server Error
   ERROR:    Exception in ASGI application
   Traceback (most recent call last):
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py",
 line 399, in run_asgi
       result = await app(  # type: ignore[func-returns-value]
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py",
 line 70, in __call__
       return await self.app(scope, receive, send)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/fastapi/applications.py",
 line 1054, in __call__
       await super().__call__(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/applications.py",
 line 123, in __call__
       await self.middleware_stack(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py",
 line 186, in __call__
       raise exc
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/middleware/errors.py",
 line 164, in __call__
       await self.app(scope, receive, _send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/middleware/exceptions.py",
 line 65, in __call__
       await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py",
 line 64, in wrapped_app
       raise exc
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py",
 line 53, in wrapped_app
       await app(scope, receive, sender)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/routing.py",
 line 756, in __call__
       await self.middleware_stack(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/routing.py",
 line 776, in app
       await route.handle(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/routing.py",
 line 297, in handle
       await self.app(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/routing.py",
 line 77, in app
       await wrap_app_handling_exceptions(app, request)(scope, receive, send)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py",
 line 64, in wrapped_app
       raise exc
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/_exception_handler.py",
 line 53, in wrapped_app
       await app(scope, receive, sender)
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/routing.py",
 line 72, in app
       response = await func(request)
                  ^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/fastapi/routing.py",
 line 278, in app
       raw_response = await run_endpoint_function(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/fastapi/routing.py",
 line 193, in run_endpoint_function
       return await run_in_threadpool(dependant.call, **values)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/starlette/concurrency.py",
 line 42, in run_in_threadpool
       return await anyio.to_thread.run_sync(func, *args)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/anyio/to_thread.py",
 line 56, in run_sync
       return await get_async_backend().run_sync_in_worker_thread(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py",
 line 2177, in run_sync_in_worker_thread
       return await future
              ^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/.venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py",
 line 859, in run
       result = context.run(func, *args)
                ^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/src/iceberg_rest/api/catalog_api.py",
 line 453, in update_table
       resp = catalog._commit_table(commit_table_request)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/vendor/iceberg-python/pyiceberg/catalog/sql.py",
 line 423, in _commit_table
       updated_staged_table = self._update_and_stage_table(current_table, 
table_request)
                              
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/vendor/iceberg-python/pyiceberg/catalog/__init__.py",
 line 781, in _update_and_stage_table
       updated_metadata = update_table_metadata(
                          ^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/vendor/iceberg-python/pyiceberg/table/__init__.py",
 line 1179, in update_table_metadata
       new_metadata = _apply_table_update(update, new_metadata, context)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File "/Users/kevinliu/.pyenv/versions/3.11.0/lib/python3.11/functools.py", 
line 909, in wrapper
       return dispatch(args[0].__class__)(*args, **kw)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     File 
"/Users/kevinliu/repos/iceberg-rest-catalog/vendor/iceberg-python/pyiceberg/table/__init__.py",
 line 1022, in _
       raise ValueError(f"Partition spec with id {spec.spec_id} already exists: 
{spec}")
   ValueError: Partition spec with id 0 already exists: []
   ```
   
   From here, you can add breakpoints to the codebase in 
`vendor/iceberg-python` and debug. 
   
   Here are the fixes that I added to make the spark test work 
   
https://github.com/apache/iceberg-python/compare/main...kevinjqliu:iceberg-python:kevinjqliu/iceberg-rest-catalog
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to