From a94867907fcd81bf8db60ed7ea58f0fe88a028ef Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 15 Mar 2013 16:52:56 +0000 Subject: [PATCH] Getting group message headers requires acquiring rating lock. --- briar-core/src/net/sf/briar/db/Database.java | 2 +- .../sf/briar/db/DatabaseComponentImpl.java | 29 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java index 0dc1c9d36..5ed55973f 100644 --- a/briar-core/src/net/sf/briar/db/Database.java +++ b/briar-core/src/net/sf/briar/db/Database.java @@ -277,7 +277,7 @@ interface Database { /** * Returns the headers of all messages in the given group. *

- * Locking: message read. + * Locking: message read, rating read. */ Collection getMessageHeaders(T txn, GroupId g) throws DbException; diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java index 15c301335..6fa43393b 100644 --- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java +++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java @@ -953,22 +953,27 @@ DatabaseCleaner.Callback { throws DbException { messageLock.readLock().lock(); try { - subscriptionLock.readLock().lock(); + ratingLock.readLock().lock(); try { - T txn = db.startTransaction(); + subscriptionLock.readLock().lock(); try { - if(!db.containsSubscription(txn, g)) - throw new NoSuchSubscriptionException(); - Collection headers = - db.getMessageHeaders(txn, g); - db.commitTransaction(txn); - return headers; - } catch(DbException e) { - db.abortTransaction(txn); - throw e; + T txn = db.startTransaction(); + try { + if(!db.containsSubscription(txn, g)) + throw new NoSuchSubscriptionException(); + Collection headers = + db.getMessageHeaders(txn, g); + db.commitTransaction(txn); + return headers; + } catch(DbException e) { + db.abortTransaction(txn); + throw e; + } + } finally { + subscriptionLock.readLock().unlock(); } } finally { - subscriptionLock.readLock().unlock(); + ratingLock.readLock().unlock(); } } finally { messageLock.readLock().unlock();