From 5e0aadd373f6fe3a0c5268f48d2cf4e4f22df910 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Sun, 14 Aug 2011 14:46:12 +0200
Subject: [PATCH] Moved the subscription and transport timestamps out of the
 contacts table so it's not necessary to hold a write lock on the (heavily
 used) contacts table to update them.

---
 .../protocol/writers/SubscriptionWriter.java  |   2 +-
 .../api/protocol/writers/TransportWriter.java |   2 +-
 components/net/sf/briar/db/Database.java      |   4 +-
 components/net/sf/briar/db/JdbcDatabase.java  | 131 ++++++++++++++----
 .../db/ReadWriteLockDatabaseComponent.java    |  13 +-
 .../db/SynchronizedDatabaseComponent.java     |   5 +-
 .../writers/SubscriptionWriterImpl.java       |   2 +-
 .../protocol/writers/TransportWriterImpl.java |   5 +-
 test/net/sf/briar/FileReadWriteTest.java      |   4 +-
 .../sf/briar/db/DatabaseComponentTest.java    |   4 +-
 test/net/sf/briar/db/H2DatabaseTest.java      |   9 --
 .../briar/protocol/ProtocolReadWriteTest.java |   4 +-
 12 files changed, 122 insertions(+), 63 deletions(-)

diff --git a/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java b/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java
index fe88229a9d..2fd582caca 100644
--- a/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java
@@ -9,6 +9,6 @@ import net.sf.briar.api.protocol.Group;
 public interface SubscriptionWriter {
 
 	/** Writes the contents of the update. */
-	void writeSubscriptionUpdate(Map<Group, Long> subs, long timestamp)
+	void writeSubscriptions(Map<Group, Long> subs, long timestamp)
 	throws IOException;
 }
