-
Notifications
You must be signed in to change notification settings - Fork 94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Make --stopcp=reload
use [scheduling]stop after cycle point
instead of the final cycle point
#4543
Changes from all commits
32ed7d6
f4b2ab4
6c27190
986ae87
b366e13
cb851c4
433072d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -185,6 +185,7 @@ class Scheduler: | |||||||||||||||||||||||||||||||||||||||
ext_trigger_queue: Queue | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
# configuration | ||||||||||||||||||||||||||||||||||||||||
config: WorkflowConfig # flow config | ||||||||||||||||||||||||||||||||||||||||
options: Values | ||||||||||||||||||||||||||||||||||||||||
cylc_config: DictTree # [scheduler] config | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
@@ -195,7 +196,6 @@ class Scheduler: | |||||||||||||||||||||||||||||||||||||||
bad_hosts: Optional[Set[str]] = None | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
# configuration | ||||||||||||||||||||||||||||||||||||||||
config: Optional[WorkflowConfig] = None # flow config | ||||||||||||||||||||||||||||||||||||||||
flow_file: Optional[str] = None | ||||||||||||||||||||||||||||||||||||||||
flow_file_update_time: Optional[float] = None | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
|
@@ -480,7 +480,7 @@ async def configure(self): | |||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||
self._load_pool_from_point() | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
self.process_cylc_stop_point() | ||||||||||||||||||||||||||||||||||||||||
self.process_stop_cycle_point() | ||||||||||||||||||||||||||||||||||||||||
self.profiler.log_memory("scheduler.py: after load_tasks") | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
self.workflow_db_mgr.put_workflow_params(self) | ||||||||||||||||||||||||||||||||||||||||
|
@@ -678,17 +678,14 @@ def _load_pool_from_point(self): | |||||||||||||||||||||||||||||||||||||||
released from runhead.) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
if self.config.start_point is not None: | ||||||||||||||||||||||||||||||||||||||||
start_type = "Warm" if self.options.startcp else "Cold" | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"{start_type} start from {self.config.start_point}") | ||||||||||||||||||||||||||||||||||||||||
LOG.info( | ||||||||||||||||||||||||||||||||||||||||
f"{'warm' if self.options.startcp else 'cold'} start from" | ||||||||||||||||||||||||||||||||||||||||
f"{self.config.start_point}.") | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
flow_num = self.flow_mgr.get_new_flow( | ||||||||||||||||||||||||||||||||||||||||
f"original flow from {self.config.start_point}" | ||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||
for name in self.config.get_task_name_list(): | ||||||||||||||||||||||||||||||||||||||||
if self.config.start_point is None: | ||||||||||||||||||||||||||||||||||||||||
# No start cycle point at which to load cycling tasks. | ||||||||||||||||||||||||||||||||||||||||
continue | ||||||||||||||||||||||||||||||||||||||||
tdef = self.config.get_taskdef(name) | ||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||
point = sorted([ | ||||||||||||||||||||||||||||||||||||||||
|
@@ -708,9 +705,6 @@ def _load_pool_from_point(self): | |||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def _load_pool_from_db(self): | ||||||||||||||||||||||||||||||||||||||||
"""Load task pool from DB, for a restart.""" | ||||||||||||||||||||||||||||||||||||||||
if self.options.startcp: | ||||||||||||||||||||||||||||||||||||||||
self.config.start_point = TaskID.get_standardised_point( | ||||||||||||||||||||||||||||||||||||||||
self.options.startcp) | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
-711
to
-713
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems to be unnecessary as duplication of Lines 669 to 687 in b366e13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Confirm looks reasonable. |
||||||||||||||||||||||||||||||||||||||||
self.workflow_db_mgr.pri_dao.select_broadcast_states( | ||||||||||||||||||||||||||||||||||||||||
self.broadcast_mgr.load_db_broadcast_states) | ||||||||||||||||||||||||||||||||||||||||
self.workflow_db_mgr.pri_dao.select_task_job_run_times( | ||||||||||||||||||||||||||||||||||||||||
|
@@ -1125,10 +1119,6 @@ def load_flow_file(self, is_reload=False): | |||||||||||||||||||||||||||||||||||||||
handle.write(b"# cylc-version: %s\n" % CYLC_VERSION.encode()) | ||||||||||||||||||||||||||||||||||||||||
printcfg(self.config.cfg, none_str=None, handle=handle) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if not self.config.initial_point and not self.is_restart: | ||||||||||||||||||||||||||||||||||||||||
LOG.warning('No initial cycle point provided - no cycling tasks ' | ||||||||||||||||||||||||||||||||||||||||
'will be loaded.') | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
Comment on lines
-1128
to
-1131
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Again pretty sure this condition is no longer possible ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Legit. |
||||||||||||||||||||||||||||||||||||||||
# Pass static cylc and workflow variables to job script generation code | ||||||||||||||||||||||||||||||||||||||||
self.task_job_mgr.job_file_writer.set_workflow_env({ | ||||||||||||||||||||||||||||||||||||||||
**verbosity_to_env(cylc.flow.flags.verbosity), | ||||||||||||||||||||||||||||||||||||||||
|
@@ -1159,23 +1149,17 @@ def _load_workflow_params(self, row_idx, row): | |||||||||||||||||||||||||||||||||||||||
LOG.info('LOADING workflow parameters') | ||||||||||||||||||||||||||||||||||||||||
key, value = row | ||||||||||||||||||||||||||||||||||||||||
if key in self.workflow_db_mgr.KEY_INITIAL_CYCLE_POINT_COMPATS: | ||||||||||||||||||||||||||||||||||||||||
if self.is_restart and self.options.icp == 'reload': | ||||||||||||||||||||||||||||||||||||||||
LOG.debug(f"- initial point = {value} (ignored)") | ||||||||||||||||||||||||||||||||||||||||
elif self.options.icp is None: | ||||||||||||||||||||||||||||||||||||||||
self.options.icp = value | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ initial point = {value}") | ||||||||||||||||||||||||||||||||||||||||
self.options.icp = value | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ initial point = {value}") | ||||||||||||||||||||||||||||||||||||||||
elif key in self.workflow_db_mgr.KEY_START_CYCLE_POINT_COMPATS: | ||||||||||||||||||||||||||||||||||||||||
Comment on lines
-1162
to
1154
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since #4313, initial and start cycle points cannot change on restart. But still need to set |
||||||||||||||||||||||||||||||||||||||||
if self.is_restart and self.options.startcp == 'reload': | ||||||||||||||||||||||||||||||||||||||||
LOG.debug(f"- start point = {value} (ignored)") | ||||||||||||||||||||||||||||||||||||||||
elif self.options.startcp is None: | ||||||||||||||||||||||||||||||||||||||||
self.options.startcp = value | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ start point = {value}") | ||||||||||||||||||||||||||||||||||||||||
self.options.startcp = value | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ start point = {value}") | ||||||||||||||||||||||||||||||||||||||||
elif key in self.workflow_db_mgr.KEY_FINAL_CYCLE_POINT_COMPATS: | ||||||||||||||||||||||||||||||||||||||||
if self.is_restart and self.options.fcp == 'reload': | ||||||||||||||||||||||||||||||||||||||||
LOG.debug(f"- override final point = {value} (ignored)") | ||||||||||||||||||||||||||||||||||||||||
LOG.debug(f"- final point = {value} (ignored)") | ||||||||||||||||||||||||||||||||||||||||
wxtim marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||
elif self.options.fcp is None: | ||||||||||||||||||||||||||||||||||||||||
self.options.fcp = value | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ override final point = {value}") | ||||||||||||||||||||||||||||||||||||||||
LOG.info(f"+ final point = {value}") | ||||||||||||||||||||||||||||||||||||||||
elif key == self.workflow_db_mgr.KEY_STOP_CYCLE_POINT: | ||||||||||||||||||||||||||||||||||||||||
if self.is_restart and self.options.stopcp == 'reload': | ||||||||||||||||||||||||||||||||||||||||
LOG.debug(f"- stop point = {value} (ignored)") | ||||||||||||||||||||||||||||||||||||||||
|
@@ -1929,29 +1913,27 @@ def _check_startup_opts(self) -> None: | |||||||||||||||||||||||||||||||||||||||
f"option --{opt}=reload is only valid for restart" | ||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def process_cylc_stop_point(self): | ||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
Set stop point. | ||||||||||||||||||||||||||||||||||||||||
def process_stop_cycle_point(self) -> None: | ||||||||||||||||||||||||||||||||||||||||
"""Set stop after cycle point. | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
In decreasing priority, stop cycle point (``stopcp``) is set: | ||||||||||||||||||||||||||||||||||||||||
* From the final point for ``cylc play --stopcp=reload``. | ||||||||||||||||||||||||||||||||||||||||
* From the command line (``cylc play --stopcp=XYZ``). | ||||||||||||||||||||||||||||||||||||||||
* From the database. | ||||||||||||||||||||||||||||||||||||||||
* From the flow.cylc file (``[scheduling]stop after cycle point``). | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
However, if ``--stopcp=reload`` on the command line during restart, | ||||||||||||||||||||||||||||||||||||||||
the ``[scheduling]stop after cycle point`` value is used. | ||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
stoppoint = None | ||||||||||||||||||||||||||||||||||||||||
if self.is_restart and self.options.stopcp == 'reload': | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.config.final_point | ||||||||||||||||||||||||||||||||||||||||
elif self.options.stopcp: | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.options.stopcp | ||||||||||||||||||||||||||||||||||||||||
# Tests whether pool has stopcp from database on restart. | ||||||||||||||||||||||||||||||||||||||||
elif ( | ||||||||||||||||||||||||||||||||||||||||
self.pool.stop_point and | ||||||||||||||||||||||||||||||||||||||||
self.pool.stop_point != self.config.final_point | ||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.pool.stop_point | ||||||||||||||||||||||||||||||||||||||||
elif 'stop after cycle point' in self.config.cfg['scheduling']: | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.config.cfg['scheduling']['stop after cycle point'] | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.config.cfg['scheduling'].get('stop after cycle point') | ||||||||||||||||||||||||||||||||||||||||
if self.options.stopcp != 'reload': | ||||||||||||||||||||||||||||||||||||||||
if self.options.stopcp: | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.options.stopcp | ||||||||||||||||||||||||||||||||||||||||
# Tests whether pool has stopcp from database on restart. | ||||||||||||||||||||||||||||||||||||||||
elif ( | ||||||||||||||||||||||||||||||||||||||||
self.pool.stop_point and | ||||||||||||||||||||||||||||||||||||||||
self.pool.stop_point != self.config.final_point | ||||||||||||||||||||||||||||||||||||||||
): | ||||||||||||||||||||||||||||||||||||||||
stoppoint = self.pool.stop_point | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
if stoppoint is not None: | ||||||||||||||||||||||||||||||||||||||||
self.options.stopcp = str(stoppoint) | ||||||||||||||||||||||||||||||||||||||||
|
@@ -1970,7 +1952,7 @@ async def handle_exception(self, exc: Exception) -> NoReturn: | |||||||||||||||||||||||||||||||||||||||
await self.shutdown(exc) | ||||||||||||||||||||||||||||||||||||||||
raise exc from None | ||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||
def validate_finalcp(self): | ||||||||||||||||||||||||||||||||||||||||
def validate_finalcp(self) -> None: | ||||||||||||||||||||||||||||||||||||||||
"""Warn if Stop Cycle point is on or after the final cycle point | ||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||
if self.config.final_point is None: | ||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,9 +20,7 @@ | |
|
||
. "$(dirname "$0")/test_header" | ||
|
||
set_test_number 14 | ||
|
||
# integer cycling | ||
set_test_number 7 | ||
|
||
init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' | ||
[scheduler] | ||
|
@@ -31,7 +29,7 @@ init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' | |
initial cycle point = 1 | ||
final cycle point = 2 | ||
cycling mode = integer | ||
[[dependencies]] | ||
[[graph]] | ||
P1 = foo | ||
__FLOW_CONFIG__ | ||
|
||
|
@@ -53,35 +51,3 @@ for SCP in 1 2 3; do | |
done | ||
|
||
purge | ||
|
||
# Gregorian Cycling | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No need to check this for different cycling types; it should be the responsibility of the |
||
|
||
init_workflow "${TEST_NAME_BASE}" <<'__FLOW_CONFIG__' | ||
[scheduler] | ||
allow implicit tasks = True | ||
[scheduling] | ||
initial cycle point = 1348 | ||
final cycle point = 1349 | ||
[[dependencies]] | ||
P1Y = foo | ||
__FLOW_CONFIG__ | ||
|
||
TEST_NAME="${TEST_NAME_BASE}-validate" | ||
run_ok "${TEST_NAME}" cylc validate "${WORKFLOW_NAME}" | ||
|
||
|
||
for SCP in 1348 1349 1350; do | ||
TEST_NAME="${TEST_NAME_BASE}-play-gregorian-scp=${SCP}" | ||
workflow_run_ok "${TEST_NAME}" cylc play "${WORKFLOW_NAME}" \ | ||
--no-detach --stopcp="${SCP}" | ||
|
||
if [[ "${SCP}" -lt 1350 ]]; then | ||
grep_ok "Stop cycle point '.*'.*after.*final cycle point '.*'" \ | ||
"${RUN_DIR}/${WORKFLOW_NAME}/log/workflow/log" "-v" | ||
else | ||
grep_ok "Stop cycle point '.*'.*after.*final cycle point '.*'" \ | ||
"${RUN_DIR}/${WORKFLOW_NAME}/log/workflow/log" | ||
fi | ||
done | ||
|
||
purge |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pretty sure this condition is no longer possible. And L691 showing as never hit in code coverage: https://app.codecov.io/gh/cylc/cylc-flow/blob/master/cylc/flow/scheduler.py
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Checked in practice. Confirmed I can't get it to be true.