diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 53ed7416a..0d055641a 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -314,16 +314,6 @@ public interface DatabaseComponent extends TransactionManager { */ Message getMessage(Transaction txn, MessageId m) throws DbException; - /** - * Returns the total length, including headers, of any messages that are - * eligible to be sent to the given contact via a transport with the given - * max latency. - *

- * Read-only. - */ - long getMessageBytesToSend(Transaction txn, ContactId c, int maxLatency) - throws DbException; - /** * Returns the IDs of all delivered messages in the given group. *

@@ -469,6 +459,16 @@ public interface DatabaseComponent extends TransactionManager { Map getUnackedMessagesToSend(Transaction txn, ContactId c) throws DbException; + /** + * Returns the total length, including headers, of all messages that are + * eligible to be sent to the given contact. This may include messages + * that have already been sent and are not yet due for retransmission. + *

+ * Read-only. + */ + long getUnackedMessageBytesToSend(Transaction txn, ContactId c) + throws DbException; + /** * Returns the next time (in milliseconds since the Unix epoch) when a * message is due to be deleted, or {@link #NO_CLEANUP_DEADLINE} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java index cb386ab5c..64f54f19b 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java @@ -357,16 +357,6 @@ interface Database { */ Message getMessage(T txn, MessageId m) throws DbException; - /** - * Returns the total length, including headers, of any messages that are - * eligible to be sent to the given contact via a transport with the given - * max latency. - *

- * Read-only. - */ - long getMessageBytesToSend(T txn, ContactId c, int maxLatency) - throws DbException; - /** * Returns the IDs and states of all dependencies of the given message. * For missing dependencies and dependencies in other groups, the state @@ -518,6 +508,15 @@ interface Database { Map getUnackedMessagesToSend(T txn, ContactId c) throws DbException; + /** + * Returns the total length, including headers, of all messages that are + * eligible to be sent to the given contact. This may include messages + * that have already been sent and are not yet due for retransmission. + *

+ * Read-only. + */ + long getUnackedMessageBytesToSend(T txn, ContactId c) throws DbException; + /** * Returns the IDs of any messages that need to be validated. *

diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index d4c8ef682..c92245acd 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -608,15 +608,6 @@ class DatabaseComponentImpl implements DatabaseComponent { return db.getMessage(txn, m); } - @Override - public long getMessageBytesToSend(Transaction transaction, ContactId c, - int maxLatency) throws DbException { - T txn = unbox(transaction); - if (!db.containsContact(txn, c)) - throw new NoSuchContactException(); - return db.getMessageBytesToSend(txn, c, maxLatency); - } - @Override public Collection getMessageIds(Transaction transaction, GroupId g) throws DbException { @@ -750,6 +741,15 @@ class DatabaseComponentImpl implements DatabaseComponent { return db.getUnackedMessagesToSend(txn, c); } + @Override + public long getUnackedMessageBytesToSend(Transaction transaction, + ContactId c) throws DbException { + T txn = unbox(transaction); + if (!db.containsContact(txn, c)) + throw new NoSuchContactException(); + return db.getUnackedMessageBytesToSend(txn, c); + } + @Override public Map getMessageDependencies( Transaction transaction, MessageId m) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 32212193b..c77010b82 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -1788,37 +1788,6 @@ abstract class JdbcDatabase implements Database { } } - @Override - public long getMessageBytesToSend(Connection txn, ContactId c, - int maxLatency) throws DbException { - long now = clock.currentTimeMillis(); - long eta = now + maxLatency; - PreparedStatement ps = null; - ResultSet rs = null; - try { - String sql = "SELECT SUM(length) FROM statuses" - + " WHERE contactId = ? AND state = ?" - + " AND groupShared = TRUE AND messageShared = TRUE" - + " AND deleted = FALSE AND seen = FALSE" - + " AND (expiry <= ? OR eta > ?)"; - ps = txn.prepareStatement(sql); - ps.setInt(1, c.getInt()); - ps.setInt(2, DELIVERED.getValue()); - ps.setLong(3, now); - ps.setLong(4, eta); - rs = ps.executeQuery(); - rs.next(); - long total = rs.getInt(1); - rs.close(); - ps.close(); - return total; - } catch (SQLException e) { - tryToClose(rs, LOG, WARNING); - tryToClose(ps, LOG, WARNING); - throw new DbException(e); - } - } - @Override public Collection getMessageIds(Connection txn, GroupId g) throws DbException { @@ -2297,6 +2266,32 @@ abstract class JdbcDatabase implements Database { } } + @Override + public long getUnackedMessageBytesToSend(Connection txn, ContactId c) + throws DbException { + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = "SELECT SUM(length) FROM statuses" + + " WHERE contactId = ? AND state = ?" + + " AND groupShared = TRUE AND messageShared = TRUE" + + " AND deleted = FALSE AND seen = FALSE"; + ps = txn.prepareStatement(sql); + ps.setInt(1, c.getInt()); + ps.setInt(2, DELIVERED.getValue()); + rs = ps.executeQuery(); + rs.next(); + long total = rs.getInt(1); + rs.close(); + ps.close(); + return total; + } catch (SQLException e) { + tryToClose(rs, LOG, WARNING); + tryToClose(ps, LOG, WARNING); + throw new DbException(e); + } + } + @Override public Collection getMessagesToValidate(Connection txn) throws DbException { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java index 563f306fa..1055f9de9 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/file/RemovableDriveWriterTask.java @@ -60,10 +60,9 @@ class RemovableDriveWriterTask extends RemovableDriveTaskImpl setSuccess(false); return; } - int maxLatency = plugin.getMaxLatency(); try { setTotal(db.transactionWithResult(true, txn -> - db.getMessageBytesToSend(txn, contactId, maxLatency))); + db.getUnackedMessageBytesToSend(txn, contactId))); } catch (DbException e) { logException(LOG, WARNING, e); registry.removeWriter(this); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java index 4b53a781d..a46f893ea 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java @@ -358,7 +358,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { try { db.transaction(true, transaction -> - db.getMessageBytesToSend(transaction, contactId, 123)); + db.getUnackedMessageBytesToSend(transaction, contactId)); fail(); } catch (NoSuchContactException expected) { // Expected diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java index 2da33c18d..db6b3411b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java @@ -228,7 +228,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertEquals(singletonList(messageId), ids); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); // Changing the status to seen = true should make the message unsendable db.raiseSeenFlag(txn, contactId, messageId); @@ -236,7 +236,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); db.commitTransaction(txn); db.close(); @@ -261,7 +261,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Marking the message delivered should make it sendable db.setMessageState(txn, messageId, DELIVERED); @@ -270,7 +270,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertEquals(singletonList(messageId), ids); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); // Marking the message invalid should make it unsendable db.setMessageState(txn, messageId, INVALID); @@ -278,7 +278,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Marking the message pending should make it unsendable db.setMessageState(txn, messageId, PENDING); @@ -286,7 +286,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); db.commitTransaction(txn); db.close(); @@ -310,7 +310,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Making the group visible should not make the message sendable db.addGroupVisibility(txn, contactId, groupId, false); @@ -318,7 +318,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Sharing the group should make the message sendable db.setGroupVisibility(txn, contactId, groupId, true); @@ -327,7 +327,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertEquals(singletonList(messageId), ids); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); // Unsharing the group should make the message unsendable db.setGroupVisibility(txn, contactId, groupId, false); @@ -335,7 +335,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Making the group invisible should make the message unsendable db.removeGroupVisibility(txn, contactId, groupId); @@ -343,7 +343,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); db.commitTransaction(txn); db.close(); @@ -368,7 +368,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { assertTrue(ids.isEmpty()); ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertTrue(ids.isEmpty()); - assertEquals(0, db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + assertEquals(0, db.getUnackedMessageBytesToSend(txn, contactId)); // Sharing the message should make it sendable db.setMessageShared(txn, messageId, true); @@ -377,7 +377,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { ids = db.getMessagesToOffer(txn, contactId, 100, MAX_LATENCY); assertEquals(singletonList(messageId), ids); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); db.commitTransaction(txn); db.close(); @@ -402,14 +402,14 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { MAX_LATENCY); assertTrue(ids.isEmpty()); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); // The message is just the right size to send ids = db.getMessagesToSend(txn, contactId, message.getRawLength(), MAX_LATENCY); assertEquals(singletonList(messageId), ids); assertEquals(message.getRawLength(), - db.getMessageBytesToSend(txn, contactId, MAX_LATENCY)); + db.getUnackedMessageBytesToSend(txn, contactId)); db.commitTransaction(txn); db.close();