Skip to content

Commit

Permalink
[MINOR] [UI] Improve error message on log page
Browse files Browse the repository at this point in the history
Currently if a bad log type if specified, then we get blank.
We should provide a more informative error message.
  • Loading branch information
Andrew Or committed Jun 2, 2015
1 parent 2f9c751 commit 15d7c90
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import org.apache.spark.util.logging.RollingFileAppender
private[ui] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") with Logging {
private val worker = parent.worker
private val workDir = parent.workDir
private val supportedLogTypes = Set("stderr", "stdout")

def renderLog(request: HttpServletRequest): String = {
val defaultBytes = 100 * 1024
Expand Down Expand Up @@ -129,6 +130,11 @@ private[ui] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") with
offsetOption: Option[Long],
byteLength: Int
): (String, Long, Long, Long) = {

if (!supportedLogTypes.contains(logType)) {
return ("Error: Log type must be one of " + supportedLogTypes.mkString(", "), 0, 0, 0)
}

try {
val files = RollingFileAppender.getSortedRolledOverFiles(logDirectory, logType)
logDebug(s"Sorted log files of type $logType in $logDirectory:\n${files.mkString("\n")}")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.apache.spark.deploy.worker.ui

import java.io.{File, FileWriter}

import org.mockito.Mockito.mock
import org.scalatest.PrivateMethodTester

import org.apache.spark.SparkFunSuite

class LogPageSuite extends SparkFunSuite with PrivateMethodTester {

test("get logs simple") {
val webui = mock(classOf[WorkerWebUI])
val logPage = new LogPage(webui)

// Prepare some fake log files to read later
val out = "some stdout here"
val err = "some stderr here"
val tmpDir = new File(sys.props("java.io.tmpdir"))
val tmpOut = new File(tmpDir, "stdout")
val tmpErr = new File(tmpDir, "stderr")
val tmpRand = new File(tmpDir, "random")
write(tmpOut, out)
write(tmpErr, err)
write(tmpRand, "1 6 4 5 2 7 8")

// Get the logs. All log types other than "stderr" or "stdout" will be rejected
val getLog = PrivateMethod[(String, Long, Long, Long)]('getLog)
val (stdout, _, _, _) =
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "stdout", None, 100)
val (stderr, _, _, _) =
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "stderr", None, 100)
val (error1, _, _, _) =
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "random", None, 100)
val (error2, _, _, _) =
logPage invokePrivate getLog(tmpDir.getAbsolutePath, "does-not-exist.txt", None, 100)
assert(stdout === out)
assert(stderr === err)
assert(error1.startsWith("Error"))
assert(error2.startsWith("Error"))
}

/** Write the specified string to the file. */
private def write(f: File, s: String): Unit = {
val writer = new FileWriter(f)
try {
writer.write(s)
} finally {
writer.close()
}
}

}

0 comments on commit 15d7c90

Please sign in to comment.