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

Reply via email to