Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JAMES-2586 Postgresql implementation: ready for master #2587

Open
wants to merge 344 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
344 commits
Select commit Hold shift + click to select a range
7b8103c
JAMES-2586 Rename JPAAttachmentContentLoader to PostgresAttachmentCon…
Arsnael Dec 7, 2023
8cdf5aa
JAMES-2586 Add a unit test for recreate RLS column should not fail
quantranhong1999 Dec 7, 2023
7c8ef21
JAMES-2586 PostgresExecutor: better recognize prepared statement conf…
quantranhong1999 Dec 7, 2023
2642495
JAMES-2586 PostgresTableManager - Check the existence of RLS column/p…
vttranlina Dec 11, 2023
116cea8
JAMES-2586 PostgresTableManager - Cleanup
vttranlina Dec 11, 2023
fc630cd
JAMES-2586 PostgresRecipientRewriteTableDAO and PostgresRecipientRewr…
Dec 7, 2023
cfa0a80
JAMES-2586 Fixup compile error after merge master
vttranlina Dec 11, 2023
25a0718
JAMES-2586 PostgresDelegationStore (#1851)
hungphan227 Dec 13, 2023
3f328a7
JAMES-2586 Remove JPAHealthCheck.java
chibenwa Dec 12, 2023
5e9aa0e
JAMES-2586 Implement PostgresMailRepositoryUrlStore
chibenwa Dec 12, 2023
98a7cb0
JAMES-2586 Remove JPAMailRepositoryUrlStore.java
chibenwa Dec 12, 2023
f2c7f1d
JAMES-2586 Implement and bind PostgresHealthCheck
chibenwa Dec 12, 2023
55248d1
JAMES-3967 Store mails when relay is exceeded
chibenwa Dec 15, 2023
80e1649
JAMES-2586 ADR for Posgres mailbox tables structure (#1857)
hungphan227 Dec 18, 2023
3d65404
JAMES-2586 Implement PostgresSieveScriptDAO + PostgresSieveRepository
quantranhong1999 Dec 11, 2023
5544b69
JAMES-2586 Delete JPASieveScript.java
chibenwa Dec 12, 2023
82a1d0b
JAMES-2586 Guice binding for PostgresSieveScriptDAO
quantranhong1999 Dec 12, 2023
722b405
JAMES-2586 Implement PostgresMailRepository
chibenwa Dec 14, 2023
d9dedb2
JAMES-2586 Guice binding for PostgresMailRepository + remove related …
quantranhong1999 Dec 18, 2023
6cea92e
JAMES-2586 Documentation for PostgresMailRepository
quantranhong1999 Dec 18, 2023
f1c4dd9
JAMES-2586 Updating postgres-app default configuration to PostgresMai…
quantranhong1999 Dec 18, 2023
d0670db
JAMES-2586 Finally remove the rest of JPA in postgres-app
quantranhong1999 Dec 18, 2023
309bb3f
JAMES-2586 Add an `addAdditionalAlterQueries` option when declaring P…
quantranhong1999 Dec 14, 2023
cfab521
JAMES-2586 Fix compilation errors
quantranhong1999 Dec 19, 2023
9d89620
JAMES-2586 Fix repositoryPath in postgres-app mailetcontainer.xml
quantranhong1999 Dec 19, 2023
0ceffb1
JAMES-2586 add missing RLS tests
Dec 18, 2023
62910ee
JAMES-2586 Add an Id for SieveScript (#1863)
chibenwa Dec 19, 2023
3bc800d
JAMES-2586 Fix [PGSQL] Concurrency control for flags updates (#1858)
vttranlina Dec 20, 2023
15fe608
[PGSQL] ADR on PGSQL flags update concurrency control mechanism (#1867)
vttranlina Dec 20, 2023
177323d
JAMES-2586 Add search module chooser for Postgres app
Arsnael Dec 19, 2023
d158e96
JAMES-2586 Add docker compose distributed with OpenSearch for postgre…
Arsnael Dec 20, 2023
2f6a60e
JAMES-2586 Rework README for Postgres-app and rework the docker compo…
Arsnael Dec 20, 2023
0bb685e
JAMES-2586 Module chooser: S3, file blobStore
quantranhong1999 Dec 20, 2023
743679e
JAMES-2586 Message body deduplication (#1873)
quantranhong1999 Dec 21, 2023
82598bb
JAMES-2586 Remove james-server-cassandra-app direct dependency (#1875)
chibenwa Dec 22, 2023
0bc973a
JAMES-2586 Implement AllSearchOverride for Postgresql
Arsnael Dec 21, 2023
e60612a
JAMES-2586 Implement DeletedSearchOverride for Postgresql
Arsnael Dec 22, 2023
3b4f6ff
JAMES-2586 Implement DeletedWithRangeSearchOverride for Postgresql
Arsnael Dec 22, 2023
a0649f6
JAMES-2586 Implement NotDeletedWithRangeSearchOverride for Postgresql
Arsnael Dec 22, 2023
20d03fa
JAMES-2586 Implement UidSearchOverride for Postgresql
Arsnael Dec 22, 2023
9ce546b
JAMES-2586 Implement UnseenSearchOverrideTest for Postgresql
Arsnael Dec 22, 2023
f97cb4f
JAMES-2586 Correct search overrides documentation in opensearch.prope…
Arsnael Dec 22, 2023
9dfd668
JAMES-2586 Refactor search overrides tests for postgresql
Arsnael Dec 22, 2023
9d8070e
JAMES-2586 Unnecessary join on deleted uid search queries in postgresql
Arsnael Dec 22, 2023
fa461b8
JAMES-2586 Moving RabbitMQExtension from distributed-app to queue-rab…
vttranlina Dec 25, 2023
fb5f290
JAMES-2586 Plug RabbitMQ EventBus into Postgres-app
vttranlina Dec 21, 2023
a70196a
JAMES-2586 Implement DeleteMessageListener for postgres (#1869)
hungphan227 Dec 25, 2023
71bf52f
JAMES-2586 Fixup search overrides - Using Postgres Factory Executor r…
vttranlina Dec 26, 2023
a581d89
JAMES-2586 Implement PostgresEventDeadLetters
quantranhong1999 Dec 25, 2023
bb5338c
JAMES-2586 Fix flaky test DistributedPostgresJamesServerTest.guiceSer…
quantranhong1999 Dec 25, 2023
bc618ca
JAMES-2586 Add missing license
quantranhong1999 Dec 26, 2023
ee73a8a
JAMES-2586 Add a health check integration test
quantranhong1999 Dec 28, 2023
2a8c331
JAMES-2586 Implement PostgresBlobStoreDAO
Dec 26, 2023
92247f3
JAMES-2586 Disable concurrent test of PostgresBlobStoreDAO
vttranlina Jan 3, 2024
42a2bd7
JAMES-2586 [PGSQL] Guice binding Postgres BlobStore & Adapt to BlobSt…
vttranlina Dec 27, 2023
32bcfb9
JAMES-2586 Adopt Postgres 16.1 (#1897)
chibenwa Jan 5, 2024
6f59e95
JAMES-2586 Bump jOOQ to 3.16.23
quantranhong1999 Jan 6, 2024
94dc188
JAMES-2586 Bump r2dbc-postgresql to 1.0.3.RELEASE
quantranhong1999 Jan 6, 2024
996012f
JAMES-2586 - Update test cases for Delete message listener - when ena…
vttranlina Jan 5, 2024
76fc26e
JAMES-2586 - Fix BUG - DeleteMessageListener - not work correctly whe…
vttranlina Jan 5, 2024
41cddbb
Guice InitializationOperation support priority when init module
vttranlina Jan 3, 2024
a9d07db
JAMES-2586 Refactor the way initPostgres of PostgresTableManager
vttranlina Jan 3, 2024
73d5fd0
JAMES-2586 Implement PostgresDeletedMessageMetadataVault
quantranhong1999 Jan 2, 2024
ca6e813
JAMES-2586 Guice binding + module chooser + sample config for Postgre…
quantranhong1999 Jan 2, 2024
15ba2d6
JAMES-2586 Plug DeletedMessageVaultDeletionCallback into DeleteMessag…
quantranhong1999 Jan 8, 2024
a938fa4
JAMES-2586 PostgresDeletedMessageVaultIntegrationTest
quantranhong1999 Jan 8, 2024
00ca40a
JAMES-2586 Plug PreDeletionHooks
quantranhong1999 Jan 8, 2024
992aac5
JAMES-2586 - Set blobStorage implementation is postgres by default
vttranlina Jan 9, 2024
fd8d1dd
JAMES-2586 Implement BlobReferenceSource(s) for postgres-app
Jan 4, 2024
96884b9
JAMES-2586 add mailbox para for generateMessageUid method in MapperPr…
Jan 12, 2024
0d2902d
JAMES-2586 Implement PostgresMessageIdMapper
Jan 12, 2024
6fe4903
JAMES-2586 Introduce data-jmap-postgres module
quantranhong1999 Jan 15, 2024
1774b64
JAMES-2586 DeleteMessageListener: better concurrency control upon mai…
quantranhong1999 Jan 15, 2024
f54efa0
JAMES-2586 Jenkinsfile: run tests for `server/data/data-jmap-postgres…
quantranhong1999 Jan 15, 2024
9a8de4f
JAMES-2586 - CLEAN CODE - Guice binding for Postgres User Repository…
vttranlina Jan 12, 2024
7a653be
JAMES-2586 Implement PostgresMessageFastViewProjection
quantranhong1999 Jan 16, 2024
eea49e0
JAMES-2586 Moving Managers out of the mail package
Arsnael Jan 17, 2024
2a8bc83
JAMES-2586 Wire StoreMessageIdManager on top of the PostgresMessageId…
Arsnael Jan 17, 2024
4d8df85
JAMES-2586 Little refactoring around DeleteMessageListener binding in…
Arsnael Jan 18, 2024
7649aef
JAMES-2586 JMAP Guice bindings modules to pg-app
Jan 16, 2024
f77f745
fixup! JAMES-2586 JMAP Guice bindings modules to pg-app
Jan 16, 2024
8c32b75
fixup! JAMES-2586 JMAP Guice bindings modules to pg-app
Jan 16, 2024
b1d8087
JAMES-2586 Implement PostgresAttachmentMapper, DAO and binding
vttranlina Jan 16, 2024
dcc7062
JAMES-2586 Implement Postgres Attachment Blob reference source
vttranlina Jan 18, 2024
45a5350
JAMES-2586 - Delete attachment in DeleteMessageListener
vttranlina Jan 18, 2024
14b5780
JAMES-2586 Webadmin integration tests for postgres
Jan 19, 2024
f635aef
JAMES-2586 Implement PostgresEmailChangeRepository
Jan 17, 2024
d7c4b0f
JAMES-2586 - Delete Message Listener - add test case when delete mail…
vttranlina Jan 22, 2024
3455372
JAMES-2586 - Fixbug - Delete Message Listener - Fix hanging issue
vttranlina Jan 22, 2024
306b674
JAMES-2586 - Fixbug hanging issue when Jooq execute delete and return…
vttranlina Jan 22, 2024
6f72e2b
JAMES-2586 Implement PostgresEmailChangeRepository - Fixup Guice binding
vttranlina Jan 23, 2024
b5e85e6
JAMES-2586 Implement Postgres upload repository
vttranlina Jan 24, 2024
c6c5349
JAMES-2586 Implement Postgres upload usage repository
vttranlina Jan 24, 2024
842fdcd
JAMES-2586 Guice binding for Postgres upload
vttranlina Jan 24, 2024
9fc9d04
JAMES-2586: The UploadRepositoryCleanupTask should rely on the Upload…
vttranlina Jan 24, 2024
5c5b2bc
JAMES-2586: Guice binding JmapUploadCleanupModule for Postgres webadmin
vttranlina Jan 24, 2024
2945b73
JAMES-2586 Disable row-level security by default in postgres.properties
vttranlina Jan 29, 2024
c62605f
JAMES-2586 Implement Postgres Push subscription
vttranlina Jan 26, 2024
3ddac9f
JAMES-2586 Introduce sql script to clean up PGSL data
vttranlina Jan 29, 2024
db55485
JAMES-2586 Implement PostgresThreadIdGuessingAlgorithm (#1941)
hungphan227 Jan 31, 2024
5a57090
JAMES-2586 Implement PostgresMailboxChangeRepository
quantranhong1999 Jan 24, 2024
76a3d59
JAMES-2586 Guice binding PostgresMailboxChangeRepository
quantranhong1999 Jan 25, 2024
5b95a62
JAMES-2586 Implement PostgresFilteringProjection
Feb 1, 2024
250a220
JAMES-2586 Implement PostgresCustomIdentityDAO
Jan 29, 2024
1e7192c
JAMES-2586 Handle case when Postgres index/constraint already exists
vttranlina Feb 6, 2024
3372c57
JAMES-2586 More flexible on comparing Vacation's ZonedDateTime
quantranhong1999 Feb 5, 2024
953f2d1
JAMES-2586 Implement PostgresVacationRepository
quantranhong1999 Feb 5, 2024
bdbe132
JAMES-2586 Guice binding PostgresVacationRepository
quantranhong1999 Feb 5, 2024
ad79ea9
JAMES-2586 Improve PostgresVacationRepository
quantranhong1999 Feb 6, 2024
7cde4aa
JAMES-2586 Temporarily disable a flaky PostgresUploadService test
quantranhong1999 Feb 6, 2024
372a379
JAMES-2586 Optimize query increase/decrease for Quota Current Value
vttranlina Feb 7, 2024
b87e351
JAMES-2586 Add Index for Postgres Mailbox table
vttranlina Feb 7, 2024
d6abd28
JAMES-2586 Implement PostgresNotificationRegistry
quantranhong1999 Feb 7, 2024
9608a12
JAMES-2586 SQL script to clean outdated vacation notifications
quantranhong1999 Feb 7, 2024
1d7034f
JAMES-2586 Guice binding for PostgresNotificationRegistry
quantranhong1999 Feb 7, 2024
fa4af75
JAMES-2586 Fix contract test NotificationRegistryContract::registerSh…
quantranhong1999 Feb 7, 2024
3bf2da9
JAMES-2586 [Documentation] Using pg_stat_statements extension for tra…
vttranlina Feb 16, 2024
a416af6
JAMES-2586 Avoid Using COUNT() in SQL When You Could Use EXISTS()
vttranlina Feb 18, 2024
2992161
JAMES-2586 Implement PostgresEventStore
Feb 7, 2024
d429eda
JAMES-2586 Implement PostgresEmailQueryView (#2007)
hungphan227 Feb 21, 2024
b1857bc
JAMES-2586 - Postgres push subscription - expires value should be sto…
vttranlina Feb 29, 2024
ddbd614
JAMES-2586 Integration tests for JMAP postgres
Feb 20, 2024
c1171f8
JAMES-2586 Disable some tests in Integration tests JMAP postgres
Feb 21, 2024
1b157c7
JAMES-2586 Fix PostgresAuthenticationTest
Mar 1, 2024
b150798
JAMES 2586 PostgresPushSubscriptionRepository: rely on Postgres uniqu…
quantranhong1999 Mar 10, 2024
f61b06b
JAMES-2586 [Postgres] FIXUP when query with IN - should pre-check col…
vttranlina Mar 11, 2024
a98144e
[Build] Use tmpfs for Postgres db test container
Arsnael Mar 7, 2024
cc713fd
JAMES-2586 Fix PostgresPushSubscriptionSetMethodTest, PostgresThreadG…
Feb 25, 2024
8433216
JAMES-2586 Replace drop by truncate in PostgresMessageFastViewProjection
Mar 11, 2024
5098f6b
JAMES 2586 Increase timeout to 1 hour for postgres-jmap-integration-t…
quantranhong1999 Mar 14, 2024
8983953
JAMES 2586 Try forkCount=2 to see if the tests are faster
quantranhong1999 Mar 14, 2024
5454ac8
Add sslMode to require in PostgresqlConnectionConfiguration (#2109)
Arsnael Mar 15, 2024
40643c3
JAMES-2586 Reduce repeat count for some JMAP integration tests
quantranhong1999 Mar 14, 2024
f7e4184
JAMES-2586 Add PostgresAttachmentMapper to PostgresMessageIdMapper
Mar 14, 2024
0b2c820
JAMES-2586 Bind PostgresMessageFastViewProjection
Mar 14, 2024
7f6b187
JAMES-2586 Optimize AttachmentLoader
vttranlina Mar 6, 2024
ca30dbd
JAMES-2586 Fix PostgresEmailGetMethodTest
Mar 14, 2024
9aea844
JAMES-2586 Fix PostgresEmailQueryMethodTest
Mar 14, 2024
5de17c8
JAMES-2586 Fix PostgresMailboxSetMethodTest
Mar 14, 2024
9d571b2
JAMES-2586 remove redundant import in PostgresPushSubscriptionSetMeth…
Mar 14, 2024
77bdbcd
JAMES-2586 Remove opensearch in PostgresWebPushTest
Mar 14, 2024
c0052f4
JAMES-3925 - JMAP Upload - Method delete of Upload Repository should …
vttranlina Feb 29, 2024
2c906b0
JAMES-2586 - JMAP Upload - Fix unstable UploadService test
vttranlina Mar 19, 2024
1bb9485
JAMES-2586 Fix Postgres build after rebase on master
Arsnael Mar 20, 2024
0ade347
JAMES-2586 JMAP Upload - fix precision of uploadDate field
vttranlina Mar 21, 2024
4a1bda3
JAMES-2586 Refactor the handle way duplicate value on constraint inde…
vttranlina Mar 19, 2024
959fa04
JAMES-2586 [REFACTORING] - PostgresTableManager - fix incorrect log
vttranlina Mar 19, 2024
a08d941
JAMES-2586 Avoid sorting PG messages
vttranlina Mar 18, 2024
c246830
JAMES-2586 [REFACTORING] - Extract dedicated class for retrieving Pos…
vttranlina Mar 18, 2024
6403588
JAMES-2586 Fix MailboxSetMethodContract
vttranlina Mar 20, 2024
8f76113
JAMES-2586 Avoid declare jooq and r2dbc-postgresql version in multipl…
quantranhong1999 Mar 21, 2024
0783b1e
JAMES-2586 Bump jOOQ to 3.19.6
quantranhong1999 Mar 21, 2024
4438e31
JAMES-2586 Bump r2dbc-postgresql to 1.0.4
quantranhong1999 Mar 21, 2024
ca67c78
JAMES-2586 Adapt jooq 3.19.6 change
quantranhong1999 Mar 22, 2024
3b2bf3d
JAMES-2586 Postgres RewriteTablesTest should not fail unstable test p…
quantranhong1999 Mar 22, 2024
231397f
JAMES-2586 Create AttachmentIdFactory
Mar 19, 2024
da2d84a
JAMES-2586 Add UuidBackedAttachmentIdFactory
Mar 21, 2024
4b6253b
JAMES-2586 Update Guice binding Postgres (#2154)
vttranlina Mar 26, 2024
1c9741d
Duplicated the QuotaDTO event and related classes from quota-mailing-…
vttranlina Mar 27, 2024
6b1720a
Refactor cassandra-quota-mailing: using the QuotaDTO event and relate…
vttranlina Mar 28, 2024
1b7e0d0
JAMES-2586 Postgres - Binding QuotaMailing module for postgres app Tu…
vttranlina Mar 27, 2024
cf6902b
JAMES-2586 Postgres - Guice binding EventDTO for DLP Configuration
vttranlina Mar 27, 2024
790ba7b
JAMES-2586 Postgres - Guice binding EventDTO for FilteringRuleSetDefine
vttranlina Mar 27, 2024
8841049
JAMES-2586 - [Revert] Optimize query increase/decrease for Quota Curr…
vttranlina Apr 1, 2024
f7a92be
Revert "Provision Current Quota when MailboxAdded event"
vttranlina Apr 1, 2024
ca2ec25
JAMES-2586 Introduce module task-postgres
quantranhong1999 Mar 28, 2024
153bf1b
JAMES-2586 Implement PostgresTaskExecutionDetailsProjection
quantranhong1999 Mar 29, 2024
43c2cc4
JAMES-2586 Relax TaskExecutionDetailsProjectionContract: can compare …
quantranhong1999 Mar 29, 2024
c3d1769
JAMES-2586 Guice binding Distributed TaskManager for postgres-app
quantranhong1999 Mar 29, 2024
079954c
JAMES-2586 Disable DistributedTaskSerializationModule
quantranhong1999 Apr 1, 2024
00b6f5c
JAMES-2586 Add missing cleanup task webadmin routes
quantranhong1999 Apr 1, 2024
c09b8ce
JAMES-2586 Do not use ActiveMQ mail queue when distributed mode
quantranhong1999 Apr 1, 2024
ef2b43d
JAMES-2586 Add binding for DKIMMailetModule
quantranhong1999 Apr 1, 2024
b74c2b4
JAMES-2586 - Postgres - Bind DistributedTaskSerializationModule into …
vttranlina Apr 2, 2024
bc6eaa6
JAMES-2586 - Postgres - Binding ACLUpdated Event DTO
vttranlina Apr 3, 2024
0b05d26
JAMES-2586 PopulateEmailQueryViewTask should not hang for postgres-ap…
quantranhong1999 Apr 9, 2024
62a90ec
JAMES-2586 Fix flaky tests in EmailQueryMethodTest
Apr 5, 2024
552c598
JAMES-2586 Enable flaky tests in PostgresEmailQueryMethodTest
Apr 5, 2024
55704e5
JAMES-2586 Apply reactor timeout for jOOQ
quantranhong1999 Apr 5, 2024
196973f
JAMES-2586 Mitigate fix for https://github.com/jOOQ/jOOQ/issues/16556
quantranhong1999 Apr 8, 2024
54d76b3
JAMES-2586 Create metrics for PostgresExecutor
Apr 10, 2024
3f8aa40
JAMES-2586 Update postgresql guice binding - adapt after rebase maste…
vttranlina Apr 16, 2024
fa14576
JAMES-2586 [UPDATE] [PGSQL] more javax APIs migrated to jakarta
vttranlina Apr 16, 2024
f0b9c20
[BUILD] Jenkinsfile - add module server/blob/blob-postgres
vttranlina Apr 15, 2024
bbd56c1
JAMES-2586 Disable some unstable tests of PostgresBlobStoreDAOTest
vttranlina Apr 15, 2024
d1b3e99
JAMES-2586 Implement PoolBackedPostgresConnectionFactory
Apr 8, 2024
b986f54
JAMES-2586 Update PostgresCommonModule to use PoolBackedPostgresConne…
Apr 11, 2024
aa3c6cb
JAMES-2586 Add connection pool config to PostgresConfiguration
Apr 17, 2024
6e8a251
JAMES-2586 Close postgres connections when the app shutdown
Apr 26, 2024
8dd0fd1
JAMES-2586 Fix some disabled tests in PostgresBlobStoreDAOTest by usi…
Apr 26, 2024
7404a32
JAMES-2586 Create rls-bypass instance for PoolBackedPostgresConnectio…
May 2, 2024
18e0825
JAMES-2586 Update PoolBackedPostgresConnectionFactory to avoid runnin…
May 17, 2024
8fc8741
JAMES-2586 Fix sequential issue with updating flags in the reactive p…
Arsnael May 24, 2024
f746a3d
JAMES-2586 Postgres app should use Java 21 base image (#2277)
quantranhong1999 Jun 6, 2024
17d0845
JAMES-2586 - Rename class DeletedMessageVaultDeletionCallback -> Post…
vttranlina Jun 6, 2024
d726d53
[BUILD] Increase jOOQ reactive timeout for testing (#2301)
quantranhong1999 Jun 17, 2024
f63a1fe
JAMES-3946 Add a DropLists postgresql backend (#2290)
Maxxx873 Jun 18, 2024
073baf4
JAMES-2586 Clean/Refactor PostgresExtension
vttranlina Jun 10, 2024
5d1df97
JAMES-2586 Drop SinglePostgresConnectionFactory
vttranlina Jun 13, 2024
24b29f8
JAMES-2586 Drop DomainImplPostgresConnectionFactory
vttranlina Jun 13, 2024
a748f91
JAMES-2586 Refactor JamesPostgresConnectionFactory: distinctly getCon…
vttranlina Jun 13, 2024
21b7019
JAMES-2586 Re naming "non-rls" to "by-pass-rls"
vttranlina Jun 13, 2024
ff5193f
JAMES-2586 [UPGRADE] jooq 3.19.6 -> 3.19.9
vttranlina Jun 12, 2024
ecf78c4
JAMES-2586 [UPGRADE] r2dbc.postgresql.version 1.0.4.RELEASE => 1.0.5.…
vttranlina Jun 12, 2024
0c69fc9
JAMES-2586 [UPGRADE] org.testcontainers:postgresql 1.19.1 -> 1.19.8
vttranlina Jun 12, 2024
f7fb9eb
JAMES-2586 [UPGRADE] Postgres docker image 16.1 -> 16.3
vttranlina Jun 12, 2024
ed699cf
JAMES-2586 - Update primaryKey constraint for Postgres mailbox_change…
vttranlina Jun 5, 2024
d9b6216
JAMES-2586 (RLS) Optimize findNonPersonalMailboxes method in Postgres…
Jun 18, 2024
0046958
JAMES-2586 (NON_RLS) Optimize findNonPersonalMailboxes method in Post…
Jun 18, 2024
be3630f
JAMES-2586 Refactor code after optimizing findNonPersonalMailboxes me…
Jun 20, 2024
6cf4fa2
JAMES-2586 Change boolean rlsEnabled to enum RowLevelSecurity
Jun 21, 2024
d7339ea
JAMES-2586 [PGSQL] Fix checkstyle & adapt code after rebase master
vttranlina Jun 25, 2024
24ce124
JAMES-2586 Fix sequential issue with updating flags in the reactive p…
vttranlina Jun 25, 2024
5165c87
JAMES-2586 Fix BlobStoreConfigurationTest
vttranlina Jun 26, 2024
759bb2a
[ENHANCEMENT] Better reactify Identity methods - update for Postgres
vttranlina Jun 26, 2024
e3cd511
JAMES-2586 Fixup PostgresPushSubscriptionSetMethodTest - add ClockMQE…
vttranlina Jun 26, 2024
886b43d
Disable test: JamesWithNonCompatibleElasticSearchServerTest
vttranlina Jun 27, 2024
6ca64e1
Fixup - add missing dependencies in apache-james-mpt-smtp-cassandra-r…
vttranlina Jun 27, 2024
84bc690
[Antora] [PGSQL] Setup postgresql James server documentation section
vttranlina Jun 26, 2024
dc3945c
[Antora] [PGSQL] Objectives and motivation page for postgres doc
vttranlina Jun 26, 2024
825129b
[Antora] Make partial for server configure section & clean format
vttranlina Jul 1, 2024
69fec5e
[Antora] [PGSQL] Add Configuration section to postgresql doc
vttranlina Jul 1, 2024
a1f5fad
[Antora] [PGSQL] Add Performance benchmarks section to postgresql doc
vttranlina Jul 3, 2024
dc0d031
[Antora] Make partial for server Architecture section
vttranlina Jul 1, 2024
0b89af5
[Antora] [PGSQL] Architecture section for postgres doc
vttranlina Jul 3, 2024
3db52b1
[Antora] [PGSQL] Add Operate section to postgresql doc
vttranlina Jul 2, 2024
599daa2
[Antora] Add run section to postgresql documentation
Arsnael Jun 28, 2024
e380beb
[Antora] Add missing link in run with docker page to james cli comman…
Arsnael Jul 1, 2024
23e7712
[Antora] [PGSQL] Add Extending to postgresql doc
vttranlina Jul 5, 2024
47ee74b
JAMES-4054 Remove X-SMIME-Status header in mailetcontainer.xml
Arsnael Aug 20, 2024
ab151b9
Postgres-app: unset JAVA_TOOL_OPTIONS env variable when running james…
quantranhong1999 Sep 9, 2024
029be21
Bump jOOQ to 3.19.13
quantranhong1999 Oct 21, 2024
90940f7
Bump r2dbc-postgresql to 1.0.7.RELEASE
quantranhong1999 Oct 21, 2024
5983851
[PGSQL] Adapt from new master code - BlobId.Factory
vttranlina Oct 24, 2024
5bbe02f
[PGSQL] Adapt from new master code - TypeStateFactory
vttranlina Oct 24, 2024
4f85d89
[PGSQL] Adapt from new master code - SearchQuery
vttranlina Oct 24, 2024
df83547
[PGSQL] Disable PostgresAuthenticatedStateTest.rightsCommandsShouldBe…
vttranlina Oct 24, 2024
d9c3935
JAMES-2586 - Fixup InMemoryUploadRepository.deleteByUploadDateBefore
vttranlina Oct 24, 2024
cdce781
Bind MailboxCounterCorrector to DEFAULT in PostgresMailboxModule
Nov 20, 2024
0813030
JAMES-2586 - Bump Jooq 3.19.13 -> 3.19.15
vttranlina Nov 28, 2024
dbe2672
JAMES-2586 - Update correct PostgresExtension mode (Disable RLS) for …
vttranlina Nov 28, 2024
e873579
JAMES-2586 - Postgres mailbox messages support batch/pagination for s…
vttranlina Nov 28, 2024
1fa6094
JAMES-2586 - PostgresBlobStoreDAO.listBlobs support batch/pagination …
vttranlina Nov 28, 2024
3a7ebf0
JAMES-2586 - Optimize `PostgresUsersDAO.listReactive` method
vttranlina Nov 28, 2024
b5a3743
JAMES-2586 Add index for thread table
vttranlina Nov 28, 2024
981c51e
Revert "JAMES-2586 Add index for thread table" (#2537)
chibenwa Dec 4, 2024
2d1f4e5
JAMES-2586 Fix postgres mailbox acl concurrency issue (#2551)
hungphan227 Dec 10, 2024
88aa416
JAMES-2586 Remove logback-json and logback-json-classic
Arsnael Jan 7, 2025
0990aac
JAMES-2586 isAdministrator should take into account multiple administ…
Arsnael Jan 7, 2025
f46867c
JAMES-2586 Jenkinsfile: Full build with master branch
Arsnael Jan 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 17 additions & 2 deletions Jenkinsfile
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,21 @@ pipeline {
MVN_SHOW_TIMESTAMPS="-Dorg.slf4j.simpleLogger.showDateTime=true -Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS"
CI = true
LC_CTYPE = 'en_US.UTF-8'

POSTGRES_MODULES = 'backends-common/postgres,' +
'mailbox/postgres,' +
Arsnael marked this conversation as resolved.
Show resolved Hide resolved
'server/blob/blob-postgres,' +
'server/data/data-postgres,' +
'server/data/data-jmap-postgres,' +
'server/container/guice/postgres-common,' +
'server/container/guice/mailbox-postgres,' +
'server/apps/postgres-app,' +
'server/protocols/jmap-rfc-8621-integration-tests/postgres-jmap-rfc-8621-integration-tests,' +
'server/protocols/webadmin-integration-test/postgres-webadmin-integration-test,' +
'server/task/task-postgres,' +
'mpt/impl/imap-mailbox/postgres,' +
'event-bus/postgres,' +
'mailbox/plugin/deleted-messages-vault-postgres'
}

tools {
Expand Down Expand Up @@ -94,7 +109,7 @@ pipeline {
stage('Stable Tests') {
steps {
echo 'Running tests'
sh 'mvn -B -e -fae test ${MVN_SHOW_TIMESTAMPS} -P ci-test ${MVN_LOCAL_REPO_OPT} -Dassembly.skipAssembly=true jacoco:report-aggregate@jacoco-report'
sh 'mvn -B -e -fae test ${MVN_SHOW_TIMESTAMPS} -P ci-test ${MVN_LOCAL_REPO_OPT} -pl ${POSTGRES_MODULES} -Dassembly.skipAssembly=true jacoco:report-aggregate@jacoco-report'
}
post {
always {
Expand All @@ -115,7 +130,7 @@ pipeline {
steps {
echo 'Running unstable tests'
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh 'mvn -B -e -fae test -Punstable-tests ${MVN_SHOW_TIMESTAMPS} -P ci-test ${MVN_LOCAL_REPO_OPT} -Dassembly.skipAssembly=true'
sh 'mvn -B -e -fae test -Punstable-tests ${MVN_SHOW_TIMESTAMPS} -P ci-test ${MVN_LOCAL_REPO_OPT} -pl ${POSTGRES_MODULES} -Dassembly.skipAssembly=true'
}
}
post {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@
import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.QUOTA_TYPE;
import static org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueTable.TABLE_NAME;

import java.util.Objects;

import jakarta.inject.Inject;

import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
Expand All @@ -47,66 +45,12 @@
import com.datastax.oss.driver.api.querybuilder.delete.Delete;
import com.datastax.oss.driver.api.querybuilder.select.Select;
import com.datastax.oss.driver.api.querybuilder.update.Update;
import com.google.common.base.MoreObjects;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class CassandraQuotaCurrentValueDao {

public static class QuotaKey {

public static QuotaKey of(QuotaComponent component, String identifier, QuotaType quotaType) {
return new QuotaKey(component, identifier, quotaType);
}

private final QuotaComponent quotaComponent;
private final String identifier;
private final QuotaType quotaType;

public QuotaComponent getQuotaComponent() {
return quotaComponent;
}

public String getIdentifier() {
return identifier;
}

public QuotaType getQuotaType() {
return quotaType;
}

private QuotaKey(QuotaComponent quotaComponent, String identifier, QuotaType quotaType) {
this.quotaComponent = quotaComponent;
this.identifier = identifier;
this.quotaType = quotaType;
}

@Override
public final int hashCode() {
return Objects.hash(quotaComponent, identifier, quotaType);
}

@Override
public final boolean equals(Object o) {
if (o instanceof QuotaKey) {
QuotaKey other = (QuotaKey) o;
return Objects.equals(quotaComponent, other.quotaComponent)
&& Objects.equals(identifier, other.identifier)
&& Objects.equals(quotaType, other.quotaType);
}
return false;
}

public String toString() {
return MoreObjects.toStringHelper(this)
.add("quotaComponent", quotaComponent)
.add("identifier", identifier)
.add("quotaType", quotaType)
.toString();
}
}

private static final Logger LOGGER = LoggerFactory.getLogger(CassandraQuotaCurrentValueDao.class);

private final CassandraAsyncExecutor queryExecutor;
Expand All @@ -126,7 +70,7 @@ public CassandraQuotaCurrentValueDao(CqlSession session) {
this.deleteQuotaCurrentValueStatement = session.prepare(deleteQuotaCurrentValueStatement().build());
}

public Mono<Void> increase(QuotaKey quotaKey, long amount) {
public Mono<Void> increase(QuotaCurrentValue.Key quotaKey, long amount) {
return queryExecutor.executeVoid(increaseStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(IDENTIFIER, quotaKey.getIdentifier())
Expand All @@ -139,7 +83,7 @@ public Mono<Void> increase(QuotaKey quotaKey, long amount) {
});
}

public Mono<Void> decrease(QuotaKey quotaKey, long amount) {
public Mono<Void> decrease(QuotaCurrentValue.Key quotaKey, long amount) {
return queryExecutor.executeVoid(decreaseStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(IDENTIFIER, quotaKey.getIdentifier())
Expand All @@ -152,15 +96,15 @@ public Mono<Void> decrease(QuotaKey quotaKey, long amount) {
});
}

public Mono<QuotaCurrentValue> getQuotaCurrentValue(QuotaKey quotaKey) {
public Mono<QuotaCurrentValue> getQuotaCurrentValue(QuotaCurrentValue.Key quotaKey) {
return queryExecutor.executeSingleRow(getQuotaCurrentValueStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(IDENTIFIER, quotaKey.getIdentifier())
.setString(QUOTA_TYPE, quotaKey.getQuotaType().getValue()))
.map(row -> convertRowToModel(row));
}

public Mono<Void> deleteQuotaCurrentValue(QuotaKey quotaKey) {
public Mono<Void> deleteQuotaCurrentValue(QuotaCurrentValue.Key quotaKey) {
return queryExecutor.executeVoid(deleteQuotaCurrentValueStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(IDENTIFIER, quotaKey.getIdentifier())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.QUOTA_TYPE;
import static org.apache.james.backends.cassandra.components.CassandraQuotaLimitTable.TABLE_NAME;

import java.util.Objects;

import jakarta.inject.Inject;

import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
Expand All @@ -47,74 +45,11 @@
import com.datastax.oss.driver.api.querybuilder.delete.Delete;
import com.datastax.oss.driver.api.querybuilder.insert.Insert;
import com.datastax.oss.driver.api.querybuilder.select.Select;
import com.google.common.base.MoreObjects;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public class CassandraQuotaLimitDao {

public static class QuotaLimitKey {

public static QuotaLimitKey of(QuotaComponent component, QuotaScope scope, String identifier, QuotaType quotaType) {
return new QuotaLimitKey(component, scope, identifier, quotaType);
}

private final QuotaComponent quotaComponent;
private final QuotaScope quotaScope;
private final String identifier;
private final QuotaType quotaType;

public QuotaComponent getQuotaComponent() {
return quotaComponent;
}

public QuotaScope getQuotaScope() {
return quotaScope;
}

public String getIdentifier() {
return identifier;
}

public QuotaType getQuotaType() {
return quotaType;
}

private QuotaLimitKey(QuotaComponent quotaComponent, QuotaScope quotaScope, String identifier, QuotaType quotaType) {
this.quotaComponent = quotaComponent;
this.quotaScope = quotaScope;
this.identifier = identifier;
this.quotaType = quotaType;
}

@Override
public final int hashCode() {
return Objects.hash(quotaComponent, quotaScope, identifier, quotaType);
}

@Override
public final boolean equals(Object o) {
if (o instanceof QuotaLimitKey) {
QuotaLimitKey other = (QuotaLimitKey) o;
return Objects.equals(quotaComponent, other.quotaComponent)
&& Objects.equals(quotaScope, other.quotaScope)
&& Objects.equals(identifier, other.identifier)
&& Objects.equals(quotaType, other.quotaType);
}
return false;
}

public String toString() {
return MoreObjects.toStringHelper(this)
.add("quotaComponent", quotaComponent)
.add("quotaScope", quotaScope)
.add("identifier", identifier)
.add("quotaType", quotaType)
.toString();
}
}

private final CassandraAsyncExecutor queryExecutor;
private final PreparedStatement getQuotaLimitStatement;
private final PreparedStatement getQuotaLimitsStatement;
Expand All @@ -130,7 +65,7 @@ public CassandraQuotaLimitDao(CqlSession session) {
this.deleteQuotaLimitStatement = session.prepare((deleteQuotaLimitStatement().build()));
}

public Mono<QuotaLimit> getQuotaLimit(QuotaLimitKey quotaKey) {
public Mono<QuotaLimit> getQuotaLimit(QuotaLimit.QuotaLimitKey quotaKey) {
return queryExecutor.executeSingleRow(getQuotaLimitStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(QUOTA_SCOPE, quotaKey.getQuotaScope().getValue())
Expand All @@ -156,7 +91,7 @@ public Mono<Void> setQuotaLimit(QuotaLimit quotaLimit) {
.set(QUOTA_LIMIT, quotaLimit.getQuotaLimit().orElse(null), Long.class));
}

public Mono<Void> deleteQuotaLimit(QuotaLimitKey quotaKey) {
public Mono<Void> deleteQuotaLimit(QuotaLimit.QuotaLimitKey quotaKey) {
return queryExecutor.executeVoid(deleteQuotaLimitStatement.bind()
.setString(QUOTA_COMPONENT, quotaKey.getQuotaComponent().getValue())
.setString(QUOTA_SCOPE, quotaKey.getQuotaScope().getValue())
Expand Down Expand Up @@ -203,7 +138,8 @@ private QuotaLimit convertRowToModel(Row row) {
.quotaScope(QuotaScope.of(row.get(QUOTA_SCOPE, String.class)))
.identifier(row.get(IDENTIFIER, String.class))
.quotaType(QuotaType.of(row.get(QUOTA_TYPE, String.class)))
.quotaLimit(row.get(QUOTA_LIMIT, Long.class)).build();
.quotaLimit(row.get(QUOTA_LIMIT, Long.class))
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import org.apache.james.backends.cassandra.CassandraClusterExtension;
import org.apache.james.backends.cassandra.components.CassandraMutualizedQuotaModule;
import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao;
import org.apache.james.backends.cassandra.components.CassandraQuotaCurrentValueDao.QuotaKey;
import org.apache.james.core.quota.QuotaComponent;
import org.apache.james.core.quota.QuotaCurrentValue;
import org.apache.james.core.quota.QuotaType;
Expand All @@ -36,7 +35,7 @@
import org.junit.jupiter.api.extension.RegisterExtension;

public class CassandraQuotaCurrentValueDaoTest {
private static final QuotaKey QUOTA_KEY = QuotaKey.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.SIZE);
private static final QuotaCurrentValue.Key QUOTA_KEY = QuotaCurrentValue.Key.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.SIZE);

private CassandraQuotaCurrentValueDao cassandraQuotaCurrentValueDao;

Expand Down Expand Up @@ -92,7 +91,7 @@ void decreaseQuotaCurrentValueShouldDecreaseValueSuccessfully() {

@Test
void deleteQuotaCurrentValueShouldDeleteSuccessfully() {
QuotaKey quotaKey = QuotaKey.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.SIZE);
QuotaCurrentValue.Key quotaKey = QuotaCurrentValue.Key.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.SIZE);
cassandraQuotaCurrentValueDao.increase(quotaKey, 100L).block();
cassandraQuotaCurrentValueDao.deleteQuotaCurrentValue(quotaKey).block();

Expand Down Expand Up @@ -125,7 +124,7 @@ void decreaseQuotaCurrentValueShouldNotThrowExceptionWhenQueryExecutorThrowExcep

@Test
void getQuotasByComponentShouldGetAllQuotaTypesSuccessfully() {
QuotaKey countQuotaKey = QuotaKey.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.COUNT);
QuotaCurrentValue.Key countQuotaKey = QuotaCurrentValue.Key.of(QuotaComponent.MAILBOX, "[email protected]", QuotaType.COUNT);

QuotaCurrentValue expectedQuotaSize = QuotaCurrentValue.builder().quotaComponent(QUOTA_KEY.getQuotaComponent())
.identifier(QUOTA_KEY.getIdentifier()).quotaType(QUOTA_KEY.getQuotaType()).currentValue(100L).build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void setQuotaLimitShouldSaveObjectSuccessfully() {
QuotaLimit expected = QuotaLimit.builder().quotaComponent(QuotaComponent.MAILBOX).quotaScope(QuotaScope.DOMAIN).identifier("A").quotaType(QuotaType.COUNT).quotaLimit(100L).build();
cassandraQuotaLimitDao.setQuotaLimit(expected).block();

assertThat(cassandraQuotaLimitDao.getQuotaLimit(CassandraQuotaLimitDao.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
assertThat(cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
.isEqualTo(expected);
}

Expand All @@ -70,7 +70,7 @@ void setQuotaLimitWithEmptyQuotaLimitValueShouldNotThrowNullPointerException() {
QuotaLimit emptyQuotaLimitValue = QuotaLimit.builder().quotaComponent(QuotaComponent.MAILBOX).quotaScope(QuotaScope.DOMAIN).identifier("A").quotaType(QuotaType.COUNT).build();
cassandraQuotaLimitDao.setQuotaLimit(emptyQuotaLimitValue).block();

assertThat(cassandraQuotaLimitDao.getQuotaLimit(CassandraQuotaLimitDao.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
assertThat(cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
.isEqualTo(emptyQuotaLimitValue);
}

Expand All @@ -79,17 +79,17 @@ void setQuotaLimitShouldSaveObjectSuccessfullyWhenLimitIsMinusOne() {
QuotaLimit expected = QuotaLimit.builder().quotaComponent(QuotaComponent.MAILBOX).quotaScope(QuotaScope.DOMAIN).identifier("A").quotaType(QuotaType.COUNT).quotaLimit(-1L).build();
cassandraQuotaLimitDao.setQuotaLimit(expected).block();

assertThat(cassandraQuotaLimitDao.getQuotaLimit(CassandraQuotaLimitDao.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
assertThat(cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
.isEqualTo(expected);
}

@Test
void deleteQuotaLimitShouldDeleteObjectSuccessfully() {
QuotaLimit quotaLimit = QuotaLimit.builder().quotaComponent(QuotaComponent.MAILBOX).quotaScope(QuotaScope.DOMAIN).identifier("A").quotaType(QuotaType.COUNT).quotaLimit(100L).build();
cassandraQuotaLimitDao.setQuotaLimit(quotaLimit).block();
cassandraQuotaLimitDao.deleteQuotaLimit(CassandraQuotaLimitDao.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block();
cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block();

assertThat(cassandraQuotaLimitDao.getQuotaLimit(CassandraQuotaLimitDao.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
assertThat(cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, "A", QuotaType.COUNT)).block())
.isNull();
}

Expand Down
1 change: 1 addition & 0 deletions backends-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<module>cassandra</module>
<module>jpa</module>
<module>opensearch</module>
<module>postgres</module>
<module>pulsar</module>
<module>rabbitmq</module>
<module>redis</module>
Expand Down
Loading