Operation and Analysis of Coldspark Products
Q3 2007
Analysis of
Systems and Behavior
System and Behavioral Analysis
How to Assess a Situation
How to Assess a Situation
Example Scenario
Example Scenario
Example Scenario
Example Scenario
Example Scenario
Example Scenario
How to Assess A Situation
Attain a Depth of Understanding
Attain a Depth of Understanding
Attain a Depth of Understanding
Why It is Important to Have a Depth of Understanding
Why It is Important to Have a Depth of Understanding
Reproducing Problems
Reproducing Problems
Reproducing Problems
Reproducing Problems
Efficient Use of Resources
Efficient Use of Resources
Patterns of Common Pitfalls
Mitigating Risk
Striving Toward a Goal
System and Behavioral Analysis
Advanced Email Concepts
Advanced Email Concepts
TLS
TLS
STARTTLS
MIME
MIME-version: 1.0
Content-type: multipart/mixed; boundary="frontier"
This is a message with multiple parts in MIME format.
--frontier
Content-type: text/plain
This is the body of the message.
--frontier
Content-type: application/octet-stream
Content-transfer-encoding: base64
PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
--frontier--
Character Encoding: Overview
Character Sets: Ascii
Character Sets: Unicode
Other Character Sets Examples
Content-Transfer-Encoding
8BITMIME
Encoded Words
(grabbed from wikipedia)
Content Types
Content Types: Multipart
From Wikipedia:
Mixed
Multipart/mixed is used for sending files with different "Content-Type" headers inline (or as attachments). If sending pictures or other easily readable files, most mail clients will display them inline (unless otherwise specified with the "Content-disposition" header). Otherwise it will offer them as attachments. The default content-type for each part is "text/plain".
Defined in RFC 2046, Section 5.1.3
Message
A message/rfc822 part contains an email message, including any headers. Rfc822 is a misnomer, since the message may be a full MIME message. This is used for digests as well as for E-mail forwarding.
Defined in RFC 2046.
Digest
Multipart/digest is a simple way to send multiple text messages. The default content-type for each part is "message/rfc822".
Defined in RFC 2231, Section 5.1.5
Alternative
The multipart/alternative subtype indicates that each part is an "alternative" version of the same (or similar) content, each in a different format denoted by its "Content-Type" header. The formats are ordered by how faithful they are to the original, with the least faithful first and the most faithful last. Systems can then choose the "best" representation they are capable of processing; in general, this will be the last part that the system can understand, although other factors may affect this.
Example: multipart/alternative
From: Nathaniel Borenstein <nsb@bellcore.com>
To: Ned Freed <ned@innosoft.com>
Subject: Formatted text mail
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=boundary42
--boundary42
Content-Type: text/plain; charset=us-ascii
...plain text version of message goes here....
--boundary42
Content-Type: text/richtext
.... RFC 1341 richtext version of same message goes here ...
--boundary42
Content-Type: text/x-whatever
.... fanciest formatted version of same message goes here ...
--boundary42--
LDAP
LDAP
LDAP
dn: cn=klindquist, dc=coldspark,dc=com
sn: lindquist �userPassword:: bXlwYXNzd29yZA== �ou: Engineering �carLicense: ACAR123 �mail: klindquist@coldspark.com �objectClass: inetOrgPerson �uid: klindquist �homePhone: 555-111-2222 �cn: klindquist �description: a person at Coldspark
DKIM and DK
DKIM
SPF
fidelity.com. 14400 IN TXT "v=spf1 ip4:64.58.236.239 ip4:64.90.205.0/25 ip4:129.41.0.0/16 ip4:192.223.0.0/16 ip4:137.199.0.0/16 ip4:155.199.0.0/16 ip4:202.95.0.0/16 -all"
SPF
Greylisting, tarpitting
Brief RFC Overview
Some Java Concepts
Some Java Concepts
Why is this useful information?
Stack Traces
Stack Traces
jvm 1 | java.lang.IllegalArgumentException: id to load is required for loading �jvm 1 | at org.hibernate.event.LoadEvent.<init>(LoadEvent.java:51) �jvm 1 | at org.hibernate.event.LoadEvent.<init>(LoadEvent.java:33) �jvm 1 | at org.hibernate.impl.SessionImpl.get(SessionImpl.java:812) �jvm 1 | at org.hibernate.impl.SessionImpl.get(SessionImpl.java:808) �jvm 1 | at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:470) �jvm 1 | at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372) �jvm 1 | at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:464) �jvm 1 | at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:458) �jvm 1 | at com.coldspark.mailfusion.dao.GenericHibernateDAO.get(GenericHibernateDAO.java:112) �jvm 1 | at com.coldspark.mailfusion.dao.GenericHibernateDAO.get(GenericHibernateDAO.java:98) �jvm 1 | at com.coldspark.mailfusion.query.dao.StoredQueryDAOHibernate.getCurrentStoredQueryRevision(StoredQueryDAOHibernate.java: �64) �jvm 1 | at com.coldspark.mailfusion.send.event.SendEventBuilder.createSendEventEntity(SendEventBuilder.java:239) �jvm 1 | at com.coldspark.mailfusion.send.event.SendEventBuilder.createSendEvent(SendEventBuilder.java:76) �jvm 1 | at com.coldspark.mailfusion.schedule.ScheduleServiceImpl.createSchedule(ScheduleServiceImpl.java:448) �jvm 1 | at com.coldspark.mailfusion.schedule.ScheduleServiceImpl.launch(ScheduleServiceImpl.java:175) �jvm 1 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) �
Null Pointer Exceptions
NPEs
04/16/2008 12:45:02 [DBUG] handleResponse completing with GREETING response. �04/16/2008 12:45:02 [DBUG] Exception thrown from FilterQueue.enqueue �java.lang.NullPointerException � at coldspark.engine.api.FilterQueue.doEnqueue(FilterQueue.java:262) � at coldspark.engine.api.FilterQueue.internalEnqueue(FilterQueue.java:352) � at coldspark.engine.api.FilterQueue.enqueue(FilterQueue.java:177) � at coldspark.engine.smtp.server.ServerConversation.handleResponse(ServerConversation.java:1612) � at coldspark.engine.smtp.server.ServerConversation.access$100(ServerConversation.java:1089) � at coldspark.engine.smtp.server.ServerConversation$1.run(ServerConversation.java:1537) � at coldspark.engine.util.thread.MonitoredRunnable.run(MonitoredRunnable.java:94) � at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650) � at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675) � at java.lang.Thread.run(Thread.java:595)
What information does this stack trace tell us?
01/03/2008 12:58:01 [WARN] The data file reference could not be found on the file system for a disk message, while scanning for headers. for record: [0]�01/03/2008 12:58:01 [DBUG] The data file reference could not be found on the file system for a disk message, while scanning for headers. for record: [0]�java.lang.Exception: The data file reference could not be found on the file system for a disk message, while scanning for headers. for record: [0]� at coldspark.engine.smtp.EmailMessage.getMessageHeaders(EmailMessage.java:5133)� at coldspark.engine.smtp.EmailMessage.doLoadDiskMessage(EmailMessage.java:1678)� at coldspark.engine.smtp.EmailMessage.loadDiskMessage(EmailMessage.java:1574)� at coldspark.engine.smtp.client.Bucket.nextMessage(Bucket.java:425)� at coldspark.engine.smtp.client.ClientConversation.handleHelloResponse(ClientConversation.java:2040)� at coldspark.engine.smtp.client.ClientConversation.handleResponse(ClientConversation.java:1890)� at coldspark.engine.smtp.client.ClientConversation.access$000(ClientConversation.java:1414)� at coldspark.engine.smtp.client.ClientConversation$5.run(ClientConversation.java:1772)� at coldspark.engine.util.thread.MonitoredRunnable.run(MonitoredRunnable.java:94)� at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)� at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)� at java.lang.Thread.run(Thread.java:595)�01/03/2008 12:58:01 [DBUG] Unable to obtain headers for message: Object #[4655498] sender: [klindquist@not.com01/03/2008 12:58:01 [DBUG] Unable to obtain headers for message: Object #[4655498] sender: [klindquist@not.com] recipients: [[klindquist@otherdomain.com]]
How about this one?
java.net.SocketException: Broken pipe� at java.net.SocketOutputStream.socketWrite0(Native Method)� at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)� at java.net.SocketOutputStream.write(SocketOutputStream.java:136)� at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)� at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)� at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2692)� at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2621)� at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1552)� at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)� at com.mysql.jdbc.Connection.execSQL(Connection.java:2994)� at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:936)� at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1166)� at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1082)� at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1067)� at coldspark.engine.results.logger.db.MailblastDbResultLogger.writeResult(MailblastDbResultLogger.java:371)� at coldspark.engine.results.thread.ResultDAOHandlerThread.writeResultToLogger(ResultDAOHandlerThread.java:242)�
Thread Traces and Deadlocks
Thread Traces and Deadlocks
Found one Java-level deadlock:�=============================�"Thread-104client work pool":� waiting to lock monitor 0x0822b714 (object 0x668b29c0, a java.lang.Object),� which is held by "Thread-58client socket pool"�"Thread-58client socket pool":� waiting to lock monitor 0x0822b6d4 (object 0x668b2458, a coldspark.engine.smtp.client.ClientConversation),� which is held by "Thread-104client work pool"��Java stack information for the threads listed above:�===================================================�"Thread-104client work pool":� at coldspark.engine.socket.chr.NbCharChannel.close(NbCharChannel.java:153)� - waiting to lock <0x668b29c0> (a java.lang.Object)� at coldspark.engine.smtp.Conversation.close(Conversation.java:444)� at coldspark.engine.smtp.client.ClientConversation.close(ClientConversation.java:2630)� - locked <0x668b2458> (a coldspark.engine.smtp.client.ClientConversation)� at coldspark.engine.smtp.client.ClientConversation.failBucket(ClientConversation.java:2713)� at coldspark.engine.smtp.client.ClientConversation.access$200(ClientConversation.java:1410)� at coldspark.engine.smtp.client.ClientConversation$5.run(ClientConversation.java:1719)� at coldspark.engine.util.thread.MonitoredRunnable.run(MonitoredRunnable.java:94)� at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)� at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)� at java.lang.Thread.run(Thread.java:595)�"Thread-58client socket pool":� at coldspark.engine.smtp.client.ClientConversation.closed(ClientConversation.java:3234)
Thread Traces and Deadlocks
[DB-1000,CID=1,SE=se-1] [RUNNABLE]�java.net.SocketInputStream.socketRead0(native method)�java.net.SocketInputStream.read(SocketInputStream.java:129)�com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)�com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)�com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)�com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1931)�com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2380)�com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2909)�com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)�com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1129)�com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:681)�com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1368)�com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1283)�com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1268)�com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)�org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:744)�org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:537)�org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:738)�org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:796)�org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:804)�com.coldspark.injector.spi.DBHelper.setEventStatus(DBHelper.java:227)�com.coldspark.injector.spi.DBHelper.setEventStatus(DBHelper.java:183)�com.coldspark.injector.spi.DBProcessor.process(DBProcessor.java:265)�com.coldspark.injector.spi.AbstractProcessor.run(AbstractProcessor.java:118)�java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)�java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)�java.lang.Thread.run(Thread.java:595)
Sun JVM Memory Management
Sun JVM Memory Management
Sun JVM Memory
Sun JVM Memory Management
Sun JVM Garbage Collection
Sun JVM Garbage Collection
Profiling
Spring and Dependency Injection
Spring and Dependency Injection
Spring and Dependency Injection
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="driverClass" value="${jdbc.driverClass}"/>
<!-- configuration pool via c3p0-->
<property name="acquireIncrement" value="10" />
<property name="acquireRetryAttempts" value="5" />
<property name="acquireRetryDelay" value="1000" />
<property name="autoCommitOnClose" value="false" />
<property name="checkoutTimeout" value="5000" />
<property name="idleConnectionTestPeriod" value="300" /> <!-- seconds -->
<property name="maxPoolSize" value="100" />
<property name="maxStatementsPerConnection" value="10" />
<property name="minPoolSize" value="3" />
<property name="unreturnedConnectionTimeout" value="900" /> <!-- Seconds -->
</bean>
<property name="dataSource" ref="dataSource" />
Java Stuff Summary