xcube-dev/xcube

server fails to return time series for shapes in some cases

Closed this issue · 4 comments

Describe the bug
server fails to return time series for shapes

[E 2024-05-31 08:15:06,024 tornado.application] Uncaught exception POST /api/timeseries/ds1/B01?aggMethods=mean%2Cstd&startDate=2021-03-05T10%3A35%3A40Z&endDate=2022-10-19T10%3A45%3A38Z (10.0.73.252)
HTTPServerRequest(protocol='http', host='open-sr.api.dev.brockmann-consult.de', method='POST', uri='/api/timeseries/ds1/B01?aggMethods=mean%2Cstd&startDate=2021-03-05T10%3A35%3A40Z&endDate=2022-10-19T10%3A45%3A38Z', version='HTTP/1.1', remote_ip='10.0.73.252')
Traceback (most recent call last):
  File "/opt/conda/lib/python3.12/site-packages/tornado/web.py", line 1790, in _execute
    result = await result
             ^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/server/webservers/tornado.py", line 339, in post
    await self._call_method("post", *args, **kwargs)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/server/webservers/tornado.py", line 354, in _call_method
    await method(*args, **kwargs)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/routes.py", line 82, in post
    result = await self.ctx.run_in_executor(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 101, in get_time_series
    results = _get_time_series_for_geometries(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 137, in _get_time_series_for_geometries
    time_series = _get_time_series_for_geometry(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 176, in _get_time_series_for_geometry
    time_series_ds = timeseries.get_time_series(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/timeseries.py", line 138, in get_time_series
    dataset = mask_dataset_by_geometry(
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/geom.py", line 337, in mask_dataset_by_geometry
    dataset = _clip_dataset_by_geometry(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/geom.py", line 509, in _clip_dataset_by_geometry
    update_dataset_spatial_attrs(dataset_subset, update_existing=True, in_place=True)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/update.py", line 78, in update_dataset_spatial_attrs
    gm = GridMapping.from_dataset(dataset)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/gridmapping/base.py", line 803, in from_dataset
    return new_grid_mapping_from_dataset(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/gridmapping/dataset.py", line 89, in new_grid_mapping_from_dataset
    raise ValueError("cannot find any grid mapping in dataset")
ValueError: cannot find any grid mapping in dataset
[E 2024-05-31 08:15:06,024 tornado.application] Uncaught exception POST /api/timeseries/ds1/B01?aggMethods=mean%2Cstd&startDate=2021-03-05T10%3A35%3A40Z&endDate=2022-10-19T10%3A45%3A38Z (10.0.73.252)
HTTPServerRequest(protocol='http', host='open-sr.api.dev.brockmann-consult.de', method='POST', uri='/api/timeseries/ds1/B01?aggMethods=mean%2Cstd&startDate=2021-03-05T10%3A35%3A40Z&endDate=2022-10-19T10%3A45%3A38Z', version='HTTP/1.1', remote_ip='10.0.73.252')
Traceback (most recent call last):
  File "/opt/conda/lib/python3.12/site-packages/tornado/web.py", line 1790, in _execute
    result = await result
             ^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/server/webservers/tornado.py", line 339, in post
    await self._call_method("post", *args, **kwargs)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/server/webservers/tornado.py", line 354, in _call_method
    await method(*args, **kwargs)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/routes.py", line 82, in post
    result = await self.ctx.run_in_executor(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 101, in get_time_series
    results = _get_time_series_for_geometries(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 137, in _get_time_series_for_geometries
    time_series = _get_time_series_for_geometry(
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/webapi/timeseries/controllers.py", line 176, in _get_time_series_for_geometry
    time_series_ds = timeseries.get_time_series(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/timeseries.py", line 138, in get_time_series
    dataset = mask_dataset_by_geometry(
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/geom.py", line 337, in mask_dataset_by_geometry
    dataset = _clip_dataset_by_geometry(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/geom.py", line 509, in _clip_dataset_by_geometry
    update_dataset_spatial_attrs(dataset_subset, update_existing=True, in_place=True)
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/update.py", line 78, in update_dataset_spatial_attrs
    gm = GridMapping.from_dataset(dataset)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/gridmapping/base.py", line 803, in from_dataset
    return new_grid_mapping_from_dataset(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/conda/lib/python3.12/site-packages/xcube-1.6.0.dev2-py3.12.egg/xcube/core/gridmapping/dataset.py", line 89, in new_grid_mapping_from_dataset
    raise ValueError("cannot find any grid mapping in dataset")
ValueError: cannot find any grid mapping in dataset

Explanation: For a given shape, the dataset is masked and then cropped to shape bounds, finally its global CF coverage attributes are updated. The latter step fails. It seems the dataset changes such that GridMapping.from_dataset(dataset) fails.

Subsetting variables is the root cause. Since the server picks a single variable, the subset dataset only comprises that variable and no longer crs.