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

feat!: extract storenode cycle to go-waku api #5857

Merged
merged 5 commits into from
Nov 25, 2024
Merged

Conversation

richard-ramos
Copy link
Member

@richard-ramos richard-ramos commented Sep 19, 2024

Requires:

Extracts the storenode cycle code to go-waku. This PR probably makes sense to be reviewed along with the one from go-waku ^. It's mostly ready to be reviewed. I'll change it to draft once go-waku's PR is complete (it is just missing the unit tests).

@status-im-auto
Copy link
Member

status-im-auto commented Sep 19, 2024

Jenkins Builds

Click to see older builds (100)
Commit #️⃣ Finished (UTC) Duration Platform Result
✖️ a338199 #1 2024-09-19 20:19:07 ~1 min tests-rpc 📄log
a338199 #1 2024-09-19 20:19:09 ~1 min ios 📄log
a338199 #1 2024-09-19 20:19:15 ~1 min android 📄log
a338199 #1 2024-09-19 20:19:29 ~1 min linux 📄log
✖️ a338199 #1 2024-09-19 20:20:03 ~2 min tests 📄log
✖️ 1138045 #2 2024-09-19 20:30:07 ~1 min tests 📄log
✖️ 1138045 #2 2024-09-19 20:30:42 ~2 min tests-rpc 📄log
✔️ 1138045 #2 2024-09-19 20:31:39 ~2 min linux 📦zip
✔️ 1138045 #2 2024-09-19 20:33:07 ~4 min android 📦aar
✔️ 1138045 #2 2024-09-19 20:33:19 ~4 min ios 📦zip
✔️ f5dc5cb #3 2024-09-20 19:15:51 ~2 min tests-rpc 📄log
✔️ f5dc5cb #3 2024-09-20 19:15:53 ~2 min android 📦aar
✔️ f5dc5cb #3 2024-09-20 19:15:55 ~2 min linux 📦zip
✖️ f5dc5cb #3 2024-09-20 19:16:04 ~2 min tests 📄log
✔️ f5dc5cb #3 2024-09-20 19:17:25 ~3 min ios 📦zip
✔️ 7539682 #4 2024-09-20 19:19:32 ~1 min tests-rpc 📄log
✖️ 7539682 #4 2024-09-20 19:19:35 ~1 min tests 📄log
✔️ 7539682 #4 2024-09-20 19:19:55 ~1 min android 📦aar
✔️ 7539682 #4 2024-09-20 19:20:22 ~1 min linux 📦zip
✔️ 7539682 #4 2024-09-20 19:21:44 ~3 min ios 📦zip
✖️ f4aa80e #5 2024-09-20 19:24:50 ~1 min tests 📄log
✔️ f4aa80e #5 2024-09-20 19:25:29 ~2 min android 📦aar
✔️ f4aa80e #5 2024-09-20 19:25:40 ~2 min tests-rpc 📄log
✔️ f4aa80e #5 2024-09-20 19:25:46 ~2 min linux 📦zip
✔️ f4aa80e #5 2024-09-20 19:27:17 ~3 min ios 📦zip
✔️ d9d1247 #6 2024-09-20 19:32:01 ~2 min android 📦aar
✔️ d9d1247 #6 2024-09-20 19:32:12 ~2 min tests-rpc 📄log
✔️ d9d1247 #6 2024-09-20 19:32:21 ~2 min linux 📦zip
✔️ d9d1247 #6 2024-09-20 19:33:49 ~3 min ios 📦zip
✖️ d9d1247 #6 2024-09-20 19:35:53 ~5 min tests 📄log
9f4b082 #7 2024-10-15 20:37:44 ~1 min ios 📄log
9f4b082 #7 2024-10-15 20:38:05 ~1 min android 📄log
✖️ 9f4b082 #7 2024-10-15 20:38:14 ~1 min tests-rpc 📄log
9f4b082 #7 2024-10-15 20:38:22 ~2 min linux 📄log
✖️ 9f4b082 #7 2024-10-15 20:39:09 ~2 min tests 📄log
✔️ ef3f160 #8 2024-10-15 21:15:05 ~3 min linux 📦zip
✔️ ef3f160 #8 2024-10-15 21:15:33 ~4 min ios 📦zip
✔️ ef3f160 #8 2024-10-15 21:15:50 ~4 min android 📦aar
✔️ ef3f160 #8 2024-10-15 21:16:48 ~5 min tests-rpc 📄log
✖️ ef3f160 #8 2024-10-15 21:19:04 ~7 min tests 📄log
✔️ b69a3ea #9 2024-10-15 21:38:55 ~2 min android 📦aar
✔️ b69a3ea #9 2024-10-15 21:39:25 ~2 min linux 📦zip
✔️ b69a3ea #9 2024-10-15 21:40:08 ~3 min ios 📦zip
✔️ b69a3ea #9 2024-10-15 21:42:02 ~5 min tests-rpc 📄log
✖️ b69a3ea #9 2024-10-15 21:51:12 ~14 min tests 📄log
✔️ 65d7a85 #10 2024-10-15 22:02:21 ~2 min android 📦aar
✔️ 65d7a85 #10 2024-10-15 22:02:48 ~2 min linux 📦zip
✔️ 65d7a85 #10 2024-10-15 22:03:30 ~3 min ios 📦zip
✔️ 65d7a85 #10 2024-10-15 22:05:08 ~5 min tests-rpc 📄log
✖️ 65d7a85 #10 2024-10-15 22:13:54 ~13 min tests 📄log
✔️ a06eb72 #11 2024-10-15 22:25:28 ~2 min android 📦aar
✔️ a06eb72 #11 2024-10-15 22:25:55 ~2 min linux 📦zip
✔️ a06eb72 #11 2024-10-15 22:26:41 ~3 min ios 📦zip
✔️ a06eb72 #11 2024-10-15 22:28:25 ~5 min tests-rpc 📄log
✔️ a06eb72 #11 2024-10-15 22:52:27 ~29 min tests 📄log
384310e #12 2024-10-21 20:35:59 ~12 sec linux 📄log
✔️ 384310e #12 2024-10-21 20:40:05 ~4 min ios 📦zip
✔️ 384310e #12 2024-10-21 20:40:38 ~4 min android 📦aar
✖️ 384310e #12 2024-10-21 20:42:51 ~6 min tests-rpc 📄log
✔️ 384310e #12 2024-10-21 21:06:27 ~30 min tests 📄log
1658d4a #13 2024-10-21 20:38:18 ~11 sec linux 📄log
✔️ 1658d4a #13 2024-10-21 20:43:27 ~2 min android 📦aar
✔️ 1658d4a #13 2024-10-21 20:43:33 ~3 min ios 📦zip
1658d4a #14 2024-10-21 20:47:43 ~8.8 sec linux 📄log
✔️ 1658d4a #13 2024-10-21 20:48:37 ~5 min tests-rpc 📄log
✖️ 1658d4a #13 2024-10-21 21:09:42 ~3 min tests 📄log
1960b97 #15 2024-10-21 21:14:08 ~11 sec linux 📄log
✔️ 1960b97 #14 2024-10-21 21:16:11 ~2 min android 📦aar
✔️ 1960b97 #14 2024-10-21 21:16:46 ~2 min ios 📦zip
✔️ 1960b97 #14 2024-10-21 21:19:39 ~5 min tests-rpc 📄log
✔️ 1960b97 #14 2024-10-21 21:45:07 ~31 min tests 📄log
1960b97 #16 2024-10-21 21:58:25 ~10 sec linux 📄log
1960b97 #17 2024-10-21 22:00:08 ~11 sec linux 📄log
✔️ 1960b97 #18 2024-10-21 22:05:22 ~4 min linux 📦zip
✔️ c17f9ef #15 2024-10-23 20:54:34 ~3 min ios 📦zip
✖️ c17f9ef #15 2024-10-23 20:55:01 ~3 min tests 📄log
✔️ c17f9ef #19 2024-10-23 20:56:29 ~5 min linux 📦zip
✔️ c17f9ef #15 2024-10-23 20:57:02 ~5 min android 📦aar
✖️ c17f9ef #15 2024-10-23 20:57:43 ~6 min tests-rpc 📄log
✔️ 12a0c7c #16 2024-10-23 21:07:19 ~2 min android 📦aar
✔️ 12a0c7c #20 2024-10-23 21:07:45 ~2 min linux 📦zip
✔️ 12a0c7c #16 2024-10-23 21:10:47 ~5 min tests-rpc 📄log
✔️ 12a0c7c #16 2024-10-23 21:16:01 ~11 min ios 📦zip
✔️ 12a0c7c #16 2024-10-23 21:36:16 ~31 min tests 📄log
✔️ 62d4ce9 #21 2024-11-07 09:10:25 ~4 min linux 📦zip
✔️ 62d4ce9 #17 2024-11-07 09:11:15 ~5 min tests-rpc 📄log
✔️ 62d4ce9 #1 2024-11-07 09:11:22 ~5 min macos 📦zip
✔️ 62d4ce9 #1 2024-11-07 09:12:17 ~6 min windows 📦zip
✔️ 62d4ce9 #1 2024-11-07 09:12:18 ~6 min macos 📦zip
✔️ 62d4ce9 #17 2024-11-07 09:13:26 ~7 min android 📦aar
✔️ 62d4ce9 #17 2024-11-07 09:14:01 ~7 min ios 📦zip
✔️ 62d4ce9 #17 2024-11-07 09:37:50 ~31 min tests 📄log
✔️ e9c399b #2 2024-11-22 14:15:56 ~4 min macos 📦zip
✔️ e9c399b #22 2024-11-22 14:16:01 ~4 min linux 📦zip
✔️ e9c399b #18 2024-11-22 14:16:13 ~5 min ios 📦zip
✔️ e9c399b #18 2024-11-22 14:16:28 ~5 min tests-rpc 📄log
✔️ e9c399b #2 2024-11-22 14:16:30 ~5 min macos 📦zip
✔️ e9c399b #2 2024-11-22 14:16:36 ~5 min windows 📦zip
✔️ e9c399b #18 2024-11-22 14:17:11 ~6 min android 📦aar
✖️ e9c399b #18 2024-11-22 14:42:06 ~30 min tests 📄log
Commit #️⃣ Finished (UTC) Duration Platform Result
✖️ 033a445 #19 2024-11-22 15:25:35 ~2 min tests 📄log
✔️ 033a445 #3 2024-11-22 15:27:54 ~4 min macos 📦zip
✖️ 033a445 #19 2024-11-22 15:28:04 ~4 min tests-rpc 📄log
✔️ 033a445 #19 2024-11-22 15:28:18 ~4 min ios 📦zip
✔️ 033a445 #3 2024-11-22 15:28:44 ~5 min macos 📦zip
✔️ 033a445 #23 2024-11-22 15:28:53 ~5 min linux 📦zip
✔️ 033a445 #3 2024-11-22 15:29:06 ~5 min windows 📦zip
✔️ 033a445 #19 2024-11-22 15:29:29 ~6 min android 📦aar
✔️ 7959e55 #4 2024-11-22 15:32:35 ~4 min macos 📦zip
✔️ 7959e55 #20 2024-11-22 15:32:57 ~4 min tests-rpc 📄log
✔️ 7959e55 #4 2024-11-22 15:33:08 ~3 min windows 📦zip
✔️ 7959e55 #20 2024-11-22 15:33:29 ~5 min ios 📦zip
✔️ 7959e55 #4 2024-11-22 15:34:14 ~5 min macos 📦zip
✔️ 7959e55 #24 2024-11-22 15:34:28 ~5 min linux 📦zip
✔️ 7959e55 #20 2024-11-22 15:35:43 ~6 min android 📦aar
✔️ 7959e55 #20 2024-11-22 15:57:21 ~31 min tests 📄log

@richard-ramos richard-ramos force-pushed the feat/mailserver-cycle branch 2 times, most recently from 1138045 to f5dc5cb Compare September 20, 2024 19:13
@richard-ramos richard-ramos changed the title refactor_: extract storenode cycle to go-waku api feat: extract storenode cycle to go-waku api Sep 20, 2024
@richard-ramos richard-ramos changed the title feat: extract storenode cycle to go-waku api feat_: extract storenode cycle to go-waku api Sep 20, 2024
@richard-ramos richard-ramos force-pushed the feat/mailserver-cycle branch 2 times, most recently from 9f4b082 to ef3f160 Compare October 15, 2024 21:11
Copy link

codecov bot commented Oct 15, 2024

Codecov Report

Attention: Patch coverage is 56.37982% with 147 lines in your changes missing coverage. Please review.

Project coverage is 60.86%. Comparing base (5fa57c8) to head (7959e55).
Report is 3 commits behind head on develop.

Files with missing lines Patch % Lines
protocol/messenger_mailserver.go 50.00% 48 Missing and 1 partial ⚠️
protocol/messenger_mailserver_cycle.go 67.08% 19 Missing and 7 partials ⚠️
eth-node/bridge/geth/waku.go 9.09% 20 Missing ⚠️
protocol/messenger_communities.go 36.84% 10 Missing and 2 partials ⚠️
eth-node/bridge/geth/wakuv2.go 69.69% 10 Missing ⚠️
protocol/messenger_store_node_request_manager.go 52.63% 9 Missing ⚠️
eth-node/types/waku.go 0.00% 4 Missing ⚠️
protocol/messenger.go 77.77% 4 Missing ⚠️
protocol/messenger_testing_utils.go 0.00% 4 Missing ⚠️
protocol/transport/transport.go 80.95% 4 Missing ⚠️
... and 3 more
Additional details and impacted files
@@             Coverage Diff              @@
##           develop    #5857       +/-   ##
============================================
+ Coverage    13.65%   60.86%   +47.21%     
============================================
  Files          805      820       +15     
  Lines       107999   109189     +1190     
