linagora / tmail-backend

GNU Affero General Public License v3.0
31 stars 17 forks source link

Deadletter attempts to use MailboxEventSerializer for TmailContactUserAddedEvent #986

Closed chibenwa closed 2 months ago

chibenwa commented 3 months ago

Description of the bug

Given a little RabbitMQ breakage

cannot dispatch event of type 'TmailContactUserAddedEvent' belonging 'adeline.poiseau@avocat.fr' with id '11d3b71a-20a1-4890-b0c0-fdf01061dddb' to remote groups, store it into dead letter

(timed out to get a connection to the pool)

The following error was raised:

java.lang.RuntimeException: no Scala conversion known
    at org.apache.james.event.json.ScalaConverter$.toScala(MailboxEventSerializer.scala:241)
    at org.apache.james.event.json.JsonSerialize.toJson(MailboxEventSerializer.scala:406)
    at org.apache.james.event.json.MailboxEventSerializer.toJson(MailboxEventSerializer.scala:415)
    at org.apache.james.events.CassandraEventDeadLettersDAO.store(CassandraEventDeadLettersDAO.java:110)
    at org.apache.james.events.CassandraEventDeadLetters.store(CassandraEventDeadLetters.java:47)
    at org.apache.james.events.EventDispatcher.lambda$remoteGroupsDispatch$10(EventDispatcher.java:167)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
    at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:258)
    at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onError(MonoIgnoreElements.java:84)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onError(MonoFlatMapMany.java:204)
    at reactor.core.publisher.MonoUsing$MonoUsingSubscriber.onError(MonoUsing.java:260)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
    at reactor.core.publisher.Operators.error(Operators.java:198)
    at reactor.core.publisher.MonoError.subscribe(MonoError.java:53)
    at reactor.core.publisher.Mono.subscribe(Mono.java:4512)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
    at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:134)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222)
    at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
    at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:296)
    at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:281)
    at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:420)
    at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
    at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:270)
    at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:285)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
    at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
    at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
    Suppressed: java.util.NoSuchElementException: Timeout waiting for idle object
        at org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool.lambda$borrow$8(ReactorRabbitMQChannelPool.java:733)
        at reactor.core.publisher.Mono.lambda$onErrorMap$27(Mono.java:3785)
        at reactor.core.publisher.Mono.lambda$onErrorResume$29(Mono.java:3875)
        at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
        ... 16 common frames omitted

DOD plug the right serializer intead!

Arsnael commented 3 months ago

I noticed the same on pg-app

=> https://github.com/linagora/james-project-private/issues/784#issuecomment-2006714989

Is it a more general issue, related to a recent code change? It seems related to MailboxEventSerializer

EDIT: in your case yes sounds more like a wrong serializer being used. And seems the same in my case too... As something is wrong with the injections

chibenwa commented 3 months ago

As far a I am aware of we might have had (and solved) the same issue for the JMAP event bus.

Arsnael commented 3 months ago

In my case it was more like missing bindings in the postrges app (being hunting them down this week with the team)

For distributed on cnb I am less sure, or we miss a binding there too?

quantranhong1999 commented 3 months ago

I spotted the same error running the distributed app.

vttranlina commented 3 months ago

One more report for this issue: https://github.com/linagora/james-project-private/issues/788#issuecomment-2058221473

It looks to relate to the ContactAutoComplete feature (TmailContactUserAddedEvent, PushListenerGroup, ContactsCollection)

I tried to PostgresLinagoraContactAutoCompleteMethodTest#contactShouldBeIndexedWhenMailing , but it still passes

weird

vttranlina commented 3 months ago

pr: