You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2020/08/26 03:08:20 UTC
[james-project] 01/03: JAMES-3364 DeletedMessageVault: deleting
many messages dead-locks
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 23fa274b00588ada8866836a40b0e6315ca88e24
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Aug 25 15:55:03 2020 +0700
JAMES-3364 DeletedMessageVault: deleting many messages dead-locks
---
.../apache/james/vault/DeletedMessageVaultHook.java | 21 +--------------------
.../james/vault/DeletedMessageVaultHookTest.java | 16 ++++++++++++++++
2 files changed, 17 insertions(+), 20 deletions(-)
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
index 72cc971..d357649 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageVaultHook.java
@@ -50,19 +50,6 @@ import reactor.core.publisher.Mono;
public class DeletedMessageVaultHook implements PreDeletionHook {
static class DeletedMessageMailboxContext {
- private static DeletedMessageMailboxContext combine(DeletedMessageMailboxContext first, DeletedMessageMailboxContext second) {
- Preconditions.checkArgument(first.messageId.equals(second.getMessageId()));
- Preconditions.checkArgument(first.owner.equals(second.getOwner()));
-
- return new DeletedMessageMailboxContext(
- first.messageId,
- first.owner,
- ImmutableList.<MailboxId>builder()
- .addAll(first.ownerMailboxes)
- .addAll(second.ownerMailboxes)
- .build());
- }
-
private final MessageId messageId;
private final Username owner;
private final List<MailboxId> ownerMailboxes;
@@ -146,9 +133,7 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
private Flux<DeletedMessageMailboxContext> groupMetadataByOwnerAndMessageId(DeleteOperation deleteOperation) {
return Flux.fromIterable(deleteOperation.getDeletionMetadataList())
.groupBy(MetadataWithMailboxId::getMailboxId)
- .flatMap(this::addOwnerToMetadata)
- .groupBy(this::toMessageIdUserPair)
- .flatMap(groupFlux -> groupFlux.reduce(DeletedMessageMailboxContext::combine));
+ .flatMap(this::addOwnerToMetadata);
}
private Flux<DeletedMessageMailboxContext> addOwnerToMetadata(GroupedFlux<MailboxId, MetadataWithMailboxId> groupedFlux) {
@@ -157,10 +142,6 @@ public class DeletedMessageVaultHook implements PreDeletionHook {
new DeletedMessageMailboxContext(metadata.getMessageMetaData().getMessageId(), owner, ImmutableList.of(metadata.getMailboxId()))));
}
- private Pair<MessageId, Username> toMessageIdUserPair(DeletedMessageMailboxContext deletedMessageMetadata) {
- return Pair.of(deletedMessageMetadata.getMessageId(), deletedMessageMetadata.getOwner());
- }
-
private Mono<Username> retrieveMailboxUser(MailboxId mailboxId) {
return mapperFactory.getMailboxMapper(session)
.findMailboxById(mailboxId)
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
index 688574f..12165b6 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
@@ -23,11 +23,13 @@ import static org.apache.james.vault.DeletedMessageFixture.DELETION_DATE;
import static org.apache.james.vault.DeletedMessageFixture.DELIVERY_DATE;
import static org.apache.james.vault.DeletedMessageFixture.INTERNAL_DATE;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
import java.nio.charset.StandardCharsets;
import java.time.Clock;
import java.time.ZoneOffset;
import java.util.List;
+import java.util.stream.IntStream;
import org.apache.james.blob.api.HashBlobId;
import org.apache.james.blob.memory.MemoryDumbBlobStore;
@@ -58,6 +60,7 @@ import org.apache.james.vault.search.Query;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import com.github.fge.lambdas.Throwing;
import com.github.steveash.guavate.Guavate;
import com.google.common.collect.ImmutableList;
@@ -164,6 +167,19 @@ class DeletedMessageVaultHookTest {
}
@Test
+ void deletingManyMessagesShouldSucceed() throws Exception {
+ MailboxId aliceMailbox = mailboxManager.createMailbox(MAILBOX_ALICE_ONE, aliceSession).get();
+ MessageManager messageManager = mailboxManager.getMailbox(aliceMailbox, aliceSession);
+
+ ImmutableList<MessageId> ids = IntStream.range(0, 1000)
+ .mapToObj(Throwing.intFunction(i -> appendMessage(messageManager).getMessageId()))
+ .collect(Guavate.toImmutableList());
+
+ assertThatCode(() -> messageIdManager.delete(ids, aliceSession))
+ .doesNotThrowAnyException();
+ }
+
+ @Test
void notifyDeleteShouldAppendMessageToVaultOfMailboxOwnerWhenOtherUserDeleteMessageInSharingMailbox() throws Exception {
MailboxId aliceMailbox = mailboxManager.createMailbox(MAILBOX_ALICE_ONE, aliceSession).get();
MessageManager aliceMessageManager = mailboxManager.getMailbox(aliceMailbox, aliceSession);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org