============================================
+ Hits         14751    66462    +51711     
+ Misses       91334    34902    -56432     
- Partials      1914     7825     +5911     
Flag Coverage Δ
functional 13.59% <28.48%> (-0.07%) ⬇️
unit 60.07% <56.37%> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
eth-node/types/topic.go 89.13% <100.00%> (+73.22%) ⬆️
services/ext/api.go 6.37% <ø> (+5.78%) ⬆️
wakuv2/history_processor_wrapper.go 100.00% <100.00%> (ø)
wakuv2/waku.go 68.77% <100.00%> (+24.17%) ⬆️
protocol/messenger_contacts.go 61.00% <0.00%> (+61.00%) ⬆️
...col/messenger_store_node_request_manager_config.go 69.56% <50.00%> (+69.56%) ⬆️
protocol/storenodes/storenodes.go 65.45% <0.00%> (+41.38%) ⬆️
eth-node/types/waku.go 66.66% <0.00%> (+8.97%) ⬆️
protocol/messenger.go 62.43% <77.77%> (+48.57%) ⬆️
protocol/messenger_testing_utils.go 60.31% <0.00%> (+60.31%) ⬆️
... and 7 more

... and 629 files with indirect coverage changes

@richard-ramos richard-ramos marked this pull request as ready for review October 15, 2024 21:37
@richard-ramos richard-ramos force-pushed the feat/mailserver-cycle branch 2 times, most recently from 65d7a85 to a06eb72 Compare October 15, 2024 22:22
Copy link
Collaborator

@igor-sirotin igor-sirotin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏

eth-node/bridge/geth/wakuv2.go Show resolved Hide resolved
Comment on lines 356 to 357
TimeStart: proto.Int64(int64(batch.From) * int64(time.Second)),
TimeEnd: proto.Int64(int64(batch.To) * int64(time.Second)),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be nice to refactor MailserverBatch to have From/To fields as time.Time to avoid such weird conversions. Considering that we do it initially as well:

now := float64(m.GetCurrentTimeInMillis()) / 1000
to := uint32(math.Ceil(now))
from := uint32(math.Floor(now)) - uint32(duration.Seconds())

And then we have to convert them once again here, when passing to go-waku...

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did this change, but while working on it, i realized the madness of how we handle time in status-go: we use uint64 for clock values (milliseconds), on waku we use time.Time, on mailserver code and message gaps calculation we use uint32 (in seconds, i imagine this is 'inherited' from back when we used to have this logic on the mobile app).

This lack of consistency is awful. In a subsequent PR i'll attempt to get rid of the uint32 code for mailserver code and gaps to use time.Time, but perhaps we should consider to later also attempt to get rid of the milliseconds time (uint64) and use time.Time consistently across all codebase?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use time.Time consistently across all codebase

💯

go func() {
defer gocommon.LogOnPanic()
<-available
<-m.transport.OnStorenodeAvailableOneShot()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We probably need some <-ctx.Done() here as well?
Not related to your change, but would be nice to fix on the way.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, why not WaitForAvailableStoreNode here?
A function like OnStorenodeAvailableOneShot is quite specific. And only used here, but could easily be replaced with WaitForAvailableStoreNode and infinite timeout 🤔

Comment on lines 333 to 331
func (w *gethWakuV2Wrapper) WaitForAvailableStoreNode(timeout time.Duration) bool {
return w.waku.StorenodeCycle.WaitForAvailableStoreNode(context.TODO(), timeout)
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

context should probably passed as argument to WaitForAvailableStoreNode

Suggested change
func (w *gethWakuV2Wrapper) WaitForAvailableStoreNode(timeout time.Duration) bool {
return w.waku.StorenodeCycle.WaitForAvailableStoreNode(context.TODO(), timeout)
}
func (w *gethWakuV2Wrapper) WaitForAvailableStoreNode(ctx context.Context, timeout time.Duration) bool {
return w.waku.StorenodeCycle.WaitForAvailableStoreNode(ctx, timeout)
}


// getCommunityMailserver returns the active mailserver if a communityID is present then it'll return the mailserver
// for that community if it has a mailserver setup otherwise it'll return the global mailserver
func (m *Messenger) getCommunityMailserver(communityID ...string) peer.ID {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At least for the new functions 😄

Suggested change
func (m *Messenger) getCommunityMailserver(communityID ...string) peer.ID {
func (m *Messenger) getCommunityStorenode(communityID ...string) peer.ID {


return m.findNewMailserver()
}
go func() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
go func() {
go func() {
defer gocommon.LogOnPanic()

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, pass some context to PeformStorenodeTask?

if pinnedMailserver == nil {
m.disconnectActiveMailserver(graylistBackoff)
}
func (m *Messenger) performStorenodeTask(task func() (*MessengerResponse, error), opts ...history.StorenodeTaskOption) (*MessengerResponse, error) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This wrapper looks quite difficult. We start a goroutine that has a callback that calls a task, whilst receiving result/error through channels 😵

Any chances to simplify this somehow?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be simpler now!

@@ -1172,13 +917,13 @@ func (m *Messenger) fetchMessages(chatID string, duration time.Duration) (uint32
return nil, nil
}

m.logger.Debug("fetching messages", zap.String("chatID", chatID), zap.String("mailserver", ms.Name))
m.logger.Debug("fetching messages", zap.String("chatID", chatID), zap.Stringer("storenodeID", peerID))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never heard of storenodeID before 😄

Suggested change
m.logger.Debug("fetching messages", zap.String("chatID", chatID), zap.Stringer("storenodeID", peerID))
m.logger.Debug("fetching messages", zap.String("chatID", chatID), zap.Stringer("peerID", peerID))

Comment on lines 65 to 68
if err == nil {
if commStorenodeID == peerID {
return true
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if err == nil {
if commStorenodeID == peerID {
return true
}
if err == nil && commStorenodeID == peerID {
return true

Comment on lines -1411 to -1392
func (api *PublicAPI) DisconnectActiveMailserver() {
api.service.messenger.DisconnectActiveMailserver()
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This counts as a breaking change, please mark the commit accordingly

Copy link
Contributor

@osmaczko osmaczko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job moving the logic to go-waku, it fits well there 👍

I believe this PR carries a high risk and should be thoroughly reviewed by QAs from both platforms before merging. I've just requested a review from the QAs. Are there any specific instructions or steps that should be followed to ensure the affected areas are tested properly?

@osmaczko osmaczko requested review from a team and glitchminer and removed request for a team October 17, 2024 17:54
@pavloburykh
Copy link

Good job moving the logic to go-waku, it fits well there 👍

I believe this PR carries a high risk and should be thoroughly reviewed by QAs from both platforms before merging. I've just requested a review from the QAs. Are there any specific instructions or steps that should be followed to ensure the affected areas are tested properly?

@osmaczko, thank you for reaching out to the QA team. We're currently preparing to cut the release branch for the upcoming 2.31 version. Since we want to avoid including any risky changes in this release, we will be ready to test this PR once the 2.31 branch is finalized and released.

@richard-ramos meanwhile, we would appreciate if you create a corresponding mobile PR pointing at these changes and providing some details on what areas are affected and should be tested in scope of this PR. Thank you!

Copy link

github-actions bot commented Oct 21, 2024

Looks like you have BREAKING CHANGES in your PR.
Please make sure to follow 💔How to introduce breaking changes guide:

Check-list

@richard-ramos
Copy link
Member Author

@igor-sirotin i think I managed to implement/fix all of your suggestions and observations. If this PR gets your blessings I'll proceed to create PRs for desktop/mobile QA. Thank you!

@igor-sirotin igor-sirotin changed the title feat_: extract storenode cycle to go-waku api feat!: extract storenode cycle to go-waku api Oct 23, 2024
Copy link
Collaborator

@igor-sirotin igor-sirotin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Contributor

@kaichaosun kaichaosun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@churik
Copy link
Member

churik commented Nov 4, 2024

@richard-ramos is it ready to be tested?
can you please specify what areas can be affected (I suppose the whole messaaging, offline-online handling, fetching from store nodes)?

can you please update status-im/status-mobile#21494 accordingly and move PR to E2E tests column when it is ready?

Thanks!

@richard-ramos
Copy link
Member Author

@churik , done! i've just rebased the PR and moved it to the e2e column.
The areas that are affected are those related to retrieving message history for 1:1 messages and communities, as well as confirming that a message has been sent.

@pavloburykh
Copy link

@churik , done! i've just rebased the PR and moved it to the e2e column. The areas that are affected are those related to retrieving message history for 1:1 messages and communities, as well as confirming that a message has been sent.

Hey @richard-ramos! Thanks for the PR. In case you have missed, I have logged some issues in mobile PR status-im/status-mobile#21494 (comment) , please take a look once you have a chance.

@pavloburykh
Copy link

@richard-ramos tested on mobile in status-im/status-mobile#21494. No issues from my side.

@osmaczko osmaczko merged commit 0c838b0 into develop Nov 25, 2024
20 checks passed
@osmaczko osmaczko deleted the feat/mailserver-cycle branch November 25, 2024 16:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants