/// <summary> /// Scan the JM stdout looking for the specified vertex; display the lines in the file view. /// Run in the background. /// </summary> /// <param name="vertex">Vertex to look for.</param> /// <returns>true if the information was found.</returns> /// <param name="logViewer">Viewer to use to display the logs.</param> /// <param name="stdout">Job standard output stream.</param> private static bool ScanJMStdout(ExecutedVertexInstance vertex, IClusterResidentObject stdout, LogViewer logViewer) { if (vertex == null || vertex.IsManager) return false; string vertexId = vertex.UniqueID; string name = string.Format(@"\s{0}.{1}\s", vertex.Number, vertex.Version); // the dot could match a space too. string regexstring = string.Format(@"vertex\s{0}\s(.*)\sv.{1}\s|", vertex.Number, vertex.Version); if (vertexId != "") regexstring += vertexId + "|"; regexstring += name + "|" + vertex.UniqueID; Regex regex = new Regex(regexstring, RegexOptions.Compiled); Trace.TraceInformation(regex.ToString()); long length = stdout.Size; logViewer.Status("Looking for " + vertex.Name, StatusKind.LongOp); if (length == 0) { logViewer.Status("JM stdout is empty.", StatusKind.Error); logViewer.Done(); return false; } ISharedStreamReader sr = stdout.GetStream(); if (sr.Exception != null) { logViewer.Status("Error opening JM stdout: " + sr.Exception.Message, StatusKind.Error); logViewer.Done(); return false; } try { long read = 0; long lines = 0; while (!sr.EndOfStream) { string line = sr.ReadLine(); read += line.Length; if (regex.IsMatch(line)) logViewer.AddLine(stdout.ToString(), lines, line); lines++; if (lines % 100 == 0 && length > 0) { if (logViewer.Cancelled) break; logViewer.UpdateProgress(Math.Min((int)(read * 100 / length), 100)); // the length can grow while the file is being read } } sr.Close(); } finally { logViewer.Done(); } return true; }
/// <summary> /// Scan the JM logs looking for the specified vertex; display the lines in the file view. /// Run in the background. /// </summary> /// <param name="vertex">Vertex to look for.</param> /// <returns>true if the information was found.</returns> /// <param name="logViewer">Viewer used to display the logs.</param> private bool ScanJMLogs(ExecutedVertexInstance vertex, LogViewer logViewer) { if (vertex == null || this.Job.ManagerVertex == null) return false; if (vertex == this.Job.ManagerVertex) return false; string vertexId = vertex.UniqueID; Regex regex = new Regex(vertexId, RegexOptions.Compiled); Trace.TraceInformation(regex.ToString()); IClusterResidentObject logdir = this.Job.ManagerVertex.LogDirectory; if (logdir.Exception != null) { this.Status(logdir.ToString(), StatusKind.Error); return false; } List<IClusterResidentObject> files = logdir.GetFilesAndFolders(this.Job.ManagerVertex.LogFilesPattern).ToList(); if (files.Count == 0) { this.Status("No log files found", StatusKind.Error); return false; } try { long totalWork = 0; foreach (var file in files) { if (totalWork >= 0 && file.Size >= 0) totalWork += file.Size; } long done = 0; foreach (var file in files) { ISharedStreamReader sr = file.GetStream(); if (sr.Exception != null) { logViewer.Status("Error opening file: " + sr.Exception.Message, StatusKind.Error); continue; } logViewer.Status("Scanning " + file, StatusKind.LongOp); long lineno = 0; while (!sr.EndOfStream) { if (logViewer.Cancelled) break; string line = sr.ReadLine(); done += line.Length; if (regex.IsMatch(line)) { logViewer.AddLine(file.Name, lineno, line); } lineno++; logViewer.UpdateProgress((int)(100 * done / totalWork)); } sr.Close(); if (logViewer.Cancelled) break; } } finally { logViewer.Done(); } return true; }