diff --git a/CHANGELOG.md b/CHANGELOG.md index a80cf89207..30fe8f1c2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ Changed - Classical algorithms renamed, former names deprecated (#851) - Chemistry process algorithm result returns result object, lines, dict return deprecated (#861) - Measurement error mitigation supports different output orders on same qubits (#865) +- If ibmq-provider is used and job limit is reached, `run_circuit` now waits for a previous job + to finish before submitting the next one. (#906) Removed ------- diff --git a/qiskit/aqua/utils/run_circuits.py b/qiskit/aqua/utils/run_circuits.py index b5c2deac71..ff274b4d36 100644 --- a/qiskit/aqua/utils/run_circuits.py +++ b/qiskit/aqua/utils/run_circuits.py @@ -26,11 +26,13 @@ from qiskit.providers.jobstatus import JOB_FINAL_STATES from qiskit.providers.basicaer import BasicAerJob from qiskit.qobj import QasmQobj +from qiskit.exceptions import QiskitError from qiskit.aqua.aqua_error import AquaError from qiskit.aqua.utils.backend_utils import (is_aer_provider, is_basicaer_provider, is_simulator_backend, - is_local_backend) + is_local_backend, + is_ibmq_provider) MAX_CIRCUITS_PER_JOB = os.environ.get('QISKIT_AQUA_MAX_CIRCUITS_PER_JOB', None) MAX_GATES_PER_JOB = os.environ.get('QISKIT_AQUA_MAX_GATES_PER_JOB', None) @@ -134,15 +136,24 @@ def _maybe_split_qobj_by_gates(qobjs, qobj): def _safe_submit_qobj(qobj, backend, backend_options, noise_config, skip_qobj_validation): # assure get job ids while True: - job = run_on_backend(backend, qobj, backend_options=backend_options, - noise_config=noise_config, - skip_qobj_validation=skip_qobj_validation) try: + job = run_on_backend(backend, qobj, backend_options=backend_options, + noise_config=noise_config, + skip_qobj_validation=skip_qobj_validation) job_id = job.job_id() break - except JobError as ex: - logger.warning("FAILURE: Can not get job id, Resubmit the qobj to get job id." + except QiskitError as ex: + logger.warning("FAILURE: Can not get job id, Resubmit the qobj to get job id. " "Terra job error: %s ", ex) + if is_ibmq_provider(backend) and 'Error code: 3458' in str(ex): + # TODO Use IBMQBackendJobLimitError when new IBM Q provider is released. + oldest_running = backend.jobs(limit=1, descending=False, + status=['QUEUED', 'VALIDATING', 'RUNNING']) + if oldest_running: + oldest_running = oldest_running[0] + logger.warning("Job limit reached, waiting for job %s to finish " + "before submitting the next one.", oldest_running.job_id()) + oldest_running.wait_for_final_state(timeout=300) except Exception as ex: # pylint: disable=broad-except logger.warning("FAILURE: Can not get job id, Resubmit the qobj to get job id." "Error: %s ", ex) diff --git a/requirements.txt b/requirements.txt index 9d2dd7eb30..74bf8c0966 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -qiskit-terra>=0.11.0 +qiskit-terra>=0.13.0 qiskit-ignis>=0.2.0 scipy>=1.0 sympy>=1.3 diff --git a/setup.py b/setup.py index 4cbf228553..15f1b2f340 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ Qiskit Finance, Qiskit Machine Learning and Qiskit Optimization to experiment with real-world applications to quantum computing.""" requirements = [ - "qiskit-terra>=0.11.0", + "qiskit-terra>=0.13.0", "qiskit-ignis>=0.2.0", "scipy>=1.0", "sympy>=1.3",