Author: rdonkin
Date: Tue Nov 27 13:43:13 2007
New Revision: 598777
URL: http://svn.apache.org/viewvc?rev=598777&view=rev
Log:
Refined locking
Modified:
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
Modified:
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
URL:
http://svn.apache.org/viewvc/james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java?rev=598777&r1=598776&r2=598777&view=diff
==============================================================================
---
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
(original)
+++
james/server/trunk/torque-mailboxmanager-function/src/main/java/org/apache/james/mailboxmanager/torque/TorqueMailbox.java
Tue Nov 27 13:43:13 2007
@@ -136,96 +136,111 @@
public MessageResult appendMessage(MimeMessage message, Date internalDate,
int result) throws MailboxManagerException {
+
try {
- lock.writeLock().acquire();
- try {
- checkAccess();
- final MailboxRow myMailboxRow;
+ checkAccess();
+
+ final MailboxRow myMailboxRow = reserveNextUid();
+
+ if (myMailboxRow != null) {
try {
- myMailboxRow = getMailboxRow().consumeNextUid();
- } catch (TorqueException e) {
- throw new MailboxManagerException(e);
- } catch (SQLException e) {
- throw new MailboxManagerException(e);
- }
- if (myMailboxRow != null) {
- try {
- // To be thread safe, we first get our own copy and the
- // exclusive
- // Uid
- // TODO create own message_id and assign uid later
- // at the moment it could lead to the situation that
uid 5 is
- // insertet long before 4, when
- // mail 4 is big and comes over a slow connection.
- long uid = myMailboxRow.getLastUid();
- this.mailboxRow = myMailboxRow;
-
- MessageRow messageRow = new MessageRow();
-
messageRow.setMailboxId(getMailboxRow().getMailboxId());
- messageRow.setUid(uid);
- messageRow.setInternalDate(internalDate);
-
- // TODO very ugly size mesurement
- ByteArrayOutputStream sizeBos = new
ByteArrayOutputStream();
- message.writeTo(new CRLFOutputStream(sizeBos));
- messageRow.setSize(sizeBos.size());
- MessageFlags messageFlags = new MessageFlags();
- messageFlags.setFlags(message.getFlags());
- messageRow.addMessageFlags(messageFlags);
-
- int line_number = 0;
-
- for (Enumeration lines = message.getAllHeaderLines();
lines
- .hasMoreElements();) {
- String line = (String) lines.nextElement();
- int colon = line.indexOf(": ");
- if (colon > 0) {
- line_number++;
- MessageHeader mh = new MessageHeader();
- mh.setLineNumber(line_number);
- mh.setField(line.substring(0, colon));
- // TODO avoid unlikely IOOB Exception
- mh.setValue(line.substring(colon + 2));
- messageRow.addMessageHeader(mh);
- }
+ // To be thread safe, we first get our own copy and the
+ // exclusive
+ // Uid
+ // TODO create own message_id and assign uid later
+ // at the moment it could lead to the situation that uid 5
is
+ // inserted long before 4, when
+ // mail 4 is big and comes over a slow connection.
+ long uid = myMailboxRow.getLastUid();
+ this.mailboxRow = myMailboxRow;
+
+ MessageRow messageRow = new MessageRow();
+ messageRow.setMailboxId(getMailboxRow().getMailboxId());
+ messageRow.setUid(uid);
+ messageRow.setInternalDate(internalDate);
+
+ // TODO very ugly size mesurement
+ ByteArrayOutputStream sizeBos = new
ByteArrayOutputStream();
+ message.writeTo(new CRLFOutputStream(sizeBos));
+ messageRow.setSize(sizeBos.size());
+ MessageFlags messageFlags = new MessageFlags();
+ messageFlags.setFlags(message.getFlags());
+ messageRow.addMessageFlags(messageFlags);
+
+ int line_number = 0;
+
+ for (Enumeration lines = message.getAllHeaderLines(); lines
+ .hasMoreElements();) {
+ String line = (String) lines.nextElement();
+ int colon = line.indexOf(": ");
+ if (colon > 0) {
+ line_number++;
+ MessageHeader mh = new MessageHeader();
+ mh.setLineNumber(line_number);
+ mh.setField(line.substring(0, colon));
+ // TODO avoid unlikely IOOB Exception
+ mh.setValue(line.substring(colon + 2));
+ messageRow.addMessageHeader(mh);
}
+ }
- MessageBody mb = new MessageBody();
+ MessageBody mb = new MessageBody();
- InputStream is = message.getInputStream();
+ InputStream is = message.getInputStream();
- ByteArrayOutputStream baos = new
ByteArrayOutputStream();
- byte[] buf = new byte[4096];
- int read;
- while ((read = is.read(buf)) > 0) {
- baos.write(buf, 0, read);
- }
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ byte[] buf = new byte[4096];
+ int read;
+ while ((read = is.read(buf)) > 0) {
+ baos.write(buf, 0, read);
+ }
- mb.setBody(baos.toByteArray());
- messageRow.addMessageBody(mb);
+ mb.setBody(baos.toByteArray());
+ messageRow.addMessageBody(mb);
- messageRow.save();
- MessageResult messageResult =
fillMessageResult(messageRow,
- result | MessageResult.UID);
- checkForScanGap(uid);
- getUidChangeTracker().found(messageResult);
- return messageResult;
- } catch (Exception e) {
- throw new MailboxManagerException(e);
- }
- } else {
- // mailboxRow==null
- getUidChangeTracker().mailboxNotFound();
- throw new MailboxManagerException("Mailbox has been
deleted");
+ save(messageRow);
+ MessageResult messageResult = fillMessageResult(messageRow,
+ result | MessageResult.UID);
+ checkForScanGap(uid);
+ getUidChangeTracker().found(messageResult);
+ return messageResult;
+ } catch (Exception e) {
+ throw new MailboxManagerException(e);
}
- } finally {
- lock.writeLock().release();
+ } else {
+ // mailboxRow==null
+ getUidChangeTracker().mailboxNotFound();
+ throw new MailboxManagerException("Mailbox has been deleted");
}
} catch (InterruptedException e) {
throw new MailboxManagerException(e);
}
}
+ private void save(MessageRow messageRow) throws Exception {
+ try {
+ lock.writeLock().acquire();
+ messageRow.save();
+ } finally {
+ lock.writeLock().release();
+ }
+ }
+
+ private MailboxRow reserveNextUid() throws InterruptedException,
MailboxManagerException {
+ final MailboxRow myMailboxRow;
+ try {
+ lock.writeLock().acquire();
+ myMailboxRow = getMailboxRow().consumeNextUid();
+ } catch (TorqueException e) {
+ throw new MailboxManagerException(e);
+ } catch (SQLException e) {
+ throw new MailboxManagerException(e);
+ } finally {
+ lock.writeLock().release();
+ }
+ return myMailboxRow;
+ }
+
private void checkForScanGap(long uid) throws MailboxManagerException,
TorqueException, MessagingException {
synchronized (getUidChangeTracker()) {
long lastScannedUid=getUidChangeTracker().getLastScannedUid();
@@ -563,7 +578,7 @@
}
}
- public synchronized long getUidValidity() throws MailboxManagerException {
+ public long getUidValidity() throws MailboxManagerException {
try {
lock.readLock().acquire();
try {
@@ -580,9 +595,9 @@
}
- public synchronized long getUidNext() throws MailboxManagerException {
+ public long getUidNext() throws MailboxManagerException {
try {
- lock.writeLock().acquire();
+ lock.readLock().acquire();
try {
checkAccess();
try {
@@ -603,7 +618,7 @@
throw new MailboxManagerException(e);
}
} finally {
- lock.writeLock().release();
+ lock.readLock().release();
}
} catch (InterruptedException e) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]