diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index 3428875086..133cbf7b3b 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -352,8 +352,8 @@ def __init__( # data storage self._result_data = ThreadSafeList() self._figures = ThreadSafeOrderedDict(self._db_data.figure_names) - self._analysis_results = AnalysisResultTable() - + self._analysis_results = ThreadSafeOrderedDict() + self._completion_times = ThreadSafeOrderedDict() self._deleted_figures = deque() self._deleted_analysis_results = deque() @@ -377,12 +377,7 @@ def experiment(self): @property def completion_times(self) -> Dict[str, datetime]: """Returns the completion times of the jobs.""" - job_times = {} - for job_id, job in self._jobs.items(): - if job is not None and "COMPLETED" in job.time_per_step(): - job_times[job_id] = job.time_per_step().get("COMPLETED") - - return job_times + return dict(self._completion_times) @property def tags(self) -> List[str]: @@ -916,8 +911,11 @@ def _add_job_data( pass self._add_result_data(job_result, jid) LOG.debug("Job data added [Job ID: %s]", jid) - # sets the endtime to be the time the last successful job was added - self.end_datetime = datetime.now() + completed_at = datetime.now() + with self._completion_times.lock: + self._completion_times[jid] = completed_at + # sets the end time to be the time the last successful job was added + self.end_datetime = completed_at return jid, True except Exception as ex: # pylint: disable=broad-except # Handle cancelled jobs @@ -2463,6 +2461,7 @@ def __json_encode__(self): "_deleted_figures": self._deleted_figures, "_deleted_analysis_results": self._deleted_analysis_results, "_result_data": self._result_data, + "_completion_times": self._completion_times, "_extra_data": self._extra_data, "_created_in_db": self._created_in_db, "_figures": self._safe_serialize_figures(), # Convert figures to SVG diff --git a/test/database_service/test_db_experiment_data.py b/test/database_service/test_db_experiment_data.py index 3d83fa8512..2587284a8f 100644 --- a/test/database_service/test_db_experiment_data.py +++ b/test/database_service/test_db_experiment_data.py @@ -779,6 +779,19 @@ def _analysis(*args): # pylint: disable = unused-argument self.assertEqual(exp_data.analysis_status(), AnalysisStatus.CANCELLED) self.assertEqual(exp_data.status(), ExperimentStatus.CANCELLED) + def test_completion_times(self): + """Test the completion_times property""" + jid = "1234" + job = mock.create_autospec(Job, instance=True) + job.job_id.return_value = jid + job.status = JobStatus.DONE + + exp_data = ExperimentData(experiment_type="qiskit_test") + exp_data.add_jobs(job) + completion_times = exp_data.completion_times + self.assertTrue(jid in completion_times) + self.assertTrue(isinstance(completion_times[jid], datetime)) + def test_partial_cancel_analysis(self): """Test canceling experiment analysis."""