azkaban-aplcache

Details

diff --git a/azkaban-common/src/main/java/azkaban/utils/AbstractMailer.java b/azkaban-common/src/main/java/azkaban/utils/AbstractMailer.java
index a9074a7..681ae33 100644
--- a/azkaban-common/src/main/java/azkaban/utils/AbstractMailer.java
+++ b/azkaban-common/src/main/java/azkaban/utils/AbstractMailer.java
@@ -19,6 +19,7 @@ package azkaban.utils;
 import java.util.Collection;
 
 public class AbstractMailer {
+  private static int MB_IN_BYTES = 1048576;
   private String clientHostname;
   private int clientPort;
   private boolean usesSSL;
@@ -31,11 +32,18 @@ public class AbstractMailer {
 
   private String referenceURL;
 
+  private long attachmentMazSizeInByte;
+
   public AbstractMailer(Props props) {
     this.azkabanName = props.getString("azkaban.name", "azkaban");
     this.mailHost = props.getString("mail.host", "localhost");
     this.mailUser = props.getString("mail.user", "");
     this.mailPassword = props.getString("mail.password", "");
+    long maxAttachmentSizeInMB =
+        props.getInt("mail.max.attachment.size.mb", 1000);
+
+    attachmentMazSizeInByte = maxAttachmentSizeInMB * MB_IN_BYTES;
+
     this.mailSender = props.getString("mail.sender", "");
 
     this.clientHostname = props.get("server.hostname");
@@ -92,4 +100,13 @@ public class AbstractMailer {
   public String getMailSender() {
     return mailSender;
   }
+
+  /**
+   * Attachment maximum size in bytes
+   * 
+   * @return
+   */
+  public long getAttachmentMaxSize() {
+    return attachmentMazSizeInByte;
+  }
 }
diff --git a/azkaban-common/src/main/java/azkaban/utils/Emailer.java b/azkaban-common/src/main/java/azkaban/utils/Emailer.java
index 947800a..ee0dbad 100644
--- a/azkaban-common/src/main/java/azkaban/utils/Emailer.java
+++ b/azkaban-common/src/main/java/azkaban/utils/Emailer.java
@@ -16,7 +16,6 @@
 
 package azkaban.utils;
 
-import java.lang.String;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -32,9 +31,6 @@ import azkaban.executor.Status;
 import azkaban.executor.mail.DefaultMailCreator;
 import azkaban.executor.mail.MailCreator;
 import azkaban.sla.SlaOption;
-import azkaban.utils.AbstractMailer;
-import azkaban.utils.EmailMessage;
-import azkaban.utils.Props;
 
 public class Emailer extends AbstractMailer implements Alerter {
   private static Logger logger = Logger.getLogger(Emailer.class);
@@ -71,6 +67,8 @@ public class Emailer extends AbstractMailer implements Alerter {
         props.getInt("mail.connection.timeout.millis", 10000);
     EmailMessage.setConnectionTimeout(connectionTimeout);
 
+    EmailMessage.setAttachmentMaxSize(getAttachmentMaxSize());
+
     this.clientHostname = props.getString("jetty.hostname", "localhost");
 
     if (props.getBoolean("jetty.use.ssl", true)) {
diff --git a/azkaban-common/src/main/java/azkaban/utils/EmailMessage.java b/azkaban-common/src/main/java/azkaban/utils/EmailMessage.java
index c939b13..4826478 100644
--- a/azkaban-common/src/main/java/azkaban/utils/EmailMessage.java
+++ b/azkaban-common/src/main/java/azkaban/utils/EmailMessage.java
@@ -18,6 +18,7 @@ package azkaban.utils;
 
 import java.io.File;
 import java.io.InputStream;
+import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
@@ -36,9 +37,13 @@ import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
+import org.apache.log4j.Logger;
+
 import com.sun.mail.smtp.SMTPTransport;
 
 public class EmailMessage {
+  private final Logger logger = Logger.getLogger(EmailMessage.class);
+
   private static String protocol = "smtp";
   private List<String> _toAddress = new ArrayList<String>();
   private String _mailHost;
@@ -48,9 +53,11 @@ public class EmailMessage {
   private String _fromAddress;
   private String _mimeType = "text/plain";
   private String _tls;
+
   private StringBuffer _body = new StringBuffer();
   private static int _mailTimeout = 10000;
   private static int _connectionTimeout = 10000;
+  private static long _attachmentMaxSizeInByte = 134217728; // 1 GB
 
   private ArrayList<BodyPart> _attachments = new ArrayList<BodyPart>();
 
@@ -72,6 +79,14 @@ public class EmailMessage {
     _connectionTimeout = timeoutMillis;
   }
 
+  public static void setAttachmentMaxSize(long sizeInByte) {
+    if (sizeInByte < 1) {
+      throw new IllegalArgumentException(
+          "attachment max size can't be 0 or negative");
+    }
+    _attachmentMaxSizeInByte = sizeInByte;
+  }
+
   public EmailMessage setMailHost(String host) {
     _mailHost = host;
     return this;
@@ -118,6 +133,12 @@ public class EmailMessage {
 
   public EmailMessage addAttachment(String attachmentName, File file)
       throws MessagingException {
+
+    if (file.length() > _attachmentMaxSizeInByte) {
+      throw new MessageAttachmentExceededMaximumSizeException("Attachment '"
+          + attachmentName + "' exceeded maximum size "
+          + _attachmentMaxSizeInByte);
+    }
     BodyPart attachmentPart = new MimeBodyPart();
     DataSource fileDataSource = new FileDataSource(file);
     attachmentPart.setDataHandler(new DataHandler(fileDataSource));
@@ -194,7 +215,23 @@ public class EmailMessage {
     // Transport transport = session.getTransport();
 
     SMTPTransport t = (SMTPTransport) session.getTransport(protocol);
-    t.connect(_mailHost, _mailUser, _mailPassword);
+    try {
+      t.connect(_mailHost, _mailUser, _mailPassword);
+    } catch (MessagingException ste) {
+      if (ste.getCause() instanceof SocketTimeoutException) {
+        try {
+          // retry on SocketTimeoutException
+          t.connect(_mailHost, _mailUser, _mailPassword);
+          logger
+              .info("Email retry on SocketTimeoutException completed successfully");
+        } catch (MessagingException me) {
+          logger.info("Email retry on SocketTimeoutException failed");
+          throw me;
+        }
+      } else {
+        throw ste;
+      }
+    }
     t.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
     t.close();
   }
diff --git a/azkaban-common/src/main/java/azkaban/utils/MessageAttachmentExceededMaximumSizeException.java b/azkaban-common/src/main/java/azkaban/utils/MessageAttachmentExceededMaximumSizeException.java
new file mode 100644
index 0000000..344bc86
--- /dev/null
+++ b/azkaban-common/src/main/java/azkaban/utils/MessageAttachmentExceededMaximumSizeException.java
@@ -0,0 +1,26 @@
+package azkaban.utils;
+
+import javax.mail.MessagingException;
+
+/**
+ * To indicate the attachment size is larger than allowed size
+ * 
+ * @author hluu
+ *
+ */
+public class MessageAttachmentExceededMaximumSizeException extends
+    MessagingException {
+
+  public MessageAttachmentExceededMaximumSizeException() {
+    super();
+  }
+
+  public MessageAttachmentExceededMaximumSizeException(String s) {
+    super(s);
+  }
+
+  public MessageAttachmentExceededMaximumSizeException(String s, Exception e) {
+    super(s, e);
+  }
+
+}