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

VStream API: allow keyspace-level heartbeats to be streamed #16593

Merged
merged 18 commits into from
Aug 27, 2024

Conversation

rohit-nayak-ps
Copy link
Contributor

@rohit-nayak-ps rohit-nayak-ps commented Aug 13, 2024

Description

This PR adds an option to the VTGate VStream API to allow heartbeats created by vttablet's heartbeat writer to be streamed as regular FieldEvents/RowEvents for the sidecar _vt.heartbeat table.

flags := &vtgatepb.VStreamFlags{
	StreamKeyspaceHeartbeats: true,
}

Note that the vttablet heartbeats have to be enabled either through the throttler (which is on by default) or explicitly turning on the heartbeats using, for example, --heartbeat_enable, --heartbeat_interval 1s and --heartbeat_on_demand_duration 0

Related Issue(s)

Checklist

  • "Backport to:" labels have been added if this change should be back-ported to release branches
  • If this change is to be back-ported to previous releases, a justification is included in the PR description
  • Tests were added or are not required
  • Did the new or modified tests pass consistently locally and on CI?
  • Documentation was added or is not required

@github-actions github-actions bot added this to the v21.0.0 milestone Aug 13, 2024
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
…l tables

Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
@rohit-nayak-ps rohit-nayak-ps force-pushed the rohit/vstream-vt-heartbeat branch from 68863d4 to 731799a Compare August 14, 2024 08:17
Copy link

codecov bot commented Aug 14, 2024

Codecov Report

Attention: Patch coverage is 90.12346% with 8 lines in your changes missing coverage. Please review.

Project coverage is 68.98%. Comparing base (cc68dd5) to head (8fb0240).
Report is 34 commits behind head on main.

Files Patch % Lines
go/vt/vttablet/tabletserver/vstreamer/vstreamer.go 94.33% 3 Missing ⚠️
go/vt/vtgate/vstream_manager.go 75.00% 2 Missing ⚠️
...et/tabletmanager/vreplication/replica_connector.go 0.00% 1 Missing ⚠️
go/vt/vttablet/tabletserver/binlog_watcher.go 0.00% 1 Missing ⚠️
go/vt/vttablet/tabletserver/tabletserver.go 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #16593      +/-   ##
==========================================
+ Coverage   68.85%   68.98%   +0.12%     
==========================================
  Files        1557     1562       +5     
  Lines      199891   200776     +885     
==========================================
+ Hits       137644   138505     +861     
- Misses      62247    62271      +24     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

…nes and the ones specified separately

Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
go/test/endtoend/vreplication/vstream_test.go Outdated Show resolved Hide resolved
go/test/endtoend/vreplication/vstream_test.go Outdated Show resolved Hide resolved
go/test/endtoend/vreplication/vstream_test.go Outdated Show resolved Hide resolved
go/test/endtoend/vreplication/vstream_test.go Outdated Show resolved Hide resolved
go/test/endtoend/vreplication/vstream_test.go Outdated Show resolved Hide resolved
proto/binlogdata.proto Outdated Show resolved Hide resolved
proto/binlogdata.proto Outdated Show resolved Hide resolved
go/vt/vtgate/vstream_manager.go Outdated Show resolved Hide resolved
go/vt/vtgate/vstream_manager.go Outdated Show resolved Hide resolved
@@ -1171,7 +1171,7 @@ func (tsv *TabletServer) VStream(ctx context.Context, request *binlogdatapb.VStr
if err := tsv.sm.VerifyTarget(ctx, request.Target); err != nil {
return err
}
return tsv.vstreamer.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send)
return tsv.vstreamer.Stream(ctx, request.Position, request.TableLastPKs, request.Filter, throttlerapp.VStreamerName, send, request.Options)
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it worth adding vstream options to support a variadic set of options (0-N) like we recently did for lock options and (workflow) server options? Then we don't need to pass this as nil in so many places: https://github.com/vitessio/vitess/blob/main/go/vt/vtctl/workflow/server_options.go

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I prefer using strong typing unless functionally contraindicated. Especially for a grpc API.

