diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java index 25424a216..c1db5697d 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImpl.java @@ -158,6 +158,12 @@ class MailboxPropertyManagerImpl implements MailboxPropertyManager, BdfList body = clientHelper.getMessageAsList(txn, m.getId()); MailboxPropertiesUpdate p = parseProperties(body); txn.attach(new RemoteMailboxPropertiesUpdateEvent(c, p)); + // Reset message retransmission timers for the contact. Avoiding + // messages getting stranded: + // - on our mailbox, if they now have a mailbox but didn't before + // - on the contact's old mailbox, if they removed their mailbox + // - on the contact's old mailbox, if they replaced their mailbox + db.resetUnackedMessagesToSend(txn, c); } catch (FormatException e) { throw new InvalidMessageException(e); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java index dd8825455..217dfd62f 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxPropertyManagerImplTest.java @@ -281,6 +281,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { public void testDoesNotDeleteAnythingWhenFirstUpdateIsDelivered() throws Exception { Transaction txn = new Transaction(null, false); + Contact contact = getContact(); GroupId contactGroupId = new GroupId(getRandomId()); Message message = getMessage(contactGroupId); BdfList body = BdfList.of(1, propsDict); @@ -304,11 +305,13 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { contactGroupId); will(returnValue(messageMetadata)); oneOf(clientHelper).getContactId(txn, contactGroupId); + will(returnValue(contact.getId())); oneOf(clientHelper).getMessageAsList(txn, message.getId()); will(returnValue(body)); oneOf(clientHelper).parseAndValidateMailboxPropertiesUpdate( propsDict); will(returnValue(props)); + oneOf(db).resetUnackedMessagesToSend(txn, contact.getId()); }}); MailboxPropertyManagerImpl t = createInstance(); @@ -321,6 +324,7 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { public void testDeletesOlderUpdateWhenUpdateIsDelivered() throws Exception { Transaction txn = new Transaction(null, false); + Contact contact = getContact(); GroupId contactGroupId = new GroupId(getRandomId()); Message message = getMessage(contactGroupId); BdfList body = BdfList.of(1, propsDict); @@ -352,11 +356,13 @@ public class MailboxPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).deleteMessage(txn, updateId); oneOf(db).deleteMessageMetadata(txn, updateId); oneOf(clientHelper).getContactId(txn, contactGroupId); + will(returnValue(contact.getId())); oneOf(clientHelper).getMessageAsList(txn, message.getId()); will(returnValue(body)); oneOf(clientHelper).parseAndValidateMailboxPropertiesUpdate( propsDict); will(returnValue(props)); + oneOf(db).resetUnackedMessagesToSend(txn, contact.getId()); }}); MailboxPropertyManagerImpl t = createInstance();