Skip to content
This repository was archived by the owner on Aug 29, 2023. It is now read-only.

Commit

Permalink
#393 local ds error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Krzysztof (Chris) Bernat committed Sep 26, 2017
1 parent 83fcb50 commit d800351
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 19 deletions.
15 changes: 8 additions & 7 deletions cate/core/ds.py
Original file line number Diff line number Diff line change
Expand Up @@ -459,30 +459,31 @@ def _repr_html_(self):


# noinspection PyArgumentList
class DataSourceInitializationError(Exception):
class DataAccessError(Exception):
"""
Exceptions produced by Cate's DataStore during DataSource initialization.
Exceptions produced by Cate's data stores and data sources instances, used to report any problems handling data.
"""
def __init__(self, cause, *args, **kwargs):
if isinstance(cause, Exception):
super(DataSourceInitializationError, self).__init__(str(cause), *args, **kwargs)
super(DataAccessError, self).__init__(str(cause), *args, **kwargs)
_, _, traceback = sys.exc_info()
self.with_traceback(traceback)
elif isinstance(cause, str):
super(DataSourceInitializationError, self).__init__(cause, *args, **kwargs)
super(DataAccessError, self).__init__(cause, *args, **kwargs)
else:
super(DataSourceInitializationError, self).__init__(*args, **kwargs)
super(DataAccessError, self).__init__(*args, **kwargs)
self._cause = cause

@property
def cause(self):
return self._cause


class DataSourceInitializationWarning(UserWarning):
class DataAccessWarning(UserWarning):
"""
Warnings produced by Cate's DataStore during DataSource initialization.
Warnings produced by Cate's data stores and data sources instances, used to report any problems handling data.
"""
pass


def find_data_sources(data_stores: Union[DataStore, Sequence[DataStore]] = None,
Expand Down
27 changes: 15 additions & 12 deletions cate/ds/local.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@

from cate.conf import get_config_value, get_data_stores_path
from cate.conf.defaults import NETCDF_COMPRESSION_LEVEL
from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, DataSourceInitializationError, \
DataSourceInitializationWarning, open_xarray_dataset
from cate.core.ds import DATA_STORE_REGISTRY, DataStore, DataSource, DataAccessError, DataAccessWarning,\
open_xarray_dataset
from cate.core.types import Polygon, PolygonLike, TimeRange, TimeRangeLike, VarNames, VarNamesLike
from cate.util.monitor import Monitor

Expand Down Expand Up @@ -744,16 +744,16 @@ def create_data_source(self, data_source_id: str, region: PolygonLike.TYPE = Non
with open(lock_filepath, 'r') as lock_file:
writer_pid = lock_file.readline()
if psutil.pid_exists(int(writer_pid)):
raise ValueError("Cannot access data source {}, another process is using it (pid:{}"
.format(ds.id, writer_pid))
raise DataAccessError("Cannot access data source {}, another process is using it (pid:{}".
format(ds.id, writer_pid))
# ds.temporal_coverage() == time_range and
if ds.spatial_coverage() == region \
and ds.variables_info == var_names:
data_source = ds
data_source.set_completed(False)
break
raise ValueError("Local data store '{}' already contains a data source named '{}'"
.format(self.id, data_source_id))
raise DataAccessError("Local data store '{}' already contains a data source named '{}'".
format(self.id, data_source_id))
if not data_source:
data_source = LocalDataSource(data_source_id, files=[], data_store=self, spatial_coverage=region,
variables=var_names, temporal_coverage=time_range, meta_info=meta_info)
Expand Down Expand Up @@ -808,9 +808,9 @@ def _init_data_sources(self, skip_broken: bool=True):
data_source = self._load_data_source(os.path.join(self._store_dir, json_file))
if data_source:
self._data_sources.append(data_source)
except DataSourceInitializationError as e:
except DataAccessError as e:
if skip_broken:
warnings.warn(e.cause, DataSourceInitializationWarning, stacklevel=0)
warnings.warn(e.cause, DataAccessWarning, stacklevel=0)
else:
raise e

Expand All @@ -826,8 +826,11 @@ def _save_data_source(self, data_source):
json_dict = data_source.to_json_dict()
dump_kwargs = dict(indent=' ', default=self._json_default_serializer)
file_name = os.path.join(self._store_dir, data_source.id + '.json')
with open(file_name, 'w') as fp:
json.dump(json_dict, fp, **dump_kwargs)
try:
with open(file_name, 'w') as fp:
json.dump(json_dict, fp, **dump_kwargs)
except EnvironmentError as e:
raise DataAccessError("Couldn't save Data Source config file {}\n{}".format(file_name, e.strerror))

def _load_data_source(self, json_path):
json_dict = self._load_json_file(json_path)
Expand All @@ -841,9 +844,9 @@ def _load_json_file(json_path: str):
with open(json_path) as fp:
return json.load(fp=fp) or {}
except json.decoder.JSONDecodeError:
raise DataSourceInitializationError("Cannot load data source config, {}".format(json_path))
raise DataAccessError("Cannot load data source config, {}".format(json_path))
else:
raise DataSourceInitializationError("Data source config does not exists, {}".format(json_path))
raise DataAccessError("Data source config does not exists, {}".format(json_path))

@staticmethod
def _json_default_serializer(obj):
Expand Down

0 comments on commit d800351

Please sign in to comment.