diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index c6adf0c2db87..ee15820250ba 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -2935,11 +2935,10 @@
The base dir for HTTP Jetty server to extract contents. If this property
is not configured, by default, Jetty will create a directory inside the
- directory named by the java.io.tmpdir System property(/tmp by default).
- While in production environment, it's strongly suggested to instruct Jetty
- to use a different parent directory by setting this property to the name
- of the desired parent directory. The value of the property will be used to
- set Jetty context attribute 'org.eclipse.jetty.webapp.basetempdir'.
+ directory named by the ${ozone.metadata.dirs}/webserver. While in production environment,
+ it's strongly suggested instructing Jetty to use a different parent directory by
+ setting this property to the name of the desired parent directory. The value of the
+ property will be used to set Jetty context attribute 'org.eclipse.jetty.webapp.basetempdir'.
The directory named by this property must exist and be writeable.
diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/BaseHttpServer.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/BaseHttpServer.java
index 144cec862099..1e1b9bd66afb 100644
--- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/BaseHttpServer.java
+++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/BaseHttpServer.java
@@ -24,6 +24,7 @@
import java.util.Optional;
import java.util.OptionalInt;
+import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hdds.DFSConfigKeysLegacy;
import org.apache.hadoop.hdds.HddsConfigKeys;
@@ -43,6 +44,7 @@
import static org.apache.hadoop.hdds.HddsUtils.getHostNameFromConfigKeys;
import static org.apache.hadoop.hdds.HddsUtils.getPortNumberFromConfigKeys;
import static org.apache.hadoop.hdds.HddsUtils.createDir;
+import static org.apache.hadoop.hdds.server.ServerUtils.getOzoneMetaDirPath;
import static org.apache.hadoop.hdds.server.http.HttpConfig.getHttpPolicy;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ADMINISTRATORS_GROUPS;
@@ -70,6 +72,7 @@ public abstract class BaseHttpServer {
static final String PROMETHEUS_SINK = "PROMETHEUS_SINK";
private static final String JETTY_BASETMPDIR =
"org.eclipse.jetty.webapp.basetempdir";
+ public static final String SERVER_DIR = "/webserver";
private HttpServer2 httpServer;
private final MutableConfigurationSource conf;
@@ -178,14 +181,22 @@ public BaseHttpServer(MutableConfigurationSource conf, String name)
}
String baseDir = conf.get(OzoneConfigKeys.OZONE_HTTP_BASEDIR);
- if (!StringUtils.isEmpty(baseDir)) {
- createDir(baseDir);
- httpServer.getWebAppContext().setAttribute(JETTY_BASETMPDIR, baseDir);
- LOG.info("HTTP server of {} uses base directory {}", name, baseDir);
+
+ if (StringUtils.isEmpty(baseDir)) {
+ baseDir = getOzoneMetaDirPath(conf) + SERVER_DIR;
}
+ createDir(baseDir);
+ httpServer.getWebAppContext().setAttribute(JETTY_BASETMPDIR, baseDir);
+ LOG.info("HTTP server of {} uses base directory {}", name, baseDir);
}
}
+ @VisibleForTesting
+ public String getJettyBaseTmpDir() {
+ return httpServer.getWebAppContext().getAttribute(JETTY_BASETMPDIR)
+ .toString();
+ }
+
/**
* Return a HttpServer.Builder that the OzoneManager/SCM/Datanode/S3Gateway/
* Recon to initialize their HTTP / HTTPS server.
diff --git a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManagerHttpServer.java b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManagerHttpServer.java
index 4446631851e4..eb244f3f4016 100644
--- a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManagerHttpServer.java
+++ b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/TestStorageContainerManagerHttpServer.java
@@ -56,7 +56,8 @@ public class TestStorageContainerManagerHttpServer {
public static void setUp() throws Exception {
File base = new File(BASEDIR);
FileUtil.fullyDelete(base);
- base.mkdirs();
+ File ozoneMetadataDirectory = new File(BASEDIR, "metadata");
+ ozoneMetadataDirectory.mkdirs();
conf = new OzoneConfiguration();
keystoresDir = new File(BASEDIR).getAbsolutePath();
sslConfDir = KeyStoreTestUtil.getClasspathDir(
@@ -68,6 +69,8 @@ public static void setUp() throws Exception {
KeyStoreTestUtil.getClientSSLConfigFileName());
conf.set(OzoneConfigKeys.OZONE_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY,
KeyStoreTestUtil.getServerSSLConfigFileName());
+ conf.set(OzoneConfigKeys.OZONE_METADATA_DIRS,
+ ozoneMetadataDirectory.getAbsolutePath());
}
@AfterAll
diff --git a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHttpServer.java b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHttpServer.java
index 5e8909a127d1..4c75ed9191a3 100644
--- a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHttpServer.java
+++ b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerHttpServer.java
@@ -27,6 +27,7 @@
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.server.http.BaseHttpServer;
import org.apache.hadoop.hdfs.web.URLConnectionFactory;
import org.apache.hadoop.http.HttpConfig;
import org.apache.hadoop.http.HttpConfig.Policy;
@@ -40,6 +41,7 @@
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@@ -55,6 +57,7 @@ public class TestOzoneManagerHttpServer {
private static String sslConfDir;
private static OzoneConfiguration conf;
private static URLConnectionFactory connectionFactory;
+ private static File ozoneMetadataDirectory;
@Parameters public static Collection