Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Support zarr v3 #967

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open

WIP: Support zarr v3 #967

wants to merge 7 commits into from

Conversation

weiji14
Copy link
Collaborator

@weiji14 weiji14 commented Mar 19, 2025

Remove upper pin on zarr that was set in 529b5ca / #923. Motivation is to unblock update on pangeo-docker-images - pangeo-data/pangeo-docker-images#603 (comment)

Updated dependency pins:

TODO:

  • Set upper pin on zarr to <4 in pyproject.toml
  • Update uv.lock file to have zarr=3
  • Check which integrations tests are failing and update as required
Pull Request (PR) draft checklist - click to expand
  • Please review our
    contributing documentation
    before getting started.
  • Populate a descriptive title. For example, instead of "Updated README.md", use a
    title such as "Add testing details to the contributor section of the README".
    Example PRs: #763
  • Populate the body of the pull request with:
  • Update CHANGELOG.md with details about your change in a section titled
    ## Unreleased. If such a section does not exist, please create one. Follow
    Common Changelog for your additions.
    Example PRs: #763
  • Update the documentation and/or the README.md with details of changes to the
    earthaccess interface, if any. Consider new environment variables, function names,
    decorators, etc.

Click the "Ready for review" button at the bottom of the "Conversation" tab in GitHub
once these requirements are fulfilled. Don't worry if you see any test failures in
GitHub at this point!

Pull Request (PR) merge checklist - click to expand

Please do your best to complete these requirements! If you need help with any of these
requirements, you can ping the @nsidc/earthaccess-support team in a comment and we
will help you out!

  • Add unit tests for any new features.
  • Apply formatting and linting autofixes. You can add a GitHub comment in this Pull
    Request containing "pre-commit.ci autofix" to automate this.
  • Ensure all automated PR checks (seen at the bottom of the "conversation" tab) pass.
  • Get at least one approving review.

📚 Documentation preview 📚: https://earthaccess--967.org.readthedocs.build/en/967/

Closes #973, Addresses #974

Copy link

github-actions bot commented Mar 19, 2025

Binder 👈 Launch a binder notebook on this branch for commit 3d24d85

I will automatically update this comment whenever this PR is modified

Binder 👈 Launch a binder notebook on this branch for commit f322272

Binder 👈 Launch a binder notebook on this branch for commit 783b573

Binder 👈 Launch a binder notebook on this branch for commit 67d31ea

Binder 👈 Launch a binder notebook on this branch for commit 7903d0a

weiji14 added a commit to pangeo-data/pangeo-docker-images that referenced this pull request Mar 31, 2025
Wait for zarr-python 3.0 compatibility at nsidc/earthaccess#967
@weiji14
Copy link
Collaborator Author

weiji14 commented Apr 1, 2025

Traceback from failed integration tests at https://github.com/nsidc/earthaccess/actions/runs/13956243295/job/39794658975?pr=967#step:6:791:

=================================== FAILURES ===================================
_____________________ test_consolidate_metadata_outfile[] ______________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 23, in test_consolidate_metadata_outfile
    result = ***.consolidate_metadata(
        granules,
    ...<2 lines>...
        kerchunk_options={"concat_dims": "Time"},
    )
  File "/home/runner/work/***/***/***/kerchunk.py", line 63, in consolidate_metadata
    chunks = dask.compute(*[get_chunk_metadata(g, fs) for g in granules])  # type: ignore
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/dask/base.py", line 660, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/runner/work/***/***/***/kerchunk.py", line 17, in _get_chunk_metadata
    from kerchunk.hdf import SingleHdf5ToZarr
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/kerchunk/hdf.py", line 10, in <module>
    from zarr.meta import encode_fill_value
