Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
        }