diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java index 79ff4473b578a0ce5bc73d0eda879fd58532bf90..255a5af2ebeee5a4a8a95234ed57c44acfdfd6de 100644 --- a/briar-core/src/org/briarproject/db/Database.java +++ b/briar-core/src/org/briarproject/db/Database.java @@ -77,6 +77,15 @@ interface Database<T> { */ void commitTransaction(T txn) throws DbException; + /** + * Returns the number of transactions started since the transaction count + * was last reset. + */ + int getTransactionCount(); + + /** Resets the transaction count. */ + void resetTransactionCount(); + /** * Stores a contact associated with the given local and remote pseudonyms, * and returns an ID for the contact. diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java index 0cd93423535b8ea24da14e4150774ff63cf02515..106e8cab018b516fd7106ab32ae9ae11ee89476c 100644 --- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java +++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java @@ -4,9 +4,8 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static org.briarproject.db.DatabaseConstants.BYTES_PER_SWEEP; import static org.briarproject.db.DatabaseConstants.CRITICAL_FREE_SPACE; -import static org.briarproject.db.DatabaseConstants.MAX_BYTES_BETWEEN_SPACE_CHECKS; -import static org.briarproject.db.DatabaseConstants.MAX_MS_BETWEEN_SPACE_CHECKS; import static org.briarproject.db.DatabaseConstants.MAX_OFFERED_MESSAGES; +import static org.briarproject.db.DatabaseConstants.MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS; import static org.briarproject.db.DatabaseConstants.MIN_FREE_SPACE; import java.io.IOException; @@ -120,10 +119,6 @@ DatabaseCleaner.Callback { private final Collection<EventListener> listeners = new CopyOnWriteArrayList<EventListener>(); - private final Object spaceLock = new Object(); - private long bytesStoredSinceLastCheck = 0; // Locking: spaceLock - private long timeOfLastCheck = 0; // Locking: spaceLock - private final Object openCloseLock = new Object(); private boolean open = false; // Locking: openCloseLock; private int shutdownHandle = -1; // Locking: openCloseLock; @@ -403,10 +398,6 @@ DatabaseCleaner.Callback { db.addStatus(txn, c, m.getId(), false, false); } } - // Count the bytes stored - synchronized(spaceLock) { - bytesStoredSinceLastCheck += m.getSerialised().length; - } } public void addSecrets(Collection<TemporarySecret> secrets) @@ -1975,14 +1966,9 @@ DatabaseCleaner.Callback { } public boolean shouldCheckFreeSpace() { - synchronized(spaceLock) { - long now = clock.currentTimeMillis(); - if(bytesStoredSinceLastCheck > MAX_BYTES_BETWEEN_SPACE_CHECKS - || now - timeOfLastCheck > MAX_MS_BETWEEN_SPACE_CHECKS) { - bytesStoredSinceLastCheck = 0; - timeOfLastCheck = now; - return true; - } + if(db.getTransactionCount() > MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS) { + db.resetTransactionCount(); + return true; } return false; } diff --git a/briar-core/src/org/briarproject/db/DatabaseConstants.java b/briar-core/src/org/briarproject/db/DatabaseConstants.java index f1c3f3f747f67ed2cf0302b5e966c56e1473db8c..25f325ff4d748b7be538cea3ea5a2fd58d26715a 100644 --- a/briar-core/src/org/briarproject/db/DatabaseConstants.java +++ b/briar-core/src/org/briarproject/db/DatabaseConstants.java @@ -26,16 +26,12 @@ interface DatabaseConstants { long CRITICAL_FREE_SPACE = 10 * 1024 * 1024; // 10 MiB /** - * The amount of free space will be checked whenever this many bytes of - * messages have been added to the database since the last check. + * The amount of free space will be checked whenever this many transactions + * have been started since the last check. + * <p> + * FIXME: Increase this after implementing BTPv2 (smaller packets)? */ - int MAX_BYTES_BETWEEN_SPACE_CHECKS = 1024 * 1024; // 1 MiB - - /** - * The amount of free space will be checked whenever this many milliseconds - * have passed since the last check. - */ - long MAX_MS_BETWEEN_SPACE_CHECKS = 60 * 1000; // 1 min + int MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS = 10; /** * Up to this many bytes of messages will be expired from the database each diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java index 24d97b435b8bb2fa93d3475a0ba735ef84f1f779..ce5f74aab9097a3c24b1dd440bcd9e6d9c65d306 100644 --- a/briar-core/src/org/briarproject/db/JdbcDatabase.java +++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java @@ -22,6 +22,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; import org.briarproject.api.Author; @@ -339,6 +340,8 @@ abstract class JdbcDatabase implements Database<Connection> { private final LinkedList<Connection> connections = new LinkedList<Connection>(); // Locking: self + private final AtomicInteger transactionCount = new AtomicInteger(0); + private int openConnections = 0; // Locking: connections private boolean closed = false; // Locking: connections @@ -498,6 +501,7 @@ abstract class JdbcDatabase implements Database<Connection> { } catch(SQLException e) { throw new DbException(e); } + transactionCount.incrementAndGet(); return txn; } @@ -541,6 +545,14 @@ abstract class JdbcDatabase implements Database<Connection> { } } + public int getTransactionCount() { + return transactionCount.get(); + } + + public void resetTransactionCount() { + transactionCount.set(0); + } + protected void closeAllConnections() throws SQLException { boolean interrupted = false; synchronized(connections) {