diff --git a/api/net/sf/briar/api/protocol/writers/TransportWriter.java b/api/net/sf/briar/api/protocol/writers/TransportWriter.java
index 70fb8251cf..39257d6bbf 100644
--- a/api/net/sf/briar/api/protocol/writers/TransportWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/TransportWriter.java
@@ -7,6 +7,6 @@ import java.util.Map;
 public interface TransportWriter {
 
 	/** Writes the contents of the update. */
-	void writeTransportUpdate(Map<String, Map<String, String>> transports,
+	void writeTransports(Map<String, Map<String, String>> transports,
 			long timestamp) throws IOException;
 }
diff --git a/components/net/sf/briar/db/Database.java b/components/net/sf/briar/db/Database.java
index 7e8a204262..c2f186e717 100644
--- a/components/net/sf/briar/db/Database.java
+++ b/components/net/sf/briar/db/Database.java
@@ -436,7 +436,7 @@ interface Database<T> {
 	 * Sets the subscriptions for the given contact, replacing any existing
 	 * subscriptions unless the existing subscriptions have a newer timestamp.
 	 * <p>
-	 * Locking: contacts write, subscriptions write.
+	 * Locking: contacts read, subscriptions write.
 	 */
 	void setSubscriptions(T txn, ContactId c, Map<Group, Long> subs,
 			long timestamp) throws DbException;
@@ -464,7 +464,7 @@ interface Database<T> {
 	 * existing properties unless the existing properties have a newer
 	 * timestamp.
 	 * <p>
-	 * Locking: contacts write, transports write.
+	 * Locking: contacts read, transports write.
 	 */
 	void setTransports(T txn, ContactId c,
 			Map<String, Map<String, String>> transports, long timestamp)
diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java
index d0bf3a5d75..dc6f9252e9 100644
--- a/components/net/sf/briar/db/JdbcDatabase.java
+++ b/components/net/sf/briar/db/JdbcDatabase.java
@@ -77,8 +77,6 @@ abstract class JdbcDatabase implements Database<Connection> {
 	private static final String CREATE_CONTACTS =
 		"CREATE TABLE contacts"
 		+ " (contactId INT NOT NULL,"
-		+ " subscriptionsTimestamp BIGINT NOT NULL,"
-		+ " transportsTimestamp BIGINT NOT NULL,"
 		+ " secret BINARY NOT NULL,"
 		+ " PRIMARY KEY (contactId))";
 
@@ -166,26 +164,26 @@ abstract class JdbcDatabase implements Database<Connection> {
 	private static final String CREATE_CONTACT_TRANSPORTS =
 		"CREATE TABLE contactTransports"
 		+ " (contactId INT NOT NULL,"
-		+ " transportName VARCHAR NOT NULL,"
+		+ " name VARCHAR NOT NULL,"
 		+ " key VARCHAR NOT NULL,"
 		+ " value VARCHAR NOT NULL,"
-		+ " PRIMARY KEY (contactId, transportName, key),"
+		+ " PRIMARY KEY (contactId, name, key),"
 		+ " FOREIGN KEY (contactId) REFERENCES contacts (contactId)"
 		+ " ON DELETE CASCADE)";
 
 	private static final String CREATE_TRANSPORTS =
 		"CREATE TABLE transports"
-		+ " (transportName VARCHAR NOT NULL,"
+		+ " (name VARCHAR NOT NULL,"
 		+ " key VARCHAR NOT NULL,"
 		+ " value VARCHAR NOT NULL,"
-		+ " PRIMARY KEY (transportName, key))";
+		+ " PRIMARY KEY (name, key))";
 
 	private static final String CREATE_TRANSPORT_CONFIG =
 		"CREATE TABLE transportConfig"
-		+ " (transportName VARCHAR NOT NULL,"
+		+ " (name VARCHAR NOT NULL,"
 		+ " key VARCHAR NOT NULL,"
 		+ " value VARCHAR NOT NULL,"
-		+ " PRIMARY KEY (transportName, key))";
+		+ " PRIMARY KEY (name, key))";
 
 	private static final String CREATE_CONNECTION_WINDOWS =
 		"CREATE TABLE connectionWindows"
@@ -197,6 +195,24 @@ abstract class JdbcDatabase implements Database<Connection> {
 		+ " FOREIGN KEY (contactId) REFERENCES contacts (contactId)"
 		+ " ON DELETE CASCADE)";
 
+	private static final String CREATE_SUBSCRIPTION_TIMESTAMPS =
+		"CREATE TABLE subscriptionTimestamps"
+		+ " (contactId INT NOT NULL,"
+		+ " sent BIGINT NOT NULL,"
+		+ " received BIGINT NOT NULL,"
+		+ " PRIMARY KEY (contactId),"
+		+ " FOREIGN KEY (contactId) REFERENCES contacts (contactId)"
+		+ " ON DELETE CASCADE)";
+
+	private static final String CREATE_TRANSPORT_TIMESTAMPS =
+		"CREATE TABLE transportTimestamps"
+		+ " (contactId INT NOT NULL,"
+		+ " sent BIGINT NOT NULL,"
+		+ " received BIGINT NOT NULL,"
+		+ " PRIMARY KEY (contactId),"
+		+ " FOREIGN KEY (contactId) REFERENCES contacts (contactId)"
+		+ " ON DELETE CASCADE)";
+
 	private static final Logger LOG =
 		Logger.getLogger(JdbcDatabase.class.getName());
 
@@ -282,6 +298,8 @@ abstract class JdbcDatabase implements Database<Connection> {
 			s.executeUpdate(insertTypeNames(CREATE_TRANSPORTS));
 			s.executeUpdate(insertTypeNames(CREATE_TRANSPORT_CONFIG));
 			s.executeUpdate(insertTypeNames(CREATE_CONNECTION_WINDOWS));
+			s.executeUpdate(insertTypeNames(CREATE_SUBSCRIPTION_TIMESTAMPS));
+			s.executeUpdate(insertTypeNames(CREATE_TRANSPORT_TIMESTAMPS));
 			s.close();
 		} catch(SQLException e) {
 			tryToClose(s);
@@ -450,20 +468,16 @@ abstract class JdbcDatabase implements Database<Connection> {
 			rs.close();
 			ps.close();
 			// Create a new contact row
-			sql = "INSERT INTO contacts (contactId, subscriptionsTimestamp,"
-				+ " transportsTimestamp, secret)"
-				+ " VALUES (?, ?, ?, ?)";
+			sql = "INSERT INTO contacts (contactId, secret) VALUES (?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
-			ps.setLong(2, 0L);
-			ps.setLong(3, 0L);
-			ps.setBytes(4, secret);
+			ps.setBytes(2, secret);
 			int affected = ps.executeUpdate();
 			if(affected != 1) throw new DbStateException();
 			ps.close();
 			// Store the contact's transport properties
 			sql = "INSERT INTO contactTransports"
-				+ " (contactId, transportName, key, value)"
+				+ " (contactId, name, key, value)"
 				+ " VALUES (?, ?, ?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
@@ -483,6 +497,28 @@ abstract class JdbcDatabase implements Database<Connection> {
 				if(batchAffected[i] != 1) throw new DbStateException();
 			}
 			ps.close();
+			// Initialise the subscription timestamps
+			sql = "INSERT INTO subscriptionTimestamps"
+				+ " (contactId, sent, received)"
+				+ " VALUES (?, ?, ?)";
+			ps = txn.prepareStatement(sql);
+			ps.setInt(1, c.getInt());
+			ps.setLong(2, 0L);
+			ps.setLong(3, 0L);
+			affected = ps.executeUpdate();
+			if(affected != 1) throw new DbStateException();
+			ps.close();
+			// Initialise the transport timestamps
+			sql = "INSERT INTO transportTimestamps"
+				+ " (contactId, sent, received)"
+				+ " VALUES (?, ?, ?)";
+			ps = txn.prepareStatement(sql);
+			ps.setInt(1, c.getInt());
+			ps.setLong(2, 0L);
+			ps.setLong(3, 0L);
+			affected = ps.executeUpdate();
+			if(affected != 1) throw new DbStateException();
+			ps.close();
 			return c;
 		} catch(SQLException e) {
 			tryToClose(ps);
@@ -1199,7 +1235,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			String sql = "SELECT key, value FROM transportConfig"
-				+ " WHERE transportName = ?";
+				+ " WHERE name = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setString(1, name);
 			rs = ps.executeQuery();
@@ -1220,9 +1256,8 @@ abstract class JdbcDatabase implements Database<Connection> {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
-			String sql = "SELECT transportName, key, value"
-				+ " FROM transports"
-				+ " ORDER BY transportName";
+			String sql = "SELECT name, key, value FROM transports"
+				+ " ORDER BY name";
 			ps = txn.prepareStatement(sql);
 			rs = ps.executeQuery();
 			Map<String, Map<String, String>> transports =
@@ -1252,10 +1287,9 @@ abstract class JdbcDatabase implements Database<Connection> {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
-			String sql = "SELECT transportName, key, value"
-				+ " FROM contactTransports"
+			String sql = "SELECT name, key, value FROM contactTransports"
 				+ " WHERE contactId = ?"
-				+ " ORDER BY transportName";
+				+ " ORDER BY name";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
 			rs = ps.executeQuery();
@@ -1747,7 +1781,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			// Return if the timestamp isn't fresh
-			String sql = "SELECT subscriptionsTimestamp FROM contacts"
+			String sql = "SELECT received FROM subscriptionTimestamps"
 				+ " WHERE contactId = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
@@ -1786,7 +1820,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			}
 			ps.close();
 			// Update the timestamp
-			sql = "UPDATE contacts SET subscriptionsTimestamp = ?"
+			sql = "UPDATE subscriptionTimestamps SET received = ?"
 				+ " WHERE contactId = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setLong(1, timestamp);
@@ -1800,6 +1834,25 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	public void setSubscriptionTimestamp(Connection txn, ContactId c,
+			long timestamp) throws DbException {
+		PreparedStatement ps = null;
+		try {
+			String sql = "UPDATE subscriptionTimestamps SET sent = ?"
+				+ " WHERE contactId = ? AND sent < ?";
+			ps = txn.prepareStatement(sql);
+			ps.setLong(1, timestamp);
+			ps.setInt(2, c.getInt());
+			ps.setLong(3, timestamp);
+			int affected = ps.executeUpdate();
+			if(affected > 1) throw new DbStateException();
+			ps.close();
+		} catch(SQLException e) {
+			tryToClose(ps);
+			throw new DbException(e);
+		}
+	}
+
 	public void setTransportConfig(Connection txn, String name,
 			Map<String, String> config) throws DbException {
 		setTransportDetails(txn, name, config, "transportConfig");
@@ -1810,13 +1863,13 @@ abstract class JdbcDatabase implements Database<Connection> {
 		PreparedStatement ps = null;
 		try {
 			// Delete any existing details for the named transport
-			String sql = "DELETE FROM " + table + " WHERE transportName = ?";
+			String sql = "DELETE FROM " + table + " WHERE name = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setString(1, name);
 			ps.executeUpdate();
 			ps.close();
 			// Store the new details
-			sql = "INSERT INTO " + table + " (transportName, key, value)"
+			sql = "INSERT INTO " + table + " (name, key, value)"
 			+ " VALUES (?, ?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setString(1, name);
@@ -1850,7 +1903,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			// Return if the timestamp isn't fresh
-			String sql = "SELECT transportsTimestamp FROM contacts"
+			String sql = "SELECT received FROM transportTimestamps"
 				+ " WHERE contactId = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
@@ -1868,8 +1921,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			ps.executeUpdate();
 			ps.close();
 			// Store the new transports
-			sql = "INSERT INTO contactTransports"
-				+ " (contactId, transportName, key, value)"
+			sql = "INSERT INTO contactTransports (contactId, name, key, value)"
 				+ " VALUES (?, ?, ?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, c.getInt());
@@ -1890,7 +1942,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			}
 			ps.close();
 			// Update the timestamp
-			sql = "UPDATE contacts SET transportsTimestamp = ?"
+			sql = "UPDATE transportTimestamps SET received = ?"
 				+ " WHERE contactId = ?";
 			ps = txn.prepareStatement(sql);
 			ps.setLong(1, timestamp);
@@ -1904,6 +1956,25 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	public void setTransportTimestamp(Connection txn, ContactId c,
+			long timestamp) throws DbException {
+		PreparedStatement ps = null;
+		try {
+			String sql = "UPDATE transportTimestamps SET sent = ?"
+				+ " WHERE contactId = ? AND sent < ?";
+			ps = txn.prepareStatement(sql);
+			ps.setLong(1, timestamp);
+			ps.setInt(2, c.getInt());
+			ps.setLong(3, timestamp);
+			int affected = ps.executeUpdate();
+			if(affected > 1) throw new DbStateException();
+			ps.close();
+		} catch(SQLException e) {
+			tryToClose(ps);
+			throw new DbException(e);
+		}
+	}
+
 	public void setVisibility(Connection txn, GroupId g,
 			Collection<ContactId> visible) throws DbException {
 		PreparedStatement ps = null;
diff --git a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
index adc1e64a46..43b382a26c 100644
--- a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
+++ b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
@@ -445,7 +445,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				Txn txn = db.startTransaction();
 				try {
 					Map<Group, Long> subs = db.getVisibleSubscriptions(txn, c);
-					s.writeSubscriptionUpdate(subs, System.currentTimeMillis());
+					s.writeSubscriptions(subs, System.currentTimeMillis());
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added " + subs.size() + " subscriptions");
 					db.commitTransaction(txn);
@@ -475,8 +475,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				try {
 					Map<String, Map<String, String>> transports =
 						db.getTransports(txn);
-					long timestamp = System.currentTimeMillis();
-					t.writeTransportUpdate(transports, timestamp);
+					t.writeTransports(transports, System.currentTimeMillis());
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added " + transports.size() + " transports");
 					db.commitTransaction(txn);
@@ -834,7 +833,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 	public void receiveSubscriptionUpdate(ContactId c, SubscriptionUpdate s)
 	throws DbException {
 		// Update the contact's subscriptions
-		contactLock.writeLock().lock();
+		contactLock.readLock().lock();
 		try {
 			if(!containsContact(c)) throw new NoSuchContactException();
 			subscriptionLock.writeLock().lock();
@@ -854,14 +853,14 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				subscriptionLock.writeLock().unlock();
 			}
 		} finally {
-			contactLock.writeLock().unlock();
+			contactLock.readLock().unlock();
 		}
 	}
 
 	public void receiveTransportUpdate(ContactId c, TransportUpdate t)
 	throws DbException {
 		// Update the contact's transport properties
-		contactLock.writeLock().lock();
+		contactLock.readLock().lock();
 		try {
 			if(!containsContact(c)) throw new NoSuchContactException();
 			transportLock.writeLock().lock();
@@ -883,7 +882,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				transportLock.writeLock().unlock();
 			}
 		} finally {
-			contactLock.writeLock().unlock();
+			contactLock.readLock().unlock();
 		}
 	}
 
diff --git a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
index 5bc52fd67b..42048e12a6 100644
--- a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
+++ b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
@@ -339,7 +339,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				Txn txn = db.startTransaction();
 				try {
 					Map<Group, Long> subs = db.getVisibleSubscriptions(txn, c);
-					s.writeSubscriptionUpdate(subs, System.currentTimeMillis());
+					s.writeSubscriptions(subs, System.currentTimeMillis());
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added " + subs.size() + " subscriptions");
 					db.commitTransaction(txn);
@@ -363,8 +363,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 				try {
 					Map<String, Map<String, String>> transports =
 						db.getTransports(txn);
-					long timestamp = System.currentTimeMillis();
-					t.writeTransportUpdate(transports, timestamp);
+					t.writeTransports(transports, System.currentTimeMillis());
 					if(LOG.isLoggable(Level.FINE))
 						LOG.fine("Added " + transports.size() + " transports");
 					db.commitTransaction(txn);
diff --git a/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java b/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java
index 9e7d5c6329..ad778ba303 100644
--- a/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java
@@ -20,7 +20,7 @@ class SubscriptionWriterImpl implements SubscriptionWriter {
 		w = writerFactory.createWriter(out);
 	}
 
-	public void writeSubscriptionUpdate(Map<Group, Long> subs, long timestamp)
+	public void writeSubscriptions(Map<Group, Long> subs, long timestamp)
 	throws IOException {
 		w.writeUserDefinedTag(Tags.SUBSCRIPTION_UPDATE);
 		w.writeMap(subs);
diff --git a/components/net/sf/briar/protocol/writers/TransportWriterImpl.java b/components/net/sf/briar/protocol/writers/TransportWriterImpl.java
index aeb74c5e6b..227a45eec9 100644
--- a/components/net/sf/briar/protocol/writers/TransportWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/TransportWriterImpl.java
@@ -20,9 +20,8 @@ class TransportWriterImpl implements TransportWriter {
 		w = writerFactory.createWriter(out);
 	}
 
-	public void writeTransportUpdate(
-			Map<String, Map<String, String>> transports, long timestamp)
-	throws IOException {
+	public void writeTransports(Map<String, Map<String, String>> transports,
+			long timestamp) throws IOException {
 		w.writeUserDefinedTag(Tags.TRANSPORT_UPDATE);
 		w.writeListStart();
 		for(Entry<String, Map<String, String>> e : transports.entrySet()) {
diff --git a/test/net/sf/briar/FileReadWriteTest.java b/test/net/sf/briar/FileReadWriteTest.java
index 64725290bb..14ac71a9c4 100644
--- a/test/net/sf/briar/FileReadWriteTest.java
+++ b/test/net/sf/briar/FileReadWriteTest.java
@@ -172,11 +172,11 @@ public class FileReadWriteTest extends TestCase {
 		Map<Group, Long> subs = new LinkedHashMap<Group, Long>();
 		subs.put(group, 0L);
 		subs.put(group1, 0L);
-		s.writeSubscriptionUpdate(subs, timestamp);
+		s.writeSubscriptions(subs, timestamp);
 		packetWriter.finishPacket();
 
 		TransportWriter t = protocolWriterFactory.createTransportWriter(out);
-		t.writeTransportUpdate(transports, timestamp);
+		t.writeTransports(transports, timestamp);
 		packetWriter.finishPacket();
 
 		out.flush();
diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java
index f1d6eef225..9454785c95 100644
--- a/test/net/sf/briar/db/DatabaseComponentTest.java
+++ b/test/net/sf/briar/db/DatabaseComponentTest.java
@@ -779,7 +779,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).getVisibleSubscriptions(txn, contactId);
 			will(returnValue(Collections.singletonMap(group, 0L)));
 			// Add the subscriptions to the writer
-			oneOf(subscriptionWriter).writeSubscriptionUpdate(
+			oneOf(subscriptionWriter).writeSubscriptions(
 					with(Collections.singletonMap(group, 0L)),
 					with(any(long.class)));
 		}});
@@ -812,7 +812,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).getTransports(txn);
 			will(returnValue(transports));
 			// Add the properties to the writer
-			oneOf(transportWriter).writeTransportUpdate(with(transports),
+			oneOf(transportWriter).writeTransports(with(transports),
 					with(any(long.class)));
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java
index a0f525eb6a..d1e5f076c2 100644
--- a/test/net/sf/briar/db/H2DatabaseTest.java
+++ b/test/net/sf/briar/db/H2DatabaseTest.java
@@ -1200,15 +1200,12 @@ public class H2DatabaseTest extends TestCase {
 		// Add a contact and subscribe to a group
 		assertEquals(contactId, db.addContact(txn, transports, secret));
 		db.addSubscription(txn, group);
-
 		// The group should not be visible to the contact
 		assertEquals(Collections.emptyList(), db.getVisibility(txn, groupId));
-
 		// Make the group visible to the contact
 		db.setVisibility(txn, groupId, Collections.singleton(contactId));
 		assertEquals(Collections.singletonList(contactId),
 				db.getVisibility(txn, groupId));
-
 		// Make the group invisible again
 		db.setVisibility(txn, groupId, Collections.<ContactId>emptySet());
 		assertEquals(Collections.emptyList(), db.getVisibility(txn, groupId));
@@ -1225,10 +1222,8 @@ public class H2DatabaseTest extends TestCase {
 
 		// Add a contact
 		assertEquals(contactId, db.addContact(txn, transports, secret));
-
 		// Get the connection window for a new transport
 		ConnectionWindow w = db.getConnectionWindow(txn, contactId, 123);
-
 		// The connection window should exist and be in the initial state
 		assertNotNull(w);
 		assertEquals(0L, w.getCentre());
@@ -1245,19 +1240,15 @@ public class H2DatabaseTest extends TestCase {
 
 		// Add a contact
 		assertEquals(contactId, db.addContact(txn, transports, secret));
-
 		// Get the connection window for a new transport
 		ConnectionWindow w = db.getConnectionWindow(txn, contactId, 123);
-
 		// The connection window should exist and be in the initial state
 		assertNotNull(w);
 		assertEquals(0L, w.getCentre());
 		assertEquals(0, w.getBitmap());
-
 		// Update the connection window and store it
 		w.setSeen(5L);
 		db.setConnectionWindow(txn, contactId, 123, w);
-
 		// Check that the connection window was stored
 		w = db.getConnectionWindow(txn, contactId, 123);
 		assertNotNull(w);
diff --git a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
index e4cbc879f9..537da36b5e 100644
--- a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
+++ b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
@@ -95,10 +95,10 @@ public class ProtocolReadWriteTest extends TestCase {
 		r.writeRequest(offerId, bitSet, 10);
 
 		SubscriptionWriter s = writerFactory.createSubscriptionWriter(out);
-		s.writeSubscriptionUpdate(subscriptions, timestamp);
+		s.writeSubscriptions(subscriptions, timestamp);
 
 		TransportWriter t = writerFactory.createTransportWriter(out);
-		t.writeTransportUpdate(transports, timestamp);
+		t.writeTransports(transports, timestamp);
 
 		// Read
 		ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-- 
GitLab