Skip to content
Closed
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion core/src/main/scala/org/apache/spark/util/Utils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,10 @@ private[spark] object Utils extends Logging {
* always return a single directory.
*/
def getLocalDir(conf: SparkConf): String = {
getOrCreateLocalRootDirs(conf)(0)
getOrCreateLocalRootDirs(conf).headOption.getOrElse {
val dirPaths = getConfiguredLocalDirs(conf)
throw new IOException(s"Failed to get a temp directory under [${dirPaths.mkString(",")}].")
}
}

private[spark] def isRunningInYarnContainer(conf: SparkConf): Boolean = {
Expand Down
17 changes: 14 additions & 3 deletions core/src/test/scala/org/apache/spark/storage/LocalDirsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

package org.apache.spark.storage

import java.io.File
import java.io.{File, IOException}

import org.scalatest.BeforeAndAfter

Expand All @@ -35,20 +35,31 @@ class LocalDirsSuite extends SparkFunSuite with BeforeAndAfter {

test("Utils.getLocalDir() returns a valid directory, even if some local dirs are missing") {
// Regression test for SPARK-2974
assert(!new File("/NONEXISTENT_DIR").exists())
assert(!new File("/NONEXISTENT_PATH").exists())
val conf = new SparkConf(false)
.set("spark.local.dir", s"/NONEXISTENT_PATH,${System.getProperty("java.io.tmpdir")}")
assert(new File(Utils.getLocalDir(conf)).exists())
}

test("SPARK_LOCAL_DIRS override also affects driver") {
// Regression test for SPARK-2975
assert(!new File("/NONEXISTENT_DIR").exists())
assert(!new File("/NONEXISTENT_PATH").exists())
// spark.local.dir only contains invalid directories, but that's not a problem since
// SPARK_LOCAL_DIRS will override it on both the driver and workers:
val conf = new SparkConfWithEnv(Map("SPARK_LOCAL_DIRS" -> System.getProperty("java.io.tmpdir")))
.set("spark.local.dir", "/NONEXISTENT_PATH")
assert(new File(Utils.getLocalDir(conf)).exists())
}

test("Utils.getLocalDir() throws an exception if any temporary directory cannot be retrieved") {
assert(!new File("/NONEXISTENT_PATH_ONE").exists())
assert(!new File("/NONEXISTENT_PATH_TWO").exists())
val conf = new SparkConf(false)
.set("spark.local.dir", "/NONEXISTENT_PATH_ONE,/NONEXISTENT_PATH_TWO")
val message = intercept[IOException] {
Utils.getLocalDir(conf)
}.getMessage
assert(message ===
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would only suggest not testing the exact message here, but it's not a big deal. Maybe testing for the existence of the paths.

"Failed to get a temp directory under [/NONEXISTENT_PATH_ONE,/NONEXISTENT_PATH_TWO].")
}
}