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

chore(storage): implement Notification methods #6138

Merged
merged 13 commits into from
Jun 14, 2022

Conversation

cojenco
Copy link
Contributor

@cojenco cojenco commented Jun 8, 2022

This adds interface Notification methods
Tests pending on testbench new release with fix -googleapis/storage-testbench#360

  • CreateNotification
  • GetNotification
  • DeleteNotification
  • ListNotifications

@product-auto-label product-auto-label bot added size: l Pull request size is large. api: storage Issues related to the Cloud Storage API. labels Jun 8, 2022
@cojenco cojenco marked this pull request as ready for review June 8, 2022 21:10
@cojenco cojenco requested review from a team as code owners June 8, 2022 21:10
@cojenco cojenco requested review from tritone and noahdietz June 8, 2022 21:11
storage/grpc_client.go Outdated Show resolved Hide resolved
storage/grpc_client.go Outdated Show resolved Hide resolved
Copy link
Contributor

@tritone tritone left a comment

Choose a reason for hiding this comment

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

thanks Cathy!

err = run(ctx, func() error {
gitr := c.raw.ListNotifications(ctx, req, s.gax...)
for {
items, nextPageToken, err := gitr.InternalFetch(int(req.PageSize), req.PageToken)
Copy link
Contributor

Choose a reason for hiding this comment

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

I was initially confused about how the page token was being preserved between loop iterations but looks like InternalFetch modifies the request to handle this. Might be worth adding a comment about this since it does seem confusing!

Also @noahdietz can you just verify that this will preserve the page token if there is a failure from internalFetch mid-way through? Otherwise we might end up with duplicate results.

Copy link
Contributor

Choose a reason for hiding this comment

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

looks like InternalFetch modifies the request to handle this

I'm not sure what you mean by this. InternalFetch will return the nextPageToken, but not modify the next request to use it. That's how I read its code at least. I think we need to set req.PageToken = nextPageToken right after line 869 before the next iteration.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ahh I was not preserving the nextPageToken between iterations >"< updated. Thank you both for the clarification!

Copy link
Contributor

Choose a reason for hiding this comment

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

Hah @noahdietz that's what I thought originally looking through the code and I talked myself out of it for some reason. Yup that sounds like the right answer.

if err != nil {
return nil, err
}
return notificationsToMap(res.Items), nil
Copy link
Contributor

Choose a reason for hiding this comment

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

Interestingly it seems like this implementation doesn't use page tokens-- so if there are more than 1000 notifications you won't get all of them. (I think this would be very uncommon though)

Copy link
Contributor

Choose a reason for hiding this comment

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

Might be worth adding a Note or TODO for later mentioning this. I too was surprised to see an un-paginated list api, even if it predates the design standards.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah so I did a bit of digging and found the following:

I'm not sure how this would effect gRPC, if at all.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think we should keep page size unspecified. The server will "do the right thing" and if for some reason that quota is raised to 500, we won't have to change our code or be worried about what might happen - it will "just work".

Can we add a comment that the server will use a default page_size (just sent an email to inquire what the default actually is), and that our code will not set a page_size? We could leave the param just in case we want to set it later. WDYT?

Copy link
Contributor

Choose a reason for hiding this comment

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

Sounds fine to me! Agreed that we don't want to depend of behavior that may change going forward.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Gotcha... IIUC, based on the same block of code, req.GetPageSize() is not set here and the zero value fallbacks to the API default pageSize of 100.

So I've added a comment but no change in our code. PTAL and let me know if my understanding is correct.

storage/http_client.go Outdated Show resolved Hide resolved
storage/notifications.go Outdated Show resolved Hide resolved
err = run(ctx, func() error {
gitr := c.raw.ListNotifications(ctx, req, s.gax...)
for {
items, nextPageToken, err := gitr.InternalFetch(int(req.PageSize), req.PageToken)
Copy link
Contributor

Choose a reason for hiding this comment

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

looks like InternalFetch modifies the request to handle this

I'm not sure what you mean by this. InternalFetch will return the nextPageToken, but not modify the next request to use it. That's how I read its code at least. I think we need to set req.PageToken = nextPageToken right after line 869 before the next iteration.

storage/notifications.go Outdated Show resolved Hide resolved
storage/grpc_client.go Outdated Show resolved Hide resolved
storage/http_client.go Outdated Show resolved Hide resolved
Copy link
Contributor

@tritone tritone left a comment

Choose a reason for hiding this comment

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

Couple more minor things, otherwise LGTM


// ListNotifications returns all the Notifications configured for this bucket, as a map indexed by notification ID.
//
// Note: Pagination is not currently supported.
Copy link
Contributor

Choose a reason for hiding this comment

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

I would amend this to say something like:

Note: This API does not support pagination. However, entity limits cap the number of notifications on a single bucket, so all results will be returned in the first response. See https://cloud.google.com/storage/quotas#buckets

Copy link
Contributor Author

Choose a reason for hiding this comment

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

updated, thanks!

storage/notifications.go Outdated Show resolved Hide resolved
ctx = trace.StartSpan(ctx, "cloud.google.com/go/storage.grpcStorageClient.CreateNotification")
defer func() { trace.EndSpan(ctx, err) }()

if n.ID != "" {
Copy link
Contributor

Choose a reason for hiding this comment

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

Remove client-side validation here as well (to be left above the interface).

@product-auto-label product-auto-label bot added size: m Pull request size is medium. and removed size: l Pull request size is large. labels Jun 13, 2022
@cojenco cojenco requested a review from tritone June 14, 2022 19:15
@cojenco cojenco merged commit 61dbbe6 into googleapis:main Jun 14, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: storage Issues related to the Cloud Storage API. size: m Pull request size is medium.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants