//-------------------------------------------------------------------------------------------------// private LabExperimentStatus GetLabExperimentStatus(int experimentId, string sbName) { const string STRLOG_MethodName = "GetLabExperimentStatus"; Logfile.WriteCalled(STRLOG_ClassName, STRLOG_MethodName); LabExperimentStatus labExperimentStatus = null; // // Check experiment status of each experiment engine // for (int i = 0; i < this.appData.farmSize; i++) { LabExperimentEngine labExperimentEngine = this.appData.labExperimentEngines[i]; labExperimentStatus = labExperimentEngine.GetLabExperimentStatus(experimentId, sbName); if ((StatusCodes)labExperimentStatus.statusReport.statusCode != StatusCodes.Unknown) { // This engine is running the experiment break; } } Logfile.WriteCompleted(STRLOG_ClassName, STRLOG_MethodName); return(labExperimentStatus); }
//-------------------------------------------------------------------------------------------------// public WaitEstimate GetEffectiveQueueLength(string userGroup, int priorityHint) { WaitEstimate waitEstimate = null; lock (this.managerLock) { // // NOTE: This implementation does not consider the group or priority of the user // // Get queue wait estimate waitEstimate = this.experimentQueue.GetWaitEstimate(); // Add in time remaining before the next experiment can run LabExperimentStatus labExperimentStatus = this.GetLabExperimentStatus(0, null); waitEstimate.estWait += labExperimentStatus.statusReport.estRemainingRuntime; } return(waitEstimate); }
//-------------------------------------------------------------------------------------------------// public LabExperimentStatus GetLabExperimentStatus(int experimentId, string sbName) { const string STRLOG_MethodName = "GetLabExperimentStatus"; string logMessage = STRLOG_experimentId + experimentId.ToString() + Logfile.STRLOG_Spacer + STRLOG_sbName + Logfile.STRLOG_Quote + sbName + Logfile.STRLOG_Quote + Logfile.STRLOG_Spacer + STRLOG_unitId + unitId.ToString(); Logfile.WriteCalled(STRLOG_ClassName, STRLOG_MethodName, logMessage); LabExperimentStatus labExperimentStatus = new LabExperimentStatus( new ExperimentStatus((int)StatusCodes.Unknown)); int remainingRuntime = 0; lock (this.statusLock) { // // Check if the specified experiment is running on this engine // if ((this.labExperimentInfo != null) && (labExperimentInfo.experimentInfo.experimentId == experimentId) && (labExperimentInfo.experimentInfo.sbName.Equals(sbName, StringComparison.OrdinalIgnoreCase) == true)) { // // Update the status code // StatusCodes status = this.labExperimentInfo.experimentInfo.status; labExperimentStatus.statusReport.statusCode = (int)status; if (status == StatusCodes.Running) { // // The specified experiment is currently running, fill in information // labExperimentStatus.statusReport.estRuntime = (double)this.labExperimentInfo.experimentInfo.estExecutionTime; // Calculate time already passed for the experiment remainingRuntime = (int)((TimeSpan)(DateTime.Now - this.labExperimentInfo.startDateTime)).TotalSeconds; // Now calculate the time remaining for the experiment remainingRuntime = this.labExperimentInfo.experimentInfo.estExecutionTime - remainingRuntime; // // Estimated runtime may have been underestimated. Don't say remaining runtime is zero while // the experiment is still running. // if (remainingRuntime < 1) { remainingRuntime = 1; } labExperimentStatus.statusReport.estRemainingRuntime = (double)remainingRuntime; logMessage = STRLOG_estRuntime + labExperimentStatus.statusReport.estRuntime.ToString() + Logfile.STRLOG_Spacer + STRLOG_remainingRuntime + labExperimentStatus.statusReport.estRemainingRuntime.ToString(); } } else { // Unkown experiment labExperimentStatus = new LabExperimentStatus(new ExperimentStatus((int)StatusCodes.Unknown)); } } logMessage = STRLOG_statusCode + ((StatusCodes)labExperimentStatus.statusReport.statusCode).ToString() + Logfile.STRLOG_Spacer + logMessage; Logfile.WriteCompleted(STRLOG_ClassName, STRLOG_MethodName, logMessage); return(labExperimentStatus); }
//-------------------------------------------------------------------------------------------------// public LabExperimentStatus GetExperimentStatus(int experimentId, string sbName) { const string STRLOG_MethodName = "GetExperimentStatus"; LabExperimentStatus labExperimentStatus = null; lock (this.managerLock) { string logMessage = STRLOG_experimentId + experimentId.ToString() + Logfile.STRLOG_Spacer + STRLOG_sbName + Logfile.STRLOG_Quote + sbName + Logfile.STRLOG_Quote; Logfile.WriteCalled(STRLOG_ClassName, STRLOG_MethodName, logMessage); labExperimentStatus = new LabExperimentStatus(); logMessage = string.Empty; // // Get the status of the experiment from the queue table // StatusCodes status = this.experimentQueue.GetExperimentStatus(experimentId, sbName); if (status == StatusCodes.Unknown) { // // The experiment never existed // } else if (status == StatusCodes.Waiting) { // // Experiment is waiting on the queue // QueuedExperimentInfo queuedExperimentInfo = this.experimentQueue.GetQueuedExperimentInfo(experimentId, sbName); if (queuedExperimentInfo != null && queuedExperimentInfo.position > 0) { // Set the experiment status labExperimentStatus.statusReport.statusCode = (int)queuedExperimentInfo.status; // Get the queue position and wait time labExperimentStatus.statusReport.wait = new WaitEstimate(queuedExperimentInfo.position, queuedExperimentInfo.waitTime); // Add in time for any currently running experiment ???? labExperimentStatus.statusReport.wait.estWait += GetMinRemainingRuntime(); // Get the time it takes to run the experiment labExperimentStatus.statusReport.estRuntime = queuedExperimentInfo.estExecutionTime; labExperimentStatus.statusReport.estRemainingRuntime = queuedExperimentInfo.estExecutionTime; logMessage = Logfile.STRLOG_Spacer + STRLOG_QueuePosition + labExperimentStatus.statusReport.wait.effectiveQueueLength.ToString() + Logfile.STRLOG_Spacer + STRLOG_QueueWaitTime + labExperimentStatus.statusReport.wait.estWait.ToString() + Logfile.STRLOG_Spacer + STRLOG_estRuntime + labExperimentStatus.statusReport.estRuntime.ToString() + Logfile.STRLOG_Spacer + STRLOG_remainingRuntime + labExperimentStatus.statusReport.estRemainingRuntime.ToString(); } } else if (status == StatusCodes.Running) { // // Experiment is currently running // labExperimentStatus = this.GetLabExperimentStatus(experimentId, sbName); } else { // // Experiment has completed, cancelled or failed // ResultReport resultReport = this.experimentResults.Load(experimentId, sbName); // Set the experiment status labExperimentStatus.statusReport.statusCode = resultReport.statusCode; } logMessage = STRLOG_statusCode + ((StatusCodes)labExperimentStatus.statusReport.statusCode).ToString() + Logfile.STRLOG_Spacer + logMessage; Logfile.WriteCompleted(STRLOG_ClassName, STRLOG_MethodName, logMessage); } return(labExperimentStatus); }