ModuleNotFoundError: No module named 'zarr.meta'
------------------------------ Captured log setup ------------------------------
INFO     ***.api:api.py:139 Granules found: 2207
__________________ test_consolidate_metadata_outfile[file://] __________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 23, in test_consolidate_metadata_outfile
    result = ***.consolidate_metadata(
        granules,
    ...<2 lines>...
        kerchunk_options={"concat_dims": "Time"},
    )
  File "/home/runner/work/***/***/***/kerchunk.py", line 63, in consolidate_metadata
    chunks = dask.compute(*[get_chunk_metadata(g, fs) for g in granules])  # type: ignore
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/dask/base.py", line 660, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/runner/work/***/***/***/kerchunk.py", line 17, in _get_chunk_metadata
    from kerchunk.hdf import SingleHdf5ToZarr
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/kerchunk/hdf.py", line 10, in <module>
    from zarr.meta import encode_fill_value
ModuleNotFoundError: No module named 'zarr.meta'
_______________________ test_consolidate_metadata_memory _______________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 34, in test_consolidate_metadata_memory
    result = ***.consolidate_metadata(
        granules,
        access="indirect",
        kerchunk_options={"concat_dims": "Time"},
    )
  File "/home/runner/work/***/***/***/kerchunk.py", line 63, in consolidate_metadata
    chunks = dask.compute(*[get_chunk_metadata(g, fs) for g in granules])  # type: ignore
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/dask/base.py", line 660, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/runner/work/***/***/***/kerchunk.py", line 17, in _get_chunk_metadata
    from kerchunk.hdf import SingleHdf5ToZarr
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/kerchunk/hdf.py", line 10, in <module>
    from zarr.meta import encode_fill_value
ModuleNotFoundError: No module named 'zarr.meta'
_______________________ test_consolidate_metadata[file] ________________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 56, in test_consolidate_metadata
    metadata = ***.consolidate_metadata(
        granules, access="indirect", kerchunk_options={"concat_dims": "Time"}, **kwargs
    )
  File "/home/runner/work/***/***/***/kerchunk.py", line 63, in consolidate_metadata
    chunks = dask.compute(*[get_chunk_metadata(g, fs) for g in granules])  # type: ignore
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/dask/base.py", line 660, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/runner/work/***/***/***/kerchunk.py", line 17, in _get_chunk_metadata
    from kerchunk.hdf import SingleHdf5ToZarr
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/kerchunk/hdf.py", line 10, in <module>
    from zarr.meta import encode_fill_value
ModuleNotFoundError: No module named 'zarr.meta'
------------------------------ Captured log call -------------------------------
INFO     ***.store:store.py:386 Opening 2 granules, approx size: 0.02 GB
______________________ test_consolidate_metadata[memory] _______________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 56, in test_consolidate_metadata
    metadata = ***.consolidate_metadata(
        granules, access="indirect", kerchunk_options={"concat_dims": "Time"}, **kwargs
    )
  File "/home/runner/work/***/***/***/kerchunk.py", line 63, in consolidate_metadata
    chunks = dask.compute(*[get_chunk_metadata(g, fs) for g in granules])  # type: ignore
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/dask/base.py", line 660, in compute
    results = schedule(dsk, keys, **kwargs)
  File "/home/runner/work/***/***/***/kerchunk.py", line 17, in _get_chunk_metadata
    from kerchunk.hdf import SingleHdf5ToZarr
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/kerchunk/hdf.py", line 10, in <module>
    from zarr.meta import encode_fill_value
ModuleNotFoundError: No module named 'zarr.meta'
------------------------------ Captured log call -------------------------------
INFO     ***.store:store.py:386 Opening 2 granules, approx size: 0.02 GB
______________ test_open_virtual_dataset[MUR25-JPL-L4-GLOB-v04.2] ______________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 806, in _cat_file
    await self.fss[protocol]._cat_file(part_or_url, start=start, end=end)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/http.py", line 234, in _cat_file
    async with session.get(self.encode_url(url), **kw) as r:
               ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 1359, in __aenter__
    self._resp: _RetType = await self._coro
                           ^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 579, in _request
    with timer:
         ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/helpers.py", line 712, in __enter__
    raise RuntimeError(
        "Timeout context manager should be used " "inside a task"
    )
RuntimeError: Timeout context manager should be used inside a task

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 451, in decode_cf_variables
    new_vars[k] = decode_cf_variable(
                  ~~~~~~~~~~~~~~~~~~^
        k,
        ^^
    ...<6 lines>...
        decode_timedelta=_item_or_default(decode_timedelta, k, None),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 292, in decode_cf_variable
    var = times.CFDatetimeCoder(use_cftime=use_cftime).decode(var, name=name)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 1001, in decode
    dtype = _decode_cf_datetime_dtype(data, units, calendar, self.use_cftime)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 214, in _decode_cf_datetime_dtype
    [first_n_items(values, 1) or [0], last_item(values) or [0]]
     ~~~~~~~~~~~~~^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/formatting.py", line 97, in first_n_items
    return np.ravel(to_duck_array(array))[:n_desired]
                    ~~~~~~~~~~~~~^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/namedarray/pycompat.py", line 138, in to_duck_array
    return np.asarray(data)  # type: ignore[return-value]
           ~~~~~~~~~~^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 578, in __array__
    return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy)
                      ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 583, in get_duck_array
    return self.array.get_duck_array()
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/variables.py", line 81, in get_duck_array
    return self.func(self.array.get_duck_array())
                     ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 657, in get_duck_array
    array = self.array[self.key]
            ~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 166, in __getitem__
    return indexing.explicit_indexing_adapter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        key, array.shape, indexing.IndexingSupport.VECTORIZED, method
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 1018, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 156, in _getitem
    return self._array[key]
           ~~~~~~~~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2425, in __getitem__
    return self.get_orthogonal_selection(pure_selection, fields=fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/_compat.py", line 43, in inner_f
    return f(*args, **kwargs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2867, in get_orthogonal_selection
    return sync(
        self._async_array._get_selection(
            indexer=indexer, out=out, fields=fields, prototype=prototype
        )
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 163, in sync
    raise return_result
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 119, in _runner
    return await coro
           ^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 1287, in _get_selection
    await self.codec_pipeline.read(
    ...<12 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 464, in read
    await concurrent_map(
    ...<6 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 265, in read_batch
    chunk_bytes_batch = await concurrent_map(
                        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_common.py", line 124, in get
    return await self.store.get(self.path, prototype=prototype, byte_range=byte_range)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_fsspec.py", line 230, in get
    value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 808, in _cat_file
    raise ReferenceNotReachable(path, part_or_url) from e
fsspec.implementations.reference.ReferenceNotReachable: Reference "time/0" failed to fetch target https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/MUR25-JPL-L4-GLOB-v04.2/20240101090000-JPL-L4_GHRSST-SSTfnd-MUR25-GLOB-v02.0-fv04.2.nc

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_virtualizarr.py", line 37, in test_open_virtual_dataset
    vds_load = ***.open_virtual_dataset(granule, load=True)
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 193, in open_virtual_dataset
    return open_virtual_mfdataset(
        granules=[granule],
    ...<4 lines>...
        preprocess=None,
    )
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 131, in open_virtual_mfdataset
    return xr.open_dataset(
           ~~~~~~~~~~~~~~~^
        "reference://",
        ^^^^^^^^^^^^^^^
    ...<9 lines>...
        },
        ^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/api.py", line 671, in open_dataset
    backend_ds = backend.open_dataset(
        filename_or_obj,
    ...<2 lines>...
        **kwargs,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 1427, in open_dataset
    ds = store_entrypoint.open_dataset(
        store,
    ...<6 lines>...
        decode_timedelta=decode_timedelta,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/store.py", line 46, in open_dataset
    vars, attrs, coord_names = conventions.decode_cf_variables(
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        vars,
        ^^^^^
    ...<7 lines>...
        decode_timedelta=decode_timedelta,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 462, in decode_cf_variables
    raise type(e)(f"Failed to decode variable {k!r}: {e}") from e
          ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ReferenceNotReachable.__init__() missing 1 required positional argument: 'target'
------------------------------ Captured log setup ------------------------------
INFO     ***.api:api.py:139 Granules found: 456
____________ test_open_virtual_dataset[AVHRR_OI-NCEI-L4-GLOB-v2.1] _____________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 806, in _cat_file
    await self.fss[protocol]._cat_file(part_or_url, start=start, end=end)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/http.py", line 234, in _cat_file
    async with session.get(self.encode_url(url), **kw) as r:
               ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 1359, in __aenter__
    self._resp: _RetType = await self._coro
                           ^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 579, in _request
    with timer:
         ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/helpers.py", line 712, in __enter__
    raise RuntimeError(
        "Timeout context manager should be used " "inside a task"
    )
RuntimeError: Timeout context manager should be used inside a task

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 451, in decode_cf_variables
    new_vars[k] = decode_cf_variable(
                  ~~~~~~~~~~~~~~~~~~^
        k,
        ^^
    ...<6 lines>...
        decode_timedelta=_item_or_default(decode_timedelta, k, None),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 292, in decode_cf_variable
    var = times.CFDatetimeCoder(use_cftime=use_cftime).decode(var, name=name)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 1001, in decode
    dtype = _decode_cf_datetime_dtype(data, units, calendar, self.use_cftime)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 214, in _decode_cf_datetime_dtype
    [first_n_items(values, 1) or [0], last_item(values) or [0]]
     ~~~~~~~~~~~~~^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/formatting.py", line 97, in first_n_items
    return np.ravel(to_duck_array(array))[:n_desired]
                    ~~~~~~~~~~~~~^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/namedarray/pycompat.py", line 138, in to_duck_array
    return np.asarray(data)  # type: ignore[return-value]
           ~~~~~~~~~~^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 578, in __array__
    return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy)
                      ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 583, in get_duck_array
    return self.array.get_duck_array()
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/variables.py", line 81, in get_duck_array
    return self.func(self.array.get_duck_array())
                     ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 657, in get_duck_array
    array = self.array[self.key]
            ~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 166, in __getitem__
    return indexing.explicit_indexing_adapter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        key, array.shape, indexing.IndexingSupport.VECTORIZED, method
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 1018, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 156, in _getitem
    return self._array[key]
           ~~~~~~~~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2425, in __getitem__
    return self.get_orthogonal_selection(pure_selection, fields=fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/_compat.py", line 43, in inner_f
    return f(*args, **kwargs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2867, in get_orthogonal_selection
    return sync(
        self._async_array._get_selection(
            indexer=indexer, out=out, fields=fields, prototype=prototype
        )
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 163, in sync
    raise return_result
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 119, in _runner
    return await coro
           ^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 1287, in _get_selection
    await self.codec_pipeline.read(
    ...<12 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 464, in read
    await concurrent_map(
    ...<6 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 265, in read_batch
    chunk_bytes_batch = await concurrent_map(
                        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_common.py", line 124, in get
    return await self.store.get(self.path, prototype=prototype, byte_range=byte_range)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_fsspec.py", line 230, in get
    value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 808, in _cat_file
    raise ReferenceNotReachable(path, part_or_url) from e
fsspec.implementations.reference.ReferenceNotReachable: Reference "time/0" failed to fetch target https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/AVHRR_OI-NCEI-L4-GLOB-v2.1/20231231120000-NCEI-L4_GHRSST-SSTblend-AVHRR_OI-GLOB-v02.0-fv02.1.nc

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_virtualizarr.py", line 37, in test_open_virtual_dataset
    vds_load = ***.open_virtual_dataset(granule, load=True)
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 193, in open_virtual_dataset
    return open_virtual_mfdataset(
        granules=[granule],
    ...<4 lines>...
        preprocess=None,
    )
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 131, in open_virtual_mfdataset
    return xr.open_dataset(
           ~~~~~~~~~~~~~~~^
        "reference://",
        ^^^^^^^^^^^^^^^
    ...<9 lines>...
        },
        ^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/api.py", line 671, in open_dataset
    backend_ds = backend.open_dataset(
        filename_or_obj,
    ...<2 lines>...
        **kwargs,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 1427, in open_dataset
    ds = store_entrypoint.open_dataset(
        store,
    ...<6 lines>...
        decode_timedelta=decode_timedelta,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/store.py", line 46, in open_dataset
    vars, attrs, coord_names = conventions.decode_cf_variables(
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        vars,
        ^^^^^
    ...<7 lines>...
        decode_timedelta=decode_timedelta,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 462, in decode_cf_variables
    raise type(e)(f"Failed to decode variable {k!r}: {e}") from e
          ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ReferenceNotReachable.__init__() missing 1 required positional argument: 'target'
------------------------------ Captured log setup ------------------------------
INFO     ***.api:api.py:139 Granules found: 455
_____________________ test_open_virtual_dataset[M2T1NXSLV] _____________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 806, in _cat_file
    await self.fss[protocol]._cat_file(part_or_url, start=start, end=end)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/http.py", line 234, in _cat_file
    async with session.get(self.encode_url(url), **kw) as r:
               ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 1359, in __aenter__
    self._resp: _RetType = await self._coro
                           ^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 579, in _request
    with timer:
         ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/helpers.py", line 712, in __enter__
    raise RuntimeError(
        "Timeout context manager should be used " "inside a task"
    )
RuntimeError: Timeout context manager should be used inside a task

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 451, in decode_cf_variables
    new_vars[k] = decode_cf_variable(
                  ~~~~~~~~~~~~~~~~~~^
        k,
        ^^
    ...<6 lines>...
        decode_timedelta=_item_or_default(decode_timedelta, k, None),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 292, in decode_cf_variable
    var = times.CFDatetimeCoder(use_cftime=use_cftime).decode(var, name=name)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 1001, in decode
    dtype = _decode_cf_datetime_dtype(data, units, calendar, self.use_cftime)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/times.py", line 214, in _decode_cf_datetime_dtype
    [first_n_items(values, 1) or [0], last_item(values) or [0]]
     ~~~~~~~~~~~~~^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/formatting.py", line 97, in first_n_items
    return np.ravel(to_duck_array(array))[:n_desired]
                    ~~~~~~~~~~~~~^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/namedarray/pycompat.py", line 138, in to_duck_array
    return np.asarray(data)  # type: ignore[return-value]
           ~~~~~~~~~~^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 578, in __array__
    return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy)
                      ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 583, in get_duck_array
    return self.array.get_duck_array()
           ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/coding/variables.py", line 81, in get_duck_array
    return self.func(self.array.get_duck_array())
                     ~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 657, in get_duck_array
    array = self.array[self.key]
            ~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 166, in __getitem__
    return indexing.explicit_indexing_adapter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        key, array.shape, indexing.IndexingSupport.VECTORIZED, method
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 1018, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 156, in _getitem
    return self._array[key]
           ~~~~~~~~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2425, in __getitem__
    return self.get_orthogonal_selection(pure_selection, fields=fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/_compat.py", line 43, in inner_f
    return f(*args, **kwargs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2867, in get_orthogonal_selection
    return sync(
        self._async_array._get_selection(
            indexer=indexer, out=out, fields=fields, prototype=prototype
        )
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 163, in sync
    raise return_result
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 119, in _runner
    return await coro
           ^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 1287, in _get_selection
    await self.codec_pipeline.read(
    ...<12 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 464, in read
    await concurrent_map(
    ...<6 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 265, in read_batch
    chunk_bytes_batch = await concurrent_map(
                        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_common.py", line 124, in get
    return await self.store.get(self.path, prototype=prototype, byte_range=byte_range)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_fsspec.py", line 230, in get
    value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 808, in _cat_file
    raise ReferenceNotReachable(path, part_or_url) from e
fsspec.implementations.reference.ReferenceNotReachable: Reference "time/0" failed to fetch target https://data.gesdisc.earthdata.nasa.gov/data/MERRA2/M2T1NXSLV.5.12.4/2024/01/MERRA2_400.tavg1_2d_slv_Nx.20240101.nc4

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_virtualizarr.py", line 37, in test_open_virtual_dataset
    vds_load = ***.open_virtual_dataset(granule, load=True)
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 193, in open_virtual_dataset
    return open_virtual_mfdataset(
        granules=[granule],
    ...<4 lines>...
        preprocess=None,
    )
  File "/home/runner/work/***/***/***/dmrpp_zarr.py", line 131, in open_virtual_mfdataset
    return xr.open_dataset(
           ~~~~~~~~~~~~~~~^
        "reference://",
        ^^^^^^^^^^^^^^^
    ...<9 lines>...
        },
        ^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/api.py", line 671, in open_dataset
    backend_ds = backend.open_dataset(
        filename_or_obj,
    ...<2 lines>...
        **kwargs,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 1427, in open_dataset
    ds = store_entrypoint.open_dataset(
        store,
    ...<6 lines>...
        decode_timedelta=decode_timedelta,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/store.py", line 46, in open_dataset
    vars, attrs, coord_names = conventions.decode_cf_variables(
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        vars,
        ^^^^^
    ...<7 lines>...
        decode_timedelta=decode_timedelta,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/conventions.py", line 462, in decode_cf_variables
    raise type(e)(f"Failed to decode variable {k!r}: {e}") from e
          ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: ReferenceNotReachable.__init__() missing 1 required positional argument: 'target'

So there is:

  1. TypeError: ReferenceNotReachable.__init__() missing 1 required positional argument: 'target' on test_open_virtual_dataset* as expected since those are the DMRPP/Virtualizarr tests. Fixed in commit f322272
  2. ModuleNotFoundError: No module named 'zarr.meta' on test_consolidate_metadata* that I wasn't expecting, but hopefully not too hard to fix

Using a convenience function within virtualizarr to translate a store-level kerchunk reference dict into an xarray Dataset. Function is at https://github.com/zarr-developers/VirtualiZarr/blob/v1.3.2/virtualizarr/translators/kerchunk.py#L119-L153
Comment on lines 129 to +130
refs = vds.virtualize.to_kerchunk(filepath=None, format="dict")
protocol = "s3" if "s3" in fs.protocol else fs.protocol
return xr.open_dataset(
"reference://",
engine="zarr",
chunks={},
backend_kwargs={
"consolidated": False,
"storage_options": {
"fo": refs, # codespell:ignore
"remote_protocol": protocol,
"remote_options": fs.storage_options,
},
},
)
return vz.translators.kerchunk.dataset_from_kerchunk_refs(refs=refs)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These two lines (calling vds.virtualize.to_kerchunk and dataset_from_kerchunk_refs) are based to a roundtrip test at https://github.com/zarr-developers/VirtualiZarr/blob/25c0b3889d13bfc275d702437e15ae3a1492be98/virtualizarr/tests/test_integration.py#L42-L46.

@TomNicholas, just checking to see how stable this virtualizarr.translators.kerchunk.dataset_from_kerchunk_refs function is (i.e. will it be refactored away in a future release of Virtualizarr). I see it mentioned at zarr-developers/VirtualiZarr#257 that " dataset_from_kerchunk_refs should be a common utility...", but unsure if it's meant to be a public or private interface. If it's meant to be private, I can refactor this load logic to use something else.

@weiji14
Copy link
Collaborator Author

weiji14 commented Apr 1, 2025

A couple of integration tests appear to be timing out at https://github.com/nsidc/earthaccess/actions/runs/14206033643/job/39803890145#step:6:1158?

=================================== FAILURES ===================================
_______________________ test_consolidate_metadata[file] ________________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 814, in _cat_file
    return await self.fss[protocol]._cat_file(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        part_or_url, start=start0, end=end0
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/http.py", line 234, in _cat_file
    async with session.get(self.encode_url(url), **kw) as r:
               ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 1359, in __aenter__
    self._resp: _RetType = await self._coro
                           ^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 579, in _request
    with timer:
         ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/helpers.py", line 712, in __enter__
    raise RuntimeError(
        "Timeout context manager should be used " "inside a task"
    )
RuntimeError: Timeout context manager should be used inside a task

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 61, in test_consolidate_metadata
    result = xr.open_dataset(
        "reference://",
    ...<9 lines>...
        },
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/api.py", line 671, in open_dataset
    backend_ds = backend.open_dataset(
        filename_or_obj,
    ...<2 lines>...
        **kwargs,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 1427, in open_dataset
    ds = store_entrypoint.open_dataset(
        store,
    ...<6 lines>...
        decode_timedelta=decode_timedelta,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/store.py", line 58, in open_dataset
    ds = Dataset(vars, attrs=attrs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/dataset.py", line 720, in __init__
    variables, coord_names, dims, indexes, _ = merge_data_and_coords(
                                               ~~~~~~~~~~~~~~~~~~~~~^
        data_vars, coords
        ^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/dataset.py", line 434, in merge_data_and_coords
    return merge_core(
        [data_vars, coords],
    ...<5 lines>...
        skip_align_args=[1],
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/merge.py", line 699, in merge_core
    collected = collect_variables_and_indexes(aligned, indexes=indexes)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/merge.py", line 362, in collect_variables_and_indexes
    idx, idx_vars = create_default_index_implicit(variable)
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 1420, in create_default_index_implicit
    index = PandasIndex.from_variables(dim_var, options={})
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 654, in from_variables
    obj = cls(data, dim, coord_dtype=var.dtype)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 589, in __init__
    index = safe_cast_to_index(array)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 469, in safe_cast_to_index
    index = pd.Index(np.asarray(array), **kwargs)
                     ~~~~~~~~~~^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 514, in __array__
    return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy)
                      ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/common.py", line 194, in get_duck_array
    return self[key]  # type: ignore [index]
           ~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 166, in __getitem__
    return indexing.explicit_indexing_adapter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        key, array.shape, indexing.IndexingSupport.VECTORIZED, method
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 1018, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 156, in _getitem
    return self._array[key]
           ~~~~~~~~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2425, in __getitem__
    return self.get_orthogonal_selection(pure_selection, fields=fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/_compat.py", line 43, in inner_f
    return f(*args, **kwargs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2867, in get_orthogonal_selection
    return sync(
        self._async_array._get_selection(
            indexer=indexer, out=out, fields=fields, prototype=prototype
        )
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 163, in sync
    raise return_result
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 119, in _runner
    return await coro
           ^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 1287, in _get_selection
    await self.codec_pipeline.read(
    ...<12 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 464, in read
    await concurrent_map(
    ...<6 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 265, in read_batch
    chunk_bytes_batch = await concurrent_map(
                        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_common.py", line 124, in get
    return await self.store.get(self.path, prototype=prototype, byte_range=byte_range)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_fsspec.py", line 230, in get
    value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 818, in _cat_file
    raise ReferenceNotReachable(path, part_or_url) from e
fsspec.implementations.reference.ReferenceNotReachable: Reference "Latitude/0" failed to fetch target https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc
------------------------------ Captured log call -------------------------------
INFO     ***.store:store.py:386 Opening 2 granules, approx size: 0.02 GB
DEBUG    h5-to-zarr:hdf.py:94 HDF5 file: <File-like object HTTPFileSystem, https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101512.nc>
DEBUG    h5-to-zarr:hdf.py:94 HDF5 file: <File-like object HTTPFileSystem, https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc>
DEBUG    h5-to-zarr:hdf.py:120 HDF5 file URI: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101512.nc
DEBUG    h5-to-zarr:hdf.py:142 Translation begins
DEBUG    h5-to-zarr:hdf.py:120 HDF5 file URI: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc
DEBUG    h5-to-zarr:hdf.py:142 Translation begins
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lat_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Lat_bounds shape=(960, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Latitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Latitude shape=(960,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lon_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Lon_bounds shape=(2160, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Longitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Longitude shape=(2160,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/SLA shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA_ERR
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/SLA_ERR shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Time shape=(1,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857368640/Time_bounds shape=(1, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /nv
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: None
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lat_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Lat_bounds shape=(960, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Latitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Latitude shape=(960,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lon_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Lon_bounds shape=(2160, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Longitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Longitude shape=(2160,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/SLA shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA_ERR
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/SLA_ERR shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Time shape=(1,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916881058496/Time_bounds shape=(1, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /nv
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: None
INFO     fsspec.reference:reference.py:700 Read reference from URL /tmp/pytest-of-runner/pytest-0/test_consolidate_metadata_file0/metadata.json
______________________ test_consolidate_metadata[memory] _______________________
Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 814, in _cat_file
    return await self.fss[protocol]._cat_file(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        part_or_url, start=start0, end=end0
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/http.py", line 234, in _cat_file
    async with session.get(self.encode_url(url), **kw) as r:
               ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 1359, in __aenter__
    self._resp: _RetType = await self._coro
                           ^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/client.py", line 579, in _request
    with timer:
         ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/aiohttp/helpers.py", line 712, in __enter__
    raise RuntimeError(
        "Timeout context manager should be used " "inside a task"
    )
RuntimeError: Timeout context manager should be used inside a task

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
                             ~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
            ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 182, in _multicall
    return outcome.get_result()
           ~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_result.py", line 100, in get_result
    raise exc.with_traceback(exc.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
    yield from thread_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
    yield from self._runtest_for(item, "call")
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/logging.py", line 829, in _runtest_for
    yield
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 167, in _multicall
    teardown.throw(outcome._exception)
    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
    return (yield)
            ^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
    item.runtest()
    ~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 1627, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
           ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 139, in _multicall
    raise exception.with_traceback(exception.__traceback__)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/_pytest/python.py", line 159, in pytest_pyfunc_call
    result = testfunction(**testargs)
  File "/home/runner/work/***/***/tests/integration/test_kerchunk.py", line 61, in test_consolidate_metadata
    result = xr.open_dataset(
        "reference://",
    ...<9 lines>...
        },
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/api.py", line 671, in open_dataset
    backend_ds = backend.open_dataset(
        filename_or_obj,
    ...<2 lines>...
        **kwargs,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 1427, in open_dataset
    ds = store_entrypoint.open_dataset(
        store,
    ...<6 lines>...
        decode_timedelta=decode_timedelta,
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/store.py", line 58, in open_dataset
    ds = Dataset(vars, attrs=attrs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/dataset.py", line 720, in __init__
    variables, coord_names, dims, indexes, _ = merge_data_and_coords(
                                               ~~~~~~~~~~~~~~~~~~~~~^
        data_vars, coords
        ^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/dataset.py", line 434, in merge_data_and_coords
    return merge_core(
        [data_vars, coords],
    ...<5 lines>...
        skip_align_args=[1],
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/merge.py", line 699, in merge_core
    collected = collect_variables_and_indexes(aligned, indexes=indexes)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/merge.py", line 362, in collect_variables_and_indexes
    idx, idx_vars = create_default_index_implicit(variable)
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 1420, in create_default_index_implicit
    index = PandasIndex.from_variables(dim_var, options={})
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 654, in from_variables
    obj = cls(data, dim, coord_dtype=var.dtype)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 589, in __init__
    index = safe_cast_to_index(array)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexes.py", line 469, in safe_cast_to_index
    index = pd.Index(np.asarray(array), **kwargs)
                     ~~~~~~~~~~^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 514, in __array__
    return np.asarray(self.get_duck_array(), dtype=dtype, copy=copy)
                      ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/common.py", line 194, in get_duck_array
    return self[key]  # type: ignore [index]
           ~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 166, in __getitem__
    return indexing.explicit_indexing_adapter(
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        key, array.shape, indexing.IndexingSupport.VECTORIZED, method
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/core/indexing.py", line 1018, in explicit_indexing_adapter
    result = raw_indexing_method(raw_key.tuple)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/xarray/backends/zarr.py", line 156, in _getitem
    return self._array[key]
           ~~~~~~~~~~~^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2425, in __getitem__
    return self.get_orthogonal_selection(pure_selection, fields=fields)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/_compat.py", line 43, in inner_f
    return f(*args, **kwargs)
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 2867, in get_orthogonal_selection
    return sync(
        self._async_array._get_selection(
            indexer=indexer, out=out, fields=fields, prototype=prototype
        )
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 163, in sync
    raise return_result
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/sync.py", line 119, in _runner
    return await coro
           ^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/array.py", line 1287, in _get_selection
    await self.codec_pipeline.read(
    ...<12 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 464, in read
    await concurrent_map(
    ...<6 lines>...
    )
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/codec_pipeline.py", line 265, in read_batch
    chunk_bytes_batch = await concurrent_map(
                        ^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 68, in concurrent_map
    return await asyncio.gather(*[asyncio.ensure_future(run(item)) for item in items])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/core/common.py", line 66, in run
    return await func(*item)
           ^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_common.py", line 124, in get
    return await self.store.get(self.path, prototype=prototype, byte_range=byte_range)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/zarr/storage/_fsspec.py", line 230, in get
    value = prototype.buffer.from_bytes(await self.fs._cat_file(path))
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/***/***/.venv/lib/python3.13/site-packages/fsspec/implementations/reference.py", line 818, in _cat_file
    raise ReferenceNotReachable(path, part_or_url) from e
fsspec.implementations.reference.ReferenceNotReachable: Reference "Latitude/0" failed to fetch target https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc
------------------------------ Captured log call -------------------------------
INFO     ***.store:store.py:386 Opening 2 granules, approx size: 0.02 GB
DEBUG    h5-to-zarr:hdf.py:94 HDF5 file: <File-like object HTTPFileSystem, https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101512.nc>
DEBUG    h5-to-zarr:hdf.py:94 HDF5 file: <File-like object HTTPFileSystem, https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc>
DEBUG    h5-to-zarr:hdf.py:120 HDF5 file URI: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101512.nc
DEBUG    h5-to-zarr:hdf.py:142 Translation begins
DEBUG    h5-to-zarr:hdf.py:120 HDF5 file URI: https://archive.podaac.earthdata.nasa.gov/podaac-ops-cumulus-protected/SEA_SURFACE_HEIGHT_ALT_GRIDS_L4_2SATS_5DAY_6THDEG_V_JPL2205/ssh_grids_v2205_1992101012.nc
DEBUG    h5-to-zarr:hdf.py:142 Translation begins
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lat_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Lat_bounds shape=(960, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Latitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Latitude shape=(960,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lon_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Lon_bounds shape=(2160, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Longitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Longitude shape=(2160,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/SLA shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA_ERR
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/SLA_ERR shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Time shape=(1,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916848824576/Time_bounds shape=(1, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /nv
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: None
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lat_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Lat_bounds shape=(960, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Latitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Latitude shape=(960,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Latitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Lon_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Lon_bounds shape=(2160, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Longitude
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Longitude shape=(2160,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/SLA shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /SLA_ERR
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/SLA_ERR shape=(1, 960, 2160) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'Latitude', 'Longitude']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Time shape=(1,) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /Time_bounds
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: gzip
DEBUG    h5-to-zarr:hdf.py:497 Created Zarr array: <Array memory://139916857361344/Time_bounds shape=(1, 2) dtype=float32>
DEBUG    h5-to-zarr:hdf.py:500 _ARRAY_DIMENSIONS = ['Time', 'nv']
DEBUG    h5-to-zarr:hdf.py:303 HDF5 dataset: /nv
DEBUG    h5-to-zarr:hdf.py:304 HDF5 compression: None

Otherwise this should be ready for an initial round of reviews 🚀

@weiji14 weiji14 marked this pull request as ready for review April 1, 2025 21:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant