private bool SendResultToJobServer(Job j, out bool errorInReadingOutputFile) { const int HEADER_FLAGS_FIELD_SIZE = 1; // 1 Byte const int HEADER_PAYLOAD_SIZE_FIELD_SIZE = 4; // 4 Byte const int HEADER_WORKER_ID_FIELD_SIZE = 2; // 2 Byte const int HEADER_JOB_ID_FIELD_SIZE = 8; // 8 Byte const int HEADER_PAYLOAD_START_INDEX = HEADER_FLAGS_FIELD_SIZE + HEADER_PAYLOAD_SIZE_FIELD_SIZE + HEADER_WORKER_ID_FIELD_SIZE + HEADER_JOB_ID_FIELD_SIZE; byte[] message = null; long messageSize = 0; bool jobOutputFileReadSuccessfully = true; uint jobOutputFileLength = 0; #region Read Job's output file System.IO.FileStream fs = null; ErrorInReadingJobOutputFile fileReadErrLog = null; try { // Open Job's result file for reading fs = System.IO.File.OpenRead(j.OutputFileName); // allocate memory for message jobOutputFileLength = (uint)fs.Length; messageSize = HEADER_FLAGS_FIELD_SIZE + HEADER_PAYLOAD_SIZE_FIELD_SIZE + HEADER_WORKER_ID_FIELD_SIZE + HEADER_JOB_ID_FIELD_SIZE + jobOutputFileLength; message = new byte[messageSize]; // // Read file and close it fs.Read(message, HEADER_PAYLOAD_START_INDEX, (int)jobOutputFileLength); errorInReadingOutputFile = false; } catch (System.IO.FileNotFoundException fileNotFoundExcp) { jobOutputFileReadSuccessfully = false; fileReadErrLog = new WorkerAgent.ErrorInReadingJobOutputFile(); fileReadErrLog.Job = j; fileReadErrLog.Message = "Job's output file not found."; fileReadErrLog.ErrorMessage = fileNotFoundExcp.Message; errorInReadingOutputFile = true; EventExtensions.Raise(NewLogItem, new[] { fileReadErrLog }); } catch (Exception e) { jobOutputFileReadSuccessfully = false; fileReadErrLog = new WorkerAgent.ErrorInReadingJobOutputFile(); fileReadErrLog.Job = j; fileReadErrLog.Message = "Error in reading job's output file."; fileReadErrLog.ErrorMessage = e.Message; errorInReadingOutputFile = true; EventExtensions.Raise(NewLogItem, new[] { fileReadErrLog }); } finally { if (fs != null) { fs.Close(); } } #endregion if (!jobOutputFileReadSuccessfully) { return(false); } #region Send job result(message) to the job server // Set Header's fields of the message byte[] payloadSizeBytes = new byte[4]; // UInt32 byte[] workerIDBytes = new byte[2]; // UInt16 byte[] jobIDBytes = new byte[8]; // UInt64 // Flags message[0] = 0; // This field is reserved for future use. // Payload Size, UInt32 payloadSizeBytes = BitConverter.GetBytes(jobOutputFileLength); for (int i = 0; i < 4; i++) { message[i + HEADER_FLAGS_FIELD_SIZE] = payloadSizeBytes[i]; } // Worker ID, UInt16 workerIDBytes = BitConverter.GetBytes(ID); for (int i = 0; i < 2; i++) { message[i + HEADER_FLAGS_FIELD_SIZE + HEADER_PAYLOAD_SIZE_FIELD_SIZE] = workerIDBytes[i]; } // JobID, UInt64 jobIDBytes = BitConverter.GetBytes(j.ID); for (int i = 0; i < 8; i++) { message[i + HEADER_FLAGS_FIELD_SIZE + HEADER_PAYLOAD_SIZE_FIELD_SIZE + HEADER_WORKER_ID_FIELD_SIZE] = jobIDBytes[i]; } // Try "AttemptsToSendResult" times to send the message bool successfullySent = false; TcpClient client = new TcpClient(); NetworkStream netStream = null; for (int i = 1; (i <= AttemptsToSendResult) && (!successfullySent); i++) { try { client.Connect(new IPEndPoint(JobServerIPAddress, JobServerDataChannelPortNumber)); netStream = client.GetStream(); netStream.Write(message, 0, (int)messageSize); successfullySent = true; // Generate log WorkerAgent.JobResultSentLog log = new JobResultSentLog(); log.Job = j; log.Message = "Job's output file sent to the job server."; EventExtensions.Raise(NewLogItem, new[] { log }); } catch (Exception e) { successfullySent = false; WorkerAgent.ErrorInConnectingToJobServerLog log = new ErrorInConnectingToJobServerLog(); log.Message = "[ Attempt " + (i).ToString() + " ] Could not connect to the job server to transfer the results."; log.ErrorMessage = e.Message; EventExtensions.Raise(NewLogItem, new[] { log }); } if ((!successfullySent) && (i < AttemptsToSendResult)) { // if an error has occured in sending, Wait 1 second and then try to send again System.Threading.Thread.Sleep(3000); } } if (netStream != null) { netStream.Close(); } client.Close(); #endregion return(successfullySent); }
private void AddLogToTextBox(WorkerAgent.Log log) { Color timeColor = Color.Gray; Color messageColor = Color.White; Color errorMessageColor = Color.Red; const int INDENT_L1 = 30; // Level 1 indent size = 30; AppendText(DateTime.Now.ToLongTimeString() + " ", timeColor); if (log is WorkerAgent.JobsRecivedLog) { #region JobsRecivedLog WorkerAgent.JobsRecivedLog l = (WorkerAgent.JobsRecivedLog)log; AppendText(l.Jobs.Length.ToString() + " job(s) recived:", messageColor); rtbLogs.AppendText(Environment.NewLine); for (int i = 0; i < l.Jobs.Length; i++) { AppendText("[" + (i + 1).ToString() + "] Job ID: ", Color.Aqua, INDENT_L1); AppendText(l.Jobs[i].ID.ToString(), Color.Aqua, 30); AppendText(" Executable length: " + l.Jobs[i].ExecutableFileLength.ToString() + " Bytes", Color.Aqua, INDENT_L1); rtbLogs.AppendText(Environment.NewLine); } #endregion } else if (log is WorkerAgent.JobExecutionStartedLog) { #region JobExecutionStartedLog WorkerAgent.JobExecutionStartedLog l = (WorkerAgent.JobExecutionStartedLog)log; AppendText(l.Message + " (Job ID: " + l.Job.ID.ToString() + ")", messageColor); #endregion } else if (log is WorkerAgent.JobResultSentLog) { #region JobResultSentLog WorkerAgent.JobResultSentLog l = (WorkerAgent.JobResultSentLog)log; AppendText(l.Message + " (Job ID: " + l.Job.ID.ToString() + ")", messageColor); #endregion } else if (log is WorkerAgent.JobExecutedSuccessfullyLog) { #region JobExecutedSuccessfullyLog WorkerAgent.JobExecutedSuccessfullyLog l = (WorkerAgent.JobExecutedSuccessfullyLog)log; AppendText(l.Message + " (Job ID: " + l.Job.ID.ToString() + ")", messageColor); #endregion } else if (log is WorkerAgent.WorkerStartedLog) { #region WorkerStartedLog WorkerAgent.WorkerStartedLog l = (WorkerAgent.WorkerStartedLog)log; AppendText(l.Message, Color.GreenYellow); #endregion } else if (log is WorkerAgent.WorkerStoppedLog) { #region WorkerStoppedLog WorkerAgent.WorkerStoppedLog l = (WorkerAgent.WorkerStoppedLog)log; AppendText(l.Message, messageColor); #endregion } else if (log is WorkerAgent.WorkerCouldNotStartLog) { #region WorkerCouldNotStartLog WorkerAgent.WorkerCouldNotStartLog l = (WorkerAgent.WorkerCouldNotStartLog)log; AppendText(l.Message, errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Error Message: " + l.ErrorMessage, errorMessageColor); #endregion } else if (log is WorkerAgent.WorkerCouldNotStopLog) { #region WorkerCouldNotStopLog WorkerAgent.WorkerCouldNotStopLog l = (WorkerAgent.WorkerCouldNotStopLog)log; AppendText(l.Message, errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Error Message: " + l.ErrorMessage, errorMessageColor); #endregion } else if (log is WorkerAgent.ErrorInJobExecutionLog) { #region ErrorInJobExecutionLog WorkerAgent.ErrorInJobExecutionLog l = (WorkerAgent.ErrorInJobExecutionLog)log; AppendText(l.Message, errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Job ID: " + l.Job.ID.ToString() + Environment.NewLine, errorMessageColor, INDENT_L1); AppendText("Job Executable: " + l.Job.ExecuteableFileName + Environment.NewLine, errorMessageColor, INDENT_L1); AppendText("Error: " + l.ErrorMessage, errorMessageColor, 30); rtbLogs.AppendText(Environment.NewLine); AppendText("Is Win32 Error: " + (l.IsWin32Error ? "Yes" : "No"), errorMessageColor, INDENT_L1); if (l.IsWin32Error) { rtbLogs.AppendText(Environment.NewLine); AppendText("Win32 Error Code: " + l.Win32ErrorCode.ToString(), errorMessageColor, INDENT_L1); } #endregion } else if (log is WorkerAgent.ErrorInWritingJobToDiskLog) { #region ErrorInWritingJobToDiskLog WorkerAgent.ErrorInWritingJobToDiskLog l = (WorkerAgent.ErrorInWritingJobToDiskLog)log; AppendText(l.Message + " (Job ID: " + l.Job.ID.ToString() + ")", errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Error Message: " + l.ErrorMessage, errorMessageColor); #endregion } else if (log is WorkerAgent.ErrorInReadingJobOutputFile) { #region ErrorInReadingJobOutputFile WorkerAgent.ErrorInReadingJobOutputFile l = (WorkerAgent.ErrorInReadingJobOutputFile)log; AppendText(l.Message + " (Job ID: " + l.Job.ID.ToString() + ")", errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Error Message: " + l.ErrorMessage, errorMessageColor, INDENT_L1); #endregion } else if (log is WorkerAgent.ErrorInConnectingToJobServerLog) { #region ErrorInConnectingToJobServerLog WorkerAgent.ErrorInConnectingToJobServerLog l = (WorkerAgent.ErrorInConnectingToJobServerLog)log; AppendText(l.Message, errorMessageColor); rtbLogs.AppendText(Environment.NewLine); AppendText("Error Message: " + l.ErrorMessage, errorMessageColor, INDENT_L1); #endregion } else if (log is WorkerAgent.WorkerRegisterationFailedLog) { #region WorkerRegisterationFailedLog WorkerAgent.WorkerRegisterationFailedLog l = (WorkerAgent.WorkerRegisterationFailedLog)log; AppendText(l.Message, errorMessageColor); rtbLogs.AppendText(Environment.NewLine); #endregion } else if (log is WorkerAgent.WorkerRegisterationStartLog) { #region WorkerRegisterationStartLog WorkerAgent.WorkerRegisterationStartLog l = (WorkerAgent.WorkerRegisterationStartLog)log; AppendText(l.Message, Color.GreenYellow); #endregion } else if (log is WorkerAgent.WorkerRegisterdLog) { #region WorkerRegisterdLog WorkerAgent.WorkerRegisterdLog l = (WorkerAgent.WorkerRegisterdLog)log; AppendText(l.Message, Color.GreenYellow); rtbLogs.AppendText(Environment.NewLine); #endregion } else // log is Log { AppendText(log.Message, messageColor); } // Move cursor to next line rtbLogs.AppendText(Environment.NewLine); rtbLogs.ScrollToCaret(); }