Skip to content

ClientResponseError when serving xarray loaded from Zarr #291

@ThomWorm

Description

@ThomWorm

Hello - I'm having trouble hosting a zarr dataset with Xpublish, getting error 500 - Client Response from the .zmetadata file.

I'm able to serve an xarray file not created from a zarr just fine. For example:

Server Side:


data = xr.Dataset(
    {
        "temperature": (("time", "lat", "lon"), 20 * np.random.rand(4, 3, 2)),
    },
    coords={
        "time": pd.date_range("2023-01-01", periods=4),
        "lat": [10, 20, 30],
        "lon": [100, 110],
    },
)
rest = xpublish.SingleDatasetRest(data)
# Start the server and keep it running
if __name__ == "__main__":
    print("Serving simple dataset...")
    rest.serve(port=8000)


Client Side

import zarr
from fsspec.implementations.http import HTTPFileSystem

fs = HTTPFileSystem()

# The URL 'http://0.0.0.0:9000/zarr/' here serves one dataset
http_map = fs.get_mapper("http://0.0.0.0:8000/zarr/")

# open as a zarr group
zg = zarr.open_consolidated(http_map, mode="r")

# or open as another Xarray Dataset
ds = xr.open_zarr(http_map, consolidated=True)

However, when the data are created and then stored as a zarr dataset first, I'm getting a 500:ClientResponseError:Internal Server Error. I believe this is something to do with .zmetadata.

For example, saving the file first
data.to_zarr("simple_zarr_dataset.zarr", consolidated=True)

and then opening it when creating the server

output_zarr_store = r"simple_zarr_dataset.zarr"  
data = xr.open_zarr(output_zarr_store)

Is producing the following error log:


---------------------------------------------------------------------------
ClientResponseError                       Traceback (most recent call last)
Cell In[8], [line 10](vscode-notebook-cell:?execution_count=8&line=10)
      [7](vscode-notebook-cell:?execution_count=8&line=7) http_map = fs.get_mapper("http://0.0.0.0:8001/zarr/")
      [9](vscode-notebook-cell:?execution_count=8&line=9) # Open as a Zarr group
---> [10](vscode-notebook-cell:?execution_count=8&line=10) zg = zarr.open_consolidated(http_map, mode="r")
     [12](vscode-notebook-cell:?execution_count=8&line=12) # Or open as another Xarray Dataset
     [13](vscode-notebook-cell:?execution_count=8&line=13) ds = xr.open_zarr(http_map, consolidated=True)

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1362, in open_consolidated(store, metadata_key, mode, **kwargs)
   [1359](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1359)         metadata_key = "meta/root/consolidated/" + metadata_key
   [1361](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1361) # setup metadata store
-> [1362](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1362) meta_store = ConsolidatedStoreClass(store, metadata_key=metadata_key)
   [1364](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1364) # pass through
   [1365](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/convenience.py:1365) chunk_store = kwargs.pop("chunk_store", None) or store

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3045, in ConsolidatedMetadataStore.__init__(self, store, metadata_key)
   [3042](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3042) self.store = Store._ensure_store(store)
   [3044](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3044) # retrieve consolidated metadata
-> [3045](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3045) meta = json_loads(self.store[metadata_key])
   [3047](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3047) # check format of consolidated metadata
   [3048](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:3048) consolidated_format = meta.get("zarr_consolidated_format", None)

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1446, in FSStore.__getitem__(self, key)
   [1444](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1444) key = self._normalize_key(key)
   [1445](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1445) try:
-> [1446](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1446)     return self.map[key]
   [1447](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1447) except self.exceptions as e:
   [1448](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/zarr/storage.py:1448)     raise KeyError(key) from e

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:155, in FSMap.__getitem__(self, key, default)
    [153](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:153) k = self._key_to_str(key)
    [154](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:154) try:
--> [155](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:155)     result = self.fs.cat(k)
    [156](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:156) except self.missing_exceptions as exc:
    [157](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/mapping.py:157)     if default is not None:

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:118, in sync_wrapper.<locals>.wrapper(*args, **kwargs)
    [115](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:115) @functools.wraps(func)
    [116](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:116) def wrapper(*args, **kwargs):
    [117](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:117)     self = obj or args[0]
--> [118](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:118)     return sync(self.loop, func, *args, **kwargs)

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:103, in sync(loop, func, timeout, *args, **kwargs)
    [101](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:101)     raise FSTimeoutError from return_result
    [102](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:102) elif isinstance(return_result, BaseException):
--> [103](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:103)     raise return_result
    [104](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:104) else:
    [105](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:105)     return return_result

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:56, in _runner(event, coro, result, timeout)
     [54](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:54)     coro = asyncio.wait_for(coro, timeout=timeout)
     [55](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:55) try:
---> [56](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:56)     result[0] = await coro
     [57](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:57) except Exception as ex:
     [58](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:58)     result[0] = ex

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:465, in AsyncFileSystem._cat(self, path, recursive, on_error, batch_size, **kwargs)
    [463](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:463)     ex = next(filter(is_exception, out), False)
    [464](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:464)     if ex:
--> [465](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:465)         raise ex
    [466](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:466) if (
    [467](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:467)     len(paths) > 1
    [468](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:468)     or isinstance(path, list)
    [469](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:469)     or paths[0] != self._strip_protocol(path)
    [470](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:470) ):
    [471](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:471)     return {
    [472](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:472)         k: v
    [473](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:473)         for k, v in zip(paths, out)
    [474](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:474)         if on_error != "omit" or not is_exception(v)
    [475](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:475)     }

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:245, in _run_coros_in_chunks.<locals>._run_coro(coro, i)
    [243](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:243) async def _run_coro(coro, i):
    [244](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:244)     try:
--> [245](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:245)         return await asyncio.wait_for(coro, timeout=timeout), i
    [246](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:246)     except Exception as e:
    [247](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/asyn.py:247)         if not return_exceptions:

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/asyncio/tasks.py:507, in wait_for(fut, timeout)
    [504](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/asyncio/tasks.py:504)         raise TimeoutError from exc
    [506](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/asyncio/tasks.py:506) async with timeouts.timeout(timeout):
--> [507](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/asyncio/tasks.py:507)     return await fut

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:236, in HTTPFileSystem._cat_file(self, url, start, end, **kwargs)
    [234](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:234) async with session.get(self.encode_url(url), **kw) as r:
    [235](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:235)     out = await r.read()
--> [236](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:236)     self._raise_not_found_for_status(r, url)
    [237](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:237) return out

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:219, in HTTPFileSystem._raise_not_found_for_status(self, response, url)
    [217](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:217) if response.status == 404:
    [218](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:218)     raise FileNotFoundError(url)
--> [219](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/fsspec/implementations/http.py:219) response.raise_for_status()

File ~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1161, in ClientResponse.raise_for_status(self)
   [1158](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1158) if not self._in_context:
   [1159](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1159)     self.release()
-> [1161](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1161) raise ClientResponseError(
   [1162](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1162)     self.request_info,
   [1163](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1163)     self.history,
   [1164](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1164)     status=self.status,
   [1165](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1165)     message=self.reason,
   [1166](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1166)     headers=self.headers,
   [1167](https://file+.vscode-resource.vscode-cdn.net/home/thom/Desktop/CIPM/FruitFlyPheno/tests/~/miniforge3/envs/fruitflyzarr/lib/python3.13/site-packages/aiohttp/client_reqrep.py:1167) )

ClientResponseError: 500, message='Internal Server Error', url='http://0.0.0.0:8001/zarr/.zmetadata'

Thanks in advance!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions