From a4da948f1ed85d65c6ed02fa4891d24e7a9978a7 Mon Sep 17 00:00:00 2001 From: Christopher Wood Date: Fri, 8 Oct 2021 11:30:28 -0400 Subject: [PATCH 1/2] Fix DbExperimentData._retrieve_data This method had two typos in it: - iteration over `self._jobs` doesn't work for the ThreadSafeOrderedDict class like with standard dict, iteration must be over `self._jobs.items()` - IBMQ providers don't have a `retrieve_job` method, only the backends have this method. --- .../database_service/db_experiment_data.py | 19 ++++++++++++------- .../fix-retrieve-data-c93c8406ff4f2e7e.yaml | 6 ++++++ 2 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 releasenotes/notes/fix-retrieve-data-c93c8406ff4f2e7e.yaml diff --git a/qiskit_experiments/database_service/db_experiment_data.py b/qiskit_experiments/database_service/db_experiment_data.py index a30e81f989..aedfe59068 100644 --- a/qiskit_experiments/database_service/db_experiment_data.py +++ b/qiskit_experiments/database_service/db_experiment_data.py @@ -335,16 +335,21 @@ def _add_single_data(self, data: Dict[str, any]) -> None: def _retrieve_data(self): """Retrieve job data if missing experiment data.""" # Get job results if missing experiment data. - if (not self._data) and self._provider: + if (not self._data) and self._backend: with self._jobs.lock: - for jid in self._jobs: - if self._jobs[jid] is None: + for jid, job in self._jobs.items(): + if job is None: try: - self._jobs[jid] = self._provider.retrieve_job(jid) + job = self._backend.retrieve_job(jid) + self._jobs[jid] = job except Exception: # pylint: disable=broad-except - pass - if self._jobs[jid] is not None: - self._add_result_data(self._jobs[jid].result()) + LOG.warning( + "Unable to retrive data from job %s on backend %s", + jid, + self._backend, + ) + if job is not None: + self._add_result_data(job.result()) def data(self, index: Optional[Union[int, slice, str]] = None) -> Union[Dict, List[Dict]]: """Return the experiment data at the specified index. diff --git a/releasenotes/notes/fix-retrieve-data-c93c8406ff4f2e7e.yaml b/releasenotes/notes/fix-retrieve-data-c93c8406ff4f2e7e.yaml new file mode 100644 index 0000000000..e144e391b1 --- /dev/null +++ b/releasenotes/notes/fix-retrieve-data-c93c8406ff4f2e7e.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixed bug in :class:`~qiskit_experiments.framework.ExperimentData` where + trying to load saved job data from a backend using + ``ExperimentData(backend=backend, job_ids=job_ids)`` resulted in an error. From 108f69b349ece5da0226e7ea2a4346e38cf99c96 Mon Sep 17 00:00:00 2001 From: Christopher Wood Date: Mon, 11 Oct 2021 10:54:16 -0400 Subject: [PATCH 2/2] Add __iter__ method to ThreadSafeContainer --- qiskit_experiments/database_service/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qiskit_experiments/database_service/utils.py b/qiskit_experiments/database_service/utils.py index 0e72287507..c377cdcff9 100644 --- a/qiskit_experiments/database_service/utils.py +++ b/qiskit_experiments/database_service/utils.py @@ -178,6 +178,10 @@ def _init_container(self, init_values): """Initialize the container.""" pass + def __iter__(self): + with self._lock: + return iter(self._container) + def __getitem__(self, key): with self._lock: return self._container[key]