This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit dc5ecc7e0dc1ae95063ccb82eb38b2338729d34a Author: Benoit Tellier <btell...@linagora.com> AuthorDate: Wed Jul 22 14:08:56 2020 +0700 JAMES-3177 Applicable flags updates needs to be thread safe --- .../imap/processor/base/SelectedMailboxImpl.java | 23 +++++++++++++++------- .../processor/base/SelectedMailboxImplTest.java | 3 --- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java index 91fe286..1c8d8db 100644 --- a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java +++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java @@ -122,12 +122,13 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener { private final Set<MessageUid> flagUpdateUids = new TreeSet<>(); private final Flags.Flag uninterestingFlag = Flags.Flag.RECENT; private final Set<MessageUid> expungedUids = new TreeSet<>(); + private final Object applicableFlagsLock = new Object(); private boolean recentUidRemoved = false; private boolean isDeletedByOtherSession = false; private boolean sizeChanged = false; private boolean silentFlagChanges = false; - private ApplicableFlags applicableFlags; + private ApplicableFlags applicableFlags = ApplicableFlags.from(new Flags()); public SelectedMailboxImpl(MailboxManager mailboxManager, EventBus eventBus, ImapSession session, MessageManager messageManager) throws MailboxException { this.session = session; @@ -147,7 +148,9 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener { .subscribeOn(Schedulers.elastic()) .block(); - applicableFlags = ApplicableFlags.from(messageManager.getApplicableFlags(mailboxSession)); + synchronized (applicableFlagsLock) { + applicableFlags = applicableFlags.updateWithNewFlags(messageManager.getApplicableFlags(mailboxSession)); + } try (Stream<MessageUid> stream = messageManager.search(SearchQuery.of(SearchQuery.all()), mailboxSession)) { uidMsnConverter.addAll(stream.collect(Guavate.toImmutableList())); } @@ -236,7 +239,9 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener { sizeChanged = false; flagUpdateUids.clear(); isDeletedByOtherSession = false; - applicableFlags = applicableFlags.ackUpdates(); + synchronized (applicableFlagsLock) { + applicableFlags = applicableFlags.ackUpdates(); + } } @Override @@ -340,20 +345,22 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener { } @Override - public synchronized Flags getApplicableFlags() { + public Flags getApplicableFlags() { return applicableFlags.flags(); } @Override - public synchronized boolean hasNewApplicableFlags() { + public boolean hasNewApplicableFlags() { return applicableFlags.updated(); } @Override public synchronized void resetNewApplicableFlags() { - applicableFlags = applicableFlags.ackUpdates(); + synchronized (applicableFlagsLock) { + applicableFlags = applicableFlags.ackUpdates(); + } } @@ -426,7 +433,9 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener { } } } - applicableFlags = updateApplicableFlags(applicableFlags, updated); + synchronized (applicableFlagsLock) { + applicableFlags = updateApplicableFlags(applicableFlags, updated); + } return VOID; } diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java index 679add3..02fd802 100644 --- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java +++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java @@ -66,7 +66,6 @@ import org.apache.james.mailbox.store.mail.model.DefaultMessageId; import org.apache.james.util.concurrent.NamedThreadFactory; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.stubbing.Answer; @@ -145,7 +144,6 @@ class SelectedMailboxImplTest { assertThat(selectedMailbox.getLastUid().get()).isEqualTo(EMITTED_EVENT_UID); } - @Disabled("JAMES-3177 SelectedMailboxImpl is not thread safe") @Test void customFlagsEventShouldNotFailWhenConcurrentWithCreation() throws Exception { AtomicInteger successCount = new AtomicInteger(0); @@ -158,7 +156,6 @@ class SelectedMailboxImplTest { assertThat(successCount.get()).isEqualTo(1); } - @Disabled("JAMES-3177 SelectedMailboxImpl is not thread safe") @Test void applicableFlagsShouldBeWellUpdatedWhenConcurrentWithCreation() throws Exception { AtomicInteger successCount = new AtomicInteger(0); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org