DatabaseComponent.generateAck() now returns a boolean.

The return value indicates whether any batch IDs were written.
AckWriter.finish() and Database.removeBatchesToAck() are only called
if at least one batch ID was written.
This commit is contained in:
akwizgran
2011-09-21 17:51:17 +01:00
parent fadd95ae49
commit 8dd7ec93e7
3 changed files with 30 additions and 9 deletions

View File

@@ -377,20 +377,21 @@ DatabaseCleaner.Callback {
}
}
public void generateAck(ContactId c, AckWriter a) throws DbException,
public boolean generateAck(ContactId c, AckWriter a) throws DbException,
IOException {
contactLock.readLock().lock();
try {
if(!containsContact(c)) throw new NoSuchContactException();
messageStatusLock.writeLock().lock();
Collection<BatchId> sent = new ArrayList<BatchId>();
messageStatusLock.readLock().lock();
try {
T txn = db.startTransaction();
try {
Collection<BatchId> acks = db.getBatchesToAck(txn, c);
Collection<BatchId> sent = new ArrayList<BatchId>();
for(BatchId b : acks) if(a.writeBatchId(b)) sent.add(b);
a.finish();
db.removeBatchesToAck(txn, c, sent);
for(BatchId b : acks) {
if(!a.writeBatchId(b)) break;
sent.add(b);
}
if(LOG.isLoggable(Level.FINE))
LOG.fine("Added " + acks.size() + " acks");
db.commitTransaction(txn);
@@ -401,6 +402,23 @@ DatabaseCleaner.Callback {
db.abortTransaction(txn);
throw e;
}
} finally {
messageStatusLock.readLock().unlock();
}
// Record the contents of the ack, unless it's empty
if(sent.isEmpty()) return false;
a.finish();
messageStatusLock.writeLock().lock();
try {
T txn = db.startTransaction();
try {
db.removeBatchesToAck(txn, c, sent);
db.commitTransaction(txn);
return true;
} catch(DbException e) {
db.abortTransaction(txn);
throw e;
}
} finally {
messageStatusLock.writeLock().unlock();
}