azkaban-aplcache

Details

diff --git a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
index 66e8ba9..2d0619e 100644
--- a/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
+++ b/azkaban-common/src/main/java/azkaban/project/ProjectManager.java
@@ -77,8 +77,7 @@ public class ProjectManager {
     // The prop passed to XmlValidatorManager is used to initialize all the
     // validators
     // Each validator will take certain key/value pairs from the prop to
-    // initialize
-    // itself.
+    // initialize itself.
     Props prop = new Props(props);
     prop.put(ValidatorConfigs.PROJECT_ARCHIVE_FILE_PATH, "initialize");
     loadAllProjects();
@@ -399,12 +398,10 @@ public class ProjectManager {
     }
 
     // Since props is an instance variable of ProjectManager, and each
-    // invocation to the
-    // uploadProject manager needs to pass a different value for the
-    // PROJECT_ARCHIVE_FILE_PATH
-    // key, it is necessary to create a new instance of Props to make sure these
-    // different
-    // values are isolated from each other.
+    // invocation to the uploadProject manager needs to pass a different
+    // value for the PROJECT_ARCHIVE_FILE_PATH key, it is necessary to
+    // create a new instance of Props to make sure these different values
+    // are isolated from each other.
     Props prop = new Props(props);
     prop.putAll(additionalProps);
     prop.put(ValidatorConfigs.PROJECT_ARCHIVE_FILE_PATH,
diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 012ebbc..f839a80 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -87,10 +87,14 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
   private static final String LOCKDOWN_CREATE_PROJECTS_KEY =
       "lockdown.create.projects";
 
+  private static final String PROJECT_DOWNLOAD_BUFFER_SIZE =
+      "project.download.bufffer.size";
+
   private ProjectManager projectManager;
   private ExecutorManagerAdapter executorManager;
   private ScheduleManager scheduleManager;
   private UserManager userManager;
+  private int downloadBufferSize;
 
   private boolean lockdownCreateProjects = false;
 
@@ -115,6 +119,11 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     if (lockdownCreateProjects) {
       logger.info("Creation of projects is locked down");
     }
+
+    downloadBufferSize =
+        server.getServerProps().getInt(PROJECT_DOWNLOAD_BUFFER_SIZE, 8192);
+
+    logger.info("downloadBufferSize: " + downloadBufferSize);
   }
 
   @Override
@@ -447,6 +456,8 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     }
 
     ProjectFileHandler projectFileHandler = null;
+    FileInputStream inStream = null;
+    OutputStream outStream = null;
     try {
       projectFileHandler =
           projectManager.getProjectFileHandler(project, version);
@@ -468,10 +479,9 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
       logger.info(logStr);
 
       // now set up HTTP response for downloading file
-      FileInputStream inStream = new FileInputStream(projectZipFile);
+      inStream = new FileInputStream(projectZipFile);
 
       resp.setContentType(APPLICATION_ZIP_MIME_TYPE);
-      resp.setContentLength((int) projectZipFile.length());
 
       String headerKey = "Content-Disposition";
       String headerValue =
@@ -479,21 +489,21 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
               projectFileHandler.getFileName());
       resp.setHeader(headerKey, headerValue);
 
-      OutputStream outStream = resp.getOutputStream();
+      outStream = resp.getOutputStream();
 
-      byte[] buffer = new byte[4096];
+      byte[] buffer = new byte[downloadBufferSize];
       int bytesRead = -1;
 
       while ((bytesRead = inStream.read(buffer)) != -1) {
         outStream.write(buffer, 0, bytesRead);
       }
 
-      inStream.close();
-      outStream.close();
-
-    } catch (ProjectManagerException e) {
+    } catch (Throwable e) {
       throw new ServletException(e);
     } finally {
+      IOUtils.closeQuietly(inStream);
+      IOUtils.closeQuietly(outStream);
+
       if (projectFileHandler != null) {
         projectFileHandler.deleteLocalFile();
       }