Skip to content

Commit efb2240

Browse files
committed
Propagate and show exec_hosts in run_dialog if present
1 parent 8ff7299 commit efb2240

File tree

9 files changed

+36
-4
lines changed

9 files changed

+36
-4
lines changed

src/_ert/events.py

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ class RealizationBaseEvent(BaseEvent):
110110
real: str
111111
ensemble: Union[str, None] = None
112112
queue_event_type: Union[str, None] = None
113+
exec_hosts: Union[str, None] = None
113114

114115

115116
class RealizationPending(RealizationBaseEvent):

src/ert/ensemble_evaluator/snapshot.py

+6
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ def update_realization(
252252
status: str,
253253
start_time: Optional[datetime] = None,
254254
end_time: Optional[datetime] = None,
255+
exec_hosts: Optional[str] = None,
255256
callback_status_message: Optional[str] = None,
256257
) -> "EnsembleSnapshot":
257258
self._realization_snapshots[real_id].update(
@@ -260,6 +261,7 @@ def update_realization(
260261
status=status,
261262
start_time=start_time,
262263
end_time=end_time,
264+
exec_hosts=exec_hosts,
263265
callback_status_message=callback_status_message,
264266
)
265267
)
@@ -279,6 +281,7 @@ def update_from_event(
279281
status = _FM_TYPE_EVENT_TO_STATUS[type(event)]
280282
start_time = None
281283
end_time = None
284+
exec_hosts = event.exec_hosts
282285
callback_status_message = None
283286

284287
if e_type is RealizationRunning:
@@ -296,6 +299,7 @@ def update_from_event(
296299
status,
297300
start_time,
298301
end_time,
302+
exec_hosts,
299303
callback_status_message,
300304
)
301305

@@ -397,6 +401,7 @@ class RealizationSnapshot(TypedDict, total=False):
397401
active: Optional[bool]
398402
start_time: Optional[datetime]
399403
end_time: Optional[datetime]
404+
exec_hosts: Optional[str]
400405
fm_steps: Dict[str, FMStepSnapshot]
401406
callback_status_message: Optional[str]
402407

@@ -409,6 +414,7 @@ def _realization_dict_to_realization_snapshot(
409414
active=source.get("active"),
410415
start_time=source.get("start_time"),
411416
end_time=source.get("end_time"),
417+
exec_hosts=source.get("exec_hosts"),
412418
callback_status_message=source.get("callback_status_message"),
413419
fm_steps=source.get("fm_steps", {}),
414420
)

src/ert/gui/model/node.py

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class RealNodeData:
7474
real_status_color: Optional[QColor] = None
7575
current_memory_usage: Optional[int] = None
7676
max_memory_usage: Optional[int] = None
77+
exec_hosts: Optional[str] = None
7778
stderr: Optional[str] = None
7879
callback_status_message: Optional[str] = None
7980

src/ert/gui/model/snapshot.py

+2
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ def _update_snapshot(self, snapshot: EnsembleSnapshot, iter_: str) -> None:
168168
data = real_node.data
169169
if real_status := real.get("status"):
170170
data.status = real_status
171+
if real_exec_hosts := real.get("exec_hosts"):
172+
data.exec_hosts = real_exec_hosts
171173
for real_fm_step_id, color in (
172174
metadata["aggr_fm_step_status_colors"].get(real_id, {}).items()
173175
):

src/ert/gui/simulation/run_dialog.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,21 @@ def on_snapshot_new_iteration(
335335
def _select_real(self, index: QModelIndex) -> None:
336336
real = index.row()
337337
iter_ = index.model().get_iter() # type: ignore
338+
exec_hosts = None
339+
340+
iter_node = self._snapshot_model.root.children.get(str(iter_), None)
341+
if iter_node:
342+
real_node = iter_node.children.get(str(real), None)
343+
if real_node:
344+
exec_hosts = real_node.data.exec_hosts
345+
338346
self._fm_step_overview.set_realization(iter_, real)
339-
self._fm_step_label.setText(
347+
text = (
340348
f"Realization id {index.data(RealIens)} in iteration {index.data(IterNum)}"
341349
)
350+
if exec_hosts and exec_hosts != "-":
351+
text += f", assigned to host: {exec_hosts}"
352+
self._fm_step_label.setText(text)
342353

343354
def closeEvent(self, a0: Optional[QCloseEvent]) -> None:
344355
if not self._notifier.is_simulation_running:

src/ert/scheduler/event.py

+2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
@dataclass
88
class StartedEvent:
99
iens: int
10+
exec_hosts: str = ""
1011

1112

1213
@dataclass
1314
class FinishedEvent:
1415
iens: int
1516
returncode: int
17+
exec_hosts: str = ""
1618

1719

1820
Event = Union[StartedEvent, FinishedEvent]

src/ert/scheduler/job.py

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def __init__(self, scheduler: Scheduler, real: Realization) -> None:
6262
self.real = real
6363
self.state = JobState.WAITING
6464
self.started = asyncio.Event()
65+
self.exec_hosts: str = "-"
6566
self.returncode: asyncio.Future[int] = asyncio.Future()
6667
self._aborted = False
6768
self._scheduler: Scheduler = scheduler
@@ -263,6 +264,7 @@ async def _send(self, state: JobState) -> None:
263264
"event_type": _queue_jobstate_event_type[state],
264265
"queue_event_type": state,
265266
"real": str(self.iens),
267+
"exec_hosts": self.exec_hosts,
266268
}
267269
self.state = state
268270
if state == JobState.FAILED:

src/ert/scheduler/lsf_driver.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,15 @@ async def _process_job_update(self, job_id: str, new_state: AnyJob) -> None:
500500
event: Optional[Event] = None
501501
if isinstance(new_state, RunningJob):
502502
logger.debug(f"Realization {iens} is running")
503-
event = StartedEvent(iens=iens)
503+
event = StartedEvent(iens=iens, exec_hosts=self._jobs[job_id].exec_hosts)
504504
elif isinstance(new_state, FinishedJobFailure):
505505
logger.info(f"Realization {iens} (LSF-id: {self._iens2jobid[iens]}) failed")
506506
exit_code = await self._get_exit_code(job_id)
507-
event = FinishedEvent(iens=iens, returncode=exit_code)
507+
event = FinishedEvent(
508+
iens=iens,
509+
returncode=exit_code,
510+
exec_hosts=self._jobs[job_id].exec_hosts,
511+
)
508512
elif isinstance(new_state, FinishedJobSuccess):
509513
logger.info(
510514
f"Realization {iens} (LSF-id: {self._iens2jobid[iens]}) succeeded"

src/ert/scheduler/scheduler.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from ert.constant_filenames import CERT_FILE
2929

3030
from .driver import Driver
31-
from .event import FinishedEvent
31+
from .event import FinishedEvent, StartedEvent
3232
from .job import Job, JobState
3333

3434
if TYPE_CHECKING:
@@ -308,6 +308,9 @@ async def _process_event_queue(self) -> None:
308308
# Any event implies the job has at least started
309309
job.started.set()
310310

311+
if isinstance(event, (StartedEvent, FinishedEvent)) and event.exec_hosts:
312+
self._jobs[event.iens].exec_hosts = event.exec_hosts
313+
311314
if (
312315
isinstance(event, FinishedEvent)
313316
and not self._cancelled

0 commit comments

Comments
 (0)