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

2 - Broadcast - Datatypes #199

Open
wants to merge 1 commit into
base: features/broadcast/logging
Choose a base branch
from

Conversation

aleksander-vedvik
Copy link
Collaborator

This pull request build on top of: #198

This is a preparation pr that includes the most important types in the broadcast implementation.

Data types, such as dtos and errors, used in the broadcast implementation
@aleksander-vedvik aleksander-vedvik changed the title Features/broadcast/datatypes 2 Broadcast Datatypes Jan 11, 2025
@aleksander-vedvik aleksander-vedvik changed the title Broadcast Datatypes 2 - Broadcast - Datatypes Jan 11, 2025
@meling meling changed the base branch from master to features/broadcast/logging January 11, 2025 18:59
Copy link
Member

@meling meling left a comment

Choose a reason for hiding this comment

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

So I did a rather thorough review here...

If you prefer that I push suggested changes directly to the PR, rather than asking you to fix my nitpicking comments. That way, I could instead ask only the questions that need more coordination and clarification. Let me know what's the best way forward.

@@ -0,0 +1,75 @@
package dtos
Copy link
Member

Choose a reason for hiding this comment

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

We need a package doc comment for dtos to explain what it is and provides.

Copy link
Member

Choose a reason for hiding this comment

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

Maybe the package name could be more specific. I can't figure out what it means, so I can't think of something better.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

It's supposed to contain all dto's that are referenced outside of the broadcast package context (including subfolders). The main idea is to prevent cyclic imports and provide a common namespace for dto's pertaining to broadcast outside of the broadcast context. I.e. instead of referencing processor.RequestDto and router.Msg in gorums/server.go, I thought it would be easier to use dtos.RequestDto and dtos.Msg. Hoping this would reduce the cognitive load of developers working with higher level functionality such as nodes/channels, as both processor and router are implementation details specific to broadcasting.

Naming things are not my strong suit, so feel free to rename/change. If you think it is better, the dtos could also be moved to their respective packages (RequestDto -> processor, the rest -> router).

@@ -0,0 +1,57 @@
package broadcastErrors
Copy link
Member

Choose a reason for hiding this comment

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

Go packages shouldn't use camel case. However, it is also uncommon to have errors in a separate package. Since I assume your errors are specific to broadcast, they should probably be part of the broadcast package.

Some notable exceptions exist, e.g., upspin. Since Upspin is a large project, they standardize on a particular error style across the whole project. We could do the same, but perhaps that would be part of Asbjørn's thesis work.

Copy link
Member

Choose a reason for hiding this comment

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

Note also: Since the package is declared as broadcastErrors but the file is saved in the errors folder, this will not compile.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

My bad. The package should've been renamed to errors. I agree that they should not be in their own package. I'm just not very happy with how the logging wrapper currently operates, as it pollutes the code a bit (see the log statements in processor.go). I was hoping to improve this my including more context/fields in each error and log the errors directly. Hopefully making the logging a bit less verbose and at the same time making the errors a bit more explicit.

Since this is not implemented yet, it is probably better to move the errors to the packages that references them.

@@ -0,0 +1,57 @@
package broadcastErrors

type BroadcastIDErr struct{}
Copy link
Member

Choose a reason for hiding this comment

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

Rename it to IDErr to avoid stuttering.

Usage from outside the broadcast package would be broadcast.IDErr instead of broadcast.BroadcastIDErr.

type MissingClientReqErr struct{}

func (err MissingClientReqErr) Error() string {
return "has not received client req yet"
Copy link
Member

Choose a reason for hiding this comment

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

return "client request not received (yet)"

type ClientReqAlreadyReceivedErr struct{}

func (err ClientReqAlreadyReceivedErr) Error() string {
return "the client req has already been received. The forward req is thus dropped."
Copy link
Member

Choose a reason for hiding this comment

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

What about this:

// The forwarded request is dropped since:
return "client request already received"
// OR:
return "client request already received (dropped)"
// OR:
return "forwarded client request already received (dropped)"

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I like number 2 the best. 👍

}

func (err InvalidAddrErr) Error() string {
return "provided Addr is invalid. got: " + err.Addr
Copy link
Member

Choose a reason for hiding this comment

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

return fmt.Sprintf("invalid address: %s", err.Addr)

String() string
}

type BroadcastMsg struct {
Copy link
Member

Choose a reason for hiding this comment

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

It would be quite useful with doc comments for structs, methods, fields etc. Especially, those fields that aren't common knowledge, such as Info, Options, OriginAddr.

}

type BroadcastMsg struct {
Ctx context.Context
Copy link
Member

Choose a reason for hiding this comment

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

Difficult to assess, since I don't know the use of the Ctx field here, but it is a antipattern to include context.Context in structs. See the Context and Structs blog post. It should be passed as the first argument to all functions/methods that need a context. But see the blog for concrete advice.

return "wrong broadcastID"
}

type MissingClientReqErr struct{}
Copy link
Member

Choose a reason for hiding this comment

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

Would be nice to have doc comments on these errors too.

Close func() error
}

type BroadcastOptions struct {
Copy link
Member

Choose a reason for hiding this comment

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

This question applies to the all types and fields in the PR: Is it intentional that all types and fields are exported? Are they needed outside the broadcast/dtos package?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, they are. I provided a longer explanation to one of the comments above. 👍

@aleksander-vedvik
Copy link
Collaborator Author

So I did a rather thorough review here...

If you prefer that I push suggested changes directly to the PR, rather than asking you to fix my nitpicking comments. That way, I could instead ask only the questions that need more coordination and clarification. Let me know what's the best way forward.

Yes, please do. I'll instead update the subsequent PR's with the changes. 👍

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.

2 participants