private void run(TaskExecutionDetails executionDetails, Task task, Consumer<TaskId> callback) { TaskExecutionDetails started = executionDetails.start(); idToExecutionDetails.put(started.getTaskId(), started); try { task.run() .onComplete(() -> success(started)) .onFailure(() -> failed(started, logger -> logger.info("Task was partially performed. Check logs for more details"))); } catch (Exception e) { failed(started, logger -> logger.error("Error while running task", executionDetails, e)); } finally { idToFuture.remove(executionDetails.getTaskId()); callback.accept(executionDetails.getTaskId()); } }
@Test void userReIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(User.fromUsername(USERNAME)).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
@Test void reIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(INBOX).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
@Test void mailboxPathUserShouldBeUsedWhenReIndexing() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex().run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
@Test void reIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(createdMessage.getMessageId()).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getComposedMessageIdWithMetaData().getComposedMessageId().getMessageId() .equals(createdMessage.getMessageId())); }
@Test void messageReIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(INBOX, createdMessage.getUid()).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); } }
@Test void reIndexShouldBeWellPerformed() throws Exception { // Given a mailbox with 1000 messages * 150 KB MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); mailboxManager.createMailbox(INBOX, systemSession); byte[] bigBody = (Strings.repeat("header: value\r\n", 10000) + "\r\nbody").getBytes(StandardCharsets.UTF_8); int threadCount = 10; int operationCount = 100; MessageManager mailbox = mailboxManager.getMailbox(INBOX, systemSession); ConcurrentTestRunner.builder() .operation((a, b) -> mailbox .appendMessage( MessageManager.AppendCommand.builder().build(bigBody), systemSession)) .threadCount(threadCount) .operationCount(operationCount) .runSuccessfullyWithin(Duration.ofMinutes(10)); // When We re-index reIndexer.reIndex(INBOX).run(); // The indexer is called for each message verify(messageSearchIndex).deleteAll(any(MailboxSession.class), any(Mailbox.class)); verify(messageSearchIndex, times(threadCount * operationCount)) .add(any(MailboxSession.class), any(Mailbox.class),any(MailboxMessage.class)); verifyNoMoreInteractions(messageSearchIndex); } }