From a94867907fcd81bf8db60ed7ea58f0fe88a028ef Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
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 0dc1c9d360..5ed55973f3 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<T> {
 	/**
 	 * Returns the headers of all messages in the given group.
 	 * <p>
-	 * Locking: message read.
+	 * Locking: message read, rating read.
 	 */
 	Collection<GroupMessageHeader> 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 15c3013352..6fa43393b2 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<GroupMessageHeader> 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<GroupMessageHeader> 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();
-- 
GitLab