From 3fcb30c2077ff1d372599bdde178f68efe83be0c Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Fri, 15 Mar 2013 17:28:09 +0000 Subject: [PATCH] Database executor parameters were causing performance problems. --- .../briar/android/groups/GroupActivity.java | 4 +++ .../android/groups/GroupListActivity.java | 29 ++++++++++++++++++- .../messages/ConversationActivity.java | 4 +++ .../messages/ConversationListActivity.java | 12 +++++++- .../src/net/sf/briar/db/DatabaseModule.java | 20 ++----------- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java index dfe597debc..59dbbca49f 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupActivity.java @@ -113,8 +113,12 @@ OnClickListener, OnItemClickListener { // Wait for the service to be bound and started serviceConnection.waitForStartup(); // Load the headers from the database + long now = System.currentTimeMillis(); Collection<GroupMessageHeader> headers = db.getMessageHeaders(groupId); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Load took " + duration + " ms"); // Display the headers in the UI displayHeaders(headers); } catch(NoSuchSubscriptionException e) { diff --git a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java index 5bb2a6c4d5..6921e582fe 100644 --- a/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java +++ b/briar-android/src/net/sf/briar/android/groups/GroupListActivity.java @@ -123,7 +123,11 @@ implements OnClickListener, DatabaseListener { // We'll also need a contact to receive messages from ContactId contactId = db.addContact("Dave"); // Finally, we'll need some authors for the messages + long now = System.currentTimeMillis(); KeyPair keyPair = crypto.generateSignatureKeyPair(); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Key generation took " + duration + " ms"); byte[] publicKey = keyPair.getPublic().getEncoded(); PrivateKey privateKey = keyPair.getPrivate(); Author author = authorFactory.createAuthor("Batman", @@ -150,6 +154,7 @@ implements OnClickListener, DatabaseListener { } Group g = i % 2 == 0 ? group : group1; Message m; + now = System.currentTimeMillis(); if(i % 5 == 0) { m = messageFactory.createAnonymousMessage(null, g, "text/plain", body.getBytes("UTF-8")); @@ -162,9 +167,20 @@ implements OnClickListener, DatabaseListener { g, author1, privateKey, "text/plain", body.getBytes("UTF-8")); } + duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) { + LOG.info("Message creation took " + + duration + " ms"); + } + now = System.currentTimeMillis(); if(Math.random() < 0.5) db.addLocalGroupMessage(m); else db.receiveMessage(contactId, m); db.setReadFlag(m.getId(), i % 4 == 0); + duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) { + LOG.info("Message storage took " + + duration + " ms"); + } } // Insert a non-text message Message m = messageFactory.createAnonymousMessage(null, @@ -214,9 +230,13 @@ implements OnClickListener, DatabaseListener { // Filter out restricted groups if(g.getPublicKey() != null) continue; try { + long now = System.currentTimeMillis(); // Load the headers from the database Collection<GroupMessageHeader> headers = db.getMessageHeaders(g.getId()); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Full load took " + duration + " ms"); // Display the headers in the UI displayHeaders(g, headers); } catch(NoSuchSubscriptionException e) { @@ -312,7 +332,14 @@ implements OnClickListener, DatabaseListener { public void run() { try { serviceConnection.waitForStartup(); - displayHeaders(db.getGroup(g), db.getMessageHeaders(g)); + long now = System.currentTimeMillis(); + Group group = db.getGroup(g); + Collection<GroupMessageHeader> headers = + db.getMessageHeaders(g); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Partial load took " + duration + " ms"); + displayHeaders(group, headers); } catch(NoSuchSubscriptionException e) { if(LOG.isLoggable(INFO)) LOG.info("Subscription removed"); } catch(DbException e) { diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java index c3463dd96a..635eee5940 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationActivity.java @@ -111,8 +111,12 @@ implements DatabaseListener, OnClickListener, OnItemClickListener { // Wait for the service to be bound and started serviceConnection.waitForStartup(); // Load the headers from the database + long now = System.currentTimeMillis(); Collection<PrivateMessageHeader> headers = db.getPrivateMessageHeaders(contactId); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Load took " + duration + " ms"); // Display the headers in the UI displayHeaders(headers); } catch(NoSuchContactException e) { diff --git a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java index caf7a0601a..a6f829e990 100644 --- a/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java +++ b/briar-android/src/net/sf/briar/android/messages/ConversationListActivity.java @@ -173,8 +173,12 @@ implements OnClickListener, DatabaseListener { for(Contact c : db.getContacts()) { try { // Load the headers from the database + long now = System.currentTimeMillis(); Collection<PrivateMessageHeader> headers = db.getPrivateMessageHeaders(c.getId()); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Full load took " + duration + " ms"); // Display the headers in the UI displayHeaders(c, headers); } catch(NoSuchContactException e) { @@ -281,8 +285,14 @@ implements OnClickListener, DatabaseListener { public void run() { try { serviceConnection.waitForStartup(); + long now = System.currentTimeMillis(); Contact contact = db.getContact(c); - displayHeaders(contact, db.getPrivateMessageHeaders(c)); + Collection<PrivateMessageHeader> headers = + db.getPrivateMessageHeaders(c); + long duration = System.currentTimeMillis() - now; + if(LOG.isLoggable(INFO)) + LOG.info("Partial load took " + duration + " ms"); + displayHeaders(contact, headers); } catch(NoSuchContactException e) { if(LOG.isLoggable(INFO)) LOG.info("Contact removed"); } catch(DbException e) { diff --git a/briar-core/src/net/sf/briar/db/DatabaseModule.java b/briar-core/src/net/sf/briar/db/DatabaseModule.java index 1f4829d858..540a2990d3 100644 --- a/briar-core/src/net/sf/briar/db/DatabaseModule.java +++ b/briar-core/src/net/sf/briar/db/DatabaseModule.java @@ -1,12 +1,8 @@ package net.sf.briar.db; -import static java.util.concurrent.TimeUnit.MILLISECONDS; - import java.sql.Connection; -import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.Executors; import net.sf.briar.api.clock.Clock; import net.sf.briar.api.clock.SystemClock; @@ -21,23 +17,11 @@ import com.google.inject.Singleton; public class DatabaseModule extends AbstractModule { - /** The minimum number of database threads to keep in the pool. */ - private static final int MIN_DB_THREADS = 1; - - /** The maximum number of database threads. */ - private static final int MAX_DB_THREADS = 10; - - /** The time in milliseconds to keep unused database threads alive. */ - private static final int DB_KEEPALIVE = 60 * 1000; - @Override protected void configure() { bind(DatabaseCleaner.class).to(DatabaseCleanerImpl.class); - // Database tasks may depend on each other, so use an unbounded queue - BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); bind(Executor.class).annotatedWith(DatabaseExecutor.class).toInstance( - new ThreadPoolExecutor(MIN_DB_THREADS, MAX_DB_THREADS, - DB_KEEPALIVE, MILLISECONDS, queue)); + Executors.newCachedThreadPool()); } @Provides -- GitLab