While updating all usages can be tedious, it also helps review the parts of code where that API is being called: #16593 (comment)

Copy link
Contributor

@mattlord mattlord left a comment

Choose a reason for hiding this comment

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

LGTM! I only had some minor comments. Let me know what you think and I'll come back to this quickly.

go/vt/vttablet/tabletserver/vstreamer/helper_event_test.go Outdated Show resolved Hide resolved
Comment on lines -1490 to +1563
func TestInternalTables(t *testing.T) {
func TestOnlineDDLTables(t *testing.T) {
Copy link
Contributor

Choose a reason for hiding this comment

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

This is a clue that it might be better to explicitly call these sidecar[db]_tables rather than internal_tables. Although they're all internal tables so it's also fine as-is IMO.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yeah, I was also vacillating between internal and sidecar(db). internal is not precise because we could also term online ddl shadow tables and other artifacts as internal. I will let @deepthi also weigh in before changing it everywhere.

Copy link
Member

Choose a reason for hiding this comment

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

This seems to have been resolved.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@deepthi, the question was a broader one. Currently we use options/proto attributes like InternalTables, is_internal. Should we change that to SidecarDBTables and is_sidecardb_table?

We could either continue calling it Internal (keeping it generic, allowing for future specification of other tables than SidecarDB tables, like, I don't know, shadow tables in OnlineDDL for example) or lock it down to SidecarDB tables using that in the object naming instead.

Copy link
Member

Choose a reason for hiding this comment

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

internal is fine for now. Renaming proto fields is not difficult if we wanted to change it in the future.

@@ -398,6 +398,79 @@ func TestMissingTables(t *testing.T) {
runCases(t, filter, testcases, startPos, nil)
}

// TestInternalTables tests streaming of sidecar db tables.
Copy link
Contributor

Choose a reason for hiding this comment

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

This comment for the function name is another clue that it might be better/clearer to call them SidecarDBTables rather than InternalTables.

go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go Outdated Show resolved Hide resolved
go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go Outdated Show resolved Hide resolved
go/vt/vttablet/tabletserver/vstreamer/vstreamer_test.go Outdated Show resolved Hide resolved
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Comment on lines -1490 to +1563
func TestInternalTables(t *testing.T) {
func TestOnlineDDLTables(t *testing.T) {
Copy link
Member

Choose a reason for hiding this comment

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

This seems to have been resolved.

@@ -73,5 +73,5 @@ func (c *ReplicaConnector) Close() error {
}

func (c *ReplicaConnector) VStream(ctx context.Context, startPos string, filter *binlogdatapb.Filter, send func([]*binlogdatapb.VEvent) error) error {
return c.vstreamer.Stream(ctx, startPos, nil, filter, throttlerapp.ReplicaConnectorName, send)
return c.vstreamer.Stream(ctx, startPos, nil, filter, throttlerapp.ReplicaConnectorName, send, nil)
Copy link
Member

Choose a reason for hiding this comment

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

Here again, based on how this is being used (only in PITR), we don't pass in the options.
Is it possible to replace usages of this connector with the tabletConnector?

Copy link
Contributor Author

@rohit-nayak-ps rohit-nayak-ps Aug 24, 2024

Choose a reason for hiding this comment

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

Is it possible to replace usages of this connector with the tabletConnector?

I think so. Should be a separate PR though.

Copy link
Member

Choose a reason for hiding this comment

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

We should even think about deleting all the binlog server code in the existing PITR implementation. No one is using it.

Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Signed-off-by: Rohit Nayak <rohit@planetscale.com>
Copy link
Contributor

@mattlord mattlord left a comment

Choose a reason for hiding this comment

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

Nice work, @rohit-nayak-ps ! ❤️

@deepthi deepthi merged commit bc6fb1c into vitessio:main Aug 27, 2024
132 checks passed
@deepthi deepthi deleted the rohit/vstream-vt-heartbeat branch August 27, 2024 16:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature Request: Binlog Timestamp Watermarking for VStream
4 participants