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
The following commit(s) were added to refs/heads/master by this push:
new f4dc8e3b7a [CNB] JAMES-4088 Ensure IMAP SELECT EXIST response is up to
date (#2507)
f4dc8e3b7a is described below
commit f4dc8e3b7a6acf063260fe9afc43e82e9c60f5c4
Author: Benoit TELLIER <[email protected]>
AuthorDate: Mon Nov 18 13:12:46 2024 +0700
[CNB] JAMES-4088 Ensure IMAP SELECT EXIST response is up to date (#2507)
This is critical for Mail User Agent like Apple mail relying on
MSN FETCH for resynchronisation. Outdated counters, meant to be
expected with Cassandra implementation would lead to terminal
errors aborting mail resynchronisation.
Instead, use the content of the just loaded selected mailbox,
accurate and piggyback counter asynchronous correction as needed.
---
.../james/mailbox/MailboxCounterCorrector.java | 29 +++++++++++++
.../task/CassandraMailboxCounterCorrector.java | 49 ++++++++++++++++++++++
.../imap/processor/AbstractSelectionProcessor.java | 25 ++++++++---
.../james/imap/processor/DefaultProcessor.java | 6 ++-
.../james/imap/processor/ExamineProcessor.java | 5 ++-
.../james/imap/processor/SelectProcessor.java | 5 ++-
.../main/DefaultImapProcessorFactory.java | 3 +-
.../processor/AbstractSelectionProcessorTest.java | 4 +-
.../james/imap/processor/SelectProcessorTest.java | 5 ++-
.../modules/mailbox/CassandraMailboxModule.java | 4 ++
.../james/modules/mailbox/JPAMailboxModule.java | 2 +
.../james/modules/mailbox/MemoryMailboxModule.java | 2 +
12 files changed, 124 insertions(+), 15 deletions(-)
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java
new file mode 100644
index 0000000000..c1362dd4b9
--- /dev/null
+++
b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxCounterCorrector.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox;
+
+import reactor.core.publisher.Mono;
+
+public interface MailboxCounterCorrector {
+
+ MailboxCounterCorrector DEFAULT = id -> Mono.empty();
+
+ Mono<Void> fixCountersFor(MessageManager mailbox);
+}
diff --git
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java
new file mode 100644
index 0000000000..8e5ded7589
--- /dev/null
+++
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/CassandraMailboxCounterCorrector.java
@@ -0,0 +1,49 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.mailbox.cassandra.mail.task;
+
+import jakarta.inject.Inject;
+
+import org.apache.james.mailbox.MailboxCounterCorrector;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.MailboxException;
+
+import reactor.core.publisher.Mono;
+
+public class CassandraMailboxCounterCorrector implements
MailboxCounterCorrector {
+ private final RecomputeMailboxCountersService service;
+
+ @Inject
+ public CassandraMailboxCounterCorrector(RecomputeMailboxCountersService
service) {
+ this.service = service;
+ }
+
+ @Override
+ public Mono<Void> fixCountersFor(MessageManager mailbox) {
+ try {
+ return service.recomputeMailboxCounter(new
RecomputeMailboxCountersService.Context(),
+ mailbox.getMailboxEntity(),
+
RecomputeMailboxCountersService.Options.trustMessageProjection())
+ .then();
+ } catch (MailboxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index 1ca548e699..520f083659 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -52,6 +52,7 @@ import
org.apache.james.imap.message.request.AbstractMailboxSelectionRequest.Cli
import org.apache.james.imap.message.response.ExistsResponse;
import org.apache.james.imap.message.response.RecentResponse;
import org.apache.james.imap.processor.base.SelectedMailboxImpl;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
@@ -78,6 +79,7 @@ import com.google.common.collect.ImmutableList;
import io.vavr.Tuple;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
abstract class AbstractSelectionProcessor<R extends
AbstractMailboxSelectionRequest> extends AbstractMailboxProcessor<R> implements
PermitEnableCapabilityProcessor {
private static final Logger LOGGER =
LoggerFactory.getLogger(AbstractSelectionProcessor.class);
@@ -88,15 +90,17 @@ abstract class AbstractSelectionProcessor<R extends
AbstractMailboxSelectionRequ
private final PathConverter.Factory pathConverterFactory;
private final boolean openReadOnly;
private final EventBus eventBus;
+ private final MailboxCounterCorrector mailboxCounterCorrector;
public AbstractSelectionProcessor(Class<R> acceptableClass, MailboxManager
mailboxManager, StatusResponseFactory statusResponseFactory,
PathConverter.Factory pathConverterFactory, boolean openReadOnly,
- MetricFactory metricFactory, EventBus
eventBus) {
+ MetricFactory metricFactory, EventBus
eventBus, MailboxCounterCorrector mailboxCounterCorrector) {
super(acceptableClass, mailboxManager, statusResponseFactory,
metricFactory);
this.statusResponseFactory = statusResponseFactory;
this.pathConverterFactory = pathConverterFactory;
this.openReadOnly = openReadOnly;
this.eventBus = eventBus;
+ this.mailboxCounterCorrector = mailboxCounterCorrector;
}
@Override
@@ -140,7 +144,7 @@ abstract class AbstractSelectionProcessor<R extends
AbstractMailboxSelectionRequ
mailboxId(responder, selected.getMailboxId());
flags(responder, selected);
- exists(responder, metaData);
+ exists(responder, metaData, selected);
recent(responder, selected);
uidValidity(responder, metaData);
})
@@ -384,10 +388,19 @@ abstract class AbstractSelectionProcessor<R extends
AbstractMailboxSelectionRequ
responder.respond(recentResponse);
}
- private void exists(Responder responder, MailboxMetaData metaData) {
- final long messageCount = metaData.getMessageCount();
- final ExistsResponse existsResponse = new ExistsResponse(messageCount);
- responder.respond(existsResponse);
+ private void exists(Responder responder, MailboxMetaData metaData,
SelectedMailbox selectedMailbox) {
+ long messageCount = metaData.getMessageCount();
+ long realMessageCount = selectedMailbox.existsCount();
+
+ responder.respond(new ExistsResponse(realMessageCount));
+
+ if (messageCount != realMessageCount) {
+ LOGGER.warn("Invalid counter for {}, was {} and should have been
{}", selectedMailbox.getMessageManager().getId().serialize(),
+ messageCount, realMessageCount);
+
mailboxCounterCorrector.fixCountersFor(selectedMailbox.getMessageManager())
+ .subscribeOn(Schedulers.parallel())
+ .subscribe();
+ }
}
private void mailboxId(Responder responder, MailboxId mailboxId) {
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java
index c47c7a2eac..2ce7f03091 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/DefaultProcessor.java
@@ -34,6 +34,7 @@ import org.apache.james.imap.main.PathConverter;
import org.apache.james.imap.processor.base.AbstractProcessor;
import org.apache.james.imap.processor.base.ImapResponseMessageProcessor;
import org.apache.james.imap.processor.fetch.FetchProcessor;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -55,6 +56,7 @@ public class DefaultProcessor implements ImapProcessor {
MailboxTyper
mailboxTyper,
QuotaManager
quotaManager,
QuotaRootResolver
quotaRootResolver,
+ MailboxCounterCorrector
mailboxCounterCorrector,
MetricFactory
metricFactory) {
PathConverter.Factory pathConverterFactory =
PathConverter.Factory.DEFAULT;
@@ -76,7 +78,7 @@ public class DefaultProcessor implements ImapProcessor {
builder.add(new AuthenticateProcessor(mailboxManager,
statusResponseFactory, metricFactory, pathConverterFactory));
builder.add(new ExpungeProcessor(mailboxManager,
statusResponseFactory, metricFactory));
builder.add(new ReplaceProcessor(mailboxManager,
statusResponseFactory, metricFactory, pathConverterFactory));
- builder.add(new ExamineProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, pathConverterFactory));
+ builder.add(new ExamineProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, pathConverterFactory,
mailboxCounterCorrector));
builder.add(new AppendProcessor(mailboxManager, statusResponseFactory,
metricFactory, pathConverterFactory));
builder.add(new StoreProcessor(mailboxManager, statusResponseFactory,
metricFactory));
builder.add(new NoopProcessor(mailboxManager, statusResponseFactory,
metricFactory));
@@ -87,7 +89,7 @@ public class DefaultProcessor implements ImapProcessor {
builder.add(new XListProcessor(mailboxManager, statusResponseFactory,
mailboxTyper, metricFactory, subscriptionManager, pathConverterFactory));
builder.add(new ListProcessor<>(mailboxManager, statusResponseFactory,
metricFactory, subscriptionManager, statusProcessor, mailboxTyper,
pathConverterFactory));
builder.add(new SearchProcessor(mailboxManager, statusResponseFactory,
metricFactory));
- builder.add(new SelectProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, pathConverterFactory));
+ builder.add(new SelectProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, pathConverterFactory,
mailboxCounterCorrector));
builder.add(new NamespaceProcessor(mailboxManager,
statusResponseFactory, metricFactory, new NamespaceSupplier.Default()));
builder.add(new FetchProcessor(mailboxManager, statusResponseFactory,
metricFactory));
builder.add(new StartTLSProcessor(statusResponseFactory));
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java
index 6a03f55db8..6ea665c8c4 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExamineProcessor.java
@@ -30,6 +30,7 @@ import org.apache.james.imap.api.message.UidRange;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.main.PathConverter;
import org.apache.james.imap.message.request.ExamineRequest;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.metrics.api.MetricFactory;
import org.apache.james.util.MDCBuilder;
@@ -38,8 +39,8 @@ public class ExamineProcessor extends
AbstractSelectionProcessor<ExamineRequest>
@Inject
public ExamineProcessor(MailboxManager mailboxManager, EventBus eventBus,
StatusResponseFactory statusResponseFactory,
- MetricFactory metricFactory, PathConverter.Factory
pathConverterFactory) {
- super(ExamineRequest.class, mailboxManager, statusResponseFactory,
pathConverterFactory, true, metricFactory, eventBus);
+ MetricFactory metricFactory, PathConverter.Factory
pathConverterFactory, MailboxCounterCorrector mailboxCounterCorrector) {
+ super(ExamineRequest.class, mailboxManager, statusResponseFactory,
pathConverterFactory, true, metricFactory, eventBus, mailboxCounterCorrector);
}
@Override
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java
index fdfd4960e6..8cca1a1dbe 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/SelectProcessor.java
@@ -30,6 +30,7 @@ import org.apache.james.imap.api.message.UidRange;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.main.PathConverter;
import org.apache.james.imap.message.request.SelectRequest;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.metrics.api.MetricFactory;
import org.apache.james.util.MDCBuilder;
@@ -38,8 +39,8 @@ public class SelectProcessor extends
AbstractSelectionProcessor<SelectRequest> {
@Inject
public SelectProcessor(MailboxManager mailboxManager, EventBus eventBus,
StatusResponseFactory statusResponseFactory,
- MetricFactory metricFactory, PathConverter.Factory
pathConverterFactory) {
- super(SelectRequest.class, mailboxManager, statusResponseFactory,
pathConverterFactory, false, metricFactory, eventBus);
+ MetricFactory metricFactory, PathConverter.Factory
pathConverterFactory, MailboxCounterCorrector mailboxCounterCorrector) {
+ super(SelectRequest.class, mailboxManager, statusResponseFactory,
pathConverterFactory, false, metricFactory, eventBus, mailboxCounterCorrector);
}
@Override
diff --git
a/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
b/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
index 20d94041ce..95513bfc4e 100644
---
a/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
+++
b/protocols/imap/src/main/java/org/apache/james/imap/processor/main/DefaultImapProcessorFactory.java
@@ -27,6 +27,7 @@ import org.apache.james.imap.api.process.MailboxTyper;
import org.apache.james.imap.message.response.UnpooledStatusResponseFactory;
import org.apache.james.imap.processor.DefaultProcessor;
import org.apache.james.imap.processor.base.UnknownRequestProcessor;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -48,7 +49,7 @@ public class DefaultImapProcessorFactory {
UnknownRequestProcessor unknownRequestImapProcessor = new
UnknownRequestProcessor(statusResponseFactory);
return
DefaultProcessor.createDefaultProcessor(unknownRequestImapProcessor,
mailboxManager,
- eventBus, subscriptionManager, statusResponseFactory,
mailboxTyper, quotaManager, quotaRootResolver, metricFactory);
+ eventBus, subscriptionManager, statusResponseFactory,
mailboxTyper, quotaManager, quotaRootResolver, MailboxCounterCorrector.DEFAULT,
metricFactory);
}
}
diff --git
a/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java
b/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java
index 67f886a2fe..03d9b759be 100644
---
a/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java
+++
b/protocols/imap/src/test/java/org/apache/james/imap/processor/AbstractSelectionProcessorTest.java
@@ -31,6 +31,7 @@ import org.apache.james.imap.api.message.UidRange;
import org.apache.james.imap.api.message.response.StatusResponseFactory;
import org.apache.james.imap.api.process.SelectedMailbox;
import org.apache.james.imap.main.PathConverter;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.metrics.api.MetricFactory;
@@ -46,7 +47,8 @@ public class AbstractSelectionProcessorTest {
EventBus eventBus = null;
StatusResponseFactory statusResponseFactory = null;
MetricFactory metricFactory = null;
- testee = new SelectProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, PathConverter.Factory.DEFAULT);
+ MailboxCounterCorrector mailboxCounterCorrector = null;
+ testee = new SelectProcessor(mailboxManager, eventBus,
statusResponseFactory, metricFactory, PathConverter.Factory.DEFAULT,
mailboxCounterCorrector);
}
@Test
diff --git
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java
index a0e339baf0..386f652d7c 100644
---
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java
+++
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SelectProcessorTest.java
@@ -41,6 +41,7 @@ import org.apache.james.imap.main.ResponseEncoder;
import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest;
import org.apache.james.imap.message.request.SelectRequest;
import org.apache.james.imap.message.response.UnpooledStatusResponseFactory;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
@@ -66,11 +67,13 @@ class SelectProcessorTest {
InMemoryIntegrationResources integrationResources =
InMemoryIntegrationResources.defaultResources();
mailboxManager = integrationResources.getMailboxManager();
+ MailboxCounterCorrector mailboxCounterCorrector = null;
testee = new SelectProcessor(mailboxManager,
integrationResources.getEventBus(),
new UnpooledStatusResponseFactory(),
new RecordingMetricFactory(),
- PathConverter.Factory.DEFAULT);
+ PathConverter.Factory.DEFAULT,
+ mailboxCounterCorrector);
mailboxSession =
mailboxManager.createSystemSession(Username.of("bob"));
mailboxManager.createMailbox(MailboxPath.inbox(BOB), mailboxSession);
diff --git
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index e9a03a74aa..f0f93b5908 100644
---
a/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++
b/server/container/guice/cassandra/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -55,6 +55,7 @@ import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.AttachmentIdFactory;
import org.apache.james.mailbox.AttachmentManager;
import org.apache.james.mailbox.Authenticator;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MessageIdManager;
@@ -89,6 +90,7 @@ import
org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
import org.apache.james.mailbox.cassandra.mail.MessageBlobReferenceSource;
import org.apache.james.mailbox.cassandra.mail.eventsourcing.acl.ACLModule;
+import
org.apache.james.mailbox.cassandra.mail.task.CassandraMailboxCounterCorrector;
import org.apache.james.mailbox.cassandra.modules.CassandraAclModule;
import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
import
org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
@@ -180,6 +182,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON);
bind(EmailChangeRepositoryDAO.class).in(Scopes.SINGLETON);
bind(MailboxChangeRepositoryDAO.class).in(Scopes.SINGLETON);
+ bind(CassandraMailboxCounterCorrector.class).in(Scopes.SINGLETON);
bind(ReIndexerImpl.class).in(Scopes.SINGLETON);
bind(MessageIdReIndexerImpl.class).in(Scopes.SINGLETON);
@@ -211,6 +214,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(RightManager.class).to(StoreRightManager.class);
bind(SessionProvider.class).to(SessionProviderImpl.class);
bind(AttachmentContentLoader.class).to(AttachmentManager.class);
+
bind(MailboxCounterCorrector.class).to(CassandraMailboxCounterCorrector.class);
bind(Limit.class).annotatedWith(Names.named(CassandraEmailChangeRepository.LIMIT_NAME)).toInstance(Limit.of(256));
bind(Limit.class).annotatedWith(Names.named(CassandraMailboxChangeRepository.LIMIT_NAME)).toInstance(Limit.of(256));
diff --git
a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index 0a872673ed..f9150f564d 100644
---
a/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++
b/server/container/guice/mailbox-jpa/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.AttachmentIdFactory;
import org.apache.james.mailbox.Authenticator;
import org.apache.james.mailbox.Authorizator;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.SessionProvider;
@@ -120,6 +121,7 @@ public class JPAMailboxModule extends AbstractModule {
bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
bind(AttachmentIdFactory.class).to(StringBackedAttachmentIdFactory.class);
bind(AttachmentContentLoader.class).to(JPAAttachmentContentLoader.class);
+
bind(MailboxCounterCorrector.class).toInstance(MailboxCounterCorrector.DEFAULT);
bind(ReIndexer.class).to(ReIndexerImpl.class);
diff --git
a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 09746e8e9b..5fbb80e4ce 100644
---
a/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++
b/server/container/guice/memory/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.AttachmentIdFactory;
import org.apache.james.mailbox.AttachmentManager;
import org.apache.james.mailbox.Authenticator;
import org.apache.james.mailbox.Authorizator;
+import org.apache.james.mailbox.MailboxCounterCorrector;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.MessageIdManager;
@@ -131,6 +132,7 @@ public class MemoryMailboxModule extends AbstractModule {
bind(AttachmentContentLoader.class).to(AttachmentManager.class);
bind(DeletedMessageMetadataVault.class).to(MemoryDeletedMessageMetadataVault.class);
+
bind(MailboxCounterCorrector.class).toInstance(MailboxCounterCorrector.DEFAULT);
bind(InMemoryMailboxSessionMapperFactory.class).in(Scopes.SINGLETON);
bind(InMemoryModSeqProvider.class).in(Scopes.SINGLETON);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]