From 3c8dfe36202446de63f1a2984c6c9e07a2e8c5b5 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 14 Mar 2021 20:00:54 -0400 Subject: [PATCH 1/7] Add RPC for ShardReplicationPositions, generate and add method stub Signed-off-by: Andrew Mason --- go/vt/proto/vtctldata/vtctldata.pb.go | 885 ++++++++++++++++---- go/vt/proto/vtctlservice/vtctlservice.pb.go | 142 ++-- go/vt/vtctl/grpcvtctldclient/client_gen.go | 9 + go/vt/vtctl/grpcvtctldserver/server.go | 5 + proto/vtctldata.proto | 12 + proto/vtctlservice.proto | 6 + web/vtadmin/src/proto/vtadmin.d.ts | 186 ++++ web/vtadmin/src/proto/vtadmin.js | 439 ++++++++++ 8 files changed, 1471 insertions(+), 213 deletions(-) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index 6c3d3e57ea6..cc26936a18b 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -13,6 +13,7 @@ import ( binlogdata "vitess.io/vitess/go/vt/proto/binlogdata" logutil "vitess.io/vitess/go/vt/proto/logutil" mysqlctl "vitess.io/vitess/go/vt/proto/mysqlctl" + replicationdata "vitess.io/vitess/go/vt/proto/replicationdata" tabletmanagerdata "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodata "vitess.io/vitess/go/vt/proto/topodata" vschema "vitess.io/vitess/go/vt/proto/vschema" @@ -3875,6 +3876,110 @@ func (m *ReparentTabletResponse) GetPrimary() *topodata.TabletAlias { return nil } +type ShardReplicationPositionsRequest struct { + Keyspace string `protobuf:"bytes,1,opt,name=keyspace,proto3" json:"keyspace,omitempty"` + Shard string `protobuf:"bytes,2,opt,name=shard,proto3" json:"shard,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ShardReplicationPositionsRequest) Reset() { *m = ShardReplicationPositionsRequest{} } +func (m *ShardReplicationPositionsRequest) String() string { return proto.CompactTextString(m) } +func (*ShardReplicationPositionsRequest) ProtoMessage() {} +func (*ShardReplicationPositionsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_f41247b323a1ab2e, []int{61} +} +func (m *ShardReplicationPositionsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShardReplicationPositionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ShardReplicationPositionsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ShardReplicationPositionsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShardReplicationPositionsRequest.Merge(m, src) +} +func (m *ShardReplicationPositionsRequest) XXX_Size() int { + return m.Size() +} +func (m *ShardReplicationPositionsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ShardReplicationPositionsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ShardReplicationPositionsRequest proto.InternalMessageInfo + +func (m *ShardReplicationPositionsRequest) GetKeyspace() string { + if m != nil { + return m.Keyspace + } + return "" +} + +func (m *ShardReplicationPositionsRequest) GetShard() string { + if m != nil { + return m.Shard + } + return "" +} + +type ShardReplicationPositionsResponse struct { + // ReplicationStatuses is a mapping of tablet alias string to replication + // status for that tablet. + ReplicationStatuses map[string]*replicationdata.Status `protobuf:"bytes,1,rep,name=replication_statuses,json=replicationStatuses,proto3" json:"replication_statuses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ShardReplicationPositionsResponse) Reset() { *m = ShardReplicationPositionsResponse{} } +func (m *ShardReplicationPositionsResponse) String() string { return proto.CompactTextString(m) } +func (*ShardReplicationPositionsResponse) ProtoMessage() {} +func (*ShardReplicationPositionsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f41247b323a1ab2e, []int{62} +} +func (m *ShardReplicationPositionsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShardReplicationPositionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ShardReplicationPositionsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ShardReplicationPositionsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShardReplicationPositionsResponse.Merge(m, src) +} +func (m *ShardReplicationPositionsResponse) XXX_Size() int { + return m.Size() +} +func (m *ShardReplicationPositionsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ShardReplicationPositionsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ShardReplicationPositionsResponse proto.InternalMessageInfo + +func (m *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string]*replicationdata.Status { + if m != nil { + return m.ReplicationStatuses + } + return nil +} + type TabletExternallyReparentedRequest struct { // Tablet is the alias of the tablet that was promoted externally and should // be updated to the shard primary in the topo. @@ -3888,7 +3993,7 @@ func (m *TabletExternallyReparentedRequest) Reset() { *m = TabletExterna func (m *TabletExternallyReparentedRequest) String() string { return proto.CompactTextString(m) } func (*TabletExternallyReparentedRequest) ProtoMessage() {} func (*TabletExternallyReparentedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_f41247b323a1ab2e, []int{61} + return fileDescriptor_f41247b323a1ab2e, []int{63} } func (m *TabletExternallyReparentedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3938,7 +4043,7 @@ func (m *TabletExternallyReparentedResponse) Reset() { *m = TabletExtern func (m *TabletExternallyReparentedResponse) String() string { return proto.CompactTextString(m) } func (*TabletExternallyReparentedResponse) ProtoMessage() {} func (*TabletExternallyReparentedResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f41247b323a1ab2e, []int{62} + return fileDescriptor_f41247b323a1ab2e, []int{64} } func (m *TabletExternallyReparentedResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4065,6 +4170,9 @@ func init() { proto.RegisterType((*RemoveShardCellResponse)(nil), "vtctldata.RemoveShardCellResponse") proto.RegisterType((*ReparentTabletRequest)(nil), "vtctldata.ReparentTabletRequest") proto.RegisterType((*ReparentTabletResponse)(nil), "vtctldata.ReparentTabletResponse") + proto.RegisterType((*ShardReplicationPositionsRequest)(nil), "vtctldata.ShardReplicationPositionsRequest") + proto.RegisterType((*ShardReplicationPositionsResponse)(nil), "vtctldata.ShardReplicationPositionsResponse") + proto.RegisterMapType((map[string]*replicationdata.Status)(nil), "vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry") proto.RegisterType((*TabletExternallyReparentedRequest)(nil), "vtctldata.TabletExternallyReparentedRequest") proto.RegisterType((*TabletExternallyReparentedResponse)(nil), "vtctldata.TabletExternallyReparentedResponse") } @@ -4072,170 +4180,175 @@ func init() { func init() { proto.RegisterFile("vtctldata.proto", fileDescriptor_f41247b323a1ab2e) } var fileDescriptor_f41247b323a1ab2e = []byte{ - // 2593 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4d, 0x6f, 0x1b, 0xc7, - 0xb5, 0x4b, 0x52, 0x94, 0xf8, 0x48, 0xea, 0x63, 0xf4, 0xb5, 0x61, 0x6c, 0xd9, 0x59, 0xc7, 0x8e, - 0xea, 0xc4, 0x94, 0xad, 0x24, 0x86, 0xe1, 0x26, 0xad, 0x6d, 0x7d, 0x18, 0x72, 0x5c, 0x57, 0x5d, - 0xaa, 0x0a, 0xda, 0x02, 0xdd, 0x8e, 0x76, 0x47, 0xf4, 0x42, 0xcb, 0x5d, 0x66, 0x67, 0x48, 0x89, - 0xe9, 0xa1, 0x97, 0xf6, 0x10, 0xa0, 0x40, 0xaf, 0x05, 0x82, 0x02, 0x3d, 0x15, 0xfd, 0x05, 0x01, - 0x5a, 0x14, 0x3d, 0x16, 0x3d, 0xf4, 0xd0, 0x6b, 0x6f, 0x85, 0xfb, 0x33, 0x7a, 0x29, 0xe6, 0x6b, - 0xb9, 0x5c, 0x7e, 0x58, 0x56, 0x0c, 0x14, 0x3d, 0x71, 0xe7, 0xcd, 0x7b, 0xf3, 0xde, 0xbc, 0xef, - 0x37, 0x84, 0xb9, 0x2e, 0x73, 0x59, 0xe0, 0x61, 0x86, 0xeb, 0xed, 0x38, 0x62, 0x11, 0x2a, 0x25, - 0x80, 0xda, 0xfc, 0x91, 0x1f, 0x06, 0x51, 0xb3, 0xbf, 0x59, 0xab, 0x06, 0x51, 0xb3, 0xc3, 0xfc, - 0x40, 0x2d, 0x67, 0x5b, 0x3d, 0xfa, 0x59, 0xe0, 0x32, 0xbd, 0x5e, 0x65, 0xf8, 0x28, 0x20, 0xac, - 0x85, 0x43, 0xdc, 0x24, 0x71, 0x8a, 0x6e, 0x96, 0x45, 0xed, 0x28, 0x7d, 0x4e, 0x97, 0xba, 0xcf, - 0x49, 0x4b, 0x2f, 0x2b, 0x5d, 0xc6, 0xfc, 0x16, 0x91, 0x2b, 0xeb, 0x53, 0xa8, 0xed, 0x9c, 0x11, - 0xb7, 0xc3, 0xc8, 0x21, 0x17, 0x65, 0x2b, 0x6a, 0xb5, 0x70, 0xe8, 0xd9, 0xe4, 0xb3, 0x0e, 0xa1, - 0x0c, 0x21, 0x28, 0xe0, 0xb8, 0x49, 0x4d, 0xe3, 0x6a, 0x7e, 0xbd, 0x64, 0x8b, 0x6f, 0x74, 0x1d, - 0x66, 0xb1, 0xcb, 0xfc, 0x28, 0x74, 0xf8, 0x31, 0x51, 0x87, 0x99, 0xb9, 0xab, 0xc6, 0x7a, 0xde, - 0xae, 0x4a, 0xe8, 0x81, 0x04, 0x5a, 0x5b, 0xf0, 0xe6, 0xc8, 0x83, 0x69, 0x3b, 0x0a, 0x29, 0x41, - 0x6f, 0xc3, 0x14, 0xe9, 0x92, 0x90, 0x99, 0xc6, 0x55, 0x63, 0xbd, 0xbc, 0x39, 0x5b, 0xd7, 0x97, - 0xdd, 0xe1, 0x50, 0x5b, 0x6e, 0x5a, 0x5f, 0x18, 0x60, 0x1e, 0xf0, 0x6b, 0x7e, 0x17, 0x33, 0x12, - 0xfb, 0x38, 0xf0, 0x3f, 0x27, 0x0d, 0xc2, 0x98, 0x1f, 0x36, 0x29, 0x7a, 0x0b, 0x2a, 0x0c, 0xc7, - 0x4d, 0xc2, 0x1c, 0xa1, 0x09, 0x71, 0x52, 0xc9, 0x2e, 0x4b, 0x98, 0xa0, 0x42, 0xef, 0xc2, 0x02, - 0x8d, 0x3a, 0xb1, 0x4b, 0x1c, 0x72, 0xd6, 0x8e, 0x09, 0xa5, 0x7e, 0x14, 0x0a, 0x71, 0x4b, 0xf6, - 0xbc, 0xdc, 0xd8, 0x49, 0xe0, 0xe8, 0x32, 0x80, 0x1b, 0x13, 0xcc, 0x88, 0xe3, 0x79, 0x81, 0x99, - 0x17, 0x58, 0x25, 0x09, 0xd9, 0xf6, 0x02, 0xeb, 0x9f, 0x39, 0x58, 0x1c, 0x25, 0x46, 0x0d, 0x66, - 0x4e, 0xa3, 0xf8, 0xe4, 0x38, 0x88, 0x4e, 0x95, 0x08, 0xc9, 0x1a, 0xbd, 0x03, 0x73, 0x8a, 0xff, - 0x09, 0xe9, 0xd1, 0x36, 0x76, 0x89, 0xe2, 0x3e, 0x2b, 0xc1, 0x9f, 0x28, 0x28, 0x47, 0x54, 0x77, - 0x49, 0x10, 0xa5, 0x00, 0xb3, 0x12, 0x9c, 0x20, 0xde, 0x80, 0x39, 0xca, 0xa2, 0xb6, 0x83, 0x8f, - 0x19, 0x89, 0x1d, 0x37, 0x6a, 0xf7, 0xcc, 0xc2, 0x55, 0x63, 0x7d, 0xc6, 0xae, 0x72, 0xf0, 0x43, - 0x0e, 0xdd, 0x8a, 0xda, 0x3d, 0xf4, 0x04, 0x66, 0x85, 0x56, 0x1c, 0xaa, 0xe4, 0x34, 0xa7, 0xae, - 0xe6, 0xd7, 0xcb, 0x9b, 0xd7, 0xea, 0x7d, 0x1f, 0x1c, 0xa7, 0x59, 0xbb, 0x2a, 0x48, 0x93, 0x1b, - 0x22, 0x28, 0xb8, 0x24, 0x08, 0xcc, 0xa2, 0x90, 0x48, 0x7c, 0x4b, 0xe5, 0x73, 0xff, 0x73, 0x58, - 0xaf, 0x4d, 0xa8, 0x39, 0xad, 0x95, 0xcf, 0x61, 0x07, 0x1c, 0x84, 0xbe, 0x09, 0xf3, 0xe4, 0x8c, - 0x91, 0x38, 0xc4, 0x81, 0xe3, 0x06, 0x1d, 0xca, 0x48, 0x6c, 0xce, 0x08, 0xb4, 0x39, 0x0d, 0xdf, - 0x92, 0x60, 0xeb, 0x19, 0xcc, 0x24, 0x37, 0x44, 0x50, 0x08, 0x71, 0x4b, 0x9b, 0x53, 0x7c, 0xa3, - 0x3a, 0xcc, 0x0c, 0x28, 0xb0, 0xbc, 0x89, 0xea, 0x89, 0x97, 0x6b, 0x4a, 0x3b, 0xc1, 0xb1, 0x7e, - 0x02, 0x53, 0x8d, 0xe7, 0x38, 0xf6, 0xb8, 0x71, 0x12, 0x42, 0x65, 0x9c, 0x93, 0x2c, 0xa3, 0x5c, - 0x8a, 0xd1, 0x75, 0x98, 0xa2, 0x9c, 0x50, 0x68, 0xbf, 0xbc, 0x39, 0xd7, 0xe7, 0x22, 0xce, 0xb3, - 0xe5, 0xae, 0xf5, 0x87, 0x12, 0xcc, 0x7c, 0xaa, 0x8d, 0x3c, 0x4a, 0xe0, 0xef, 0x40, 0x51, 0x5a, - 0x58, 0x89, 0xfb, 0x4e, 0x4a, 0xed, 0x9a, 0xb0, 0x6e, 0x93, 0x76, 0xe0, 0xbb, 0x98, 0x47, 0xcd, - 0xd3, 0x48, 0xfe, 0xda, 0x8a, 0x8c, 0x1f, 0x20, 0x2d, 0xaf, 0x24, 0x39, 0xff, 0x01, 0x92, 0x0c, - 0xdd, 0x81, 0xe5, 0x16, 0x3e, 0x73, 0xba, 0x4e, 0xdc, 0x47, 0x72, 0x02, 0xdc, 0x14, 0xee, 0x92, - 0xb7, 0x51, 0x0b, 0x9f, 0x1d, 0xa6, 0xe9, 0x71, 0x13, 0x3d, 0x81, 0xaa, 0xb8, 0x9e, 0x43, 0x59, - 0x4c, 0x70, 0x4b, 0xbb, 0xcc, 0xf5, 0x51, 0xac, 0x85, 0x3a, 0x1a, 0x12, 0x6f, 0x27, 0x64, 0x71, - 0xcf, 0xae, 0xd0, 0x14, 0xa8, 0xf6, 0x53, 0x58, 0x18, 0x42, 0x41, 0xf3, 0x90, 0x3f, 0x21, 0x3d, - 0xa5, 0x28, 0xfe, 0x89, 0x3e, 0x84, 0xa9, 0x2e, 0x0e, 0x3a, 0x5a, 0x4d, 0x57, 0x5e, 0xc2, 0xca, - 0x96, 0xd8, 0xf7, 0x73, 0xf7, 0x8c, 0xda, 0x1e, 0x2c, 0x8e, 0xb8, 0xff, 0x44, 0x8b, 0xaf, 0x40, - 0x51, 0x08, 0x49, 0xcd, 0x9c, 0x48, 0x68, 0x6a, 0x55, 0xfb, 0xa3, 0x01, 0xe5, 0x14, 0x17, 0xf4, - 0x01, 0x4c, 0x6b, 0x15, 0x18, 0x42, 0x05, 0xb5, 0x91, 0x72, 0x49, 0x91, 0x34, 0x2a, 0xda, 0xe5, - 0x31, 0x2c, 0x42, 0xc2, 0x8d, 0x42, 0x16, 0x47, 0x81, 0x64, 0x53, 0xde, 0xbc, 0x9c, 0xf1, 0x22, - 0x19, 0x78, 0x6c, 0x4b, 0x62, 0xd9, 0x32, 0x50, 0xf5, 0x92, 0xa2, 0xf7, 0x00, 0xf9, 0xd4, 0x69, - 0xc7, 0x7e, 0x0b, 0xc7, 0x3d, 0x87, 0x92, 0xb8, 0xeb, 0x87, 0x4d, 0xe1, 0x06, 0x33, 0xf6, 0xbc, - 0x4f, 0xf7, 0xe5, 0x46, 0x43, 0xc2, 0x6b, 0xbf, 0x2d, 0x40, 0x51, 0x89, 0x3d, 0x0b, 0x39, 0xdf, - 0x13, 0x97, 0xce, 0xdb, 0x39, 0xdf, 0x43, 0x4b, 0xda, 0x99, 0xa5, 0x87, 0xcb, 0x05, 0xba, 0xc5, - 0x3d, 0x8b, 0x33, 0x54, 0x9e, 0xb5, 0xdc, 0x97, 0x4e, 0xca, 0xf5, 0x30, 0xf0, 0x31, 0xb5, 0x15, - 0x12, 0xfa, 0x18, 0xaa, 0xb2, 0x32, 0x39, 0xca, 0xa1, 0x0b, 0x82, 0xca, 0xac, 0xa7, 0xea, 0xd5, - 0x23, 0xf1, 0xd9, 0x10, 0xfb, 0x76, 0xe5, 0x28, 0xb5, 0xe2, 0xe6, 0x68, 0x47, 0xd4, 0xe7, 0xa6, - 0x31, 0xa7, 0xa4, 0x39, 0xf4, 0x1a, 0x5d, 0x03, 0x91, 0xb4, 0x9c, 0x04, 0x41, 0x26, 0x98, 0x0a, - 0x07, 0xee, 0x6b, 0x24, 0x7e, 0x09, 0x86, 0x19, 0x51, 0x19, 0x46, 0x2e, 0xd0, 0x2a, 0x4c, 0x7b, - 0x47, 0x8e, 0x08, 0x3b, 0x99, 0x52, 0x8a, 0xde, 0xd1, 0x33, 0x1e, 0x78, 0x0f, 0x61, 0x99, 0xc5, - 0x38, 0xa4, 0xa9, 0x12, 0x45, 0x19, 0x6e, 0xb5, 0xcd, 0x92, 0x10, 0xbb, 0x52, 0x57, 0xd5, 0x8f, - 0x97, 0x29, 0x7b, 0x29, 0x85, 0x7a, 0xa0, 0x31, 0xd1, 0x06, 0x54, 0x38, 0x8a, 0xd3, 0x69, 0x7b, - 0x98, 0x11, 0xcf, 0x84, 0x11, 0x94, 0x65, 0xfe, 0xf9, 0x03, 0x89, 0x80, 0x4c, 0x98, 0x6e, 0x11, - 0x4a, 0x71, 0x93, 0x98, 0x65, 0x21, 0x8c, 0x5e, 0xa2, 0x1d, 0x28, 0xf3, 0x14, 0xed, 0x08, 0xa1, - 0xa9, 0x59, 0x11, 0xee, 0xf0, 0xf6, 0x78, 0x67, 0xaa, 0xf3, 0xdc, 0xdd, 0xe0, 0xc8, 0x36, 0xb8, - 0xfa, 0x93, 0xd6, 0xee, 0x43, 0x29, 0xd9, 0xe0, 0x0a, 0x49, 0xd7, 0x3b, 0xb9, 0xe0, 0x0a, 0x09, - 0x30, 0x65, 0x4e, 0xfb, 0x44, 0x59, 0xbb, 0xc8, 0x97, 0xfb, 0x27, 0xd6, 0x97, 0x06, 0xac, 0x6e, - 0x3d, 0xc7, 0x61, 0x93, 0x1c, 0x24, 0xb9, 0x59, 0x97, 0xf7, 0x7b, 0x49, 0x12, 0xc7, 0xdc, 0xe6, - 0xaa, 0x16, 0x8f, 0x71, 0x08, 0x95, 0xdb, 0xc5, 0x02, 0xdd, 0x12, 0xfa, 0xe7, 0xa9, 0x5f, 0xb0, - 0x9b, 0xdd, 0x5c, 0xca, 0x12, 0x09, 0x3e, 0x45, 0xef, 0x88, 0xff, 0x0a, 0x73, 0xc5, 0x3d, 0x27, - 0xee, 0x84, 0xca, 0x8f, 0x8b, 0x5e, 0xdc, 0xb3, 0x3b, 0xa1, 0xf5, 0x7b, 0x03, 0xcc, 0x61, 0xe9, - 0x54, 0x8f, 0xf0, 0x21, 0x54, 0x8f, 0xc8, 0x71, 0x14, 0x13, 0x47, 0x39, 0xac, 0x94, 0x6f, 0x3e, - 0xcb, 0xca, 0xae, 0x48, 0x34, 0xb9, 0x42, 0xef, 0x43, 0x45, 0x56, 0x47, 0x45, 0x95, 0x1b, 0x43, - 0x55, 0x16, 0x58, 0x8a, 0x68, 0x0d, 0xca, 0xa7, 0x98, 0x3a, 0x83, 0x52, 0x96, 0x4e, 0x31, 0xdd, - 0x96, 0x82, 0x7e, 0x95, 0x87, 0xe5, 0x2d, 0xd1, 0x0b, 0x24, 0xe5, 0xa6, 0xdf, 0x23, 0x0d, 0xa5, - 0xff, 0x25, 0x98, 0x3a, 0x8e, 0x74, 0xf6, 0x9f, 0xb1, 0xe5, 0x02, 0x6d, 0xc0, 0x12, 0x0e, 0x82, - 0xe8, 0xd4, 0x21, 0xad, 0x36, 0xeb, 0x39, 0x5d, 0x47, 0xf6, 0x65, 0x8a, 0xd9, 0x82, 0xd8, 0xdb, - 0xe1, 0x5b, 0x87, 0x0d, 0xb1, 0x81, 0x6e, 0xc3, 0x92, 0x88, 0x59, 0x3f, 0x6c, 0x3a, 0x6e, 0x14, - 0x74, 0x5a, 0xa1, 0x74, 0xf9, 0x82, 0x60, 0x85, 0xf4, 0xde, 0x96, 0xd8, 0x12, 0xee, 0xff, 0x64, - 0x98, 0x42, 0x18, 0x69, 0x4a, 0x18, 0xc9, 0x1c, 0x2e, 0x9a, 0x7b, 0x9e, 0x50, 0x79, 0xe6, 0x2c, - 0x61, 0xb4, 0x07, 0x50, 0xe1, 0xc9, 0x87, 0x78, 0xce, 0x71, 0x1c, 0xb5, 0xa8, 0x59, 0xcc, 0x26, - 0x33, 0x7d, 0x46, 0xbd, 0x21, 0xd0, 0x76, 0xe3, 0xa8, 0x65, 0x97, 0x69, 0xf2, 0x4d, 0xd1, 0x4d, - 0x28, 0x08, 0xee, 0xd3, 0x82, 0xfb, 0xca, 0x30, 0xa5, 0xe0, 0x2d, 0x70, 0x78, 0x32, 0x38, 0xc2, - 0x34, 0xd5, 0x28, 0xc9, 0xb8, 0xae, 0x70, 0x60, 0xd2, 0x1b, 0xdc, 0x81, 0x2a, 0x0d, 0x71, 0x9b, - 0x3e, 0x8f, 0x98, 0x08, 0xed, 0x91, 0x51, 0x5d, 0xd1, 0x28, 0x7c, 0x65, 0xed, 0xc1, 0x4a, 0xd6, - 0x6e, 0xca, 0xbd, 0x36, 0x32, 0x95, 0xa2, 0xbc, 0xb9, 0x98, 0x8a, 0xcc, 0x11, 0x5d, 0xc5, 0xaf, - 0x0c, 0x40, 0xf2, 0x2c, 0xd9, 0x0c, 0x28, 0x07, 0x98, 0x54, 0x71, 0x2e, 0x03, 0xc8, 0x92, 0x9a, - 0xea, 0x34, 0x4a, 0x02, 0xf2, 0x6c, 0xc0, 0x4f, 0xf2, 0x69, 0x3f, 0xb9, 0x0e, 0xb3, 0x7e, 0xe8, - 0x06, 0x1d, 0x8f, 0x38, 0x6d, 0x1c, 0xf3, 0x26, 0x59, 0xb5, 0x78, 0x0a, 0xba, 0x2f, 0x80, 0xd6, - 0xef, 0x0c, 0x58, 0x1c, 0x10, 0xe7, 0x82, 0xf7, 0x42, 0x37, 0xd2, 0x75, 0x82, 0x47, 0x4a, 0x1f, - 0x3b, 0xdd, 0xf5, 0x24, 0xee, 0xe8, 0xe0, 0x20, 0x26, 0xd8, 0xeb, 0x39, 0xe4, 0xcc, 0xa7, 0x8c, - 0x2a, 0xe1, 0xa5, 0x0b, 0x3d, 0x94, 0x5b, 0x3b, 0x62, 0xc7, 0xfa, 0x3e, 0x2c, 0x6f, 0x93, 0x80, - 0x0c, 0x07, 0xcd, 0x24, 0x9d, 0x5d, 0x82, 0x52, 0x4c, 0xdc, 0x4e, 0x4c, 0xfd, 0xae, 0x0e, 0xa0, - 0x3e, 0xc0, 0x32, 0x61, 0x25, 0x7b, 0xa4, 0xbc, 0xb7, 0xf5, 0x4b, 0x03, 0x16, 0xe5, 0x96, 0x90, - 0x9a, 0x6a, 0x5e, 0xeb, 0x49, 0xd5, 0x97, 0xc5, 0x7c, 0xf8, 0x7e, 0x6a, 0x7f, 0x32, 0x67, 0xde, - 0x7a, 0xf3, 0xa9, 0xc4, 0xf1, 0x8f, 0x93, 0xa2, 0xac, 0xec, 0xc2, 0xc1, 0x7b, 0xc7, 0xaa, 0x22, - 0x5b, 0x2b, 0xb0, 0x34, 0x28, 0x86, 0x92, 0xaf, 0xa7, 0xe1, 0x32, 0xe5, 0x24, 0xf2, 0x7d, 0xa4, - 0x5a, 0x75, 0x95, 0x85, 0x89, 0x96, 0x73, 0x4c, 0x1e, 0xae, 0xa6, 0xf2, 0x30, 0xa1, 0x3c, 0x6e, - 0x64, 0x52, 0x51, 0x0d, 0x83, 0x92, 0xbb, 0x22, 0x80, 0xaa, 0x57, 0xb0, 0x56, 0xb5, 0x1d, 0x12, - 0xd6, 0x4a, 0xa6, 0x5f, 0xe7, 0xe0, 0xf2, 0x4e, 0x8b, 0xc4, 0x4d, 0x12, 0xba, 0x3d, 0x9b, 0x48, - 0x77, 0x3b, 0xb7, 0x77, 0x8f, 0x6e, 0x30, 0xee, 0x42, 0x39, 0x24, 0x7d, 0x79, 0x26, 0x76, 0x19, - 0x10, 0x12, 0x2d, 0x24, 0xfa, 0x36, 0xcc, 0xf9, 0xcd, 0x90, 0xa7, 0x7b, 0xd5, 0xb2, 0x52, 0xb3, - 0x30, 0x49, 0x11, 0xb3, 0x12, 0x5b, 0x35, 0x81, 0x14, 0x6d, 0xc3, 0xf2, 0x29, 0xf6, 0x59, 0x42, - 0x9d, 0xcc, 0xa7, 0x53, 0x89, 0x5b, 0x8b, 0x24, 0xb1, 0xdd, 0x89, 0x65, 0xab, 0xbc, 0xc8, 0xd1, - 0x35, 0xb9, 0x9e, 0x5b, 0xff, 0x6c, 0xc0, 0xda, 0x38, 0x8d, 0xa8, 0x00, 0x7b, 0x75, 0x95, 0x3c, - 0x80, 0xf9, 0x76, 0x1c, 0xb5, 0x22, 0x46, 0xbc, 0xf3, 0xe9, 0x65, 0x4e, 0xa3, 0x6b, 0xe5, 0xdc, - 0x80, 0xa2, 0x18, 0x89, 0xb5, 0x4e, 0xb2, 0x03, 0xb3, 0xda, 0xb5, 0x3e, 0x82, 0xb5, 0x5d, 0x3f, - 0xf4, 0x1e, 0x06, 0x81, 0xf4, 0xbe, 0xbd, 0xf0, 0x15, 0x42, 0xcf, 0xfa, 0x8b, 0x01, 0x57, 0xc6, - 0x92, 0xab, 0xdb, 0x3f, 0xcb, 0x84, 0xd3, 0xdd, 0x54, 0x38, 0xbd, 0x84, 0x56, 0x86, 0x9b, 0x9a, - 0x17, 0x74, 0xf3, 0xfd, 0x89, 0xea, 0xbd, 0xc7, 0xce, 0x08, 0x37, 0x06, 0x67, 0x84, 0x11, 0xe9, - 0x29, 0x19, 0x0a, 0xac, 0x1d, 0x58, 0x78, 0x4c, 0xd8, 0x23, 0xec, 0x9e, 0x74, 0xda, 0xf4, 0xc2, - 0x2e, 0x6c, 0x6d, 0x03, 0x4a, 0x1f, 0xa3, 0x6e, 0x5e, 0x87, 0xe9, 0x23, 0x09, 0x52, 0x57, 0x5f, - 0xaa, 0x27, 0x6f, 0x32, 0x12, 0x77, 0x2f, 0x3c, 0x8e, 0x6c, 0x8d, 0x64, 0xbd, 0x01, 0xab, 0x8f, - 0x09, 0xdb, 0x22, 0x41, 0xc0, 0xe1, 0x3c, 0xe1, 0x6b, 0x91, 0xac, 0xdb, 0x60, 0x0e, 0x6f, 0x29, - 0x36, 0x4b, 0x30, 0xc5, 0xab, 0x85, 0x7e, 0x75, 0x91, 0x0b, 0x6b, 0x5d, 0x88, 0xa4, 0x29, 0x52, - 0xcd, 0x87, 0x18, 0xcd, 0x8d, 0xfe, 0x68, 0x6e, 0xed, 0xc2, 0xe2, 0x00, 0x66, 0x52, 0x16, 0x4a, - 0x7c, 0xdb, 0xf1, 0xc3, 0xe3, 0x48, 0xd5, 0x85, 0xd4, 0x10, 0x9d, 0xa0, 0xcf, 0xb8, 0xea, 0x8b, - 0x67, 0x5a, 0x75, 0x0e, 0x55, 0xc9, 0x46, 0x4b, 0xff, 0x95, 0x91, 0xdc, 0xac, 0xbf, 0xa5, 0xd8, - 0xec, 0xc1, 0xf4, 0x60, 0x1a, 0xdb, 0x48, 0xd9, 0x6b, 0x0c, 0x51, 0x5d, 0xad, 0xa5, 0x63, 0x68, - 0xfa, 0xda, 0x3e, 0x54, 0xd2, 0x1b, 0x23, 0x5c, 0xe3, 0xe6, 0xa0, 0x6b, 0x2c, 0x0d, 0xde, 0x47, - 0xb2, 0x49, 0xbb, 0xc7, 0xb2, 0x50, 0x8d, 0x76, 0xcb, 0xe4, 0x3e, 0x7b, 0xb0, 0x34, 0x08, 0x56, - 0x77, 0xb9, 0x03, 0x25, 0xed, 0x28, 0xfa, 0x36, 0x23, 0x4b, 0x69, 0x1f, 0xcb, 0xba, 0x2d, 0xcc, - 0xf4, 0x2a, 0x31, 0xb7, 0x3b, 0x20, 0xd3, 0xc5, 0xbb, 0x93, 0x5f, 0xe4, 0x60, 0xfe, 0x31, 0x61, - 0xb2, 0x75, 0xfc, 0xfa, 0x1d, 0xfe, 0x8a, 0x1a, 0x13, 0x93, 0x59, 0x59, 0xae, 0x78, 0x73, 0x42, - 0xce, 0x64, 0x73, 0xa2, 0xf6, 0xf3, 0x62, 0xbf, 0xaa, 0xa0, 0x07, 0x12, 0xed, 0x1a, 0xe8, 0x6e, - 0xc5, 0xe9, 0xfa, 0xe4, 0x94, 0xaa, 0x52, 0x59, 0x51, 0xc0, 0x43, 0x0e, 0x43, 0xeb, 0x30, 0x2f, - 0x1f, 0xa9, 0x84, 0x8b, 0x3b, 0x51, 0x18, 0xf4, 0x44, 0xb2, 0x9e, 0x51, 0x33, 0xb1, 0x88, 0x8b, - 0xef, 0x85, 0x41, 0xaf, 0x8f, 0x49, 0xfd, 0xcf, 0x35, 0x66, 0x31, 0x85, 0xd9, 0xe0, 0x60, 0x8e, - 0x69, 0xed, 0x8b, 0x0c, 0xa0, 0xb5, 0xa0, 0x94, 0xf9, 0x2d, 0x28, 0xaa, 0x5e, 0x5b, 0x2a, 0xe0, - 0x5a, 0x7d, 0xf8, 0xf1, 0x54, 0x92, 0x6c, 0x93, 0x63, 0x3f, 0xf4, 0xd5, 0x53, 0x8c, 0x80, 0x58, - 0x4f, 0x61, 0x8e, 0x9f, 0xf8, 0x7a, 0x5a, 0x3e, 0xeb, 0xbe, 0xb4, 0xd2, 0x40, 0x41, 0x49, 0x1a, - 0x30, 0x63, 0x62, 0x03, 0x66, 0x3d, 0x11, 0x11, 0xd9, 0x88, 0xbb, 0x59, 0x0f, 0x7e, 0x59, 0x8a, - 0xe3, 0x31, 0xad, 0x0d, 0x29, 0x17, 0xd6, 0xdf, 0x65, 0x0c, 0x0f, 0x1e, 0xa6, 0xe4, 0xf9, 0x21, - 0x54, 0x69, 0xdc, 0x75, 0xb2, 0xbe, 0xff, 0xc1, 0x60, 0x24, 0x8f, 0x22, 0xad, 0xa7, 0x81, 0xfa, - 0x5d, 0x28, 0x05, 0xaa, 0x1d, 0xc2, 0xc2, 0x10, 0xca, 0x88, 0xc0, 0x7e, 0x77, 0x30, 0xb0, 0x53, - 0x0e, 0x9b, 0xa2, 0x4e, 0x47, 0xf6, 0x4d, 0x11, 0xc2, 0x8d, 0xb8, 0x7b, 0x38, 0x18, 0x00, 0xa3, - 0x12, 0xe4, 0x33, 0x58, 0xce, 0xe0, 0x26, 0x03, 0x27, 0x17, 0xb6, 0x3f, 0x98, 0x25, 0x71, 0xa7, - 0x1e, 0xd0, 0x53, 0x24, 0x40, 0x93, 0x6f, 0xeb, 0xa9, 0x30, 0xa9, 0x9a, 0x2a, 0xbf, 0x6e, 0xe0, - 0x59, 0x1f, 0x0b, 0x07, 0xd6, 0xa7, 0x29, 0xc9, 0xd6, 0x93, 0x47, 0x9b, 0x71, 0x33, 0xb0, 0xda, - 0xb7, 0x7e, 0x9c, 0x22, 0xbf, 0x78, 0x05, 0xec, 0x3b, 0x4d, 0x3e, 0xed, 0x34, 0x0f, 0x44, 0x76, - 0xcb, 0x34, 0x91, 0xe8, 0x26, 0x4c, 0x4b, 0xe6, 0xfd, 0x0e, 0x3b, 0x2b, 0x9d, 0x46, 0xb0, 0x36, - 0x84, 0x78, 0x19, 0x23, 0x4d, 0x4a, 0x8f, 0x8f, 0x04, 0xcb, 0xac, 0xa5, 0xde, 0x83, 0x99, 0x8c, - 0x95, 0x16, 0x12, 0x2b, 0x25, 0xee, 0x31, 0xdd, 0x55, 0x06, 0xb2, 0x45, 0x8a, 0xd5, 0x6f, 0x2d, - 0xe7, 0xd2, 0xca, 0x15, 0x28, 0x63, 0x97, 0xf9, 0x5d, 0x22, 0x73, 0x8d, 0x6c, 0xaa, 0x41, 0x82, - 0x44, 0x9e, 0x91, 0x35, 0x23, 0x75, 0x66, 0xbf, 0x66, 0xe8, 0xe7, 0xff, 0x51, 0x35, 0x43, 0x13, - 0xd8, 0x7d, 0x2c, 0xeb, 0x3f, 0x06, 0xac, 0xee, 0x85, 0xbe, 0x4c, 0x0a, 0xaa, 0xe1, 0xbb, 0xb8, - 0xe5, 0x6c, 0xa8, 0xe9, 0xb7, 0x43, 0x12, 0x10, 0x57, 0xfd, 0x3b, 0xa2, 0xfd, 0x70, 0x62, 0xd7, - 0xb9, 0xaa, 0x08, 0x77, 0x38, 0x5d, 0x6a, 0xa3, 0x3f, 0xa7, 0x16, 0xd2, 0x73, 0xea, 0xeb, 0x69, - 0xb8, 0x1f, 0x81, 0x39, 0x7c, 0xf9, 0x24, 0x31, 0xea, 0xae, 0xd7, 0x98, 0xd8, 0xf5, 0x7e, 0x91, - 0x83, 0x37, 0xf7, 0x03, 0x1c, 0x86, 0xc4, 0xfb, 0x1f, 0x0f, 0x31, 0xf7, 0xa1, 0x8a, 0xbb, 0x91, - 0xdf, 0x6f, 0xf3, 0x0b, 0x93, 0x28, 0x2b, 0x02, 0x57, 0xd3, 0xbe, 0x1e, 0x7d, 0xfe, 0xc9, 0x80, - 0x4b, 0xa3, 0x75, 0xf1, 0x7f, 0x30, 0xbe, 0xfc, 0x1c, 0xde, 0xb0, 0x49, 0x2b, 0xea, 0x26, 0xd3, - 0x3d, 0xef, 0xe3, 0xce, 0x63, 0x45, 0x9d, 0xe7, 0x73, 0xa9, 0xff, 0xa8, 0x46, 0xbf, 0xae, 0x0c, - 0x0c, 0xf9, 0x85, 0xec, 0xf3, 0xc2, 0x25, 0xa8, 0x8d, 0x12, 0x40, 0x8d, 0xcb, 0x5f, 0x1a, 0xb0, - 0x22, 0xb7, 0x85, 0x4a, 0xcf, 0x2b, 0xdc, 0x4b, 0x5e, 0x81, 0xb4, 0xec, 0xf9, 0x51, 0xb2, 0x17, - 0xc6, 0xca, 0x3e, 0x95, 0x95, 0xfd, 0x0d, 0x58, 0x1d, 0x12, 0x4e, 0x09, 0xbe, 0x0b, 0xcb, 0xda, - 0x19, 0x06, 0xeb, 0xd4, 0xad, 0x4c, 0x61, 0x99, 0xfc, 0x6f, 0x80, 0xf5, 0x33, 0x7e, 0xff, 0xc1, - 0x73, 0x2e, 0xec, 0x55, 0x1b, 0x30, 0x7d, 0x2e, 0x67, 0xd2, 0x58, 0x96, 0x0d, 0x6f, 0x49, 0xf8, - 0x8e, 0xfa, 0xfb, 0x30, 0x48, 0x06, 0x74, 0xe2, 0x5d, 0xf0, 0x42, 0x7f, 0x35, 0xc0, 0x9a, 0x74, - 0xe8, 0x85, 0x6f, 0x77, 0xd1, 0x04, 0x72, 0x17, 0xca, 0x51, 0x70, 0xce, 0xf4, 0x01, 0x51, 0xa0, - 0x23, 0xec, 0xd1, 0xbd, 0xbf, 0xbd, 0x58, 0x33, 0xfe, 0xf1, 0x62, 0xcd, 0xf8, 0xd7, 0x8b, 0x35, - 0xe3, 0x37, 0xff, 0x5e, 0xfb, 0xc6, 0x8f, 0x6e, 0x74, 0x7d, 0x46, 0x28, 0xad, 0xfb, 0xd1, 0x86, - 0xfc, 0xda, 0x68, 0x46, 0x1b, 0x5d, 0xb6, 0x21, 0xfe, 0xf8, 0xdf, 0x48, 0x4a, 0xd2, 0x51, 0x51, - 0x00, 0xde, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xbb, 0x2d, 0x31, 0x9e, 0x20, 0x00, - 0x00, + // 2675 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcb, 0x6f, 0x1b, 0xc7, + 0xf9, 0xbf, 0x25, 0x29, 0x4a, 0xfc, 0x48, 0xea, 0x31, 0xa2, 0xa4, 0x0d, 0x63, 0xcb, 0xf2, 0x3a, + 0x76, 0xf4, 0x73, 0x62, 0xd2, 0x56, 0x12, 0xc3, 0x70, 0x93, 0xd6, 0xb6, 0x44, 0x19, 0x72, 0x5c, + 0x57, 0x5d, 0xaa, 0x0a, 0xda, 0x02, 0xdd, 0x8e, 0xc8, 0x11, 0xbd, 0xd0, 0x72, 0x97, 0xd9, 0x19, + 0x52, 0x62, 0x7a, 0xe8, 0xa5, 0x3d, 0x04, 0x28, 0xd0, 0x6b, 0x81, 0xa0, 0x40, 0x4f, 0x45, 0xff, + 0x82, 0x00, 0x2d, 0x8a, 0x1e, 0x8b, 0x1e, 0x7a, 0xe8, 0xb5, 0xb7, 0xc2, 0xfd, 0x33, 0x0a, 0x14, + 0xc5, 0xbc, 0x96, 0xcb, 0xe5, 0xc3, 0xb2, 0x6c, 0xa0, 0xe8, 0x49, 0x3b, 0xdf, 0x63, 0xe6, 0x9b, + 0xef, 0xfd, 0x0d, 0x05, 0x0b, 0x3d, 0xd6, 0x60, 0x5e, 0x13, 0x33, 0x5c, 0xe9, 0x84, 0x01, 0x0b, + 0x50, 0x2e, 0x02, 0x94, 0x17, 0x8f, 0x5c, 0xdf, 0x0b, 0x5a, 0x03, 0x64, 0xb9, 0xe8, 0x05, 0xad, + 0x2e, 0x73, 0x3d, 0xb5, 0x9c, 0x6f, 0xf7, 0xe9, 0xe7, 0x5e, 0x83, 0xe9, 0xf5, 0x4a, 0x48, 0x3a, + 0x9e, 0xdb, 0xc0, 0xcc, 0x0d, 0xfc, 0x18, 0xd7, 0x1a, 0xc3, 0x47, 0x1e, 0x61, 0x6d, 0xec, 0xe3, + 0x16, 0x09, 0x63, 0x88, 0x79, 0x16, 0x74, 0x82, 0xf8, 0xf6, 0x3d, 0xda, 0x78, 0x4e, 0xda, 0x7a, + 0x59, 0xe8, 0x31, 0xe6, 0xb6, 0x89, 0x5c, 0x59, 0x9f, 0x41, 0xb9, 0x76, 0x46, 0x1a, 0x5d, 0x46, + 0x0e, 0xb9, 0x84, 0xdb, 0x41, 0xbb, 0x8d, 0xfd, 0xa6, 0x4d, 0x3e, 0xef, 0x12, 0xca, 0x10, 0x82, + 0x0c, 0x0e, 0x5b, 0xd4, 0x34, 0x36, 0xd2, 0x9b, 0x39, 0x5b, 0x7c, 0xa3, 0xeb, 0x30, 0x8f, 0x1b, + 0x5c, 0x16, 0x87, 0x6f, 0x13, 0x74, 0x99, 0x99, 0xda, 0x30, 0x36, 0xd3, 0x76, 0x51, 0x42, 0x0f, + 0x24, 0xd0, 0xda, 0x86, 0xb7, 0xc7, 0x6e, 0x4c, 0x3b, 0x81, 0x4f, 0x09, 0x7a, 0x07, 0x66, 0x48, + 0x8f, 0xf8, 0xcc, 0x34, 0x36, 0x8c, 0xcd, 0xfc, 0xd6, 0x7c, 0x45, 0xeb, 0xa0, 0xc6, 0xa1, 0xb6, + 0x44, 0x5a, 0x5f, 0x1a, 0x60, 0x1e, 0xf0, 0x6b, 0x7e, 0x1b, 0x33, 0x12, 0xba, 0xd8, 0x73, 0xbf, + 0x20, 0x75, 0xc2, 0x98, 0xeb, 0xb7, 0x28, 0xba, 0x0a, 0x05, 0x86, 0xc3, 0x16, 0x61, 0x8e, 0xd0, + 0x84, 0xd8, 0x29, 0x67, 0xe7, 0x25, 0x4c, 0x70, 0xa1, 0xf7, 0x60, 0x89, 0x06, 0xdd, 0xb0, 0x41, + 0x1c, 0x72, 0xd6, 0x09, 0x09, 0xa5, 0x6e, 0xe0, 0x0b, 0x71, 0x73, 0xf6, 0xa2, 0x44, 0xd4, 0x22, + 0x38, 0xba, 0x0c, 0xd0, 0x08, 0x09, 0x66, 0xc4, 0x69, 0x36, 0x3d, 0x33, 0x2d, 0xa8, 0x72, 0x12, + 0xb2, 0xd3, 0xf4, 0xac, 0xbf, 0xa7, 0x60, 0x79, 0x9c, 0x18, 0x65, 0x98, 0x3b, 0x0d, 0xc2, 0x93, + 0x63, 0x2f, 0x38, 0x55, 0x22, 0x44, 0x6b, 0xf4, 0x2e, 0x2c, 0xa8, 0xf3, 0x4f, 0x48, 0x9f, 0x76, + 0x70, 0x83, 0xa8, 0xd3, 0xe7, 0x25, 0xf8, 0x53, 0x05, 0xe5, 0x84, 0xea, 0x2e, 0x11, 0xa1, 0x14, + 0x60, 0x5e, 0x82, 0x23, 0xc2, 0x1b, 0xb0, 0x40, 0x59, 0xd0, 0x71, 0xf0, 0x31, 0x23, 0xa1, 0xd3, + 0x08, 0x3a, 0x7d, 0x33, 0xb3, 0x61, 0x6c, 0xce, 0xd9, 0x45, 0x0e, 0x7e, 0xc8, 0xa1, 0xdb, 0x41, + 0xa7, 0x8f, 0x9e, 0xc0, 0xbc, 0xd0, 0x8a, 0x43, 0x95, 0x9c, 0xe6, 0xcc, 0x46, 0x7a, 0x33, 0xbf, + 0x75, 0xad, 0x32, 0x70, 0xcd, 0x49, 0x9a, 0xb5, 0x8b, 0x82, 0x35, 0xba, 0x21, 0x82, 0x4c, 0x83, + 0x78, 0x9e, 0x99, 0x15, 0x12, 0x89, 0x6f, 0xa9, 0x7c, 0xee, 0x7f, 0x0e, 0xeb, 0x77, 0x08, 0x35, + 0x67, 0xb5, 0xf2, 0x39, 0xec, 0x80, 0x83, 0xd0, 0xff, 0xc3, 0x22, 0x39, 0x63, 0x24, 0xf4, 0xb1, + 0xe7, 0x34, 0xbc, 0x2e, 0x65, 0x24, 0x34, 0xe7, 0x04, 0xd9, 0x82, 0x86, 0x6f, 0x4b, 0xb0, 0xf5, + 0x0c, 0xe6, 0xa2, 0x1b, 0x22, 0xc8, 0xf8, 0xb8, 0xad, 0xcd, 0x29, 0xbe, 0x51, 0x05, 0xe6, 0x86, + 0x14, 0x98, 0xdf, 0x42, 0x95, 0xc8, 0xcb, 0x35, 0xa7, 0x1d, 0xd1, 0x58, 0x3f, 0x82, 0x99, 0xfa, + 0x73, 0x1c, 0x36, 0xb9, 0x71, 0x22, 0x46, 0x65, 0x9c, 0x93, 0xe4, 0x41, 0xa9, 0xd8, 0x41, 0xd7, + 0x61, 0x86, 0x72, 0x46, 0xa1, 0xfd, 0xfc, 0xd6, 0xc2, 0xe0, 0x14, 0xb1, 0x9f, 0x2d, 0xb1, 0xd6, + 0xef, 0x72, 0x30, 0xf7, 0x99, 0x36, 0xf2, 0x38, 0x81, 0xbf, 0x05, 0x59, 0x69, 0x61, 0x25, 0xee, + 0xbb, 0x31, 0xb5, 0x6b, 0xc6, 0x8a, 0x3d, 0x88, 0xeb, 0xa7, 0x81, 0xfc, 0x6b, 0x2b, 0x36, 0xbe, + 0x81, 0xb4, 0xbc, 0x92, 0xe4, 0xfc, 0x1b, 0x48, 0x36, 0x74, 0x07, 0x56, 0xda, 0xf8, 0xcc, 0xe9, + 0x39, 0xb1, 0xec, 0xe1, 0x78, 0xb8, 0x25, 0xdc, 0x25, 0x6d, 0xa3, 0x36, 0x3e, 0x3b, 0x8c, 0xf3, + 0xe3, 0x16, 0x7a, 0x02, 0x45, 0x71, 0x3d, 0x87, 0xb2, 0x90, 0xe0, 0xb6, 0x76, 0x99, 0xeb, 0xe3, + 0x8e, 0x16, 0xea, 0xa8, 0x4b, 0xba, 0x9a, 0xcf, 0xc2, 0xbe, 0x5d, 0xa0, 0x31, 0x50, 0xf9, 0xc7, + 0xb0, 0x34, 0x42, 0x82, 0x16, 0x21, 0x7d, 0x42, 0xfa, 0x4a, 0x51, 0xfc, 0x13, 0x7d, 0x04, 0x33, + 0x3d, 0xec, 0x75, 0xb5, 0x9a, 0xae, 0xbc, 0xe4, 0x28, 0x5b, 0x52, 0xdf, 0x4f, 0xdd, 0x33, 0xca, + 0x7b, 0xb0, 0x3c, 0xe6, 0xfe, 0x53, 0x2d, 0xbe, 0x0a, 0x59, 0x21, 0x24, 0x35, 0x53, 0x22, 0xa1, + 0xa9, 0x55, 0xf9, 0xf7, 0x06, 0xe4, 0x63, 0xa7, 0xa0, 0x0f, 0x61, 0x56, 0xab, 0xc0, 0x10, 0x2a, + 0x28, 0x8f, 0x95, 0x4b, 0x8a, 0xa4, 0x49, 0xd1, 0x2e, 0x8f, 0x61, 0x11, 0x12, 0x8d, 0xc0, 0x67, + 0x61, 0xe0, 0xc9, 0x63, 0xf2, 0x5b, 0x97, 0x13, 0x5e, 0x24, 0x03, 0x8f, 0x6d, 0x4b, 0x2a, 0x5b, + 0x06, 0xaa, 0x5e, 0x52, 0xf4, 0x3e, 0x20, 0x97, 0x3a, 0x9d, 0xd0, 0x6d, 0xe3, 0xb0, 0xef, 0x50, + 0x12, 0xf6, 0x5c, 0xbf, 0x25, 0xdc, 0x60, 0xce, 0x5e, 0x74, 0xe9, 0xbe, 0x44, 0xd4, 0x25, 0xbc, + 0xfc, 0xeb, 0x0c, 0x64, 0x95, 0xd8, 0xf3, 0x90, 0x72, 0x9b, 0xe2, 0xd2, 0x69, 0x3b, 0xe5, 0x36, + 0x51, 0x49, 0x3b, 0xb3, 0xf4, 0x70, 0xb9, 0x40, 0xb7, 0xb8, 0x67, 0xf1, 0x03, 0x95, 0x67, 0xad, + 0x0c, 0xa4, 0x93, 0x72, 0x3d, 0xf4, 0x5c, 0x4c, 0x6d, 0x45, 0x84, 0x3e, 0x81, 0xa2, 0x2c, 0x58, + 0x8e, 0x72, 0xe8, 0x8c, 0xe0, 0x32, 0x2b, 0xb1, 0x32, 0xf6, 0x48, 0x7c, 0xd6, 0x05, 0xde, 0x2e, + 0x1c, 0xc5, 0x56, 0xdc, 0x1c, 0x9d, 0x80, 0xba, 0xdc, 0x34, 0xe6, 0x8c, 0x34, 0x87, 0x5e, 0xa3, + 0x6b, 0x20, 0x92, 0x96, 0x13, 0x11, 0xc8, 0x04, 0x53, 0xe0, 0xc0, 0x7d, 0x4d, 0xc4, 0x2f, 0xc1, + 0x30, 0x23, 0x2a, 0xc3, 0xc8, 0x05, 0x5a, 0x83, 0xd9, 0xe6, 0x91, 0x23, 0xc2, 0x4e, 0xa6, 0x94, + 0x6c, 0xf3, 0xe8, 0x19, 0x0f, 0xbc, 0x87, 0xb0, 0xc2, 0x42, 0xec, 0xd3, 0x58, 0x89, 0xa2, 0x0c, + 0xb7, 0x3b, 0x66, 0x4e, 0x88, 0x5d, 0xa8, 0xa8, 0xea, 0xc7, 0xcb, 0x94, 0x5d, 0x8a, 0x91, 0x1e, + 0x68, 0x4a, 0x54, 0x85, 0x02, 0x27, 0x71, 0xba, 0x9d, 0x26, 0x66, 0xa4, 0x69, 0xc2, 0x18, 0xce, + 0x3c, 0xff, 0xfc, 0x9e, 0x24, 0x40, 0x26, 0xcc, 0xb6, 0x09, 0xa5, 0xb8, 0x45, 0xcc, 0xbc, 0x10, + 0x46, 0x2f, 0x51, 0x0d, 0xf2, 0x3c, 0x45, 0x3b, 0x42, 0x68, 0x6a, 0x16, 0x84, 0x3b, 0xbc, 0x33, + 0xd9, 0x99, 0x2a, 0x3c, 0x77, 0xd7, 0x39, 0xb1, 0x0d, 0x0d, 0xfd, 0x49, 0xcb, 0xf7, 0x21, 0x17, + 0x21, 0xb8, 0x42, 0xe2, 0xf5, 0x4e, 0x2e, 0xb8, 0x42, 0x3c, 0x4c, 0x99, 0xd3, 0x39, 0x51, 0xd6, + 0xce, 0xf2, 0xe5, 0xfe, 0x89, 0xf5, 0x95, 0x01, 0x6b, 0xdb, 0xcf, 0xb1, 0xdf, 0x22, 0x07, 0x51, + 0x6e, 0xd6, 0xe5, 0xfd, 0x5e, 0x94, 0xc4, 0x31, 0xb7, 0xb9, 0xaa, 0xc5, 0x13, 0x1c, 0x42, 0xe5, + 0x76, 0xb1, 0x40, 0xb7, 0x84, 0xfe, 0x79, 0xea, 0x17, 0xc7, 0xcd, 0x6f, 0x95, 0x92, 0x4c, 0xe2, + 0x9c, 0x6c, 0xf3, 0x88, 0xff, 0x15, 0xe6, 0x0a, 0xfb, 0x4e, 0xd8, 0xf5, 0x95, 0x1f, 0x67, 0x9b, + 0x61, 0xdf, 0xee, 0xfa, 0xd6, 0x6f, 0x0d, 0x30, 0x47, 0xa5, 0x53, 0x3d, 0xc2, 0x47, 0x50, 0x3c, + 0x22, 0xc7, 0x41, 0x48, 0x1c, 0xe5, 0xb0, 0x52, 0xbe, 0xc5, 0xe4, 0x51, 0x76, 0x41, 0x92, 0xc9, + 0x15, 0xfa, 0x00, 0x0a, 0xb2, 0x3a, 0x2a, 0xae, 0xd4, 0x04, 0xae, 0xbc, 0xa0, 0x52, 0x4c, 0xeb, + 0x90, 0x3f, 0xc5, 0xd4, 0x19, 0x96, 0x32, 0x77, 0x8a, 0xe9, 0x8e, 0x14, 0xf4, 0xeb, 0x34, 0xac, + 0x6c, 0x8b, 0x5e, 0x20, 0x2a, 0x37, 0x83, 0x1e, 0x69, 0x24, 0xfd, 0x97, 0x60, 0xe6, 0x38, 0xd0, + 0xd9, 0x7f, 0xce, 0x96, 0x0b, 0x54, 0x85, 0x12, 0xf6, 0xbc, 0xe0, 0xd4, 0x21, 0xed, 0x0e, 0xeb, + 0x3b, 0x3d, 0x47, 0xf6, 0x65, 0xea, 0xb0, 0x25, 0x81, 0xab, 0x71, 0xd4, 0x61, 0x5d, 0x20, 0xd0, + 0x6d, 0x28, 0x89, 0x98, 0x75, 0xfd, 0x96, 0xd3, 0x08, 0xbc, 0x6e, 0xdb, 0x97, 0x2e, 0x9f, 0x11, + 0x47, 0x21, 0x8d, 0xdb, 0x16, 0x28, 0xe1, 0xfe, 0x4f, 0x46, 0x39, 0x84, 0x91, 0x66, 0x84, 0x91, + 0xcc, 0xd1, 0xa2, 0xb9, 0xd7, 0x14, 0x2a, 0x4f, 0xec, 0x25, 0x8c, 0xf6, 0x00, 0x0a, 0x3c, 0xf9, + 0x90, 0xa6, 0x73, 0x1c, 0x06, 0x6d, 0x6a, 0x66, 0x93, 0xc9, 0x4c, 0xef, 0x51, 0xa9, 0x0b, 0xb2, + 0xdd, 0x30, 0x68, 0xdb, 0x79, 0x1a, 0x7d, 0x53, 0x74, 0x13, 0x32, 0xe2, 0xf4, 0x59, 0x71, 0xfa, + 0xea, 0x28, 0xa7, 0x38, 0x5b, 0xd0, 0xf0, 0x64, 0x70, 0x84, 0x69, 0xac, 0x51, 0x92, 0x71, 0x5d, + 0xe0, 0xc0, 0xa8, 0x37, 0xb8, 0x03, 0x45, 0xea, 0xe3, 0x0e, 0x7d, 0x1e, 0x30, 0x11, 0xda, 0x63, + 0xa3, 0xba, 0xa0, 0x49, 0xf8, 0xca, 0xda, 0x83, 0xd5, 0xa4, 0xdd, 0x94, 0x7b, 0x55, 0x13, 0x95, + 0x22, 0xbf, 0xb5, 0x1c, 0x8b, 0xcc, 0x31, 0x5d, 0xc5, 0x2f, 0x0c, 0x40, 0x72, 0x2f, 0xd9, 0x0c, + 0x28, 0x07, 0x98, 0x56, 0x71, 0x2e, 0x03, 0xc8, 0x92, 0x1a, 0xeb, 0x34, 0x72, 0x02, 0xf2, 0x6c, + 0xc8, 0x4f, 0xd2, 0x71, 0x3f, 0xb9, 0x0e, 0xf3, 0xae, 0xdf, 0xf0, 0xba, 0x4d, 0xe2, 0x74, 0x70, + 0xc8, 0x9b, 0x64, 0xd5, 0xe2, 0x29, 0xe8, 0xbe, 0x00, 0x5a, 0xbf, 0x31, 0x60, 0x79, 0x48, 0x9c, + 0x0b, 0xde, 0x0b, 0xdd, 0x88, 0xd7, 0x09, 0x1e, 0x29, 0x03, 0xea, 0x78, 0xd7, 0x13, 0xb9, 0xa3, + 0x83, 0xbd, 0x90, 0xe0, 0x66, 0xdf, 0x21, 0x67, 0x2e, 0x65, 0x54, 0x09, 0x2f, 0x5d, 0xe8, 0xa1, + 0x44, 0xd5, 0x04, 0xc6, 0xfa, 0x2e, 0xac, 0xec, 0x10, 0x8f, 0x8c, 0x06, 0xcd, 0x34, 0x9d, 0x5d, + 0x82, 0x5c, 0x48, 0x1a, 0xdd, 0x90, 0xba, 0x3d, 0x1d, 0x40, 0x03, 0x80, 0x65, 0xc2, 0x6a, 0x72, + 0x4b, 0x79, 0x6f, 0xeb, 0xe7, 0x06, 0x2c, 0x4b, 0x94, 0x90, 0x9a, 0xea, 0xb3, 0x36, 0xa3, 0xaa, + 0x2f, 0x8b, 0xf9, 0xe8, 0xfd, 0x14, 0x7e, 0xfa, 0xc9, 0xbc, 0xf5, 0xe6, 0x53, 0x89, 0xe3, 0x1e, + 0x47, 0x45, 0x59, 0xd9, 0x85, 0x83, 0xf7, 0x8e, 0x55, 0x45, 0xb6, 0x56, 0xa1, 0x34, 0x2c, 0x86, + 0x92, 0xaf, 0xaf, 0xe1, 0x32, 0xe5, 0x44, 0xf2, 0x7d, 0xac, 0x5a, 0x75, 0x95, 0x85, 0x89, 0x96, + 0x73, 0x42, 0x1e, 0x2e, 0xc6, 0xf2, 0x30, 0xa1, 0x3c, 0x6e, 0x64, 0x52, 0x51, 0x0d, 0x83, 0x92, + 0xbb, 0x20, 0x80, 0xaa, 0x57, 0xb0, 0xd6, 0xb4, 0x1d, 0xa2, 0xa3, 0x95, 0x4c, 0xbf, 0x4c, 0xc1, + 0xe5, 0x5a, 0x9b, 0x84, 0x2d, 0xe2, 0x37, 0xfa, 0x36, 0x91, 0xee, 0x76, 0x6e, 0xef, 0x1e, 0xdf, + 0x60, 0xdc, 0x85, 0xbc, 0x4f, 0x06, 0xf2, 0x4c, 0xed, 0x32, 0xc0, 0x27, 0x5a, 0x48, 0xf4, 0x4d, + 0x58, 0x70, 0x5b, 0x3e, 0x4f, 0xf7, 0xaa, 0x65, 0xa5, 0x66, 0x66, 0x9a, 0x22, 0xe6, 0x25, 0xb5, + 0x6a, 0x02, 0x29, 0xda, 0x81, 0x95, 0x53, 0xec, 0xb2, 0x88, 0x3b, 0x9a, 0x4f, 0x67, 0x22, 0xb7, + 0x16, 0x49, 0x62, 0xa7, 0x1b, 0xca, 0x56, 0x79, 0x99, 0x93, 0x6b, 0x76, 0x3d, 0xb7, 0xfe, 0xd1, + 0x80, 0xf5, 0x49, 0x1a, 0x51, 0x01, 0xf6, 0xea, 0x2a, 0x79, 0x00, 0x8b, 0x9d, 0x30, 0x68, 0x07, + 0x8c, 0x34, 0xcf, 0xa7, 0x97, 0x05, 0x4d, 0xae, 0x95, 0x73, 0x03, 0xb2, 0x62, 0x24, 0xd6, 0x3a, + 0x49, 0x0e, 0xcc, 0x0a, 0x6b, 0x7d, 0x0c, 0xeb, 0xbb, 0xae, 0xdf, 0x7c, 0xe8, 0x79, 0xd2, 0xfb, + 0xf6, 0xfc, 0x57, 0x08, 0x3d, 0xeb, 0x4f, 0x06, 0x5c, 0x99, 0xc8, 0xae, 0x6e, 0xff, 0x2c, 0x11, + 0x4e, 0x77, 0x63, 0xe1, 0xf4, 0x12, 0x5e, 0x19, 0x6e, 0x6a, 0x5e, 0xd0, 0xcd, 0xf7, 0xa7, 0xaa, + 0xf7, 0x9e, 0x38, 0x23, 0xdc, 0x18, 0x9e, 0x11, 0xc6, 0xa4, 0xa7, 0x68, 0x28, 0xb0, 0x6a, 0xb0, + 0xf4, 0x98, 0xb0, 0x47, 0xb8, 0x71, 0xd2, 0xed, 0xd0, 0x0b, 0xbb, 0xb0, 0xb5, 0x03, 0x28, 0xbe, + 0x8d, 0xba, 0x79, 0x05, 0x66, 0x8f, 0x24, 0x48, 0x5d, 0xbd, 0x54, 0x89, 0x9e, 0x6a, 0x24, 0xed, + 0x9e, 0x7f, 0x1c, 0xd8, 0x9a, 0xc8, 0x7a, 0x0b, 0xd6, 0x1e, 0x13, 0xb6, 0x4d, 0x3c, 0x8f, 0xc3, + 0x79, 0xc2, 0xd7, 0x22, 0x59, 0xb7, 0xc1, 0x1c, 0x45, 0xa9, 0x63, 0x4a, 0x30, 0xc3, 0xab, 0x85, + 0x7e, 0x75, 0x91, 0x0b, 0x6b, 0x53, 0x88, 0xa4, 0x39, 0x62, 0xcd, 0x87, 0x18, 0xcd, 0x8d, 0xc1, + 0x68, 0x6e, 0xed, 0xc2, 0xf2, 0x10, 0x65, 0x54, 0x16, 0x72, 0x1c, 0xed, 0xb8, 0xfe, 0x71, 0xa0, + 0xea, 0x42, 0x6c, 0x88, 0x8e, 0xc8, 0xe7, 0x1a, 0xea, 0x8b, 0x67, 0x5a, 0xb5, 0x0f, 0x55, 0xc9, + 0x46, 0x4b, 0xff, 0xb5, 0x11, 0xdd, 0x6c, 0x80, 0x52, 0xc7, 0xec, 0xc1, 0xec, 0x70, 0x1a, 0xab, + 0xc6, 0xec, 0x35, 0x81, 0xa9, 0xa2, 0xd6, 0xd2, 0x31, 0x34, 0x7f, 0x79, 0x1f, 0x0a, 0x71, 0xc4, + 0x18, 0xd7, 0xb8, 0x39, 0xec, 0x1a, 0xa5, 0xe1, 0xfb, 0xc8, 0x63, 0xe2, 0xee, 0xb1, 0x22, 0x54, + 0xa3, 0xdd, 0x32, 0xba, 0xcf, 0x1e, 0x94, 0x86, 0xc1, 0xea, 0x2e, 0x77, 0x20, 0xa7, 0x1d, 0x45, + 0xdf, 0x66, 0x6c, 0x29, 0x1d, 0x50, 0x59, 0xb7, 0x85, 0x99, 0x5e, 0x25, 0xe6, 0x76, 0x87, 0x64, + 0xba, 0x78, 0x77, 0xf2, 0xb3, 0x14, 0x2c, 0x3e, 0x26, 0x4c, 0xb6, 0x8e, 0xaf, 0xdf, 0xe1, 0xaf, + 0xaa, 0x31, 0x31, 0x9a, 0x95, 0xe5, 0x8a, 0x37, 0x27, 0xe4, 0x4c, 0x36, 0x27, 0x0a, 0x9f, 0x16, + 0xf8, 0xa2, 0x82, 0x1e, 0x48, 0xb2, 0x6b, 0xa0, 0xbb, 0x15, 0xa7, 0xe7, 0x92, 0x53, 0xaa, 0x4a, + 0x65, 0x41, 0x01, 0x0f, 0x39, 0x0c, 0x6d, 0xc2, 0xa2, 0x7c, 0xa4, 0x12, 0x2e, 0xee, 0x04, 0xbe, + 0xd7, 0x17, 0xc9, 0x7a, 0x4e, 0xcd, 0xc4, 0x22, 0x2e, 0xbe, 0xe3, 0x7b, 0xfd, 0x01, 0x25, 0x75, + 0xbf, 0xd0, 0x94, 0xd9, 0x18, 0x65, 0x9d, 0x83, 0x39, 0xa5, 0xb5, 0x2f, 0x32, 0x80, 0xd6, 0x82, + 0x52, 0xe6, 0x37, 0x20, 0xab, 0x7a, 0x6d, 0xa9, 0x80, 0x6b, 0x95, 0xd1, 0xc7, 0x53, 0xc9, 0xb2, + 0x43, 0x8e, 0x5d, 0xdf, 0x55, 0x4f, 0x31, 0x02, 0x62, 0x3d, 0x85, 0x05, 0xbe, 0xe3, 0x9b, 0x69, + 0xf9, 0xac, 0xfb, 0xd2, 0x4a, 0x43, 0x05, 0x25, 0x6a, 0xc0, 0x8c, 0xa9, 0x0d, 0x98, 0xf5, 0x44, + 0x44, 0x64, 0x3d, 0xec, 0x25, 0x3d, 0xf8, 0x65, 0x29, 0x8e, 0xc7, 0xb4, 0x36, 0xa4, 0x5c, 0x58, + 0x7f, 0x95, 0x31, 0x3c, 0xbc, 0x99, 0x92, 0xe7, 0xfb, 0x50, 0xa4, 0x61, 0xcf, 0x49, 0xfa, 0xfe, + 0x87, 0xc3, 0x91, 0x3c, 0x8e, 0xb5, 0x12, 0x07, 0xea, 0x77, 0xa1, 0x18, 0xa8, 0x7c, 0x08, 0x4b, + 0x23, 0x24, 0x63, 0x02, 0xfb, 0xbd, 0xe1, 0xc0, 0x8e, 0x39, 0x6c, 0x8c, 0x3b, 0x1e, 0xd9, 0x37, + 0x45, 0x08, 0xd7, 0xc3, 0xde, 0xe1, 0x70, 0x00, 0x8c, 0x4b, 0x90, 0xcf, 0x60, 0x25, 0x41, 0x1b, + 0x0d, 0x9c, 0x5c, 0xd8, 0xc1, 0x60, 0x16, 0xc5, 0x9d, 0x7a, 0x40, 0x8f, 0xb1, 0x00, 0x8d, 0xbe, + 0xad, 0xa7, 0xc2, 0xa4, 0x6a, 0xaa, 0x7c, 0xdd, 0xc0, 0xb3, 0x3e, 0x11, 0x0e, 0xac, 0x77, 0x53, + 0x92, 0x6d, 0x46, 0x8f, 0x36, 0x93, 0x66, 0x60, 0x85, 0xb7, 0x7e, 0x18, 0x63, 0xbf, 0x78, 0x05, + 0x1c, 0x38, 0x4d, 0x3a, 0xee, 0x34, 0x0f, 0x44, 0x76, 0x4b, 0x34, 0x91, 0xe8, 0x26, 0xcc, 0xca, + 0xc3, 0x07, 0x1d, 0x76, 0x52, 0x3a, 0x4d, 0x60, 0x55, 0x85, 0x78, 0x09, 0x23, 0x4d, 0x4b, 0x8f, + 0x8f, 0xc4, 0x91, 0x49, 0x4b, 0xbd, 0x0f, 0x73, 0x09, 0x2b, 0x2d, 0x45, 0x56, 0x8a, 0xdc, 0x63, + 0xb6, 0xa7, 0x0c, 0x64, 0x8b, 0x14, 0xab, 0xdf, 0x5a, 0xce, 0xa5, 0x95, 0x2b, 0x90, 0xc7, 0x0d, + 0xe6, 0xf6, 0x88, 0xcc, 0x35, 0xb2, 0xa9, 0x06, 0x09, 0x12, 0x79, 0x46, 0xd6, 0x8c, 0xd8, 0x9e, + 0x83, 0x9a, 0xa1, 0x9f, 0xff, 0xc7, 0xd5, 0x0c, 0xcd, 0x60, 0x0f, 0xa8, 0xac, 0x7f, 0x19, 0xb0, + 0xb6, 0xe7, 0xbb, 0x32, 0x29, 0xa8, 0x86, 0xef, 0xe2, 0x96, 0xb3, 0xa1, 0xac, 0xdf, 0x0e, 0x89, + 0x47, 0x1a, 0xea, 0xd7, 0x11, 0xed, 0x87, 0x53, 0xbb, 0xce, 0x35, 0xc5, 0x58, 0xe3, 0x7c, 0x31, + 0xc4, 0x60, 0x4e, 0xcd, 0xc4, 0xe7, 0xd4, 0x37, 0xd3, 0x70, 0x3f, 0x02, 0x73, 0xf4, 0xf2, 0x51, + 0x62, 0xd4, 0x5d, 0xaf, 0x31, 0xb5, 0xeb, 0xfd, 0x32, 0x05, 0x6f, 0xef, 0x7b, 0xd8, 0xf7, 0x49, + 0xf3, 0xbf, 0x3c, 0xc4, 0xdc, 0x87, 0x22, 0xee, 0x05, 0xee, 0xa0, 0xcd, 0xcf, 0x4c, 0xe3, 0x2c, + 0x08, 0x5a, 0xcd, 0xfb, 0x66, 0xf4, 0xf9, 0x07, 0x03, 0x2e, 0x8d, 0xd7, 0xc5, 0xff, 0xc0, 0xf8, + 0xf2, 0x53, 0x78, 0xcb, 0x26, 0xed, 0xa0, 0x17, 0x4d, 0xf7, 0xbc, 0x8f, 0x3b, 0x8f, 0x15, 0x75, + 0x9e, 0x4f, 0xc5, 0x7e, 0xa3, 0x1a, 0xff, 0xba, 0x32, 0x34, 0xe4, 0x67, 0x92, 0xcf, 0x0b, 0x97, + 0xa0, 0x3c, 0x4e, 0x00, 0x35, 0x2e, 0x7f, 0x65, 0xc0, 0xaa, 0x44, 0x0b, 0x95, 0x9e, 0x57, 0xb8, + 0x97, 0xbc, 0x02, 0x69, 0xd9, 0xd3, 0xe3, 0x64, 0xcf, 0x4c, 0x94, 0x7d, 0x26, 0x29, 0xfb, 0x5b, + 0xb0, 0x36, 0x22, 0x9c, 0x12, 0x7c, 0x17, 0x56, 0xb4, 0x33, 0x0c, 0xd7, 0xa9, 0x5b, 0x89, 0xc2, + 0x32, 0xfd, 0xd7, 0x00, 0xeb, 0x27, 0xfc, 0xfe, 0xc3, 0xfb, 0x5c, 0xd8, 0xab, 0xaa, 0x30, 0x7b, + 0x2e, 0x67, 0xd2, 0x54, 0xd6, 0x01, 0x6c, 0x28, 0x4f, 0x8e, 0x7e, 0xf6, 0xd1, 0x3f, 0x13, 0xbc, + 0xc6, 0xac, 0xf7, 0x6f, 0x03, 0xae, 0x4e, 0xd9, 0x56, 0x5d, 0xef, 0x0c, 0x4a, 0xf1, 0x1f, 0xd2, + 0x28, 0xc3, 0xac, 0x3b, 0x98, 0x71, 0x6a, 0x23, 0x1d, 0xdb, 0x94, 0xbd, 0xe2, 0x3f, 0xdb, 0xd5, + 0xd5, 0x3e, 0xb2, 0x55, 0x5a, 0x0e, 0x47, 0x31, 0x65, 0x07, 0xcc, 0x49, 0x0c, 0x63, 0x1a, 0xa7, + 0x5b, 0xc3, 0x8d, 0xd3, 0x5a, 0x25, 0xf9, 0xcf, 0x03, 0x72, 0x83, 0x78, 0xeb, 0x64, 0xc3, 0x55, + 0xa9, 0xee, 0x9a, 0xfa, 0x55, 0xd6, 0x8b, 0xde, 0x3d, 0x48, 0xf3, 0x82, 0x7e, 0xf2, 0x67, 0x03, + 0xac, 0x69, 0x9b, 0x5e, 0xd8, 0x69, 0x2e, 0x9a, 0x97, 0xef, 0x42, 0x3e, 0xf0, 0xce, 0x99, 0x95, + 0x21, 0xf0, 0x74, 0xe2, 0x7a, 0x74, 0xef, 0x2f, 0x2f, 0xd6, 0x8d, 0xbf, 0xbd, 0x58, 0x37, 0xfe, + 0xf1, 0x62, 0xdd, 0xf8, 0xd5, 0x3f, 0xd7, 0xff, 0xef, 0x07, 0x37, 0x7a, 0x2e, 0x23, 0x94, 0x56, + 0xdc, 0xa0, 0x2a, 0xbf, 0xaa, 0xad, 0xa0, 0xda, 0x63, 0x55, 0xf1, 0xff, 0x14, 0xd5, 0xc8, 0x0f, + 0x8e, 0xb2, 0x02, 0xf0, 0xc1, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x44, 0xc3, 0x8d, 0x6c, 0x0c, + 0x22, 0x00, 0x00, } func (m *ExecuteVtctlCommandRequest) Marshal() (dAtA []byte, err error) { @@ -7458,6 +7571,100 @@ func (m *ReparentTabletResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *ShardReplicationPositionsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ShardReplicationPositionsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShardReplicationPositionsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Shard) > 0 { + i -= len(m.Shard) + copy(dAtA[i:], m.Shard) + i = encodeVarintVtctldata(dAtA, i, uint64(len(m.Shard))) + i-- + dAtA[i] = 0x12 + } + if len(m.Keyspace) > 0 { + i -= len(m.Keyspace) + copy(dAtA[i:], m.Keyspace) + i = encodeVarintVtctldata(dAtA, i, uint64(len(m.Keyspace))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ShardReplicationPositionsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ShardReplicationPositionsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShardReplicationPositionsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ReplicationStatuses) > 0 { + for k := range m.ReplicationStatuses { + v := m.ReplicationStatuses[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintVtctldata(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintVtctldata(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintVtctldata(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *TabletExternallyReparentedRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8997,6 +9204,51 @@ func (m *ReparentTabletResponse) Size() (n int) { return n } +func (m *ShardReplicationPositionsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Keyspace) + if l > 0 { + n += 1 + l + sovVtctldata(uint64(l)) + } + l = len(m.Shard) + if l > 0 { + n += 1 + l + sovVtctldata(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ShardReplicationPositionsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ReplicationStatuses) > 0 { + for k, v := range m.ReplicationStatuses { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovVtctldata(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovVtctldata(uint64(len(k))) + l + n += mapEntrySize + 1 + sovVtctldata(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *TabletExternallyReparentedRequest) Size() (n int) { if m == nil { return 0 @@ -17513,6 +17765,307 @@ func (m *ReparentTabletResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *ShardReplicationPositionsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ShardReplicationPositionsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShardReplicationPositionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Keyspace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthVtctldata + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Keyspace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Shard", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthVtctldata + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Shard = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipVtctldata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ShardReplicationPositionsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ShardReplicationPositionsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShardReplicationPositionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReplicationStatuses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthVtctldata + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReplicationStatuses == nil { + m.ReplicationStatuses = make(map[string]*replicationdata.Status) + } + var mapkey string + var mapvalue *replicationdata.Status + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthVtctldata + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthVtctldata + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthVtctldata + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &replicationdata.Status{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipVtctldata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ReplicationStatuses[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipVtctldata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TabletExternallyReparentedRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/go/vt/proto/vtctlservice/vtctlservice.pb.go b/go/vt/proto/vtctlservice/vtctlservice.pb.go index 389c0f7b62b..053b6ee12fa 100644 --- a/go/vt/proto/vtctlservice/vtctlservice.pb.go +++ b/go/vt/proto/vtctlservice/vtctlservice.pb.go @@ -29,53 +29,55 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package func init() { proto.RegisterFile("vtctlservice.proto", fileDescriptor_27055cdbb1148d2b) } var fileDescriptor_27055cdbb1148d2b = []byte{ - // 725 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0xdb, 0x4e, 0x14, 0x4d, - 0x10, 0xc7, 0xd9, 0x8b, 0x8f, 0x7c, 0xb6, 0x28, 0xa4, 0x31, 0x9a, 0x2c, 0xec, 0xb0, 0xa0, 0xa8, - 0x18, 0x65, 0x0d, 0x5e, 0x7a, 0x05, 0xeb, 0x8a, 0x84, 0x84, 0x20, 0x10, 0x48, 0x48, 0xb8, 0x68, - 0x66, 0x0a, 0x76, 0xc2, 0x1c, 0x96, 0xe9, 0x66, 0x64, 0xe3, 0x8b, 0xf8, 0x48, 0xde, 0x98, 0xf8, - 0x08, 0x06, 0x5f, 0xc4, 0x30, 0xbd, 0xdd, 0xd4, 0xf4, 0x01, 0xb8, 0xdb, 0xad, 0xdf, 0xbf, 0xfe, - 0x35, 0x7d, 0xa8, 0x9a, 0x21, 0xb4, 0x14, 0xa1, 0x48, 0x38, 0x14, 0x65, 0x1c, 0xc2, 0xf2, 0xa0, - 0xc8, 0x45, 0x4e, 0x27, 0x70, 0xac, 0x39, 0x59, 0xfd, 0x8b, 0x98, 0x60, 0x12, 0xaf, 0x9c, 0x93, - 0xff, 0xf6, 0xaf, 0x43, 0xb4, 0x4f, 0xa6, 0x7b, 0x97, 0x10, 0x5e, 0x08, 0xa8, 0xfe, 0x77, 0xf3, - 0x34, 0x65, 0x59, 0x44, 0x17, 0x97, 0x6f, 0x32, 0x1c, 0x7c, 0x07, 0xce, 0x2f, 0x80, 0x8b, 0xe6, - 0xcb, 0xbb, 0x64, 0x7c, 0x90, 0x67, 0x1c, 0x16, 0xc6, 0xde, 0x37, 0x56, 0x7e, 0x4d, 0x93, 0xf1, - 0x0a, 0x46, 0xf4, 0x88, 0x4c, 0x75, 0xfb, 0x2c, 0x3b, 0x85, 0x3d, 0x76, 0x9c, 0x80, 0xd8, 0x1b, - 0x0e, 0x80, 0x2e, 0x20, 0x2b, 0x13, 0xaa, 0x72, 0xcf, 0x6f, 0xd5, 0xa8, 0x5a, 0xf4, 0x80, 0x3c, - 0xee, 0x16, 0xc0, 0x04, 0x6c, 0xc2, 0x90, 0x0f, 0x58, 0x08, 0xb4, 0x8d, 0x13, 0x6b, 0x48, 0x59, - 0xcf, 0xdf, 0xa2, 0xd0, 0xc6, 0x5b, 0xe4, 0xa1, 0x64, 0xbb, 0x7d, 0x56, 0x44, 0xb4, 0x65, 0xe5, - 0x54, 0x71, 0x65, 0x19, 0xf8, 0x30, 0x7e, 0xd0, 0x4f, 0x90, 0x80, 0xe7, 0x41, 0xeb, 0xc8, 0xf5, - 0xa0, 0xa6, 0x42, 0x1b, 0x7f, 0x25, 0x13, 0x92, 0x55, 0x15, 0x39, 0x0d, 0xac, 0x24, 0x09, 0x94, - 0xe9, 0x9c, 0x97, 0x6b, 0xcb, 0x3d, 0xf2, 0x48, 0x12, 0xb9, 0xe5, 0x9c, 0xda, 0x39, 0x23, 0xa2, - 0x4c, 0xdb, 0x7e, 0x81, 0x76, 0xcd, 0xc9, 0xd3, 0x5e, 0x0a, 0xc5, 0x29, 0x64, 0xe1, 0x70, 0x07, - 0x06, 0xac, 0x80, 0x4c, 0xc8, 0xcd, 0x7d, 0x8d, 0xaf, 0x96, 0x53, 0xa2, 0xea, 0x2c, 0xdd, 0x43, - 0xa9, 0x0b, 0x16, 0xe4, 0xd9, 0xe7, 0x38, 0x8b, 0x56, 0x93, 0x44, 0xae, 0x70, 0x23, 0xd3, 0x7b, - 0x8f, 0x7d, 0x3c, 0x1a, 0x55, 0xf2, 0xcd, 0x7d, 0xa4, 0xba, 0xe6, 0x26, 0x21, 0xeb, 0x20, 0xd6, - 0x58, 0x78, 0x76, 0x31, 0xe0, 0x74, 0x16, 0xe5, 0xde, 0x84, 0x95, 0x73, 0xcb, 0x43, 0xb5, 0xd9, - 0x11, 0x99, 0x5a, 0x07, 0xd1, 0x85, 0x24, 0xd9, 0xc8, 0x4e, 0xf2, 0x2d, 0x96, 0x02, 0xaf, 0xf5, - 0x8e, 0x09, 0x5d, 0xbd, 0x63, 0x6b, 0xf0, 0x15, 0x47, 0x94, 0xb6, 0xdc, 0x59, 0xae, 0x2b, 0x5e, - 0xc3, 0xda, 0xef, 0x90, 0x4c, 0x8e, 0x00, 0x5f, 0x4d, 0x62, 0xc6, 0x81, 0xd3, 0x79, 0x3b, 0x49, - 0x31, 0xe5, 0xbb, 0x70, 0x9b, 0xc4, 0x78, 0x56, 0x7d, 0x7e, 0xc6, 0xb3, 0x9a, 0x67, 0x16, 0xf8, - 0x30, 0xee, 0x1a, 0x04, 0xea, 0x5d, 0x83, 0x81, 0xab, 0x6b, 0xea, 0x5c, 0x5b, 0x7e, 0x21, 0x0f, - 0xd6, 0x41, 0xec, 0x86, 0x7d, 0x48, 0x19, 0x9d, 0xa9, 0xeb, 0x65, 0x54, 0x99, 0xcd, 0xba, 0xa1, - 0x76, 0xea, 0x91, 0xff, 0xaf, 0xc3, 0x55, 0x6f, 0x34, 0x0d, 0x2d, 0xee, 0x86, 0x19, 0x27, 0x33, - 0xce, 0x63, 0xb7, 0x28, 0x6f, 0x96, 0x69, 0x9c, 0x07, 0x66, 0x9e, 0xf3, 0xa8, 0x4b, 0xf0, 0x88, - 0x90, 0x70, 0x7f, 0xb4, 0xe0, 0x39, 0x2b, 0x6d, 0xbf, 0xbe, 0xe8, 0xb6, 0x5f, 0x60, 0x6c, 0xa1, - 0x1c, 0x1d, 0xe6, 0x16, 0xca, 0xa8, 0x67, 0x0b, 0x15, 0x34, 0xfa, 0x50, 0xcd, 0x2f, 0xa7, 0xda, - 0xd7, 0x87, 0xf6, 0xe4, 0x92, 0x66, 0x6a, 0xa5, 0x86, 0x99, 0xb1, 0xcc, 0x96, 0x87, 0x1a, 0x37, - 0xef, 0x20, 0x2f, 0xce, 0x4e, 0x92, 0xfc, 0x9b, 0x75, 0xf3, 0x34, 0xf0, 0xdc, 0x3c, 0xc4, 0xf1, - 0x9c, 0xd8, 0xc8, 0x62, 0x79, 0xfe, 0xdb, 0x45, 0x9c, 0xb2, 0x62, 0x58, 0x9b, 0x13, 0x26, 0x74, - 0xcd, 0x09, 0x5b, 0xa3, 0xed, 0x63, 0xf2, 0x64, 0x3b, 0x61, 0x59, 0x06, 0x51, 0x7d, 0x6c, 0xe3, - 0x2f, 0x02, 0x97, 0x40, 0x95, 0x79, 0x75, 0xa7, 0x4e, 0x97, 0x0a, 0x09, 0xdd, 0x81, 0x34, 0x2f, - 0xf5, 0x8b, 0xee, 0x7a, 0x1c, 0xd0, 0x17, 0xc8, 0xc0, 0xc6, 0xaa, 0xcc, 0xe2, 0x1d, 0x2a, 0xdc, - 0x17, 0x92, 0x57, 0xd5, 0xab, 0x0a, 0xf3, 0x56, 0xae, 0x66, 0xae, 0xbe, 0xb0, 0x24, 0xf8, 0x35, - 0xaf, 0xd6, 0x36, 0xba, 0xc6, 0xed, 0x5a, 0x1e, 0x46, 0xae, 0xd7, 0xbc, 0xa9, 0xd0, 0xc6, 0xdf, - 0x49, 0x53, 0xc6, 0x7a, 0x97, 0x02, 0x8a, 0x8c, 0x25, 0x89, 0x7e, 0xef, 0x41, 0x44, 0xdf, 0x22, - 0x0b, 0xbf, 0x4c, 0x15, 0x7c, 0x77, 0x4f, 0xb5, 0x2a, 0xbe, 0xf6, 0xf1, 0xe7, 0x55, 0xd0, 0xf8, - 0x7d, 0x15, 0x34, 0xfe, 0x5c, 0x05, 0x8d, 0x1f, 0x7f, 0x83, 0xb1, 0xc3, 0xa5, 0x32, 0x16, 0xc0, - 0xf9, 0x72, 0x9c, 0x77, 0xe4, 0xaf, 0xce, 0x69, 0xde, 0x29, 0x45, 0xa7, 0xfa, 0xe4, 0xec, 0xe0, - 0x0f, 0xd2, 0xe3, 0xf1, 0x2a, 0xf6, 0xe1, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc6, 0x00, 0x52, - 0x66, 0xbb, 0x0a, 0x00, 0x00, + // 753 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x96, 0xdf, 0x4e, 0x14, 0x3f, + 0x14, 0xc7, 0xd9, 0x8b, 0x1f, 0xf9, 0x59, 0x51, 0x48, 0x25, 0x1a, 0x17, 0x76, 0x58, 0x50, 0x54, + 0xfc, 0xc3, 0x1a, 0xbc, 0xf4, 0x0a, 0xd6, 0x15, 0x09, 0x09, 0x41, 0x20, 0x90, 0x90, 0x70, 0x51, + 0x66, 0x0e, 0xec, 0x84, 0x99, 0x76, 0x98, 0x96, 0x95, 0x8d, 0x2f, 0xe2, 0x1b, 0xe9, 0xa5, 0x8f, + 0x60, 0xf0, 0x45, 0xcc, 0x4e, 0xb7, 0xa5, 0xd3, 0x69, 0xd9, 0xbd, 0x82, 0xed, 0xe7, 0x7b, 0xbe, + 0xa7, 0xff, 0xce, 0xe9, 0x20, 0xdc, 0x13, 0xa1, 0x48, 0x38, 0xe4, 0xbd, 0x38, 0x84, 0xd5, 0x2c, + 0x67, 0x82, 0xe1, 0x29, 0x73, 0xac, 0x3e, 0x5d, 0xfc, 0x8a, 0x88, 0x20, 0x12, 0xaf, 0x5d, 0xa2, + 0xff, 0x0e, 0x07, 0x43, 0xb8, 0x8b, 0x1e, 0x75, 0xae, 0x21, 0xbc, 0x12, 0x50, 0xfc, 0x6e, 0xb3, + 0x34, 0x25, 0x34, 0xc2, 0xcb, 0xab, 0xb7, 0x11, 0x0e, 0xbe, 0x07, 0x97, 0x57, 0xc0, 0x45, 0xfd, + 0xc5, 0x28, 0x19, 0xcf, 0x18, 0xe5, 0xb0, 0x34, 0xf1, 0xbe, 0xb6, 0xf6, 0x73, 0x16, 0x4d, 0x16, + 0x30, 0xc2, 0x27, 0x68, 0xa6, 0xdd, 0x25, 0xf4, 0x1c, 0x0e, 0xc8, 0x69, 0x02, 0xe2, 0xa0, 0x9f, + 0x01, 0x5e, 0x32, 0xac, 0x6c, 0xa8, 0xd2, 0x3d, 0xbb, 0x53, 0xa3, 0x72, 0xe1, 0x23, 0xf4, 0xb0, + 0x9d, 0x03, 0x11, 0xb0, 0x0d, 0x7d, 0x9e, 0x91, 0x10, 0x70, 0xd3, 0x0c, 0x2c, 0x21, 0x65, 0xbd, + 0x78, 0x87, 0x42, 0x1b, 0xef, 0xa0, 0xfb, 0x92, 0xed, 0x77, 0x49, 0x1e, 0xe1, 0x46, 0x25, 0xa6, + 0x18, 0x57, 0x96, 0x81, 0x0f, 0x9b, 0x13, 0xfd, 0x04, 0x09, 0x78, 0x26, 0x5a, 0x46, 0xae, 0x89, + 0xda, 0x0a, 0x6d, 0xfc, 0x15, 0x4d, 0x49, 0x56, 0x64, 0xe4, 0x38, 0xa8, 0x04, 0x49, 0xa0, 0x4c, + 0x17, 0xbc, 0x5c, 0x5b, 0x1e, 0xa0, 0x07, 0x92, 0xc8, 0x2d, 0xe7, 0xb8, 0x1a, 0x33, 0x24, 0xca, + 0xb4, 0xe9, 0x17, 0x68, 0x57, 0x86, 0x1e, 0x77, 0x52, 0xc8, 0xcf, 0x81, 0x86, 0xfd, 0x3d, 0xc8, + 0x48, 0x0e, 0x54, 0xc8, 0xcd, 0x7d, 0x65, 0x5e, 0x2d, 0xa7, 0x44, 0xe5, 0x59, 0x19, 0x43, 0xa9, + 0x13, 0xe6, 0xe8, 0xc9, 0xe7, 0x98, 0x46, 0xeb, 0x49, 0x22, 0x57, 0xb8, 0x45, 0xf5, 0xde, 0x9b, + 0x3e, 0x1e, 0x8d, 0x4a, 0xf9, 0x7a, 0x1c, 0xa9, 0xce, 0xb9, 0x8d, 0xd0, 0x26, 0x88, 0x0d, 0x12, + 0x5e, 0x5c, 0x65, 0x1c, 0xcf, 0x1b, 0xb1, 0xb7, 0xc3, 0xca, 0xb9, 0xe1, 0xa1, 0xda, 0xec, 0x04, + 0xcd, 0x6c, 0x82, 0x68, 0x43, 0x92, 0x6c, 0xd1, 0x33, 0xb6, 0x43, 0x52, 0xe0, 0xa5, 0xda, 0xb1, + 0xa1, 0xab, 0x76, 0xaa, 0x1a, 0xf3, 0x8a, 0x1b, 0x14, 0x37, 0xdc, 0x51, 0xae, 0x2b, 0x5e, 0xc2, + 0xda, 0xef, 0x18, 0x4d, 0x0f, 0x01, 0x5f, 0x4f, 0x62, 0xc2, 0x81, 0xe3, 0xc5, 0x6a, 0x90, 0x62, + 0xca, 0x77, 0xe9, 0x2e, 0x89, 0x35, 0x57, 0x7d, 0x7e, 0xd6, 0x5c, 0xed, 0x33, 0x0b, 0x7c, 0xd8, + 0xac, 0x1a, 0x03, 0x94, 0xab, 0xc6, 0x04, 0xae, 0xaa, 0x29, 0x73, 0x6d, 0xf9, 0x05, 0xdd, 0xdb, + 0x04, 0xb1, 0x1f, 0x76, 0x21, 0x25, 0x78, 0xae, 0xac, 0x97, 0xa3, 0xca, 0x6c, 0xde, 0x0d, 0xb5, + 0x53, 0x07, 0xfd, 0x3f, 0x18, 0x2e, 0x6a, 0xa3, 0x6e, 0x69, 0xcd, 0x6a, 0x98, 0x73, 0x32, 0xeb, + 0x3c, 0xf6, 0xf3, 0xde, 0xed, 0x32, 0xad, 0xf3, 0x30, 0x99, 0xe7, 0x3c, 0xca, 0x12, 0xb3, 0x45, + 0x48, 0x78, 0x38, 0x5c, 0xf0, 0x42, 0x25, 0xec, 0xb0, 0xbc, 0xe8, 0xa6, 0x5f, 0x60, 0x6d, 0xa1, + 0x6c, 0x1d, 0xf6, 0x16, 0xca, 0x51, 0xcf, 0x16, 0x2a, 0x68, 0xd5, 0xa1, 0xea, 0x5f, 0x4e, 0xb5, + 0xaf, 0x0e, 0xab, 0x9d, 0x4b, 0x9a, 0xa9, 0x95, 0x5a, 0x66, 0xd6, 0x32, 0x1b, 0x1e, 0x6a, 0xdd, + 0xbc, 0x23, 0x96, 0x5f, 0x9c, 0x25, 0xec, 0x5b, 0xe5, 0xe6, 0x69, 0xe0, 0xb9, 0x79, 0x06, 0x37, + 0xfb, 0xc4, 0x16, 0x8d, 0xe5, 0xf9, 0xef, 0xe6, 0x71, 0x4a, 0xf2, 0x7e, 0xa9, 0x4f, 0xd8, 0xd0, + 0xd5, 0x27, 0xaa, 0x1a, 0x6d, 0x1f, 0xa3, 0xd9, 0xdd, 0x84, 0x50, 0x0a, 0x51, 0xb9, 0x6d, 0x9b, + 0x5f, 0x04, 0x2e, 0x81, 0x4a, 0xf3, 0x72, 0xa4, 0x4e, 0xa7, 0x0a, 0x11, 0xde, 0x83, 0x94, 0xf5, + 0xf4, 0x43, 0x37, 0x68, 0x07, 0xf8, 0xb9, 0x61, 0x50, 0xc5, 0x2a, 0xcd, 0xf2, 0x08, 0x95, 0x59, + 0x17, 0x92, 0x17, 0xd9, 0x8b, 0x0c, 0x8b, 0x95, 0x58, 0xcd, 0x5c, 0x75, 0x51, 0x91, 0x98, 0xcf, + 0xbc, 0x5a, 0xdb, 0xf0, 0x1a, 0x37, 0x4b, 0x71, 0x26, 0x72, 0x3d, 0xf3, 0xb6, 0x42, 0x1b, 0x5f, + 0xa3, 0xa7, 0xc3, 0xcd, 0xca, 0x92, 0x38, 0x24, 0x22, 0x66, 0x74, 0x97, 0xf1, 0x78, 0xf0, 0x97, + 0xe3, 0x37, 0x86, 0x83, 0x57, 0xa5, 0xd2, 0xbd, 0x1d, 0x4f, 0xac, 0x33, 0x7f, 0x47, 0x75, 0x39, + 0x9b, 0xce, 0xb5, 0x80, 0x9c, 0x92, 0x24, 0xd1, 0x2f, 0x2e, 0x44, 0xd8, 0x74, 0xf3, 0xcb, 0x54, + 0xee, 0x77, 0x63, 0xaa, 0x55, 0xf2, 0x8d, 0x8f, 0xbf, 0x6e, 0x82, 0xda, 0xef, 0x9b, 0xa0, 0xf6, + 0xe7, 0x26, 0xa8, 0xfd, 0xf8, 0x1b, 0x4c, 0x1c, 0xaf, 0xf4, 0x62, 0x01, 0x9c, 0xaf, 0xc6, 0xac, + 0x25, 0xff, 0x6b, 0x9d, 0xb3, 0x56, 0x4f, 0xb4, 0x8a, 0x8f, 0xdd, 0x96, 0xf9, 0x29, 0x7c, 0x3a, + 0x59, 0x8c, 0x7d, 0xf8, 0x17, 0x00, 0x00, 0xff, 0xff, 0xe0, 0x50, 0xd7, 0x8b, 0x35, 0x0b, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -277,6 +279,12 @@ type VtctldClient interface { // only works if the current replica position matches the last known reparent // action. ReparentTablet(ctx context.Context, in *vtctldata.ReparentTabletRequest, opts ...grpc.CallOption) (*vtctldata.ReparentTabletResponse, error) + // ShardReplicationPositions returns the replication position of each tablet + // in a shard. This RPC makes a best-effort to return partial results. For + // example, if one tablet in the shard graph is unreachable, then + // ShardReplicationPositions will return non-error, and include valid results + // for the reachable tablets. + ShardReplicationPositions(ctx context.Context, in *vtctldata.ShardReplicationPositionsRequest, opts ...grpc.CallOption) (*vtctldata.ShardReplicationPositionsResponse, error) // TabletExternallyReparented changes metadata in the topology server to // acknowledge a shard primary change performed by an external tool (e.g. // orchestrator). @@ -537,6 +545,15 @@ func (c *vtctldClient) ReparentTablet(ctx context.Context, in *vtctldata.Reparen return out, nil } +func (c *vtctldClient) ShardReplicationPositions(ctx context.Context, in *vtctldata.ShardReplicationPositionsRequest, opts ...grpc.CallOption) (*vtctldata.ShardReplicationPositionsResponse, error) { + out := new(vtctldata.ShardReplicationPositionsResponse) + err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/ShardReplicationPositions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *vtctldClient) TabletExternallyReparented(ctx context.Context, in *vtctldata.TabletExternallyReparentedRequest, opts ...grpc.CallOption) (*vtctldata.TabletExternallyReparentedResponse, error) { out := new(vtctldata.TabletExternallyReparentedResponse) err := c.cc.Invoke(ctx, "/vtctlservice.Vtctld/TabletExternallyReparented", in, out, opts...) @@ -636,6 +653,12 @@ type VtctldServer interface { // only works if the current replica position matches the last known reparent // action. ReparentTablet(context.Context, *vtctldata.ReparentTabletRequest) (*vtctldata.ReparentTabletResponse, error) + // ShardReplicationPositions returns the replication position of each tablet + // in a shard. This RPC makes a best-effort to return partial results. For + // example, if one tablet in the shard graph is unreachable, then + // ShardReplicationPositions will return non-error, and include valid results + // for the reachable tablets. + ShardReplicationPositions(context.Context, *vtctldata.ShardReplicationPositionsRequest) (*vtctldata.ShardReplicationPositionsResponse, error) // TabletExternallyReparented changes metadata in the topology server to // acknowledge a shard primary change performed by an external tool (e.g. // orchestrator). @@ -730,6 +753,9 @@ func (*UnimplementedVtctldServer) RemoveShardCell(ctx context.Context, req *vtct func (*UnimplementedVtctldServer) ReparentTablet(ctx context.Context, req *vtctldata.ReparentTabletRequest) (*vtctldata.ReparentTabletResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ReparentTablet not implemented") } +func (*UnimplementedVtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctldata.ShardReplicationPositionsRequest) (*vtctldata.ShardReplicationPositionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ShardReplicationPositions not implemented") +} func (*UnimplementedVtctldServer) TabletExternallyReparented(ctx context.Context, req *vtctldata.TabletExternallyReparentedRequest) (*vtctldata.TabletExternallyReparentedResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TabletExternallyReparented not implemented") } @@ -1224,6 +1250,24 @@ func _Vtctld_ReparentTablet_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _Vtctld_ShardReplicationPositions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(vtctldata.ShardReplicationPositionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VtctldServer).ShardReplicationPositions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/vtctlservice.Vtctld/ShardReplicationPositions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VtctldServer).ShardReplicationPositions(ctx, req.(*vtctldata.ShardReplicationPositionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Vtctld_TabletExternallyReparented_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(vtctldata.TabletExternallyReparentedRequest) if err := dec(in); err != nil { @@ -1354,6 +1398,10 @@ var _Vtctld_serviceDesc = grpc.ServiceDesc{ MethodName: "ReparentTablet", Handler: _Vtctld_ReparentTablet_Handler, }, + { + MethodName: "ShardReplicationPositions", + Handler: _Vtctld_ShardReplicationPositions_Handler, + }, { MethodName: "TabletExternallyReparented", Handler: _Vtctld_TabletExternallyReparented_Handler, diff --git a/go/vt/vtctl/grpcvtctldclient/client_gen.go b/go/vt/vtctl/grpcvtctldclient/client_gen.go index d0f1d386ad9..ee7b4d99b44 100644 --- a/go/vt/vtctl/grpcvtctldclient/client_gen.go +++ b/go/vt/vtctl/grpcvtctldclient/client_gen.go @@ -271,6 +271,15 @@ func (client *gRPCVtctldClient) ReparentTablet(ctx context.Context, in *vtctldat return client.c.ReparentTablet(ctx, in, opts...) } +// ShardReplicationPositions is part of the vtctlservicepb.VtctldClient interface. +func (client *gRPCVtctldClient) ShardReplicationPositions(ctx context.Context, in *vtctldatapb.ShardReplicationPositionsRequest, opts ...grpc.CallOption) (*vtctldatapb.ShardReplicationPositionsResponse, error) { + if client.c == nil { + return nil, status.Error(codes.Unavailable, connClosedMsg) + } + + return client.c.ShardReplicationPositions(ctx, in, opts...) +} + // TabletExternallyReparented is part of the vtctlservicepb.VtctldClient interface. func (client *gRPCVtctldClient) TabletExternallyReparented(ctx context.Context, in *vtctldatapb.TabletExternallyReparentedRequest, opts ...grpc.CallOption) (*vtctldatapb.TabletExternallyReparentedResponse, error) { if client.c == nil { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index e9ffd71e40a..9823ff30076 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -1105,6 +1105,11 @@ func (s *VtctldServer) ReparentTablet(ctx context.Context, req *vtctldatapb.Repa }, nil } +// ShardReplicationPositions is part of the vtctldservicepb.VtctldServer interface. +func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctldatapb.ShardReplicationPositionsRequest) (*vtctldatapb.ShardReplicationPositionsResponse, error) { + panic("unimplemented!") +} + // TabletExternallyReparented is part of the vtctldservicepb.VtctldServer interface. func (s *VtctldServer) TabletExternallyReparented(ctx context.Context, req *vtctldatapb.TabletExternallyReparentedRequest) (*vtctldatapb.TabletExternallyReparentedResponse, error) { if req.Tablet == nil { diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index 767164c4875..d8eb7d44251 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -25,6 +25,7 @@ package vtctldata; import "binlogdata.proto"; import "logutil.proto"; import "mysqlctl.proto"; +import "replicationdata.proto"; import "tabletmanagerdata.proto"; import "topodata.proto"; import "vschema.proto"; @@ -511,6 +512,17 @@ message ReparentTabletResponse { topodata.TabletAlias primary = 3; } +message ShardReplicationPositionsRequest { + string keyspace = 1; + string shard = 2; +} + +message ShardReplicationPositionsResponse { + // ReplicationStatuses is a mapping of tablet alias string to replication + // status for that tablet. + map replication_statuses = 1; +} + message TabletExternallyReparentedRequest { // Tablet is the alias of the tablet that was promoted externally and should // be updated to the shard primary in the topo. diff --git a/proto/vtctlservice.proto b/proto/vtctlservice.proto index 59a93ff24bc..c0c13c40f2c 100644 --- a/proto/vtctlservice.proto +++ b/proto/vtctlservice.proto @@ -119,6 +119,12 @@ service Vtctld { // only works if the current replica position matches the last known reparent // action. rpc ReparentTablet(vtctldata.ReparentTabletRequest) returns (vtctldata.ReparentTabletResponse) {}; + // ShardReplicationPositions returns the replication position of each tablet + // in a shard. This RPC makes a best-effort to return partial results. For + // example, if one tablet in the shard graph is unreachable, then + // ShardReplicationPositions will return non-error, and include valid results + // for the reachable tablets. + rpc ShardReplicationPositions(vtctldata.ShardReplicationPositionsRequest) returns (vtctldata.ShardReplicationPositionsResponse) {}; // TabletExternallyReparented changes metadata in the topology server to // acknowledge a shard primary change performed by an external tool (e.g. // orchestrator). diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index 261db952052..b3e7b652a25 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -28065,6 +28065,192 @@ export namespace vtctldata { public toJSON(): { [k: string]: any }; } + /** Properties of a ShardReplicationPositionsRequest. */ + interface IShardReplicationPositionsRequest { + + /** ShardReplicationPositionsRequest keyspace */ + keyspace?: (string|null); + + /** ShardReplicationPositionsRequest shard */ + shard?: (string|null); + } + + /** Represents a ShardReplicationPositionsRequest. */ + class ShardReplicationPositionsRequest implements IShardReplicationPositionsRequest { + + /** + * Constructs a new ShardReplicationPositionsRequest. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IShardReplicationPositionsRequest); + + /** ShardReplicationPositionsRequest keyspace. */ + public keyspace: string; + + /** ShardReplicationPositionsRequest shard. */ + public shard: string; + + /** + * Creates a new ShardReplicationPositionsRequest instance using the specified properties. + * @param [properties] Properties to set + * @returns ShardReplicationPositionsRequest instance + */ + public static create(properties?: vtctldata.IShardReplicationPositionsRequest): vtctldata.ShardReplicationPositionsRequest; + + /** + * Encodes the specified ShardReplicationPositionsRequest message. Does not implicitly {@link vtctldata.ShardReplicationPositionsRequest.verify|verify} messages. + * @param message ShardReplicationPositionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IShardReplicationPositionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ShardReplicationPositionsRequest message, length delimited. Does not implicitly {@link vtctldata.ShardReplicationPositionsRequest.verify|verify} messages. + * @param message ShardReplicationPositionsRequest message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IShardReplicationPositionsRequest, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ShardReplicationPositionsRequest message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ShardReplicationPositionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ShardReplicationPositionsRequest; + + /** + * Decodes a ShardReplicationPositionsRequest message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ShardReplicationPositionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ShardReplicationPositionsRequest; + + /** + * Verifies a ShardReplicationPositionsRequest message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ShardReplicationPositionsRequest message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ShardReplicationPositionsRequest + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ShardReplicationPositionsRequest; + + /** + * Creates a plain object from a ShardReplicationPositionsRequest message. Also converts values to other types if specified. + * @param message ShardReplicationPositionsRequest + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ShardReplicationPositionsRequest, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ShardReplicationPositionsRequest to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + + /** Properties of a ShardReplicationPositionsResponse. */ + interface IShardReplicationPositionsResponse { + + /** ShardReplicationPositionsResponse replication_statuses */ + replication_statuses?: ({ [k: string]: replicationdata.IStatus }|null); + } + + /** Represents a ShardReplicationPositionsResponse. */ + class ShardReplicationPositionsResponse implements IShardReplicationPositionsResponse { + + /** + * Constructs a new ShardReplicationPositionsResponse. + * @param [properties] Properties to set + */ + constructor(properties?: vtctldata.IShardReplicationPositionsResponse); + + /** ShardReplicationPositionsResponse replication_statuses. */ + public replication_statuses: { [k: string]: replicationdata.IStatus }; + + /** + * Creates a new ShardReplicationPositionsResponse instance using the specified properties. + * @param [properties] Properties to set + * @returns ShardReplicationPositionsResponse instance + */ + public static create(properties?: vtctldata.IShardReplicationPositionsResponse): vtctldata.ShardReplicationPositionsResponse; + + /** + * Encodes the specified ShardReplicationPositionsResponse message. Does not implicitly {@link vtctldata.ShardReplicationPositionsResponse.verify|verify} messages. + * @param message ShardReplicationPositionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: vtctldata.IShardReplicationPositionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified ShardReplicationPositionsResponse message, length delimited. Does not implicitly {@link vtctldata.ShardReplicationPositionsResponse.verify|verify} messages. + * @param message ShardReplicationPositionsResponse message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: vtctldata.IShardReplicationPositionsResponse, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a ShardReplicationPositionsResponse message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns ShardReplicationPositionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): vtctldata.ShardReplicationPositionsResponse; + + /** + * Decodes a ShardReplicationPositionsResponse message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns ShardReplicationPositionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): vtctldata.ShardReplicationPositionsResponse; + + /** + * Verifies a ShardReplicationPositionsResponse message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a ShardReplicationPositionsResponse message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns ShardReplicationPositionsResponse + */ + public static fromObject(object: { [k: string]: any }): vtctldata.ShardReplicationPositionsResponse; + + /** + * Creates a plain object from a ShardReplicationPositionsResponse message. Also converts values to other types if specified. + * @param message ShardReplicationPositionsResponse + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: vtctldata.ShardReplicationPositionsResponse, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this ShardReplicationPositionsResponse to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; + } + /** Properties of a TabletExternallyReparentedRequest. */ interface ITabletExternallyReparentedRequest { diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index 9a805cfcfd2..f0ebee8220a 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -66916,6 +66916,445 @@ $root.vtctldata = (function() { return ReparentTabletResponse; })(); + vtctldata.ShardReplicationPositionsRequest = (function() { + + /** + * Properties of a ShardReplicationPositionsRequest. + * @memberof vtctldata + * @interface IShardReplicationPositionsRequest + * @property {string|null} [keyspace] ShardReplicationPositionsRequest keyspace + * @property {string|null} [shard] ShardReplicationPositionsRequest shard + */ + + /** + * Constructs a new ShardReplicationPositionsRequest. + * @memberof vtctldata + * @classdesc Represents a ShardReplicationPositionsRequest. + * @implements IShardReplicationPositionsRequest + * @constructor + * @param {vtctldata.IShardReplicationPositionsRequest=} [properties] Properties to set + */ + function ShardReplicationPositionsRequest(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ShardReplicationPositionsRequest keyspace. + * @member {string} keyspace + * @memberof vtctldata.ShardReplicationPositionsRequest + * @instance + */ + ShardReplicationPositionsRequest.prototype.keyspace = ""; + + /** + * ShardReplicationPositionsRequest shard. + * @member {string} shard + * @memberof vtctldata.ShardReplicationPositionsRequest + * @instance + */ + ShardReplicationPositionsRequest.prototype.shard = ""; + + /** + * Creates a new ShardReplicationPositionsRequest instance using the specified properties. + * @function create + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {vtctldata.IShardReplicationPositionsRequest=} [properties] Properties to set + * @returns {vtctldata.ShardReplicationPositionsRequest} ShardReplicationPositionsRequest instance + */ + ShardReplicationPositionsRequest.create = function create(properties) { + return new ShardReplicationPositionsRequest(properties); + }; + + /** + * Encodes the specified ShardReplicationPositionsRequest message. Does not implicitly {@link vtctldata.ShardReplicationPositionsRequest.verify|verify} messages. + * @function encode + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {vtctldata.IShardReplicationPositionsRequest} message ShardReplicationPositionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShardReplicationPositionsRequest.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.keyspace != null && Object.hasOwnProperty.call(message, "keyspace")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.keyspace); + if (message.shard != null && Object.hasOwnProperty.call(message, "shard")) + writer.uint32(/* id 2, wireType 2 =*/18).string(message.shard); + return writer; + }; + + /** + * Encodes the specified ShardReplicationPositionsRequest message, length delimited. Does not implicitly {@link vtctldata.ShardReplicationPositionsRequest.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {vtctldata.IShardReplicationPositionsRequest} message ShardReplicationPositionsRequest message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShardReplicationPositionsRequest.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ShardReplicationPositionsRequest message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ShardReplicationPositionsRequest} ShardReplicationPositionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShardReplicationPositionsRequest.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ShardReplicationPositionsRequest(); + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.keyspace = reader.string(); + break; + case 2: + message.shard = reader.string(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ShardReplicationPositionsRequest message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ShardReplicationPositionsRequest} ShardReplicationPositionsRequest + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShardReplicationPositionsRequest.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ShardReplicationPositionsRequest message. + * @function verify + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ShardReplicationPositionsRequest.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + if (!$util.isString(message.keyspace)) + return "keyspace: string expected"; + if (message.shard != null && message.hasOwnProperty("shard")) + if (!$util.isString(message.shard)) + return "shard: string expected"; + return null; + }; + + /** + * Creates a ShardReplicationPositionsRequest message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ShardReplicationPositionsRequest} ShardReplicationPositionsRequest + */ + ShardReplicationPositionsRequest.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ShardReplicationPositionsRequest) + return object; + var message = new $root.vtctldata.ShardReplicationPositionsRequest(); + if (object.keyspace != null) + message.keyspace = String(object.keyspace); + if (object.shard != null) + message.shard = String(object.shard); + return message; + }; + + /** + * Creates a plain object from a ShardReplicationPositionsRequest message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ShardReplicationPositionsRequest + * @static + * @param {vtctldata.ShardReplicationPositionsRequest} message ShardReplicationPositionsRequest + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ShardReplicationPositionsRequest.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.defaults) { + object.keyspace = ""; + object.shard = ""; + } + if (message.keyspace != null && message.hasOwnProperty("keyspace")) + object.keyspace = message.keyspace; + if (message.shard != null && message.hasOwnProperty("shard")) + object.shard = message.shard; + return object; + }; + + /** + * Converts this ShardReplicationPositionsRequest to JSON. + * @function toJSON + * @memberof vtctldata.ShardReplicationPositionsRequest + * @instance + * @returns {Object.} JSON object + */ + ShardReplicationPositionsRequest.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ShardReplicationPositionsRequest; + })(); + + vtctldata.ShardReplicationPositionsResponse = (function() { + + /** + * Properties of a ShardReplicationPositionsResponse. + * @memberof vtctldata + * @interface IShardReplicationPositionsResponse + * @property {Object.|null} [replication_statuses] ShardReplicationPositionsResponse replication_statuses + */ + + /** + * Constructs a new ShardReplicationPositionsResponse. + * @memberof vtctldata + * @classdesc Represents a ShardReplicationPositionsResponse. + * @implements IShardReplicationPositionsResponse + * @constructor + * @param {vtctldata.IShardReplicationPositionsResponse=} [properties] Properties to set + */ + function ShardReplicationPositionsResponse(properties) { + this.replication_statuses = {}; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * ShardReplicationPositionsResponse replication_statuses. + * @member {Object.} replication_statuses + * @memberof vtctldata.ShardReplicationPositionsResponse + * @instance + */ + ShardReplicationPositionsResponse.prototype.replication_statuses = $util.emptyObject; + + /** + * Creates a new ShardReplicationPositionsResponse instance using the specified properties. + * @function create + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {vtctldata.IShardReplicationPositionsResponse=} [properties] Properties to set + * @returns {vtctldata.ShardReplicationPositionsResponse} ShardReplicationPositionsResponse instance + */ + ShardReplicationPositionsResponse.create = function create(properties) { + return new ShardReplicationPositionsResponse(properties); + }; + + /** + * Encodes the specified ShardReplicationPositionsResponse message. Does not implicitly {@link vtctldata.ShardReplicationPositionsResponse.verify|verify} messages. + * @function encode + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {vtctldata.IShardReplicationPositionsResponse} message ShardReplicationPositionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShardReplicationPositionsResponse.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.replication_statuses != null && Object.hasOwnProperty.call(message, "replication_statuses")) + for (var keys = Object.keys(message.replication_statuses), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.replicationdata.Status.encode(message.replication_statuses[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + return writer; + }; + + /** + * Encodes the specified ShardReplicationPositionsResponse message, length delimited. Does not implicitly {@link vtctldata.ShardReplicationPositionsResponse.verify|verify} messages. + * @function encodeDelimited + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {vtctldata.IShardReplicationPositionsResponse} message ShardReplicationPositionsResponse message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + ShardReplicationPositionsResponse.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a ShardReplicationPositionsResponse message from the specified reader or buffer. + * @function decode + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {vtctldata.ShardReplicationPositionsResponse} ShardReplicationPositionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShardReplicationPositionsResponse.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vtctldata.ShardReplicationPositionsResponse(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (message.replication_statuses === $util.emptyObject) + message.replication_statuses = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.replicationdata.Status.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.replication_statuses[key] = value; + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a ShardReplicationPositionsResponse message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {vtctldata.ShardReplicationPositionsResponse} ShardReplicationPositionsResponse + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + ShardReplicationPositionsResponse.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a ShardReplicationPositionsResponse message. + * @function verify + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + ShardReplicationPositionsResponse.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.replication_statuses != null && message.hasOwnProperty("replication_statuses")) { + if (!$util.isObject(message.replication_statuses)) + return "replication_statuses: object expected"; + var key = Object.keys(message.replication_statuses); + for (var i = 0; i < key.length; ++i) { + var error = $root.replicationdata.Status.verify(message.replication_statuses[key[i]]); + if (error) + return "replication_statuses." + error; + } + } + return null; + }; + + /** + * Creates a ShardReplicationPositionsResponse message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {Object.} object Plain object + * @returns {vtctldata.ShardReplicationPositionsResponse} ShardReplicationPositionsResponse + */ + ShardReplicationPositionsResponse.fromObject = function fromObject(object) { + if (object instanceof $root.vtctldata.ShardReplicationPositionsResponse) + return object; + var message = new $root.vtctldata.ShardReplicationPositionsResponse(); + if (object.replication_statuses) { + if (typeof object.replication_statuses !== "object") + throw TypeError(".vtctldata.ShardReplicationPositionsResponse.replication_statuses: object expected"); + message.replication_statuses = {}; + for (var keys = Object.keys(object.replication_statuses), i = 0; i < keys.length; ++i) { + if (typeof object.replication_statuses[keys[i]] !== "object") + throw TypeError(".vtctldata.ShardReplicationPositionsResponse.replication_statuses: object expected"); + message.replication_statuses[keys[i]] = $root.replicationdata.Status.fromObject(object.replication_statuses[keys[i]]); + } + } + return message; + }; + + /** + * Creates a plain object from a ShardReplicationPositionsResponse message. Also converts values to other types if specified. + * @function toObject + * @memberof vtctldata.ShardReplicationPositionsResponse + * @static + * @param {vtctldata.ShardReplicationPositionsResponse} message ShardReplicationPositionsResponse + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + ShardReplicationPositionsResponse.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.objects || options.defaults) + object.replication_statuses = {}; + var keys2; + if (message.replication_statuses && (keys2 = Object.keys(message.replication_statuses)).length) { + object.replication_statuses = {}; + for (var j = 0; j < keys2.length; ++j) + object.replication_statuses[keys2[j]] = $root.replicationdata.Status.toObject(message.replication_statuses[keys2[j]], options); + } + return object; + }; + + /** + * Converts this ShardReplicationPositionsResponse to JSON. + * @function toJSON + * @memberof vtctldata.ShardReplicationPositionsResponse + * @instance + * @returns {Object.} JSON object + */ + ShardReplicationPositionsResponse.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return ShardReplicationPositionsResponse; + })(); + vtctldata.TabletExternallyReparentedRequest = (function() { /** From 646453908b11d66c15c9534dca74a24d5350e351 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 14 Mar 2021 22:25:25 -0400 Subject: [PATCH 2/7] Implement `ShardReplicationPositions` with documentation and tests Signed-off-by: Andrew Mason --- go/vt/vtctl/grpcvtctldserver/server.go | 107 +++++++- go/vt/vtctl/grpcvtctldserver/server_test.go | 233 ++++++++++++++++++ .../testutil/test_tmclient.go | 12 + 3 files changed, 351 insertions(+), 1 deletion(-) diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 9823ff30076..777ec931a96 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -46,6 +46,7 @@ import ( logutilpb "vitess.io/vitess/go/vt/proto/logutil" mysqlctlpb "vitess.io/vitess/go/vt/proto/mysqlctl" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" tabletmanagerdatapb "vitess.io/vitess/go/vt/proto/tabletmanagerdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" @@ -1107,7 +1108,111 @@ func (s *VtctldServer) ReparentTablet(ctx context.Context, req *vtctldatapb.Repa // ShardReplicationPositions is part of the vtctldservicepb.VtctldServer interface. func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctldatapb.ShardReplicationPositionsRequest) (*vtctldatapb.ShardReplicationPositionsResponse, error) { - panic("unimplemented!") + tabletMap, err := s.ts.GetTabletMapForShard(ctx, req.Keyspace, req.Shard) + if err != nil { + return nil, fmt.Errorf("GetTabletMapForShard(%s, %s) failed: %w", req.Keyspace, req.Shard, err) + } + + log.Infof("Gathering tablet replication status for: %v", tabletMap) + + var ( + m sync.Mutex + wg sync.WaitGroup + rec concurrency.AllErrorRecorder + results = make(map[string]*replicationdatapb.Status, len(tabletMap)) + ) + + // For each tablet, we're going to create an individual context, using + // *topo.RemoteOperationTimeout as the maximum timeout (but we'll respect + // any stricter timeout in the parent context). If an individual tablet + // times out fetching its replication position, we won't fail the overall + // request. Instead, we'll log a warning and record a nil entry in the + // result map; that way, the caller can tell the difference between a tablet + // that timed out vs a tablet that didn't get queried at all. + + for alias, tabletInfo := range tabletMap { + switch { + case tabletInfo.Type == topodatapb.TabletType_MASTER: + wg.Add(1) + + go func(ctx context.Context, alias string, tablet *topodatapb.Tablet) { + defer wg.Done() + + ctx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) + defer cancel() + + var status *replicationdatapb.Status + + pos, err := s.tmc.MasterPosition(ctx, tablet) + if err != nil { + switch ctx.Err() { + case context.Canceled: + log.Warningf("context canceled before obtaining master position from %s: %s", alias, err) + case context.DeadlineExceeded: + log.Warningf("context deadline exceeded before obtaining master position from %s: %s", alias, err) + default: + // The RPC was not timed out or canceled. We treat this + // as a fatal error for the overall request. + rec.RecordError(fmt.Errorf("MasterPosition(%s) failed: %w", alias, err)) + + return + } + } else { + // No error, record a valid status for this tablet. + status = &replicationdatapb.Status{ + Position: pos, + } + } + + m.Lock() + defer m.Unlock() + + results[alias] = status + }(ctx, alias, tabletInfo.Tablet) + case tabletInfo.IsReplicaType(): + wg.Add(1) + + go func(ctx context.Context, alias string, tablet *topodatapb.Tablet) { + defer wg.Done() + + ctx, cancel := context.WithTimeout(ctx, *topo.RemoteOperationTimeout) + defer cancel() + + status, err := s.tmc.ReplicationStatus(ctx, tablet) + if err != nil { + switch ctx.Err() { + case context.Canceled: + log.Warningf("context canceled before obtaining replication position from %s: %s", alias, err) + case context.DeadlineExceeded: + log.Warningf("context deadline exceeded before obtaining replication position from %s: %s", alias, err) + default: + // The RPC was not timed out or canceled. We treat this + // as a fatal error for the overall request. + rec.RecordError(fmt.Errorf("ReplicationStatus(%s) failed: %s", alias, err)) + + return + } + + status = nil // Don't record any position for this tablet. + } + + m.Lock() + defer m.Unlock() + + results[alias] = status + }(ctx, alias, tabletInfo.Tablet) + } + } + + wg.Wait() + + if rec.HasErrors() { + return nil, rec.Error() + } + + return &vtctldatapb.ShardReplicationPositionsResponse{ + ReplicationStatuses: results, + }, nil } // TabletExternallyReparented is part of the vtctldservicepb.VtctldServer interface. diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index a1f506a48ce..ebd21436e20 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -4627,6 +4627,239 @@ func TestReparentTablet(t *testing.T) { } } +func TestShardReplicationPositions(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + ts *topo.Server + tablets []*topodatapb.Tablet + tmc tmclient.TabletManagerClient + ctxTimeout time.Duration + req *vtctldatapb.ShardReplicationPositionsRequest + expected *vtctldatapb.ShardReplicationPositionsResponse + shouldErr bool + }{ + { + name: "success", + ts: memorytopo.NewServer("zone1"), + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_MASTER, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, + tmc: &testutil.TabletManagerClient{ + MasterPositionResults: map[string]struct { + Position string + Error error + }{ + "zone1-0000000100": { + Position: "primary_tablet_position", + }, + }, + ReplicationStatusResults: map[string]struct { + Position *replicationdatapb.Status + Error error + }{ + "zone1-0000000101": { + Position: &replicationdatapb.Status{ + Position: "replica_tablet_position", + }, + }, + }, + }, + req: &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: "testkeyspace", + Shard: "-", + }, + expected: &vtctldatapb.ShardReplicationPositionsResponse{ + ReplicationStatuses: map[string]*replicationdatapb.Status{ + "zone1-0000000100": { + Position: "primary_tablet_position", + }, + "zone1-0000000101": { + Position: "replica_tablet_position", + }, + }, + }, + shouldErr: false, + }, + { + name: "timeouts are nonfatal", + ts: memorytopo.NewServer("zone1"), + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_MASTER, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, + tmc: &testutil.TabletManagerClient{ + MasterPositionDelays: map[string]time.Duration{ + "zone1-0000000100": time.Millisecond * 100, + }, + MasterPositionResults: map[string]struct { + Position string + Error error + }{ + "zone1-0000000100": { + Position: "primary_tablet_position", + }, + }, + ReplicationStatusDelays: map[string]time.Duration{ + "zone1-0000000101": time.Millisecond * 100, + }, + ReplicationStatusResults: map[string]struct { + Position *replicationdatapb.Status + Error error + }{ + "zone1-0000000101": { + Position: &replicationdatapb.Status{ + Position: "replica_tablet_position", + }, + }, + }, + }, + ctxTimeout: time.Millisecond * 10, + req: &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: "testkeyspace", + Shard: "-", + }, + expected: &vtctldatapb.ShardReplicationPositionsResponse{ + ReplicationStatuses: map[string]*replicationdatapb.Status{ + "zone1-0000000100": nil, + "zone1-0000000101": nil, + }, + }, + shouldErr: false, + }, + { + name: "other rpc errors are fatal", + ts: memorytopo.NewServer("zone1"), + tablets: []*topodatapb.Tablet{ + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_MASTER, + }, + { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, + tmc: &testutil.TabletManagerClient{ + MasterPositionResults: map[string]struct { + Position string + Error error + }{ + "zone1-0000000100": { + Error: assert.AnError, + }, + }, + ReplicationStatusResults: map[string]struct { + Position *replicationdatapb.Status + Error error + }{ + "zone1-0000000101": { + Position: &replicationdatapb.Status{ + Position: "replica_tablet_position", + }, + }, + }, + }, + req: &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: "testkeyspace", + Shard: "-", + }, + expected: nil, + shouldErr: true, + }, + { + name: "nonexistent shard", + ts: memorytopo.NewServer("zone1"), + req: &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: "testkeyspace", + Shard: "-", + }, + expected: nil, + shouldErr: true, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ctx := context.Background() + + testutil.AddTablets(ctx, t, tt.ts, &testutil.AddTabletOptions{ + AlsoSetShardMaster: true, + SkipShardCreation: false, + }, tt.tablets...) + + vtctld := testutil.NewVtctldServerWithTabletManagerClient(t, tt.ts, tt.tmc, func(ts *topo.Server) vtctlservicepb.VtctldServer { + return NewVtctldServer(ts) + }) + + if tt.ctxTimeout > 0 { + _ctx, cancel := context.WithTimeout(ctx, tt.ctxTimeout) + defer cancel() + + ctx = _ctx + } + + resp, err := vtctld.ShardReplicationPositions(ctx, tt.req) + if tt.shouldErr { + assert.Error(t, err) + + return + } + + assert.NoError(t, err) + assert.Equal(t, tt.expected, resp) + }) + } +} + func TestTabletExternallyReparented(t *testing.T) { t.Parallel() diff --git a/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go b/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go index 20aa3959e75..ccc4e53c5b0 100644 --- a/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go +++ b/go/vt/vtctl/grpcvtctldserver/testutil/test_tmclient.go @@ -162,6 +162,7 @@ type TabletManagerClient struct { Result string Error error } + ReplicationStatusDelays map[string]time.Duration ReplicationStatusResults map[string]struct { Position *replicationdatapb.Status Error error @@ -373,6 +374,17 @@ func (fake *TabletManagerClient) ReplicationStatus(ctx context.Context, tablet * key := topoproto.TabletAliasString(tablet.Alias) + if fake.ReplicationStatusDelays != nil { + if delay, ok := fake.ReplicationStatusDelays[key]; ok { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case <-time.After(delay): + // proceed to results + } + } + } + if result, ok := fake.ReplicationStatusResults[key]; ok { return result.Position, result.Error } From 8c11584ba53c2e30de169d36870ccc50be26bdd2 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 14 Mar 2021 22:43:55 -0400 Subject: [PATCH 3/7] Add TabletMap to proto response to support tablet sorting in CLI Signed-off-by: Andrew Mason --- go/vt/proto/vtctldata/vtctldata.pb.go | 527 +++++++++++++++++--------- proto/vtctldata.proto | 3 + web/vtadmin/src/proto/vtadmin.d.ts | 6 + web/vtadmin/src/proto/vtadmin.js | 66 +++- 4 files changed, 428 insertions(+), 174 deletions(-) diff --git a/go/vt/proto/vtctldata/vtctldata.pb.go b/go/vt/proto/vtctldata/vtctldata.pb.go index cc26936a18b..77baf0e8ac3 100644 --- a/go/vt/proto/vtctldata/vtctldata.pb.go +++ b/go/vt/proto/vtctldata/vtctldata.pb.go @@ -3934,10 +3934,13 @@ func (m *ShardReplicationPositionsRequest) GetShard() string { type ShardReplicationPositionsResponse struct { // ReplicationStatuses is a mapping of tablet alias string to replication // status for that tablet. - ReplicationStatuses map[string]*replicationdata.Status `protobuf:"bytes,1,rep,name=replication_statuses,json=replicationStatuses,proto3" json:"replication_statuses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ReplicationStatuses map[string]*replicationdata.Status `protobuf:"bytes,1,rep,name=replication_statuses,json=replicationStatuses,proto3" json:"replication_statuses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // TabletMap is the set of tablets whose replication statuses were queried, + // keyed by tablet alias. + TabletMap map[string]*topodata.Tablet `protobuf:"bytes,2,rep,name=tablet_map,json=tabletMap,proto3" json:"tablet_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ShardReplicationPositionsResponse) Reset() { *m = ShardReplicationPositionsResponse{} } @@ -3980,6 +3983,13 @@ func (m *ShardReplicationPositionsResponse) GetReplicationStatuses() map[string] return nil } +func (m *ShardReplicationPositionsResponse) GetTabletMap() map[string]*topodata.Tablet { + if m != nil { + return m.TabletMap + } + return nil +} + type TabletExternallyReparentedRequest struct { // Tablet is the alias of the tablet that was promoted externally and should // be updated to the shard primary in the topo. @@ -4173,6 +4183,7 @@ func init() { proto.RegisterType((*ShardReplicationPositionsRequest)(nil), "vtctldata.ShardReplicationPositionsRequest") proto.RegisterType((*ShardReplicationPositionsResponse)(nil), "vtctldata.ShardReplicationPositionsResponse") proto.RegisterMapType((map[string]*replicationdata.Status)(nil), "vtctldata.ShardReplicationPositionsResponse.ReplicationStatusesEntry") + proto.RegisterMapType((map[string]*topodata.Tablet)(nil), "vtctldata.ShardReplicationPositionsResponse.TabletMapEntry") proto.RegisterType((*TabletExternallyReparentedRequest)(nil), "vtctldata.TabletExternallyReparentedRequest") proto.RegisterType((*TabletExternallyReparentedResponse)(nil), "vtctldata.TabletExternallyReparentedResponse") } @@ -4180,175 +4191,177 @@ func init() { func init() { proto.RegisterFile("vtctldata.proto", fileDescriptor_f41247b323a1ab2e) } var fileDescriptor_f41247b323a1ab2e = []byte{ - // 2675 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3a, 0xcb, 0x6f, 0x1b, 0xc7, - 0xf9, 0xbf, 0x25, 0x29, 0x4a, 0xfc, 0x48, 0xea, 0x31, 0xa2, 0xa4, 0x0d, 0x63, 0xcb, 0xf2, 0x3a, - 0x76, 0xf4, 0x73, 0x62, 0xd2, 0x56, 0x12, 0xc3, 0x70, 0x93, 0xd6, 0xb6, 0x44, 0x19, 0x72, 0x5c, - 0x57, 0x5d, 0xaa, 0x0a, 0xda, 0x02, 0xdd, 0x8e, 0xc8, 0x11, 0xbd, 0xd0, 0x72, 0x97, 0xd9, 0x19, - 0x52, 0x62, 0x7a, 0xe8, 0xa5, 0x3d, 0x04, 0x28, 0xd0, 0x6b, 0x81, 0xa0, 0x40, 0x4f, 0x45, 0xff, - 0x82, 0x00, 0x2d, 0x8a, 0x1e, 0x8b, 0x1e, 0x7a, 0xe8, 0xb5, 0xb7, 0xc2, 0xfd, 0x33, 0x0a, 0x14, - 0xc5, 0xbc, 0x96, 0xcb, 0xe5, 0xc3, 0xb2, 0x6c, 0xa0, 0xe8, 0x49, 0x3b, 0xdf, 0x63, 0xe6, 0x9b, - 0xef, 0xfd, 0x0d, 0x05, 0x0b, 0x3d, 0xd6, 0x60, 0x5e, 0x13, 0x33, 0x5c, 0xe9, 0x84, 0x01, 0x0b, - 0x50, 0x2e, 0x02, 0x94, 0x17, 0x8f, 0x5c, 0xdf, 0x0b, 0x5a, 0x03, 0x64, 0xb9, 0xe8, 0x05, 0xad, - 0x2e, 0x73, 0x3d, 0xb5, 0x9c, 0x6f, 0xf7, 0xe9, 0xe7, 0x5e, 0x83, 0xe9, 0xf5, 0x4a, 0x48, 0x3a, - 0x9e, 0xdb, 0xc0, 0xcc, 0x0d, 0xfc, 0x18, 0xd7, 0x1a, 0xc3, 0x47, 0x1e, 0x61, 0x6d, 0xec, 0xe3, - 0x16, 0x09, 0x63, 0x88, 0x79, 0x16, 0x74, 0x82, 0xf8, 0xf6, 0x3d, 0xda, 0x78, 0x4e, 0xda, 0x7a, - 0x59, 0xe8, 0x31, 0xe6, 0xb6, 0x89, 0x5c, 0x59, 0x9f, 0x41, 0xb9, 0x76, 0x46, 0x1a, 0x5d, 0x46, - 0x0e, 0xb9, 0x84, 0xdb, 0x41, 0xbb, 0x8d, 0xfd, 0xa6, 0x4d, 0x3e, 0xef, 0x12, 0xca, 0x10, 0x82, - 0x0c, 0x0e, 0x5b, 0xd4, 0x34, 0x36, 0xd2, 0x9b, 0x39, 0x5b, 0x7c, 0xa3, 0xeb, 0x30, 0x8f, 0x1b, - 0x5c, 0x16, 0x87, 0x6f, 0x13, 0x74, 0x99, 0x99, 0xda, 0x30, 0x36, 0xd3, 0x76, 0x51, 0x42, 0x0f, - 0x24, 0xd0, 0xda, 0x86, 0xb7, 0xc7, 0x6e, 0x4c, 0x3b, 0x81, 0x4f, 0x09, 0x7a, 0x07, 0x66, 0x48, - 0x8f, 0xf8, 0xcc, 0x34, 0x36, 0x8c, 0xcd, 0xfc, 0xd6, 0x7c, 0x45, 0xeb, 0xa0, 0xc6, 0xa1, 0xb6, - 0x44, 0x5a, 0x5f, 0x1a, 0x60, 0x1e, 0xf0, 0x6b, 0x7e, 0x1b, 0x33, 0x12, 0xba, 0xd8, 0x73, 0xbf, - 0x20, 0x75, 0xc2, 0x98, 0xeb, 0xb7, 0x28, 0xba, 0x0a, 0x05, 0x86, 0xc3, 0x16, 0x61, 0x8e, 0xd0, - 0x84, 0xd8, 0x29, 0x67, 0xe7, 0x25, 0x4c, 0x70, 0xa1, 0xf7, 0x60, 0x89, 0x06, 0xdd, 0xb0, 0x41, - 0x1c, 0x72, 0xd6, 0x09, 0x09, 0xa5, 0x6e, 0xe0, 0x0b, 0x71, 0x73, 0xf6, 0xa2, 0x44, 0xd4, 0x22, - 0x38, 0xba, 0x0c, 0xd0, 0x08, 0x09, 0x66, 0xc4, 0x69, 0x36, 0x3d, 0x33, 0x2d, 0xa8, 0x72, 0x12, - 0xb2, 0xd3, 0xf4, 0xac, 0xbf, 0xa7, 0x60, 0x79, 0x9c, 0x18, 0x65, 0x98, 0x3b, 0x0d, 0xc2, 0x93, - 0x63, 0x2f, 0x38, 0x55, 0x22, 0x44, 0x6b, 0xf4, 0x2e, 0x2c, 0xa8, 0xf3, 0x4f, 0x48, 0x9f, 0x76, - 0x70, 0x83, 0xa8, 0xd3, 0xe7, 0x25, 0xf8, 0x53, 0x05, 0xe5, 0x84, 0xea, 0x2e, 0x11, 0xa1, 0x14, - 0x60, 0x5e, 0x82, 0x23, 0xc2, 0x1b, 0xb0, 0x40, 0x59, 0xd0, 0x71, 0xf0, 0x31, 0x23, 0xa1, 0xd3, - 0x08, 0x3a, 0x7d, 0x33, 0xb3, 0x61, 0x6c, 0xce, 0xd9, 0x45, 0x0e, 0x7e, 0xc8, 0xa1, 0xdb, 0x41, - 0xa7, 0x8f, 0x9e, 0xc0, 0xbc, 0xd0, 0x8a, 0x43, 0x95, 0x9c, 0xe6, 0xcc, 0x46, 0x7a, 0x33, 0xbf, - 0x75, 0xad, 0x32, 0x70, 0xcd, 0x49, 0x9a, 0xb5, 0x8b, 0x82, 0x35, 0xba, 0x21, 0x82, 0x4c, 0x83, - 0x78, 0x9e, 0x99, 0x15, 0x12, 0x89, 0x6f, 0xa9, 0x7c, 0xee, 0x7f, 0x0e, 0xeb, 0x77, 0x08, 0x35, - 0x67, 0xb5, 0xf2, 0x39, 0xec, 0x80, 0x83, 0xd0, 0xff, 0xc3, 0x22, 0x39, 0x63, 0x24, 0xf4, 0xb1, - 0xe7, 0x34, 0xbc, 0x2e, 0x65, 0x24, 0x34, 0xe7, 0x04, 0xd9, 0x82, 0x86, 0x6f, 0x4b, 0xb0, 0xf5, - 0x0c, 0xe6, 0xa2, 0x1b, 0x22, 0xc8, 0xf8, 0xb8, 0xad, 0xcd, 0x29, 0xbe, 0x51, 0x05, 0xe6, 0x86, - 0x14, 0x98, 0xdf, 0x42, 0x95, 0xc8, 0xcb, 0x35, 0xa7, 0x1d, 0xd1, 0x58, 0x3f, 0x82, 0x99, 0xfa, - 0x73, 0x1c, 0x36, 0xb9, 0x71, 0x22, 0x46, 0x65, 0x9c, 0x93, 0xe4, 0x41, 0xa9, 0xd8, 0x41, 0xd7, - 0x61, 0x86, 0x72, 0x46, 0xa1, 0xfd, 0xfc, 0xd6, 0xc2, 0xe0, 0x14, 0xb1, 0x9f, 0x2d, 0xb1, 0xd6, - 0xef, 0x72, 0x30, 0xf7, 0x99, 0x36, 0xf2, 0x38, 0x81, 0xbf, 0x05, 0x59, 0x69, 0x61, 0x25, 0xee, - 0xbb, 0x31, 0xb5, 0x6b, 0xc6, 0x8a, 0x3d, 0x88, 0xeb, 0xa7, 0x81, 0xfc, 0x6b, 0x2b, 0x36, 0xbe, - 0x81, 0xb4, 0xbc, 0x92, 0xe4, 0xfc, 0x1b, 0x48, 0x36, 0x74, 0x07, 0x56, 0xda, 0xf8, 0xcc, 0xe9, - 0x39, 0xb1, 0xec, 0xe1, 0x78, 0xb8, 0x25, 0xdc, 0x25, 0x6d, 0xa3, 0x36, 0x3e, 0x3b, 0x8c, 0xf3, - 0xe3, 0x16, 0x7a, 0x02, 0x45, 0x71, 0x3d, 0x87, 0xb2, 0x90, 0xe0, 0xb6, 0x76, 0x99, 0xeb, 0xe3, - 0x8e, 0x16, 0xea, 0xa8, 0x4b, 0xba, 0x9a, 0xcf, 0xc2, 0xbe, 0x5d, 0xa0, 0x31, 0x50, 0xf9, 0xc7, - 0xb0, 0x34, 0x42, 0x82, 0x16, 0x21, 0x7d, 0x42, 0xfa, 0x4a, 0x51, 0xfc, 0x13, 0x7d, 0x04, 0x33, - 0x3d, 0xec, 0x75, 0xb5, 0x9a, 0xae, 0xbc, 0xe4, 0x28, 0x5b, 0x52, 0xdf, 0x4f, 0xdd, 0x33, 0xca, - 0x7b, 0xb0, 0x3c, 0xe6, 0xfe, 0x53, 0x2d, 0xbe, 0x0a, 0x59, 0x21, 0x24, 0x35, 0x53, 0x22, 0xa1, - 0xa9, 0x55, 0xf9, 0xf7, 0x06, 0xe4, 0x63, 0xa7, 0xa0, 0x0f, 0x61, 0x56, 0xab, 0xc0, 0x10, 0x2a, - 0x28, 0x8f, 0x95, 0x4b, 0x8a, 0xa4, 0x49, 0xd1, 0x2e, 0x8f, 0x61, 0x11, 0x12, 0x8d, 0xc0, 0x67, - 0x61, 0xe0, 0xc9, 0x63, 0xf2, 0x5b, 0x97, 0x13, 0x5e, 0x24, 0x03, 0x8f, 0x6d, 0x4b, 0x2a, 0x5b, - 0x06, 0xaa, 0x5e, 0x52, 0xf4, 0x3e, 0x20, 0x97, 0x3a, 0x9d, 0xd0, 0x6d, 0xe3, 0xb0, 0xef, 0x50, - 0x12, 0xf6, 0x5c, 0xbf, 0x25, 0xdc, 0x60, 0xce, 0x5e, 0x74, 0xe9, 0xbe, 0x44, 0xd4, 0x25, 0xbc, - 0xfc, 0xeb, 0x0c, 0x64, 0x95, 0xd8, 0xf3, 0x90, 0x72, 0x9b, 0xe2, 0xd2, 0x69, 0x3b, 0xe5, 0x36, - 0x51, 0x49, 0x3b, 0xb3, 0xf4, 0x70, 0xb9, 0x40, 0xb7, 0xb8, 0x67, 0xf1, 0x03, 0x95, 0x67, 0xad, - 0x0c, 0xa4, 0x93, 0x72, 0x3d, 0xf4, 0x5c, 0x4c, 0x6d, 0x45, 0x84, 0x3e, 0x81, 0xa2, 0x2c, 0x58, - 0x8e, 0x72, 0xe8, 0x8c, 0xe0, 0x32, 0x2b, 0xb1, 0x32, 0xf6, 0x48, 0x7c, 0xd6, 0x05, 0xde, 0x2e, - 0x1c, 0xc5, 0x56, 0xdc, 0x1c, 0x9d, 0x80, 0xba, 0xdc, 0x34, 0xe6, 0x8c, 0x34, 0x87, 0x5e, 0xa3, - 0x6b, 0x20, 0x92, 0x96, 0x13, 0x11, 0xc8, 0x04, 0x53, 0xe0, 0xc0, 0x7d, 0x4d, 0xc4, 0x2f, 0xc1, - 0x30, 0x23, 0x2a, 0xc3, 0xc8, 0x05, 0x5a, 0x83, 0xd9, 0xe6, 0x91, 0x23, 0xc2, 0x4e, 0xa6, 0x94, - 0x6c, 0xf3, 0xe8, 0x19, 0x0f, 0xbc, 0x87, 0xb0, 0xc2, 0x42, 0xec, 0xd3, 0x58, 0x89, 0xa2, 0x0c, - 0xb7, 0x3b, 0x66, 0x4e, 0x88, 0x5d, 0xa8, 0xa8, 0xea, 0xc7, 0xcb, 0x94, 0x5d, 0x8a, 0x91, 0x1e, - 0x68, 0x4a, 0x54, 0x85, 0x02, 0x27, 0x71, 0xba, 0x9d, 0x26, 0x66, 0xa4, 0x69, 0xc2, 0x18, 0xce, - 0x3c, 0xff, 0xfc, 0x9e, 0x24, 0x40, 0x26, 0xcc, 0xb6, 0x09, 0xa5, 0xb8, 0x45, 0xcc, 0xbc, 0x10, - 0x46, 0x2f, 0x51, 0x0d, 0xf2, 0x3c, 0x45, 0x3b, 0x42, 0x68, 0x6a, 0x16, 0x84, 0x3b, 0xbc, 0x33, - 0xd9, 0x99, 0x2a, 0x3c, 0x77, 0xd7, 0x39, 0xb1, 0x0d, 0x0d, 0xfd, 0x49, 0xcb, 0xf7, 0x21, 0x17, - 0x21, 0xb8, 0x42, 0xe2, 0xf5, 0x4e, 0x2e, 0xb8, 0x42, 0x3c, 0x4c, 0x99, 0xd3, 0x39, 0x51, 0xd6, - 0xce, 0xf2, 0xe5, 0xfe, 0x89, 0xf5, 0x95, 0x01, 0x6b, 0xdb, 0xcf, 0xb1, 0xdf, 0x22, 0x07, 0x51, - 0x6e, 0xd6, 0xe5, 0xfd, 0x5e, 0x94, 0xc4, 0x31, 0xb7, 0xb9, 0xaa, 0xc5, 0x13, 0x1c, 0x42, 0xe5, - 0x76, 0xb1, 0x40, 0xb7, 0x84, 0xfe, 0x79, 0xea, 0x17, 0xc7, 0xcd, 0x6f, 0x95, 0x92, 0x4c, 0xe2, - 0x9c, 0x6c, 0xf3, 0x88, 0xff, 0x15, 0xe6, 0x0a, 0xfb, 0x4e, 0xd8, 0xf5, 0x95, 0x1f, 0x67, 0x9b, - 0x61, 0xdf, 0xee, 0xfa, 0xd6, 0x6f, 0x0d, 0x30, 0x47, 0xa5, 0x53, 0x3d, 0xc2, 0x47, 0x50, 0x3c, - 0x22, 0xc7, 0x41, 0x48, 0x1c, 0xe5, 0xb0, 0x52, 0xbe, 0xc5, 0xe4, 0x51, 0x76, 0x41, 0x92, 0xc9, - 0x15, 0xfa, 0x00, 0x0a, 0xb2, 0x3a, 0x2a, 0xae, 0xd4, 0x04, 0xae, 0xbc, 0xa0, 0x52, 0x4c, 0xeb, - 0x90, 0x3f, 0xc5, 0xd4, 0x19, 0x96, 0x32, 0x77, 0x8a, 0xe9, 0x8e, 0x14, 0xf4, 0xeb, 0x34, 0xac, - 0x6c, 0x8b, 0x5e, 0x20, 0x2a, 0x37, 0x83, 0x1e, 0x69, 0x24, 0xfd, 0x97, 0x60, 0xe6, 0x38, 0xd0, - 0xd9, 0x7f, 0xce, 0x96, 0x0b, 0x54, 0x85, 0x12, 0xf6, 0xbc, 0xe0, 0xd4, 0x21, 0xed, 0x0e, 0xeb, - 0x3b, 0x3d, 0x47, 0xf6, 0x65, 0xea, 0xb0, 0x25, 0x81, 0xab, 0x71, 0xd4, 0x61, 0x5d, 0x20, 0xd0, - 0x6d, 0x28, 0x89, 0x98, 0x75, 0xfd, 0x96, 0xd3, 0x08, 0xbc, 0x6e, 0xdb, 0x97, 0x2e, 0x9f, 0x11, - 0x47, 0x21, 0x8d, 0xdb, 0x16, 0x28, 0xe1, 0xfe, 0x4f, 0x46, 0x39, 0x84, 0x91, 0x66, 0x84, 0x91, - 0xcc, 0xd1, 0xa2, 0xb9, 0xd7, 0x14, 0x2a, 0x4f, 0xec, 0x25, 0x8c, 0xf6, 0x00, 0x0a, 0x3c, 0xf9, - 0x90, 0xa6, 0x73, 0x1c, 0x06, 0x6d, 0x6a, 0x66, 0x93, 0xc9, 0x4c, 0xef, 0x51, 0xa9, 0x0b, 0xb2, - 0xdd, 0x30, 0x68, 0xdb, 0x79, 0x1a, 0x7d, 0x53, 0x74, 0x13, 0x32, 0xe2, 0xf4, 0x59, 0x71, 0xfa, - 0xea, 0x28, 0xa7, 0x38, 0x5b, 0xd0, 0xf0, 0x64, 0x70, 0x84, 0x69, 0xac, 0x51, 0x92, 0x71, 0x5d, - 0xe0, 0xc0, 0xa8, 0x37, 0xb8, 0x03, 0x45, 0xea, 0xe3, 0x0e, 0x7d, 0x1e, 0x30, 0x11, 0xda, 0x63, - 0xa3, 0xba, 0xa0, 0x49, 0xf8, 0xca, 0xda, 0x83, 0xd5, 0xa4, 0xdd, 0x94, 0x7b, 0x55, 0x13, 0x95, - 0x22, 0xbf, 0xb5, 0x1c, 0x8b, 0xcc, 0x31, 0x5d, 0xc5, 0x2f, 0x0c, 0x40, 0x72, 0x2f, 0xd9, 0x0c, - 0x28, 0x07, 0x98, 0x56, 0x71, 0x2e, 0x03, 0xc8, 0x92, 0x1a, 0xeb, 0x34, 0x72, 0x02, 0xf2, 0x6c, - 0xc8, 0x4f, 0xd2, 0x71, 0x3f, 0xb9, 0x0e, 0xf3, 0xae, 0xdf, 0xf0, 0xba, 0x4d, 0xe2, 0x74, 0x70, - 0xc8, 0x9b, 0x64, 0xd5, 0xe2, 0x29, 0xe8, 0xbe, 0x00, 0x5a, 0xbf, 0x31, 0x60, 0x79, 0x48, 0x9c, - 0x0b, 0xde, 0x0b, 0xdd, 0x88, 0xd7, 0x09, 0x1e, 0x29, 0x03, 0xea, 0x78, 0xd7, 0x13, 0xb9, 0xa3, - 0x83, 0xbd, 0x90, 0xe0, 0x66, 0xdf, 0x21, 0x67, 0x2e, 0x65, 0x54, 0x09, 0x2f, 0x5d, 0xe8, 0xa1, - 0x44, 0xd5, 0x04, 0xc6, 0xfa, 0x2e, 0xac, 0xec, 0x10, 0x8f, 0x8c, 0x06, 0xcd, 0x34, 0x9d, 0x5d, - 0x82, 0x5c, 0x48, 0x1a, 0xdd, 0x90, 0xba, 0x3d, 0x1d, 0x40, 0x03, 0x80, 0x65, 0xc2, 0x6a, 0x72, - 0x4b, 0x79, 0x6f, 0xeb, 0xe7, 0x06, 0x2c, 0x4b, 0x94, 0x90, 0x9a, 0xea, 0xb3, 0x36, 0xa3, 0xaa, - 0x2f, 0x8b, 0xf9, 0xe8, 0xfd, 0x14, 0x7e, 0xfa, 0xc9, 0xbc, 0xf5, 0xe6, 0x53, 0x89, 0xe3, 0x1e, - 0x47, 0x45, 0x59, 0xd9, 0x85, 0x83, 0xf7, 0x8e, 0x55, 0x45, 0xb6, 0x56, 0xa1, 0x34, 0x2c, 0x86, - 0x92, 0xaf, 0xaf, 0xe1, 0x32, 0xe5, 0x44, 0xf2, 0x7d, 0xac, 0x5a, 0x75, 0x95, 0x85, 0x89, 0x96, - 0x73, 0x42, 0x1e, 0x2e, 0xc6, 0xf2, 0x30, 0xa1, 0x3c, 0x6e, 0x64, 0x52, 0x51, 0x0d, 0x83, 0x92, - 0xbb, 0x20, 0x80, 0xaa, 0x57, 0xb0, 0xd6, 0xb4, 0x1d, 0xa2, 0xa3, 0x95, 0x4c, 0xbf, 0x4c, 0xc1, - 0xe5, 0x5a, 0x9b, 0x84, 0x2d, 0xe2, 0x37, 0xfa, 0x36, 0x91, 0xee, 0x76, 0x6e, 0xef, 0x1e, 0xdf, - 0x60, 0xdc, 0x85, 0xbc, 0x4f, 0x06, 0xf2, 0x4c, 0xed, 0x32, 0xc0, 0x27, 0x5a, 0x48, 0xf4, 0x4d, - 0x58, 0x70, 0x5b, 0x3e, 0x4f, 0xf7, 0xaa, 0x65, 0xa5, 0x66, 0x66, 0x9a, 0x22, 0xe6, 0x25, 0xb5, - 0x6a, 0x02, 0x29, 0xda, 0x81, 0x95, 0x53, 0xec, 0xb2, 0x88, 0x3b, 0x9a, 0x4f, 0x67, 0x22, 0xb7, - 0x16, 0x49, 0x62, 0xa7, 0x1b, 0xca, 0x56, 0x79, 0x99, 0x93, 0x6b, 0x76, 0x3d, 0xb7, 0xfe, 0xd1, - 0x80, 0xf5, 0x49, 0x1a, 0x51, 0x01, 0xf6, 0xea, 0x2a, 0x79, 0x00, 0x8b, 0x9d, 0x30, 0x68, 0x07, - 0x8c, 0x34, 0xcf, 0xa7, 0x97, 0x05, 0x4d, 0xae, 0x95, 0x73, 0x03, 0xb2, 0x62, 0x24, 0xd6, 0x3a, - 0x49, 0x0e, 0xcc, 0x0a, 0x6b, 0x7d, 0x0c, 0xeb, 0xbb, 0xae, 0xdf, 0x7c, 0xe8, 0x79, 0xd2, 0xfb, - 0xf6, 0xfc, 0x57, 0x08, 0x3d, 0xeb, 0x4f, 0x06, 0x5c, 0x99, 0xc8, 0xae, 0x6e, 0xff, 0x2c, 0x11, - 0x4e, 0x77, 0x63, 0xe1, 0xf4, 0x12, 0x5e, 0x19, 0x6e, 0x6a, 0x5e, 0xd0, 0xcd, 0xf7, 0xa7, 0xaa, - 0xf7, 0x9e, 0x38, 0x23, 0xdc, 0x18, 0x9e, 0x11, 0xc6, 0xa4, 0xa7, 0x68, 0x28, 0xb0, 0x6a, 0xb0, - 0xf4, 0x98, 0xb0, 0x47, 0xb8, 0x71, 0xd2, 0xed, 0xd0, 0x0b, 0xbb, 0xb0, 0xb5, 0x03, 0x28, 0xbe, - 0x8d, 0xba, 0x79, 0x05, 0x66, 0x8f, 0x24, 0x48, 0x5d, 0xbd, 0x54, 0x89, 0x9e, 0x6a, 0x24, 0xed, - 0x9e, 0x7f, 0x1c, 0xd8, 0x9a, 0xc8, 0x7a, 0x0b, 0xd6, 0x1e, 0x13, 0xb6, 0x4d, 0x3c, 0x8f, 0xc3, - 0x79, 0xc2, 0xd7, 0x22, 0x59, 0xb7, 0xc1, 0x1c, 0x45, 0xa9, 0x63, 0x4a, 0x30, 0xc3, 0xab, 0x85, - 0x7e, 0x75, 0x91, 0x0b, 0x6b, 0x53, 0x88, 0xa4, 0x39, 0x62, 0xcd, 0x87, 0x18, 0xcd, 0x8d, 0xc1, - 0x68, 0x6e, 0xed, 0xc2, 0xf2, 0x10, 0x65, 0x54, 0x16, 0x72, 0x1c, 0xed, 0xb8, 0xfe, 0x71, 0xa0, - 0xea, 0x42, 0x6c, 0x88, 0x8e, 0xc8, 0xe7, 0x1a, 0xea, 0x8b, 0x67, 0x5a, 0xb5, 0x0f, 0x55, 0xc9, - 0x46, 0x4b, 0xff, 0xb5, 0x11, 0xdd, 0x6c, 0x80, 0x52, 0xc7, 0xec, 0xc1, 0xec, 0x70, 0x1a, 0xab, - 0xc6, 0xec, 0x35, 0x81, 0xa9, 0xa2, 0xd6, 0xd2, 0x31, 0x34, 0x7f, 0x79, 0x1f, 0x0a, 0x71, 0xc4, - 0x18, 0xd7, 0xb8, 0x39, 0xec, 0x1a, 0xa5, 0xe1, 0xfb, 0xc8, 0x63, 0xe2, 0xee, 0xb1, 0x22, 0x54, - 0xa3, 0xdd, 0x32, 0xba, 0xcf, 0x1e, 0x94, 0x86, 0xc1, 0xea, 0x2e, 0x77, 0x20, 0xa7, 0x1d, 0x45, - 0xdf, 0x66, 0x6c, 0x29, 0x1d, 0x50, 0x59, 0xb7, 0x85, 0x99, 0x5e, 0x25, 0xe6, 0x76, 0x87, 0x64, - 0xba, 0x78, 0x77, 0xf2, 0xb3, 0x14, 0x2c, 0x3e, 0x26, 0x4c, 0xb6, 0x8e, 0xaf, 0xdf, 0xe1, 0xaf, - 0xaa, 0x31, 0x31, 0x9a, 0x95, 0xe5, 0x8a, 0x37, 0x27, 0xe4, 0x4c, 0x36, 0x27, 0x0a, 0x9f, 0x16, - 0xf8, 0xa2, 0x82, 0x1e, 0x48, 0xb2, 0x6b, 0xa0, 0xbb, 0x15, 0xa7, 0xe7, 0x92, 0x53, 0xaa, 0x4a, - 0x65, 0x41, 0x01, 0x0f, 0x39, 0x0c, 0x6d, 0xc2, 0xa2, 0x7c, 0xa4, 0x12, 0x2e, 0xee, 0x04, 0xbe, - 0xd7, 0x17, 0xc9, 0x7a, 0x4e, 0xcd, 0xc4, 0x22, 0x2e, 0xbe, 0xe3, 0x7b, 0xfd, 0x01, 0x25, 0x75, - 0xbf, 0xd0, 0x94, 0xd9, 0x18, 0x65, 0x9d, 0x83, 0x39, 0xa5, 0xb5, 0x2f, 0x32, 0x80, 0xd6, 0x82, - 0x52, 0xe6, 0x37, 0x20, 0xab, 0x7a, 0x6d, 0xa9, 0x80, 0x6b, 0x95, 0xd1, 0xc7, 0x53, 0xc9, 0xb2, - 0x43, 0x8e, 0x5d, 0xdf, 0x55, 0x4f, 0x31, 0x02, 0x62, 0x3d, 0x85, 0x05, 0xbe, 0xe3, 0x9b, 0x69, - 0xf9, 0xac, 0xfb, 0xd2, 0x4a, 0x43, 0x05, 0x25, 0x6a, 0xc0, 0x8c, 0xa9, 0x0d, 0x98, 0xf5, 0x44, - 0x44, 0x64, 0x3d, 0xec, 0x25, 0x3d, 0xf8, 0x65, 0x29, 0x8e, 0xc7, 0xb4, 0x36, 0xa4, 0x5c, 0x58, - 0x7f, 0x95, 0x31, 0x3c, 0xbc, 0x99, 0x92, 0xe7, 0xfb, 0x50, 0xa4, 0x61, 0xcf, 0x49, 0xfa, 0xfe, - 0x87, 0xc3, 0x91, 0x3c, 0x8e, 0xb5, 0x12, 0x07, 0xea, 0x77, 0xa1, 0x18, 0xa8, 0x7c, 0x08, 0x4b, - 0x23, 0x24, 0x63, 0x02, 0xfb, 0xbd, 0xe1, 0xc0, 0x8e, 0x39, 0x6c, 0x8c, 0x3b, 0x1e, 0xd9, 0x37, - 0x45, 0x08, 0xd7, 0xc3, 0xde, 0xe1, 0x70, 0x00, 0x8c, 0x4b, 0x90, 0xcf, 0x60, 0x25, 0x41, 0x1b, - 0x0d, 0x9c, 0x5c, 0xd8, 0xc1, 0x60, 0x16, 0xc5, 0x9d, 0x7a, 0x40, 0x8f, 0xb1, 0x00, 0x8d, 0xbe, - 0xad, 0xa7, 0xc2, 0xa4, 0x6a, 0xaa, 0x7c, 0xdd, 0xc0, 0xb3, 0x3e, 0x11, 0x0e, 0xac, 0x77, 0x53, - 0x92, 0x6d, 0x46, 0x8f, 0x36, 0x93, 0x66, 0x60, 0x85, 0xb7, 0x7e, 0x18, 0x63, 0xbf, 0x78, 0x05, - 0x1c, 0x38, 0x4d, 0x3a, 0xee, 0x34, 0x0f, 0x44, 0x76, 0x4b, 0x34, 0x91, 0xe8, 0x26, 0xcc, 0xca, - 0xc3, 0x07, 0x1d, 0x76, 0x52, 0x3a, 0x4d, 0x60, 0x55, 0x85, 0x78, 0x09, 0x23, 0x4d, 0x4b, 0x8f, - 0x8f, 0xc4, 0x91, 0x49, 0x4b, 0xbd, 0x0f, 0x73, 0x09, 0x2b, 0x2d, 0x45, 0x56, 0x8a, 0xdc, 0x63, - 0xb6, 0xa7, 0x0c, 0x64, 0x8b, 0x14, 0xab, 0xdf, 0x5a, 0xce, 0xa5, 0x95, 0x2b, 0x90, 0xc7, 0x0d, - 0xe6, 0xf6, 0x88, 0xcc, 0x35, 0xb2, 0xa9, 0x06, 0x09, 0x12, 0x79, 0x46, 0xd6, 0x8c, 0xd8, 0x9e, - 0x83, 0x9a, 0xa1, 0x9f, 0xff, 0xc7, 0xd5, 0x0c, 0xcd, 0x60, 0x0f, 0xa8, 0xac, 0x7f, 0x19, 0xb0, - 0xb6, 0xe7, 0xbb, 0x32, 0x29, 0xa8, 0x86, 0xef, 0xe2, 0x96, 0xb3, 0xa1, 0xac, 0xdf, 0x0e, 0x89, - 0x47, 0x1a, 0xea, 0xd7, 0x11, 0xed, 0x87, 0x53, 0xbb, 0xce, 0x35, 0xc5, 0x58, 0xe3, 0x7c, 0x31, - 0xc4, 0x60, 0x4e, 0xcd, 0xc4, 0xe7, 0xd4, 0x37, 0xd3, 0x70, 0x3f, 0x02, 0x73, 0xf4, 0xf2, 0x51, - 0x62, 0xd4, 0x5d, 0xaf, 0x31, 0xb5, 0xeb, 0xfd, 0x32, 0x05, 0x6f, 0xef, 0x7b, 0xd8, 0xf7, 0x49, - 0xf3, 0xbf, 0x3c, 0xc4, 0xdc, 0x87, 0x22, 0xee, 0x05, 0xee, 0xa0, 0xcd, 0xcf, 0x4c, 0xe3, 0x2c, - 0x08, 0x5a, 0xcd, 0xfb, 0x66, 0xf4, 0xf9, 0x07, 0x03, 0x2e, 0x8d, 0xd7, 0xc5, 0xff, 0xc0, 0xf8, - 0xf2, 0x53, 0x78, 0xcb, 0x26, 0xed, 0xa0, 0x17, 0x4d, 0xf7, 0xbc, 0x8f, 0x3b, 0x8f, 0x15, 0x75, - 0x9e, 0x4f, 0xc5, 0x7e, 0xa3, 0x1a, 0xff, 0xba, 0x32, 0x34, 0xe4, 0x67, 0x92, 0xcf, 0x0b, 0x97, - 0xa0, 0x3c, 0x4e, 0x00, 0x35, 0x2e, 0x7f, 0x65, 0xc0, 0xaa, 0x44, 0x0b, 0x95, 0x9e, 0x57, 0xb8, - 0x97, 0xbc, 0x02, 0x69, 0xd9, 0xd3, 0xe3, 0x64, 0xcf, 0x4c, 0x94, 0x7d, 0x26, 0x29, 0xfb, 0x5b, - 0xb0, 0x36, 0x22, 0x9c, 0x12, 0x7c, 0x17, 0x56, 0xb4, 0x33, 0x0c, 0xd7, 0xa9, 0x5b, 0x89, 0xc2, - 0x32, 0xfd, 0xd7, 0x00, 0xeb, 0x27, 0xfc, 0xfe, 0xc3, 0xfb, 0x5c, 0xd8, 0xab, 0xaa, 0x30, 0x7b, - 0x2e, 0x67, 0xd2, 0x54, 0xd6, 0x01, 0x6c, 0x28, 0x4f, 0x8e, 0x7e, 0xf6, 0xd1, 0x3f, 0x13, 0xbc, - 0xc6, 0xac, 0xf7, 0x6f, 0x03, 0xae, 0x4e, 0xd9, 0x56, 0x5d, 0xef, 0x0c, 0x4a, 0xf1, 0x1f, 0xd2, - 0x28, 0xc3, 0xac, 0x3b, 0x98, 0x71, 0x6a, 0x23, 0x1d, 0xdb, 0x94, 0xbd, 0xe2, 0x3f, 0xdb, 0xd5, - 0xd5, 0x3e, 0xb2, 0x55, 0x5a, 0x0e, 0x47, 0x31, 0x65, 0x07, 0xcc, 0x49, 0x0c, 0x63, 0x1a, 0xa7, - 0x5b, 0xc3, 0x8d, 0xd3, 0x5a, 0x25, 0xf9, 0xcf, 0x03, 0x72, 0x83, 0x78, 0xeb, 0x64, 0xc3, 0x55, - 0xa9, 0xee, 0x9a, 0xfa, 0x55, 0xd6, 0x8b, 0xde, 0x3d, 0x48, 0xf3, 0x82, 0x7e, 0xf2, 0x67, 0x03, - 0xac, 0x69, 0x9b, 0x5e, 0xd8, 0x69, 0x2e, 0x9a, 0x97, 0xef, 0x42, 0x3e, 0xf0, 0xce, 0x99, 0x95, - 0x21, 0xf0, 0x74, 0xe2, 0x7a, 0x74, 0xef, 0x2f, 0x2f, 0xd6, 0x8d, 0xbf, 0xbd, 0x58, 0x37, 0xfe, - 0xf1, 0x62, 0xdd, 0xf8, 0xd5, 0x3f, 0xd7, 0xff, 0xef, 0x07, 0x37, 0x7a, 0x2e, 0x23, 0x94, 0x56, - 0xdc, 0xa0, 0x2a, 0xbf, 0xaa, 0xad, 0xa0, 0xda, 0x63, 0x55, 0xf1, 0xff, 0x14, 0xd5, 0xc8, 0x0f, - 0x8e, 0xb2, 0x02, 0xf0, 0xc1, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x44, 0xc3, 0x8d, 0x6c, 0x0c, - 0x22, 0x00, 0x00, + // 2712 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x1a, 0x4d, 0x6f, 0x1b, 0xc7, + 0xb5, 0x4b, 0x52, 0x94, 0xf8, 0xf8, 0x21, 0x69, 0x44, 0x49, 0x1b, 0x26, 0x56, 0x94, 0x75, 0xec, + 0xa8, 0x4e, 0x4c, 0xc5, 0x4a, 0x62, 0x18, 0x4e, 0xd2, 0xda, 0x96, 0x28, 0x43, 0x8e, 0xa3, 0xaa, + 0x4b, 0x55, 0x41, 0x53, 0xa0, 0xdb, 0x11, 0x39, 0xa2, 0x17, 0x5a, 0xee, 0x32, 0x3b, 0x43, 0x4a, + 0x4c, 0x0f, 0xbd, 0xb4, 0x87, 0x00, 0x05, 0x7a, 0x2d, 0x10, 0x14, 0xe8, 0xa9, 0x28, 0xfa, 0x03, + 0x02, 0xb4, 0x28, 0x7a, 0x2c, 0x7a, 0xe8, 0xa1, 0xd7, 0xde, 0x0a, 0xf7, 0x67, 0xf4, 0x52, 0xcc, + 0xd7, 0x72, 0xb9, 0xfc, 0xb0, 0x2c, 0x1b, 0x28, 0x7a, 0xd2, 0xce, 0x9b, 0xf7, 0xe6, 0xbd, 0x79, + 0xdf, 0x6f, 0x28, 0x98, 0xef, 0xb1, 0x06, 0xf3, 0x9a, 0x98, 0xe1, 0x6a, 0x27, 0x0c, 0x58, 0x80, + 0x72, 0x11, 0xa0, 0xb2, 0x70, 0xec, 0xfa, 0x5e, 0xd0, 0x1a, 0x6c, 0x56, 0x8a, 0x5e, 0xd0, 0xea, + 0x32, 0xd7, 0x53, 0xcb, 0x52, 0xbb, 0x4f, 0xbf, 0xf0, 0x1a, 0x4c, 0xaf, 0x97, 0x43, 0xd2, 0xf1, + 0xdc, 0x06, 0x66, 0x6e, 0xe0, 0xc7, 0xa8, 0x56, 0x19, 0x3e, 0xf6, 0x08, 0x6b, 0x63, 0x1f, 0xb7, + 0x48, 0x18, 0xdb, 0x28, 0xb1, 0xa0, 0x13, 0xc4, 0x8f, 0xef, 0xd1, 0xc6, 0x13, 0xd2, 0xd6, 0xcb, + 0x42, 0x8f, 0x31, 0xb7, 0x4d, 0xe4, 0xca, 0xfa, 0x0c, 0x2a, 0xb5, 0x73, 0xd2, 0xe8, 0x32, 0x72, + 0xc4, 0x25, 0xdc, 0x0e, 0xda, 0x6d, 0xec, 0x37, 0x6d, 0xf2, 0x45, 0x97, 0x50, 0x86, 0x10, 0x64, + 0x70, 0xd8, 0xa2, 0xa6, 0xb1, 0x9e, 0xde, 0xc8, 0xd9, 0xe2, 0x1b, 0x5d, 0x83, 0x12, 0x6e, 0x70, + 0x59, 0x1c, 0x7e, 0x4c, 0xd0, 0x65, 0x66, 0x6a, 0xdd, 0xd8, 0x48, 0xdb, 0x45, 0x09, 0x3d, 0x94, + 0x40, 0x6b, 0x1b, 0x5e, 0x1d, 0x7b, 0x30, 0xed, 0x04, 0x3e, 0x25, 0xe8, 0x4d, 0x98, 0x21, 0x3d, + 0xe2, 0x33, 0xd3, 0x58, 0x37, 0x36, 0xf2, 0x5b, 0xa5, 0xaa, 0xd6, 0x41, 0x8d, 0x43, 0x6d, 0xb9, + 0x69, 0x7d, 0x65, 0x80, 0x79, 0xc8, 0xaf, 0xf9, 0x29, 0x66, 0x24, 0x74, 0xb1, 0xe7, 0x7e, 0x49, + 0xea, 0x84, 0x31, 0xd7, 0x6f, 0x51, 0xf4, 0x06, 0x14, 0x18, 0x0e, 0x5b, 0x84, 0x39, 0x42, 0x13, + 0xe2, 0xa4, 0x9c, 0x9d, 0x97, 0x30, 0x41, 0x85, 0xde, 0x86, 0x45, 0x1a, 0x74, 0xc3, 0x06, 0x71, + 0xc8, 0x79, 0x27, 0x24, 0x94, 0xba, 0x81, 0x2f, 0xc4, 0xcd, 0xd9, 0x0b, 0x72, 0xa3, 0x16, 0xc1, + 0xd1, 0x15, 0x80, 0x46, 0x48, 0x30, 0x23, 0x4e, 0xb3, 0xe9, 0x99, 0x69, 0x81, 0x95, 0x93, 0x90, + 0x9d, 0xa6, 0x67, 0xfd, 0x33, 0x05, 0x4b, 0xe3, 0xc4, 0xa8, 0xc0, 0xdc, 0x59, 0x10, 0x9e, 0x9e, + 0x78, 0xc1, 0x99, 0x12, 0x21, 0x5a, 0xa3, 0xb7, 0x60, 0x5e, 0xf1, 0x3f, 0x25, 0x7d, 0xda, 0xc1, + 0x0d, 0xa2, 0xb8, 0x97, 0x24, 0xf8, 0x13, 0x05, 0xe5, 0x88, 0xea, 0x2e, 0x11, 0xa2, 0x14, 0xa0, + 0x24, 0xc1, 0x11, 0xe2, 0x75, 0x98, 0xa7, 0x2c, 0xe8, 0x38, 0xf8, 0x84, 0x91, 0xd0, 0x69, 0x04, + 0x9d, 0xbe, 0x99, 0x59, 0x37, 0x36, 0xe6, 0xec, 0x22, 0x07, 0xdf, 0xe7, 0xd0, 0xed, 0xa0, 0xd3, + 0x47, 0x8f, 0xa0, 0x24, 0xb4, 0xe2, 0x50, 0x25, 0xa7, 0x39, 0xb3, 0x9e, 0xde, 0xc8, 0x6f, 0x5d, + 0xad, 0x0e, 0x5c, 0x73, 0x92, 0x66, 0xed, 0xa2, 0x20, 0x8d, 0x6e, 0x88, 0x20, 0xd3, 0x20, 0x9e, + 0x67, 0x66, 0x85, 0x44, 0xe2, 0x5b, 0x2a, 0x9f, 0xfb, 0x9f, 0xc3, 0xfa, 0x1d, 0x42, 0xcd, 0x59, + 0xad, 0x7c, 0x0e, 0x3b, 0xe4, 0x20, 0xf4, 0x6d, 0x58, 0x20, 0xe7, 0x8c, 0x84, 0x3e, 0xf6, 0x9c, + 0x86, 0xd7, 0xa5, 0x8c, 0x84, 0xe6, 0x9c, 0x40, 0x9b, 0xd7, 0xf0, 0x6d, 0x09, 0xb6, 0xf6, 0x61, + 0x2e, 0xba, 0x21, 0x82, 0x8c, 0x8f, 0xdb, 0xda, 0x9c, 0xe2, 0x1b, 0x55, 0x61, 0x6e, 0x48, 0x81, + 0xf9, 0x2d, 0x54, 0x8d, 0xbc, 0x5c, 0x53, 0xda, 0x11, 0x8e, 0xf5, 0x63, 0x98, 0xa9, 0x3f, 0xc1, + 0x61, 0x93, 0x1b, 0x27, 0x22, 0x54, 0xc6, 0x39, 0x4d, 0x32, 0x4a, 0xc5, 0x18, 0x5d, 0x83, 0x19, + 0xca, 0x09, 0x85, 0xf6, 0xf3, 0x5b, 0xf3, 0x03, 0x2e, 0xe2, 0x3c, 0x5b, 0xee, 0x5a, 0xbf, 0xcf, + 0xc1, 0xdc, 0x67, 0xda, 0xc8, 0xe3, 0x04, 0xfe, 0x2e, 0x64, 0xa5, 0x85, 0x95, 0xb8, 0x6f, 0xc5, + 0xd4, 0xae, 0x09, 0xab, 0xf6, 0x20, 0xae, 0x1f, 0x07, 0xf2, 0xaf, 0xad, 0xc8, 0xf8, 0x01, 0xd2, + 0xf2, 0x4a, 0x92, 0x8b, 0x1f, 0x20, 0xc9, 0xd0, 0x2d, 0x58, 0x6e, 0xe3, 0x73, 0xa7, 0xe7, 0xc4, + 0xb2, 0x87, 0xe3, 0xe1, 0x96, 0x70, 0x97, 0xb4, 0x8d, 0xda, 0xf8, 0xfc, 0x28, 0x4e, 0x8f, 0x5b, + 0xe8, 0x11, 0x14, 0xc5, 0xf5, 0x1c, 0xca, 0x42, 0x82, 0xdb, 0xda, 0x65, 0xae, 0x8d, 0x63, 0x2d, + 0xd4, 0x51, 0x97, 0x78, 0x35, 0x9f, 0x85, 0x7d, 0xbb, 0x40, 0x63, 0xa0, 0xca, 0x4f, 0x60, 0x71, + 0x04, 0x05, 0x2d, 0x40, 0xfa, 0x94, 0xf4, 0x95, 0xa2, 0xf8, 0x27, 0xfa, 0x00, 0x66, 0x7a, 0xd8, + 0xeb, 0x6a, 0x35, 0xbd, 0xfe, 0x0c, 0x56, 0xb6, 0xc4, 0xbe, 0x9b, 0xba, 0x63, 0x54, 0xf6, 0x60, + 0x69, 0xcc, 0xfd, 0xa7, 0x5a, 0x7c, 0x05, 0xb2, 0x42, 0x48, 0x6a, 0xa6, 0x44, 0x42, 0x53, 0xab, + 0xca, 0x1f, 0x0d, 0xc8, 0xc7, 0xb8, 0xa0, 0xf7, 0x61, 0x56, 0xab, 0xc0, 0x10, 0x2a, 0xa8, 0x8c, + 0x95, 0x4b, 0x8a, 0xa4, 0x51, 0xd1, 0x2e, 0x8f, 0x61, 0x11, 0x12, 0x8d, 0xc0, 0x67, 0x61, 0xe0, + 0x49, 0x36, 0xf9, 0xad, 0x2b, 0x09, 0x2f, 0x92, 0x81, 0xc7, 0xb6, 0x25, 0x96, 0x2d, 0x03, 0x55, + 0x2f, 0x29, 0x7a, 0x07, 0x90, 0x4b, 0x9d, 0x4e, 0xe8, 0xb6, 0x71, 0xd8, 0x77, 0x28, 0x09, 0x7b, + 0xae, 0xdf, 0x12, 0x6e, 0x30, 0x67, 0x2f, 0xb8, 0xf4, 0x40, 0x6e, 0xd4, 0x25, 0xbc, 0xf2, 0x9b, + 0x0c, 0x64, 0x95, 0xd8, 0x25, 0x48, 0xb9, 0x4d, 0x71, 0xe9, 0xb4, 0x9d, 0x72, 0x9b, 0xa8, 0xac, + 0x9d, 0x59, 0x7a, 0xb8, 0x5c, 0xa0, 0x9b, 0xdc, 0xb3, 0x38, 0x43, 0xe5, 0x59, 0xcb, 0x03, 0xe9, + 0xa4, 0x5c, 0xf7, 0x3d, 0x17, 0x53, 0x5b, 0x21, 0xa1, 0x8f, 0xa1, 0x28, 0x0b, 0x96, 0xa3, 0x1c, + 0x3a, 0x23, 0xa8, 0xcc, 0x6a, 0xac, 0x8c, 0x3d, 0x10, 0x9f, 0x75, 0xb1, 0x6f, 0x17, 0x8e, 0x63, + 0x2b, 0x6e, 0x8e, 0x4e, 0x40, 0x5d, 0x6e, 0x1a, 0x73, 0x46, 0x9a, 0x43, 0xaf, 0xd1, 0x55, 0x10, + 0x49, 0xcb, 0x89, 0x10, 0x64, 0x82, 0x29, 0x70, 0xe0, 0x81, 0x46, 0xe2, 0x97, 0x60, 0x98, 0x11, + 0x95, 0x61, 0xe4, 0x02, 0xad, 0xc2, 0x6c, 0xf3, 0xd8, 0x11, 0x61, 0x27, 0x53, 0x4a, 0xb6, 0x79, + 0xbc, 0xcf, 0x03, 0xef, 0x3e, 0x2c, 0xb3, 0x10, 0xfb, 0x34, 0x56, 0xa2, 0x28, 0xc3, 0xed, 0x8e, + 0x99, 0x13, 0x62, 0x17, 0xaa, 0xaa, 0xfa, 0xf1, 0x32, 0x65, 0x97, 0x63, 0xa8, 0x87, 0x1a, 0x13, + 0x6d, 0x42, 0x81, 0xa3, 0x38, 0xdd, 0x4e, 0x13, 0x33, 0xd2, 0x34, 0x61, 0x0c, 0x65, 0x9e, 0x7f, + 0xfe, 0x40, 0x22, 0x20, 0x13, 0x66, 0xdb, 0x84, 0x52, 0xdc, 0x22, 0x66, 0x5e, 0x08, 0xa3, 0x97, + 0xa8, 0x06, 0x79, 0x9e, 0xa2, 0x1d, 0x21, 0x34, 0x35, 0x0b, 0xc2, 0x1d, 0xde, 0x9c, 0xec, 0x4c, + 0x55, 0x9e, 0xbb, 0xeb, 0x1c, 0xd9, 0x86, 0x86, 0xfe, 0xa4, 0x95, 0xbb, 0x90, 0x8b, 0x36, 0xb8, + 0x42, 0xe2, 0xf5, 0x4e, 0x2e, 0xb8, 0x42, 0x3c, 0x4c, 0x99, 0xd3, 0x39, 0x55, 0xd6, 0xce, 0xf2, + 0xe5, 0xc1, 0xa9, 0xf5, 0xb5, 0x01, 0xab, 0xdb, 0x4f, 0xb0, 0xdf, 0x22, 0x87, 0x51, 0x6e, 0xd6, + 0xe5, 0xfd, 0x4e, 0x94, 0xc4, 0x31, 0xb7, 0xb9, 0xaa, 0xc5, 0x13, 0x1c, 0x42, 0xe5, 0x76, 0xb1, + 0x40, 0x37, 0x85, 0xfe, 0x79, 0xea, 0x17, 0xec, 0x4a, 0x5b, 0xe5, 0x24, 0x91, 0xe0, 0x93, 0x6d, + 0x1e, 0xf3, 0xbf, 0xc2, 0x5c, 0x61, 0xdf, 0x09, 0xbb, 0xbe, 0xf2, 0xe3, 0x6c, 0x33, 0xec, 0xdb, + 0x5d, 0xdf, 0xfa, 0x9d, 0x01, 0xe6, 0xa8, 0x74, 0xaa, 0x47, 0xf8, 0x00, 0x8a, 0xc7, 0xe4, 0x24, + 0x08, 0x89, 0xa3, 0x1c, 0x56, 0xca, 0xb7, 0x90, 0x64, 0x65, 0x17, 0x24, 0x9a, 0x5c, 0xa1, 0xf7, + 0xa0, 0x20, 0xab, 0xa3, 0xa2, 0x4a, 0x4d, 0xa0, 0xca, 0x0b, 0x2c, 0x45, 0xb4, 0x06, 0xf9, 0x33, + 0x4c, 0x9d, 0x61, 0x29, 0x73, 0x67, 0x98, 0xee, 0x48, 0x41, 0xbf, 0x49, 0xc3, 0xf2, 0xb6, 0xe8, + 0x05, 0xa2, 0x72, 0x33, 0xe8, 0x91, 0x46, 0xd2, 0x7f, 0x19, 0x66, 0x4e, 0x02, 0x9d, 0xfd, 0xe7, + 0x6c, 0xb9, 0x40, 0x9b, 0x50, 0xc6, 0x9e, 0x17, 0x9c, 0x39, 0xa4, 0xdd, 0x61, 0x7d, 0xa7, 0xe7, + 0xc8, 0xbe, 0x4c, 0x31, 0x5b, 0x14, 0x7b, 0x35, 0xbe, 0x75, 0x54, 0x17, 0x1b, 0xe8, 0x5d, 0x28, + 0x8b, 0x98, 0x75, 0xfd, 0x96, 0xd3, 0x08, 0xbc, 0x6e, 0xdb, 0x97, 0x2e, 0x9f, 0x11, 0xac, 0x90, + 0xde, 0xdb, 0x16, 0x5b, 0xc2, 0xfd, 0x1f, 0x8d, 0x52, 0x08, 0x23, 0xcd, 0x08, 0x23, 0x99, 0xa3, + 0x45, 0x73, 0xaf, 0x29, 0x54, 0x9e, 0x38, 0x4b, 0x18, 0xed, 0x1e, 0x14, 0x78, 0xf2, 0x21, 0x4d, + 0xe7, 0x24, 0x0c, 0xda, 0xd4, 0xcc, 0x26, 0x93, 0x99, 0x3e, 0xa3, 0x5a, 0x17, 0x68, 0xbb, 0x61, + 0xd0, 0xb6, 0xf3, 0x34, 0xfa, 0xa6, 0xe8, 0x06, 0x64, 0x04, 0xf7, 0x59, 0xc1, 0x7d, 0x65, 0x94, + 0x52, 0xf0, 0x16, 0x38, 0x3c, 0x19, 0x1c, 0x63, 0x1a, 0x6b, 0x94, 0x64, 0x5c, 0x17, 0x38, 0x30, + 0xea, 0x0d, 0x6e, 0x41, 0x91, 0xfa, 0xb8, 0x43, 0x9f, 0x04, 0x4c, 0x84, 0xf6, 0xd8, 0xa8, 0x2e, + 0x68, 0x14, 0xbe, 0xb2, 0xf6, 0x60, 0x25, 0x69, 0x37, 0xe5, 0x5e, 0x9b, 0x89, 0x4a, 0x91, 0xdf, + 0x5a, 0x8a, 0x45, 0xe6, 0x98, 0xae, 0xe2, 0x97, 0x06, 0x20, 0x79, 0x96, 0x6c, 0x06, 0x94, 0x03, + 0x4c, 0xab, 0x38, 0x57, 0x00, 0x64, 0x49, 0x8d, 0x75, 0x1a, 0x39, 0x01, 0xd9, 0x1f, 0xf2, 0x93, + 0x74, 0xdc, 0x4f, 0xae, 0x41, 0xc9, 0xf5, 0x1b, 0x5e, 0xb7, 0x49, 0x9c, 0x0e, 0x0e, 0x79, 0x93, + 0xac, 0x5a, 0x3c, 0x05, 0x3d, 0x10, 0x40, 0xeb, 0xb7, 0x06, 0x2c, 0x0d, 0x89, 0x73, 0xc9, 0x7b, + 0xa1, 0xeb, 0xf1, 0x3a, 0xc1, 0x23, 0x65, 0x80, 0x1d, 0xef, 0x7a, 0x22, 0x77, 0x74, 0xb0, 0x17, + 0x12, 0xdc, 0xec, 0x3b, 0xe4, 0xdc, 0xa5, 0x8c, 0x2a, 0xe1, 0xa5, 0x0b, 0xdd, 0x97, 0x5b, 0x35, + 0xb1, 0x63, 0x7d, 0x1f, 0x96, 0x77, 0x88, 0x47, 0x46, 0x83, 0x66, 0x9a, 0xce, 0x5e, 0x83, 0x5c, + 0x48, 0x1a, 0xdd, 0x90, 0xba, 0x3d, 0x1d, 0x40, 0x03, 0x80, 0x65, 0xc2, 0x4a, 0xf2, 0x48, 0x79, + 0x6f, 0xeb, 0x17, 0x06, 0x2c, 0xc9, 0x2d, 0x21, 0x35, 0xd5, 0xbc, 0x36, 0xa2, 0xaa, 0x2f, 0x8b, + 0xf9, 0xe8, 0xfd, 0xd4, 0xfe, 0x74, 0xce, 0xbc, 0xf5, 0xe6, 0x53, 0x89, 0xe3, 0x9e, 0x44, 0x45, + 0x59, 0xd9, 0x85, 0x83, 0xf7, 0x4e, 0x54, 0x45, 0xb6, 0x56, 0xa0, 0x3c, 0x2c, 0x86, 0x92, 0xaf, + 0xaf, 0xe1, 0x32, 0xe5, 0x44, 0xf2, 0x7d, 0xa4, 0x5a, 0x75, 0x95, 0x85, 0x89, 0x96, 0x73, 0x42, + 0x1e, 0x2e, 0xc6, 0xf2, 0x30, 0xa1, 0x3c, 0x6e, 0x64, 0x52, 0x51, 0x0d, 0x83, 0x92, 0xbb, 0x20, + 0x80, 0xaa, 0x57, 0xb0, 0x56, 0xb5, 0x1d, 0x22, 0xd6, 0x4a, 0xa6, 0x5f, 0xa5, 0xe0, 0x4a, 0xad, + 0x4d, 0xc2, 0x16, 0xf1, 0x1b, 0x7d, 0x9b, 0x48, 0x77, 0xbb, 0xb0, 0x77, 0x8f, 0x6f, 0x30, 0x6e, + 0x43, 0xde, 0x27, 0x03, 0x79, 0xa6, 0x76, 0x19, 0xe0, 0x13, 0x2d, 0x24, 0xfa, 0x0e, 0xcc, 0xbb, + 0x2d, 0x9f, 0xa7, 0x7b, 0xd5, 0xb2, 0x52, 0x33, 0x33, 0x4d, 0x11, 0x25, 0x89, 0xad, 0x9a, 0x40, + 0x8a, 0x76, 0x60, 0xf9, 0x0c, 0xbb, 0x2c, 0xa2, 0x8e, 0xe6, 0xd3, 0x99, 0xc8, 0xad, 0x45, 0x92, + 0xd8, 0xe9, 0x86, 0xb2, 0x55, 0x5e, 0xe2, 0xe8, 0x9a, 0x5c, 0xcf, 0xad, 0x7f, 0x36, 0x60, 0x6d, + 0x92, 0x46, 0x54, 0x80, 0x3d, 0xbf, 0x4a, 0xee, 0xc1, 0x42, 0x27, 0x0c, 0xda, 0x01, 0x23, 0xcd, + 0x8b, 0xe9, 0x65, 0x5e, 0xa3, 0x6b, 0xe5, 0x5c, 0x87, 0xac, 0x18, 0x89, 0xb5, 0x4e, 0x92, 0x03, + 0xb3, 0xda, 0xb5, 0x3e, 0x82, 0xb5, 0x5d, 0xd7, 0x6f, 0xde, 0xf7, 0x3c, 0xe9, 0x7d, 0x7b, 0xfe, + 0x73, 0x84, 0x9e, 0xf5, 0x17, 0x03, 0x5e, 0x9f, 0x48, 0xae, 0x6e, 0xbf, 0x9f, 0x08, 0xa7, 0xdb, + 0xb1, 0x70, 0x7a, 0x06, 0xad, 0x0c, 0x37, 0x35, 0x2f, 0xe8, 0xe6, 0xfb, 0x13, 0xd5, 0x7b, 0x4f, + 0x9c, 0x11, 0xae, 0x0f, 0xcf, 0x08, 0x63, 0xd2, 0x53, 0x34, 0x14, 0x58, 0x35, 0x58, 0x7c, 0x48, + 0xd8, 0x03, 0xdc, 0x38, 0xed, 0x76, 0xe8, 0xa5, 0x5d, 0xd8, 0xda, 0x01, 0x14, 0x3f, 0x46, 0xdd, + 0xbc, 0x0a, 0xb3, 0xc7, 0x12, 0xa4, 0xae, 0x5e, 0xae, 0x46, 0x4f, 0x35, 0x12, 0x77, 0xcf, 0x3f, + 0x09, 0x6c, 0x8d, 0x64, 0xbd, 0x02, 0xab, 0x0f, 0x09, 0xdb, 0x26, 0x9e, 0xc7, 0xe1, 0x3c, 0xe1, + 0x6b, 0x91, 0xac, 0x77, 0xc1, 0x1c, 0xdd, 0x52, 0x6c, 0xca, 0x30, 0xc3, 0xab, 0x85, 0x7e, 0x75, + 0x91, 0x0b, 0x6b, 0x43, 0x88, 0xa4, 0x29, 0x62, 0xcd, 0x87, 0x18, 0xcd, 0x8d, 0xc1, 0x68, 0x6e, + 0xed, 0xc2, 0xd2, 0x10, 0x66, 0x54, 0x16, 0x72, 0x7c, 0xdb, 0x71, 0xfd, 0x93, 0x40, 0xd5, 0x85, + 0xd8, 0x10, 0x1d, 0xa1, 0xcf, 0x35, 0xd4, 0x17, 0xcf, 0xb4, 0xea, 0x1c, 0xaa, 0x92, 0x8d, 0x96, + 0xfe, 0x1b, 0x23, 0xba, 0xd9, 0x60, 0x4b, 0xb1, 0xd9, 0x83, 0xd9, 0xe1, 0x34, 0xb6, 0x19, 0xb3, + 0xd7, 0x04, 0xa2, 0xaa, 0x5a, 0x4b, 0xc7, 0xd0, 0xf4, 0x95, 0x03, 0x28, 0xc4, 0x37, 0xc6, 0xb8, + 0xc6, 0x8d, 0x61, 0xd7, 0x28, 0x0f, 0xdf, 0x47, 0xb2, 0x89, 0xbb, 0xc7, 0xb2, 0x50, 0x8d, 0x76, + 0xcb, 0xe8, 0x3e, 0x7b, 0x50, 0x1e, 0x06, 0xab, 0xbb, 0xdc, 0x82, 0x9c, 0x76, 0x14, 0x7d, 0x9b, + 0xb1, 0xa5, 0x74, 0x80, 0x65, 0xbd, 0x2b, 0xcc, 0xf4, 0x3c, 0x31, 0xb7, 0x3b, 0x24, 0xd3, 0xe5, + 0xbb, 0x93, 0x9f, 0xa7, 0x60, 0xe1, 0x21, 0x61, 0xb2, 0x75, 0x7c, 0xf1, 0x0e, 0x7f, 0x45, 0x8d, + 0x89, 0xd1, 0xac, 0x2c, 0x57, 0xbc, 0x39, 0x21, 0xe7, 0xb2, 0x39, 0x51, 0xfb, 0x69, 0xb1, 0x5f, + 0x54, 0xd0, 0x43, 0x89, 0x76, 0x15, 0x74, 0xb7, 0xe2, 0xf4, 0x5c, 0x72, 0x46, 0x55, 0xa9, 0x2c, + 0x28, 0xe0, 0x11, 0x87, 0xa1, 0x0d, 0x58, 0x90, 0x8f, 0x54, 0xc2, 0xc5, 0x9d, 0xc0, 0xf7, 0xfa, + 0x22, 0x59, 0xcf, 0xa9, 0x99, 0x58, 0xc4, 0xc5, 0xf7, 0x7c, 0xaf, 0x3f, 0xc0, 0xa4, 0xee, 0x97, + 0x1a, 0x33, 0x1b, 0xc3, 0xac, 0x73, 0x30, 0xc7, 0xb4, 0x0e, 0x44, 0x06, 0xd0, 0x5a, 0x50, 0xca, + 0xfc, 0x10, 0xb2, 0xaa, 0xd7, 0x96, 0x0a, 0xb8, 0x5a, 0x1d, 0x7d, 0x3c, 0x95, 0x24, 0x3b, 0xe4, + 0xc4, 0xf5, 0x5d, 0xf5, 0x14, 0x23, 0x20, 0xd6, 0x63, 0x98, 0xe7, 0x27, 0xbe, 0x9c, 0x96, 0xcf, + 0xba, 0x2b, 0xad, 0x34, 0x54, 0x50, 0xa2, 0x06, 0xcc, 0x98, 0xda, 0x80, 0x59, 0x8f, 0x44, 0x44, + 0xd6, 0xc3, 0x5e, 0xd2, 0x83, 0x9f, 0x95, 0xe2, 0x78, 0x4c, 0x6b, 0x43, 0xca, 0x85, 0xf5, 0x77, + 0x19, 0xc3, 0xc3, 0x87, 0x29, 0x79, 0x7e, 0x08, 0x45, 0x1a, 0xf6, 0x9c, 0xa4, 0xef, 0xbf, 0x3f, + 0x1c, 0xc9, 0xe3, 0x48, 0xab, 0x71, 0xa0, 0x7e, 0x17, 0x8a, 0x81, 0x2a, 0x47, 0xb0, 0x38, 0x82, + 0x32, 0x26, 0xb0, 0xdf, 0x1e, 0x0e, 0xec, 0x98, 0xc3, 0xc6, 0xa8, 0xe3, 0x91, 0x7d, 0x43, 0x84, + 0x70, 0x3d, 0xec, 0x1d, 0x0d, 0x07, 0xc0, 0xb8, 0x04, 0xb9, 0x0f, 0xcb, 0x09, 0xdc, 0x68, 0xe0, + 0xe4, 0xc2, 0x0e, 0x06, 0xb3, 0x28, 0xee, 0xd4, 0x03, 0x7a, 0x8c, 0x04, 0x68, 0xf4, 0x6d, 0x3d, + 0x16, 0x26, 0x55, 0x53, 0xe5, 0x8b, 0x06, 0x9e, 0xf5, 0xb1, 0x70, 0x60, 0x7d, 0x9a, 0x92, 0x6c, + 0x23, 0x7a, 0xb4, 0x99, 0x34, 0x03, 0xab, 0x7d, 0xeb, 0x47, 0x31, 0xf2, 0xcb, 0x57, 0xc0, 0x81, + 0xd3, 0xa4, 0xe3, 0x4e, 0x73, 0x4f, 0x64, 0xb7, 0x44, 0x13, 0x89, 0x6e, 0xc0, 0xac, 0x64, 0x3e, + 0xe8, 0xb0, 0x93, 0xd2, 0x69, 0x04, 0x6b, 0x53, 0x88, 0x97, 0x30, 0xd2, 0xb4, 0xf4, 0xf8, 0x40, + 0xb0, 0x4c, 0x5a, 0xea, 0x1d, 0x98, 0x4b, 0x58, 0x69, 0x31, 0xb2, 0x52, 0xe4, 0x1e, 0xb3, 0x3d, + 0x65, 0x20, 0x5b, 0xa4, 0x58, 0xfd, 0xd6, 0x72, 0x21, 0xad, 0xbc, 0x0e, 0x79, 0xdc, 0x60, 0x6e, + 0x8f, 0xc8, 0x5c, 0x23, 0x9b, 0x6a, 0x90, 0x20, 0x91, 0x67, 0x64, 0xcd, 0x88, 0x9d, 0x39, 0xa8, + 0x19, 0xfa, 0xf9, 0x7f, 0x5c, 0xcd, 0xd0, 0x04, 0xf6, 0x00, 0xcb, 0xfa, 0x8f, 0x01, 0xab, 0x7b, + 0xbe, 0x2b, 0x93, 0x82, 0x6a, 0xf8, 0x2e, 0x6f, 0x39, 0x1b, 0x2a, 0xfa, 0xed, 0x90, 0x78, 0xa4, + 0xa1, 0x7e, 0x1d, 0xd1, 0x7e, 0x38, 0xb5, 0xeb, 0x5c, 0x55, 0x84, 0x35, 0x4e, 0x17, 0xdb, 0x18, + 0xcc, 0xa9, 0x99, 0xf8, 0x9c, 0xfa, 0x72, 0x1a, 0xee, 0x07, 0x60, 0x8e, 0x5e, 0x3e, 0x4a, 0x8c, + 0xba, 0xeb, 0x35, 0xa6, 0x76, 0xbd, 0x5f, 0xa5, 0xe0, 0xd5, 0x03, 0x0f, 0xfb, 0x3e, 0x69, 0xfe, + 0x8f, 0x87, 0x98, 0xbb, 0x50, 0xc4, 0xbd, 0xc0, 0x1d, 0xb4, 0xf9, 0x99, 0x69, 0x94, 0x05, 0x81, + 0xab, 0x69, 0x5f, 0x8e, 0x3e, 0xff, 0x64, 0xc0, 0x6b, 0xe3, 0x75, 0xf1, 0x7f, 0x30, 0xbe, 0xfc, + 0x0c, 0x5e, 0xb1, 0x49, 0x3b, 0xe8, 0x45, 0xd3, 0x3d, 0xef, 0xe3, 0x2e, 0x62, 0x45, 0x9d, 0xe7, + 0x53, 0xb1, 0xdf, 0xa8, 0xc6, 0xbf, 0xae, 0x0c, 0x0d, 0xf9, 0x99, 0xe4, 0xf3, 0xc2, 0x6b, 0x50, + 0x19, 0x27, 0x80, 0x1a, 0x97, 0xbf, 0x36, 0x60, 0x45, 0x6e, 0x0b, 0x95, 0x5e, 0x54, 0xb8, 0x67, + 0xbc, 0x02, 0x69, 0xd9, 0xd3, 0xe3, 0x64, 0xcf, 0x4c, 0x94, 0x7d, 0x26, 0x29, 0xfb, 0x2b, 0xb0, + 0x3a, 0x22, 0x9c, 0x12, 0x7c, 0x17, 0x96, 0xb5, 0x33, 0x0c, 0xd7, 0xa9, 0x9b, 0x89, 0xc2, 0x32, + 0xfd, 0xd7, 0x00, 0xeb, 0xa7, 0xfc, 0xfe, 0xc3, 0xe7, 0x5c, 0xda, 0xab, 0x36, 0x61, 0xf6, 0x42, + 0xce, 0xa4, 0xb1, 0xac, 0x43, 0x58, 0x57, 0x9e, 0x1c, 0xfd, 0xec, 0xa3, 0x7f, 0x26, 0x78, 0x81, + 0x59, 0xef, 0x0f, 0x69, 0x78, 0x63, 0xca, 0xb1, 0xea, 0x7a, 0xe7, 0x50, 0x8e, 0xff, 0x90, 0x46, + 0x19, 0x66, 0xdd, 0xc1, 0x8c, 0x53, 0x1b, 0xe9, 0xd8, 0xa6, 0x9c, 0x15, 0xff, 0xd9, 0xae, 0xae, + 0xce, 0x91, 0xad, 0xd2, 0x52, 0x38, 0xba, 0x83, 0x3e, 0x07, 0x50, 0x19, 0xbc, 0x8d, 0x3b, 0xea, + 0x17, 0xa5, 0x0f, 0x9f, 0x8b, 0x9f, 0x54, 0xe6, 0xa7, 0xb8, 0x23, 0xb9, 0xe4, 0x98, 0x5e, 0x57, + 0x1c, 0x30, 0x27, 0x09, 0x33, 0xa6, 0x29, 0xbb, 0x39, 0xdc, 0x94, 0xad, 0x56, 0x93, 0xff, 0x98, + 0x20, 0x0f, 0x88, 0xff, 0x48, 0xb7, 0x0f, 0xa5, 0x61, 0xee, 0x17, 0x99, 0xef, 0x93, 0xcd, 0x43, + 0xac, 0xcd, 0xb3, 0xe1, 0x0d, 0x09, 0xac, 0xa9, 0x5f, 0x90, 0xbd, 0xe8, 0x8d, 0x86, 0x34, 0x2f, + 0xe9, 0xd3, 0x7f, 0x35, 0xc0, 0x9a, 0x76, 0xe8, 0xa5, 0x1d, 0xfc, 0xb2, 0x35, 0xe4, 0x36, 0xe4, + 0x03, 0xef, 0x82, 0x15, 0x04, 0x02, 0x4f, 0x27, 0xd9, 0x07, 0x77, 0xfe, 0xf6, 0x74, 0xcd, 0xf8, + 0xc7, 0xd3, 0x35, 0xe3, 0x5f, 0x4f, 0xd7, 0x8c, 0x5f, 0xff, 0x7b, 0xed, 0x5b, 0x9f, 0x5f, 0xef, + 0xb9, 0x8c, 0x50, 0x5a, 0x75, 0x83, 0x4d, 0xf9, 0xb5, 0xd9, 0x0a, 0x36, 0x7b, 0x6c, 0x53, 0xfc, + 0xef, 0xc7, 0x66, 0xe4, 0x43, 0xc7, 0x59, 0x01, 0x78, 0xef, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, + 0x15, 0x67, 0xb5, 0x39, 0xb8, 0x22, 0x00, 0x00, } func (m *ExecuteVtctlCommandRequest) Marshal() (dAtA []byte, err error) { @@ -7636,6 +7649,32 @@ func (m *ShardReplicationPositionsResponse) MarshalToSizedBuffer(dAtA []byte) (i i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.TabletMap) > 0 { + for k := range m.TabletMap { + v := m.TabletMap[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintVtctldata(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintVtctldata(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintVtctldata(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } if len(m.ReplicationStatuses) > 0 { for k := range m.ReplicationStatuses { v := m.ReplicationStatuses[k] @@ -9243,6 +9282,19 @@ func (m *ShardReplicationPositionsResponse) Size() (n int) { n += mapEntrySize + 1 + sovVtctldata(uint64(mapEntrySize)) } } + if len(m.TabletMap) > 0 { + for k, v := range m.TabletMap { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovVtctldata(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovVtctldata(uint64(len(k))) + l + n += mapEntrySize + 1 + sovVtctldata(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -18041,6 +18093,135 @@ func (m *ShardReplicationPositionsResponse) Unmarshal(dAtA []byte) error { } m.ReplicationStatuses[mapkey] = mapvalue iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TabletMap", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthVtctldata + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TabletMap == nil { + m.TabletMap = make(map[string]*topodata.Tablet) + } + var mapkey string + var mapvalue *topodata.Tablet + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthVtctldata + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthVtctldata + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowVtctldata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthVtctldata + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthVtctldata + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &topodata.Tablet{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipVtctldata(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthVtctldata + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.TabletMap[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipVtctldata(dAtA[iNdEx:]) diff --git a/proto/vtctldata.proto b/proto/vtctldata.proto index d8eb7d44251..9f5d535f569 100644 --- a/proto/vtctldata.proto +++ b/proto/vtctldata.proto @@ -521,6 +521,9 @@ message ShardReplicationPositionsResponse { // ReplicationStatuses is a mapping of tablet alias string to replication // status for that tablet. map replication_statuses = 1; + // TabletMap is the set of tablets whose replication statuses were queried, + // keyed by tablet alias. + map tablet_map = 2; } message TabletExternallyReparentedRequest { diff --git a/web/vtadmin/src/proto/vtadmin.d.ts b/web/vtadmin/src/proto/vtadmin.d.ts index b3e7b652a25..63f4f188e9c 100644 --- a/web/vtadmin/src/proto/vtadmin.d.ts +++ b/web/vtadmin/src/proto/vtadmin.d.ts @@ -28166,6 +28166,9 @@ export namespace vtctldata { /** ShardReplicationPositionsResponse replication_statuses */ replication_statuses?: ({ [k: string]: replicationdata.IStatus }|null); + + /** ShardReplicationPositionsResponse tablet_map */ + tablet_map?: ({ [k: string]: topodata.ITablet }|null); } /** Represents a ShardReplicationPositionsResponse. */ @@ -28180,6 +28183,9 @@ export namespace vtctldata { /** ShardReplicationPositionsResponse replication_statuses. */ public replication_statuses: { [k: string]: replicationdata.IStatus }; + /** ShardReplicationPositionsResponse tablet_map. */ + public tablet_map: { [k: string]: topodata.ITablet }; + /** * Creates a new ShardReplicationPositionsResponse instance using the specified properties. * @param [properties] Properties to set diff --git a/web/vtadmin/src/proto/vtadmin.js b/web/vtadmin/src/proto/vtadmin.js index f0ebee8220a..d12c330edb6 100644 --- a/web/vtadmin/src/proto/vtadmin.js +++ b/web/vtadmin/src/proto/vtadmin.js @@ -67133,6 +67133,7 @@ $root.vtctldata = (function() { * @memberof vtctldata * @interface IShardReplicationPositionsResponse * @property {Object.|null} [replication_statuses] ShardReplicationPositionsResponse replication_statuses + * @property {Object.|null} [tablet_map] ShardReplicationPositionsResponse tablet_map */ /** @@ -67145,6 +67146,7 @@ $root.vtctldata = (function() { */ function ShardReplicationPositionsResponse(properties) { this.replication_statuses = {}; + this.tablet_map = {}; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -67159,6 +67161,14 @@ $root.vtctldata = (function() { */ ShardReplicationPositionsResponse.prototype.replication_statuses = $util.emptyObject; + /** + * ShardReplicationPositionsResponse tablet_map. + * @member {Object.} tablet_map + * @memberof vtctldata.ShardReplicationPositionsResponse + * @instance + */ + ShardReplicationPositionsResponse.prototype.tablet_map = $util.emptyObject; + /** * Creates a new ShardReplicationPositionsResponse instance using the specified properties. * @function create @@ -67188,6 +67198,11 @@ $root.vtctldata = (function() { writer.uint32(/* id 1, wireType 2 =*/10).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); $root.replicationdata.Status.encode(message.replication_statuses[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); } + if (message.tablet_map != null && Object.hasOwnProperty.call(message, "tablet_map")) + for (var keys = Object.keys(message.tablet_map), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.topodata.Tablet.encode(message.tablet_map[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } return writer; }; @@ -67244,6 +67259,28 @@ $root.vtctldata = (function() { } message.replication_statuses[key] = value; break; + case 2: + if (message.tablet_map === $util.emptyObject) + message.tablet_map = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.topodata.Tablet.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.tablet_map[key] = value; + break; default: reader.skipType(tag & 7); break; @@ -67289,6 +67326,16 @@ $root.vtctldata = (function() { return "replication_statuses." + error; } } + if (message.tablet_map != null && message.hasOwnProperty("tablet_map")) { + if (!$util.isObject(message.tablet_map)) + return "tablet_map: object expected"; + var key = Object.keys(message.tablet_map); + for (var i = 0; i < key.length; ++i) { + var error = $root.topodata.Tablet.verify(message.tablet_map[key[i]]); + if (error) + return "tablet_map." + error; + } + } return null; }; @@ -67314,6 +67361,16 @@ $root.vtctldata = (function() { message.replication_statuses[keys[i]] = $root.replicationdata.Status.fromObject(object.replication_statuses[keys[i]]); } } + if (object.tablet_map) { + if (typeof object.tablet_map !== "object") + throw TypeError(".vtctldata.ShardReplicationPositionsResponse.tablet_map: object expected"); + message.tablet_map = {}; + for (var keys = Object.keys(object.tablet_map), i = 0; i < keys.length; ++i) { + if (typeof object.tablet_map[keys[i]] !== "object") + throw TypeError(".vtctldata.ShardReplicationPositionsResponse.tablet_map: object expected"); + message.tablet_map[keys[i]] = $root.topodata.Tablet.fromObject(object.tablet_map[keys[i]]); + } + } return message; }; @@ -67330,14 +67387,21 @@ $root.vtctldata = (function() { if (!options) options = {}; var object = {}; - if (options.objects || options.defaults) + if (options.objects || options.defaults) { object.replication_statuses = {}; + object.tablet_map = {}; + } var keys2; if (message.replication_statuses && (keys2 = Object.keys(message.replication_statuses)).length) { object.replication_statuses = {}; for (var j = 0; j < keys2.length; ++j) object.replication_statuses[keys2[j]] = $root.replicationdata.Status.toObject(message.replication_statuses[keys2[j]], options); } + if (message.tablet_map && (keys2 = Object.keys(message.tablet_map)).length) { + object.tablet_map = {}; + for (var j = 0; j < keys2.length; ++j) + object.tablet_map[keys2[j]] = $root.topodata.Tablet.toObject(message.tablet_map[keys2[j]], options); + } return object; }; From 41bd6e4ac71a624703e44bba70fb330e7566094b Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Sun, 14 Mar 2021 22:50:06 -0400 Subject: [PATCH 4/7] Update impl/tests to include tablet map in response Signed-off-by: Andrew Mason --- go/vt/vtctl/grpcvtctldserver/server.go | 18 ++++++---- go/vt/vtctl/grpcvtctldserver/server_test.go | 40 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 777ec931a96..460d8eee7c6 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -1108,18 +1108,19 @@ func (s *VtctldServer) ReparentTablet(ctx context.Context, req *vtctldatapb.Repa // ShardReplicationPositions is part of the vtctldservicepb.VtctldServer interface. func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctldatapb.ShardReplicationPositionsRequest) (*vtctldatapb.ShardReplicationPositionsResponse, error) { - tabletMap, err := s.ts.GetTabletMapForShard(ctx, req.Keyspace, req.Shard) + tabletInfoMap, err := s.ts.GetTabletMapForShard(ctx, req.Keyspace, req.Shard) if err != nil { return nil, fmt.Errorf("GetTabletMapForShard(%s, %s) failed: %w", req.Keyspace, req.Shard, err) } - log.Infof("Gathering tablet replication status for: %v", tabletMap) + log.Infof("Gathering tablet replication status for: %v", tabletInfoMap) var ( - m sync.Mutex - wg sync.WaitGroup - rec concurrency.AllErrorRecorder - results = make(map[string]*replicationdatapb.Status, len(tabletMap)) + m sync.Mutex + wg sync.WaitGroup + rec concurrency.AllErrorRecorder + results = make(map[string]*replicationdatapb.Status, len(tabletInfoMap)) + tabletMap = make(map[string]*topodatapb.Tablet, len(tabletInfoMap)) ) // For each tablet, we're going to create an individual context, using @@ -1130,7 +1131,7 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl // result map; that way, the caller can tell the difference between a tablet // that timed out vs a tablet that didn't get queried at all. - for alias, tabletInfo := range tabletMap { + for alias, tabletInfo := range tabletInfoMap { switch { case tabletInfo.Type == topodatapb.TabletType_MASTER: wg.Add(1) @@ -1168,6 +1169,7 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl defer m.Unlock() results[alias] = status + tabletMap[alias] = tablet }(ctx, alias, tabletInfo.Tablet) case tabletInfo.IsReplicaType(): wg.Add(1) @@ -1200,6 +1202,7 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl defer m.Unlock() results[alias] = status + tabletMap[alias] = tablet }(ctx, alias, tabletInfo.Tablet) } } @@ -1212,6 +1215,7 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl return &vtctldatapb.ShardReplicationPositionsResponse{ ReplicationStatuses: results, + TabletMap: tabletMap, }, nil } diff --git a/go/vt/vtctl/grpcvtctldserver/server_test.go b/go/vt/vtctl/grpcvtctldserver/server_test.go index ebd21436e20..34e72baa19a 100644 --- a/go/vt/vtctl/grpcvtctldserver/server_test.go +++ b/go/vt/vtctl/grpcvtctldserver/server_test.go @@ -4696,6 +4696,26 @@ func TestShardReplicationPositions(t *testing.T) { Position: "replica_tablet_position", }, }, + TabletMap: map[string]*topodatapb.Tablet{ + "zone1-0000000100": { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_MASTER, + }, + "zone1-0000000101": { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, }, shouldErr: false, }, @@ -4758,6 +4778,26 @@ func TestShardReplicationPositions(t *testing.T) { "zone1-0000000100": nil, "zone1-0000000101": nil, }, + TabletMap: map[string]*topodatapb.Tablet{ + "zone1-0000000100": { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 100, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_MASTER, + }, + "zone1-0000000101": { + Alias: &topodatapb.TabletAlias{ + Cell: "zone1", + Uid: 101, + }, + Keyspace: "testkeyspace", + Shard: "-", + Type: topodatapb.TabletType_REPLICA, + }, + }, }, shouldErr: false, }, From 4de498714b92076b445b1925b60cd5051a2fa38d Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 15 Mar 2021 08:10:55 -0400 Subject: [PATCH 5/7] Add CLI entrypoint for `ShardReplicationPositions` This also copies over `SortReplicatingTablets` over from legacy vtctl Signed-off-by: Andrew Mason --- go/cmd/vtctldclient/cli/shards.go | 80 +++++++++++++++++++ .../vtctldclient/internal/command/shards.go | 44 ++++++++++ 2 files changed, 124 insertions(+) diff --git a/go/cmd/vtctldclient/cli/shards.go b/go/cmd/vtctldclient/cli/shards.go index b71dc2741df..1349a1b0de2 100644 --- a/go/cmd/vtctldclient/cli/shards.go +++ b/go/cmd/vtctldclient/cli/shards.go @@ -17,8 +17,13 @@ limitations under the License. package cli import ( + "sort" + + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/vt/topo/topoproto" + replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" + topodatapb "vitess.io/vitess/go/vt/proto/topodata" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" ) @@ -41,3 +46,78 @@ func ParseKeyspaceShards(args []string) ([]*vtctldatapb.Shard, error) { return shards, nil } + +// ReplicatingTablet is a struct to group a Tablet together with its replication +// Status. +type ReplicatingTablet struct { + Status *replicationdatapb.Status + Tablet *topodatapb.Tablet +} + +type rTablets []*ReplicatingTablet + +func (rts rTablets) Len() int { return len(rts) } +func (rts rTablets) Swap(i, j int) { rts[i], rts[j] = rts[j], rts[i] } +func (rts rTablets) Less(i, j int) bool { + l, r := rts[i], rts[j] + + // l or r ReplicationStatus would be nil if we failed to get + // the position (put them at the beginning of the list) + if l.Status == nil { + return r.Status != nil + } + + if r.Status == nil { + return false + } + + // the type proto has MASTER first, so sort by that. Will show + // the MASTER first, then each replica type sorted by + // replication position. + if l.Tablet.Type < r.Tablet.Type { + return true + } + + if l.Tablet.Type > r.Tablet.Type { + return false + } + + // then compare replication positions + lpos, err := mysql.DecodePosition(l.Status.Position) + if err != nil { + return true + } + + rpos, err := mysql.DecodePosition(r.Status.Position) + if err != nil { + return false + } + + return !lpos.AtLeast(rpos) +} + +// SortReplicatingTablets returns a sorted list of replicating tablets (which is +// a struct grouping a Tablet together with its replication Status). +// +// The sorting order is: +// 1. Tablets that do not have a replication Status. +// 2. Any tablets of type MASTER. +// 3. Remaining tablets sorted by comparing replication positions. +func SortReplicatingTablets(tabletMap map[string]*topodatapb.Tablet, replicationStatuses map[string]*replicationdatapb.Status) []*ReplicatingTablet { + rtablets := make([]*ReplicatingTablet, 0, len(tabletMap)) + + for alias, tablet := range tabletMap { + if status, ok := replicationStatuses[alias]; ok { + rtablets = append(rtablets, &ReplicatingTablet{ + Status: status, + Tablet: tablet, + }) + } else { + rtablets = append(rtablets, &ReplicatingTablet{Tablet: tablet}) + } + } + + sort.Sort(rTablets(rtablets)) + + return rtablets +} diff --git a/go/cmd/vtctldclient/internal/command/shards.go b/go/cmd/vtctldclient/internal/command/shards.go index 62d8205fb23..0b88fbd8064 100644 --- a/go/cmd/vtctldclient/internal/command/shards.go +++ b/go/cmd/vtctldclient/internal/command/shards.go @@ -52,6 +52,16 @@ var ( Args: cobra.ExactArgs(2), RunE: commandRemoveShardCell, } + // ShardReplicationPositions makes a ShardReplicationPositions gRPC request + // to a vtctld. + ShardReplicationPositions = &cobra.Command{ + Use: "ShardReplicationPositions ", + Long: `Shows the replication status of each tablet in the shard graph. +Output is sorted by tablet type, then replication position. +Use ctrl-C to interrupt the command and see partial results if needed.`, + Args: cobra.ExactArgs(1), + RunE: commandShardReplicationPositions, + } ) var createShardOptions = struct { @@ -173,6 +183,38 @@ func commandRemoveShardCell(cmd *cobra.Command, args []string) error { return nil } +func commandShardReplicationPositions(cmd *cobra.Command, args []string) error { + keyspace, shard, err := topoproto.ParseKeyspaceShard(cmd.Flags().Arg(0)) + if err != nil { + return err + } + + cli.FinishedParsing(cmd) + + resp, err := client.ShardReplicationPositions(commandCtx, &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: keyspace, + Shard: shard, + }) + if err != nil { + return err + } + + for _, rt := range cli.SortReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { + var line string + + switch rt.Status { + case nil: + line = cli.MarshalTabletAWK(rt.Tablet) + " " + default: + line = cli.MarshalTabletAWK(rt.Tablet) + fmt.Sprintf(" %v %v", rt.Status.Position, rt.Status.SecondsBehindMaster) + } + + fmt.Println(line) + } + + return nil +} + func init() { CreateShard.Flags().BoolVarP(&createShardOptions.Force, "force", "f", false, "") CreateShard.Flags().BoolVarP(&createShardOptions.IncludeParent, "include-parent", "p", false, "") @@ -187,4 +229,6 @@ func init() { RemoveShardCell.Flags().BoolVarP(&removeShardCellOptions.Force, "force", "f", false, "Proceed even if the cell's topology server cannot be reached. The assumption is that you turned down the entire cell, and just need to update the global topo data.") RemoveShardCell.Flags().BoolVarP(&removeShardCellOptions.Recursive, "recursive", "r", false, "Also delete all tablets in that cell beloning to the specified shard.") Root.AddCommand(RemoveShardCell) + + Root.AddCommand(ShardReplicationPositions) } From 698debf49f3f57d8534d2259d40e9c8f714cbfe6 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Mon, 15 Mar 2021 08:17:17 -0400 Subject: [PATCH 6/7] Remiplement the old `ShardReplicationPositions` vtctl command with new impl The new implementation contains the bugfix for getting partial results with one (or more) dead/unreachable tablets. Closes #4073. Signed-off-by: Andrew Mason --- go/vt/vtctl/vtctl.go | 75 +++++++------------------------------------- 1 file changed, 11 insertions(+), 64 deletions(-) diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 5456d625f92..75a842ea65e 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -99,9 +99,9 @@ import ( "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" + "vitess.io/vitess/go/cmd/vtctldclient/cli" "vitess.io/vitess/go/flagutil" "vitess.io/vitess/go/json2" - "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/sync2" hk "vitess.io/vitess/go/vt/hook" @@ -117,7 +117,6 @@ import ( "vitess.io/vitess/go/vt/vterrors" "vitess.io/vitess/go/vt/wrangler" - replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" topodatapb "vitess.io/vitess/go/vt/proto/topodata" vschemapb "vitess.io/vitess/go/vt/proto/vschema" vtctldatapb "vitess.io/vitess/go/vt/proto/vtctldata" @@ -1313,19 +1312,23 @@ func commandShardReplicationPositions(ctx context.Context, wr *wrangler.Wrangler if err != nil { return err } - tablets, stats, err := wr.ShardReplicationStatuses(ctx, keyspace, shard) - if tablets == nil { + + resp, err := wr.VtctldServer().ShardReplicationPositions(ctx, &vtctldatapb.ShardReplicationPositionsRequest{ + Keyspace: keyspace, + Shard: shard, + }) + if err != nil { return err } lines := make([]string, 0, 24) - for _, rt := range sortReplicatingTablets(tablets, stats) { + for _, rt := range cli.SortReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { status := rt.Status - ti := rt.TabletInfo + tablet := rt.Tablet if status == nil { - lines = append(lines, fmtTabletAwkable(ti)+" ") + lines = append(lines, cli.MarshalTabletAWK(tablet)+" ") } else { - lines = append(lines, fmtTabletAwkable(ti)+fmt.Sprintf(" %v %v", status.Position, status.SecondsBehindMaster)) + lines = append(lines, cli.MarshalTabletAWK(tablet)+fmt.Sprintf(" %v %v", status.Position, status.SecondsBehindMaster)) } } for _, l := range lines { @@ -3652,62 +3655,6 @@ func commandPanic(ctx context.Context, wr *wrangler.Wrangler, subFlags *flag.Fla panic(fmt.Errorf("this command panics on purpose")) } -type rTablet struct { - *topo.TabletInfo - *replicationdatapb.Status -} - -type rTablets []*rTablet - -func (rts rTablets) Len() int { return len(rts) } - -func (rts rTablets) Swap(i, j int) { rts[i], rts[j] = rts[j], rts[i] } - -// Sort for tablet replication. -// Tablet type first (with master first), then replication positions. -func (rts rTablets) Less(i, j int) bool { - l, r := rts[i], rts[j] - // l or r ReplicationStatus would be nil if we failed to get - // the position (put them at the beginning of the list) - if l.Status == nil { - return r.Status != nil - } - if r.Status == nil { - return false - } - // the type proto has MASTER first, so sort by that. Will show - // the MASTER first, then each replica type sorted by - // replication position. - if l.Type < r.Type { - return true - } - if l.Type > r.Type { - return false - } - // then compare replication positions - lpos, err := mysql.DecodePosition(l.Position) - if err != nil { - return true - } - rpos, err := mysql.DecodePosition(r.Position) - if err != nil { - return false - } - return !lpos.AtLeast(rpos) -} - -func sortReplicatingTablets(tablets []*topo.TabletInfo, stats []*replicationdatapb.Status) []*rTablet { - rtablets := make([]*rTablet, len(tablets)) - for i, status := range stats { - rtablets[i] = &rTablet{ - TabletInfo: tablets[i], - Status: status, - } - } - sort.Sort(rTablets(rtablets)) - return rtablets -} - // printJSON will print the JSON version of the structure to the logger. func printJSON(logger logutil.Logger, val interface{}) error { data, err := MarshalJSON(val) From 6e0edb6ddcc872d6b6b7c22a466db78b602ba334 Mon Sep 17 00:00:00 2001 From: Andrew Mason Date: Wed, 17 Mar 2021 11:42:24 -0400 Subject: [PATCH 7/7] PR feedback: whitespace and naming Signed-off-by: Andrew Mason --- go/cmd/vtctldclient/cli/shards.go | 10 +++++----- go/cmd/vtctldclient/internal/command/shards.go | 2 +- go/vt/vtctl/grpcvtctldserver/server.go | 2 -- go/vt/vtctl/vtctl.go | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/go/cmd/vtctldclient/cli/shards.go b/go/cmd/vtctldclient/cli/shards.go index 1349a1b0de2..f45b8324c00 100644 --- a/go/cmd/vtctldclient/cli/shards.go +++ b/go/cmd/vtctldclient/cli/shards.go @@ -50,8 +50,8 @@ func ParseKeyspaceShards(args []string) ([]*vtctldatapb.Shard, error) { // ReplicatingTablet is a struct to group a Tablet together with its replication // Status. type ReplicatingTablet struct { - Status *replicationdatapb.Status - Tablet *topodatapb.Tablet + *replicationdatapb.Status + *topodatapb.Tablet } type rTablets []*ReplicatingTablet @@ -96,14 +96,14 @@ func (rts rTablets) Less(i, j int) bool { return !lpos.AtLeast(rpos) } -// SortReplicatingTablets returns a sorted list of replicating tablets (which is -// a struct grouping a Tablet together with its replication Status). +// SortedReplicatingTablets returns a sorted list of replicating tablets (which +// is a struct grouping a Tablet together with its replication Status). // // The sorting order is: // 1. Tablets that do not have a replication Status. // 2. Any tablets of type MASTER. // 3. Remaining tablets sorted by comparing replication positions. -func SortReplicatingTablets(tabletMap map[string]*topodatapb.Tablet, replicationStatuses map[string]*replicationdatapb.Status) []*ReplicatingTablet { +func SortedReplicatingTablets(tabletMap map[string]*topodatapb.Tablet, replicationStatuses map[string]*replicationdatapb.Status) []*ReplicatingTablet { rtablets := make([]*ReplicatingTablet, 0, len(tabletMap)) for alias, tablet := range tabletMap { diff --git a/go/cmd/vtctldclient/internal/command/shards.go b/go/cmd/vtctldclient/internal/command/shards.go index 0b88fbd8064..b43eff0769e 100644 --- a/go/cmd/vtctldclient/internal/command/shards.go +++ b/go/cmd/vtctldclient/internal/command/shards.go @@ -199,7 +199,7 @@ func commandShardReplicationPositions(cmd *cobra.Command, args []string) error { return err } - for _, rt := range cli.SortReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { + for _, rt := range cli.SortedReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { var line string switch rt.Status { diff --git a/go/vt/vtctl/grpcvtctldserver/server.go b/go/vt/vtctl/grpcvtctldserver/server.go index 460d8eee7c6..0220a4e740e 100644 --- a/go/vt/vtctl/grpcvtctldserver/server.go +++ b/go/vt/vtctl/grpcvtctldserver/server.go @@ -1155,7 +1155,6 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl // The RPC was not timed out or canceled. We treat this // as a fatal error for the overall request. rec.RecordError(fmt.Errorf("MasterPosition(%s) failed: %w", alias, err)) - return } } else { @@ -1191,7 +1190,6 @@ func (s *VtctldServer) ShardReplicationPositions(ctx context.Context, req *vtctl // The RPC was not timed out or canceled. We treat this // as a fatal error for the overall request. rec.RecordError(fmt.Errorf("ReplicationStatus(%s) failed: %s", alias, err)) - return } diff --git a/go/vt/vtctl/vtctl.go b/go/vt/vtctl/vtctl.go index 75a842ea65e..5dcd20bc25c 100644 --- a/go/vt/vtctl/vtctl.go +++ b/go/vt/vtctl/vtctl.go @@ -1322,7 +1322,7 @@ func commandShardReplicationPositions(ctx context.Context, wr *wrangler.Wrangler } lines := make([]string, 0, 24) - for _, rt := range cli.SortReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { + for _, rt := range cli.SortedReplicatingTablets(resp.TabletMap, resp.ReplicationStatuses) { status := rt.Status tablet := rt.Tablet if status == nil {