Hello Jean,

Answers inlined.

On 10/06/2022 15:22, Jean Helou wrote:
I fork the thread to respond on the MailRepository part :D


    > fun quiz can you tell looking
    > only at the documentation and code comments the difference between :
    > MailRepositoryStore, MailRepositoryUrlStore and MailRepository
    all of which
    > are in mailrepository-api  )
    Game accepted.
      - Mail repository is storage for email, with their processing
    context
    (long term storage, differs from mail queue which is a flow).
      - Mail repository are identified by their URL
      - Mail repository can be created through the use of mail repository
    store by supplying an URL
      - MailRepositoryUrlStore is an implementation detail of
    MailRepositoryStore, and brings persistance to mail repositories
    (that
    are created through webadmin, configuration changes etc..)


Almost :D
MailRepositoryStore only has 2 implementations :  in memory and a spring based

If I understand it correctly the MailRepositoryStore is actually a computing cache. Roughly  equivalent to Map<MailRepositoryUrl, MailRepository> with a generic factory method to create the MailRepository when it is not already in the cache.
Yes.
The factory method relies on a statically injected config that maps "protocols" to the FQDN of the corresponding implementation. When the "store" resolves a MailRepository through its MailRepositoryUrl, it retrieves the FQDN from the protocol part of the url then delegates to spring, guice or a static map to actually get the corresponding implementation. The naming Store and InMemory got me mightily confused when I tried to sort this out to inject the blob mail repository store.

MailRepositoryUrls start with a protocol such as cassandra:// blob:// file://, then a repository "id"

The MailRepositoryUrlStore has 3 implementations : cassandra, jpa and inmemory. I am not yet clear on what having a persistent store brings over using the in memory store.

    Now to have a MailRepositoryStore not based on Cassandra, the memory
    implementation is good enough if manual creation of mail
    repository is
    forbidden (akka through webadmin) and if configuration is
    homogeneous in
    the James cluster.


Even if you were to create a mail repository manually, I don't understand how anything would be stored in it if it is not mentioned in the server's configuration (mailet container's config most likely).
One case is "it was mentioned in the server configuration, and no longer is".

Without such persistence you could not, for instance, reprocess mail repositories that you had been using.

--------------

An other case is "parametric mail repository" ie cassandra://var/mail/customera.com/rejected

One such exemple is Data Leak Prevention cf https://github.com/apache/james-project/tree/master/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp

And his friend https://github.com/apache/james-project/blob/master/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/ToSenderDomainRepository.java

I might want to access a mail repository that exist, contains stuff, but is not provisionned localy because the James server I am using did not yet reject an email for this domain since it had been started.

--------------

Another thing is the difference between mailrepository URL / path (which I am not a fan of)

The idea was not to leak through webadmin the underlying storage structure

URL: cassandra://var/mail/error
PATH: var/mail/error

Then you need to do translation between the path and the URL, which is not trivial in face of several underlying storage technologies (jdbc + file for example)

Even if there is a way to dynamically make james store mails in a mail repository that is not mentioned in the configuration, the in memory implementation will still register it when it is used.  I guess that only leaves discoverability of existing MailRepositoryUrls across restarts when an Url is not used much. That leaves me wondering what the actual use case is ...
Well the one time I had to deal with mail repository with a customer, listing them was handy.

That being said, I also share the feeling that "listing URLs in use" through MailRepositoryUrlStore might be overkill.

Instead we could rely on each MailRepository implementation to list the URLs it do actually contain, thus drop MailRepositoryUrlStore alltogether, make it an implementation detail.

We would get :
  - MailRepositoryUrlSupplier interface with an implementation for each MailRepository implementation.   - Implementations can base decisions on their underlying storage thus removing the needs for additional metadata.

I would support such a refactoring. One less Cassandra table makes me happy ;-)

    Ideally MailRepositoryUrlStore should not have had been in the API.


Interesting, according to git history it was introduced by https://issues.apache.org/jira/browse/JAMES-2418 but that only says that the last point I mention above ( the discoverability part)  is needed but not why it is needed :D
I hope I did get better at writting issues since then :-P

cheers
jean


Cheers

Reply via email to