@@ -53,6 +53,7 @@ export class RunModeService {
5353
5454 this . _logger = LogManager . getLogger ( `${ process . env . npm_config_log_label ?? 'qcg' } /run-mode-service` ) ;
5555 this . _listenToEvents ( ) ;
56+ this . _fetchOnGoingRunsAtStart ( ) ;
5657 }
5758
5859 /**
@@ -115,6 +116,22 @@ export class RunModeService {
115116 this . _eventEmitter . on ( EmitterKeys . RUN_TRACK , ( runEvent ) => this . _onRunTrackEvent ( runEvent ) ) ;
116117 }
117118
119+ /**
120+ * Fetches the already ongoing runs from Bookkeeping service, becaue Kafka only sends an event at START of run.
121+ * @returns {Promise<void> }
122+ */
123+ async _fetchOnGoingRunsAtStart ( ) {
124+ const ongoingRuns = await this . _bookkeepingService . retrieveOngoingRuns ( ) ;
125+ if ( ! ongoingRuns || ongoingRuns . length === 0 ) {
126+ this . _logger . infoMessage ( 'No ongoing runs detected at server start' ) ;
127+ return ;
128+ }
129+
130+ const runNumbers = ongoingRuns . map ( ( { runNumber } ) => runNumber ) ;
131+ const tasks = runNumbers . map ( async ( runNumber ) => await this . _initializeRunData ( runNumber ) ) ;
132+ await Promise . all ( tasks ) ;
133+ }
134+
118135 /**
119136 * Handles run track events emitted by the event emitter.
120137 * Updates the ongoing runs cache based on the transition type.
@@ -125,15 +142,7 @@ export class RunModeService {
125142 */
126143 async _onRunTrackEvent ( { runNumber, transition } ) {
127144 if ( transition === Transition . START_ACTIVITY ) {
128- let rawPaths = [ ] ;
129- try {
130- rawPaths = await this . _dataService . getObjectsLatestVersionList ( {
131- filters : { RunNumber : runNumber } ,
132- } ) ;
133- } catch ( error ) {
134- this . _logger . errorMessage ( `Error fetching initial paths for run ${ runNumber } : ${ error . message || error } ` ) ;
135- }
136- this . _ongoingRuns . set ( runNumber , rawPaths ) ;
145+ await this . _initializeRunData ( runNumber ) ;
137146
138147 const wsMessage = new WebSocketMessage ( ) ;
139148 wsMessage . command = `${ EmitterKeys . RUN_TRACK } :${ Transition . START_ACTIVITY } ` ;
@@ -146,6 +155,23 @@ export class RunModeService {
146155 }
147156 }
148157
158+ /**
159+ * Fetches the latest object versions for each run and populates the local `ongoingRuns` map.
160+ * @param {number } runNumber - The run number associated with the event.
161+ * @returns {Promise<void> }
162+ */
163+ async _initializeRunData ( runNumber ) {
164+ let rawPaths = [ ] ;
165+ try {
166+ rawPaths = await this . _dataService . getObjectsLatestVersionList ( {
167+ filters : { RunNumber : runNumber } ,
168+ } ) ;
169+ } catch ( error ) {
170+ this . _logger . errorMessage ( `Error fetching initial paths for run ${ runNumber } : ${ error . message || error } ` ) ;
171+ }
172+ this . _ongoingRuns . set ( runNumber , rawPaths ) ;
173+ }
174+
149175 /**
150176 * Returns the last time the ongoing runs cache was refreshed.
151177 * @returns {number } - Timestamp of the last refresh. (ms)
0 commit comments