From f0c8e6f96bf357bded718c3e3a32df00cdd0999b Mon Sep 17 00:00:00 2001 From: Amogh Bharadwaj Date: Thu, 2 Nov 2023 07:31:51 -0700 Subject: [PATCH] Drop Peer support for query layer and UI (#602) fixes: https://github.com/PeerDB-io/peerdb/issues/425 Syntax: ```sql DROP PEER [IF EXISTS] ``` --- flow/cmd/handler.go | 99 ++- flow/generated/protos/route.pb.go | 904 ++++++++++++++----------- flow/generated/protos/route.pb.gw.go | 85 +++ flow/generated/protos/route_grpc.pb.go | 37 + nexus/analyzer/src/lib.rs | 19 +- nexus/catalog/src/lib.rs | 9 + nexus/flow-rs/src/grpc.rs | 18 +- nexus/pt/src/peerdb_flow.rs | 301 ++++---- nexus/pt/src/peerdb_peers.rs | 132 ++-- nexus/pt/src/peerdb_route.rs | 140 ++-- nexus/pt/src/peerdb_route.serde.rs | 209 ++++++ nexus/pt/src/peerdb_route.tonic.rs | 78 +++ nexus/server/src/main.rs | 48 ++ nexus/sqlparser-rs | 2 +- protos/route.proto | 15 + ui/app/api/mirrors/drop/route.ts | 1 + ui/app/api/peers/drop/route.ts | 28 + ui/app/dto/MirrorsDTO.ts | 1 + ui/app/dto/PeersDTO.ts | 5 + ui/app/mirrors/page.tsx | 22 +- ui/app/peers/page.tsx | 33 +- ui/components/DropDialog.tsx | 61 +- ui/grpc_generated/route.ts | 165 +++++ 23 files changed, 1715 insertions(+), 697 deletions(-) create mode 100644 ui/app/api/peers/drop/route.ts diff --git a/flow/cmd/handler.go b/flow/cmd/handler.go index 05a250b3c..99c105e96 100644 --- a/flow/cmd/handler.go +++ b/flow/cmd/handler.go @@ -193,6 +193,19 @@ func (h *FlowRequestHandler) updateFlowConfigInCatalog( return nil } +func (h *FlowRequestHandler) removeFlowEntryInCatalog( + flowName string, +) error { + _, err := h.pool.Exec(context.Background(), + "DELETE FROM flows WHERE name = $1", + flowName) + if err != nil { + return fmt.Errorf("unable to remove flow entry in catalog: %w", err) + } + + return nil +} + func (h *FlowRequestHandler) CreateQRepFlow( ctx context.Context, req *protos.CreateQRepFlowRequest) (*protos.CreateQRepFlowResponse, error) { lastPartition := &protos.QRepPartition{ @@ -201,7 +214,6 @@ func (h *FlowRequestHandler) CreateQRepFlow( } cfg := req.QrepConfig - log.Infof("Config for QRepFlow: %+v", cfg) workflowID := fmt.Sprintf("%s-qrepflow-%s", cfg.FlowJobName, uuid.New()) workflowOptions := client.StartWorkflowOptions{ ID: workflowID, @@ -270,12 +282,18 @@ func (h *FlowRequestHandler) ShutdownFlow( shared.ShutdownSignal, ) if err != nil { - return nil, fmt.Errorf("unable to signal PeerFlow workflow: %w", err) + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("unable to signal PeerFlow workflow: %v", err), + }, fmt.Errorf("unable to signal PeerFlow workflow: %w", err) } err = h.waitForWorkflowClose(ctx, req.WorkflowId) if err != nil { - return nil, fmt.Errorf("unable to wait for PeerFlow workflow to close: %w", err) + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("unable to wait for PeerFlow workflow to close: %v", err), + }, fmt.Errorf("unable to wait for PeerFlow workflow to close: %w", err) } workflowID := fmt.Sprintf("%s-dropflow-%s", req.FlowJobName, uuid.New()) @@ -290,7 +308,10 @@ func (h *FlowRequestHandler) ShutdownFlow( req, // workflow input ) if err != nil { - return nil, fmt.Errorf("unable to start DropFlow workflow: %w", err) + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("unable to start DropFlow workflow: %v", err), + }, fmt.Errorf("unable to start DropFlow workflow: %w", err) } cancelCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) @@ -304,15 +325,29 @@ func (h *FlowRequestHandler) ShutdownFlow( select { case err := <-errChan: if err != nil { - return nil, fmt.Errorf("DropFlow workflow did not execute successfully: %w", err) + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("DropFlow workflow did not execute successfully: %v", err), + }, fmt.Errorf("DropFlow workflow did not execute successfully: %w", err) } case <-time.After(1 * time.Minute): err := h.handleWorkflowNotClosed(ctx, workflowID, "") if err != nil { - return nil, fmt.Errorf("unable to wait for DropFlow workflow to close: %w", err) + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("unable to wait for DropFlow workflow to close: %v", err), + }, fmt.Errorf("unable to wait for DropFlow workflow to close: %w", err) } } + delErr := h.removeFlowEntryInCatalog(req.FlowJobName) + if delErr != nil { + return &protos.ShutdownResponse{ + Ok: false, + ErrorMessage: err.Error(), + }, err + } + return &protos.ShutdownResponse{ Ok: true, }, nil @@ -501,3 +536,55 @@ func (h *FlowRequestHandler) CreatePeer( Message: "", }, nil } + +func (h *FlowRequestHandler) DropPeer( + ctx context.Context, + req *protos.DropPeerRequest, +) (*protos.DropPeerResponse, error) { + if req.PeerName == "" { + return &protos.DropPeerResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("Peer %s not found", req.PeerName), + }, fmt.Errorf("peer %s not found", req.PeerName) + } + + // Check if peer name is in flows table + peerID, _, err := h.getPeerID(ctx, req.PeerName) + if err != nil { + return &protos.DropPeerResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("Failed to obtain peer ID for peer %s: %v", req.PeerName, err), + }, fmt.Errorf("failed to obtain peer ID for peer %s: %v", req.PeerName, err) + } + + var inMirror int64 + queryErr := h.pool.QueryRow(ctx, + "SELECT COUNT(*) FROM flows WHERE source_peer=$1 or destination_peer=$2", + peerID, peerID).Scan(&inMirror) + if queryErr != nil { + return &protos.DropPeerResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("Failed to check for existing mirrors with peer %s: %v", req.PeerName, queryErr), + }, fmt.Errorf("failed to check for existing mirrors with peer %s", req.PeerName) + } + + if inMirror != 0 { + return &protos.DropPeerResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("Peer %s is currently involved in an ongoing mirror.", req.PeerName), + }, nil + } + + _, delErr := h.pool.Exec(ctx, "DELETE FROM peers WHERE name = $1", req.PeerName) + if delErr != nil { + return &protos.DropPeerResponse{ + Ok: false, + ErrorMessage: fmt.Sprintf("failed to delete peer %s from metadata table: %v", req.PeerName, delErr), + }, fmt.Errorf("failed to delete peer %s from metadata table: %v", req.PeerName, delErr) + } + + return &protos.DropPeerResponse{ + Ok: true, + }, nil + +} diff --git a/flow/generated/protos/route.pb.go b/flow/generated/protos/route.pb.go index f810724b7..840623f14 100644 --- a/flow/generated/protos/route.pb.go +++ b/flow/generated/protos/route.pb.go @@ -544,6 +544,108 @@ func (x *CreatePeerRequest) GetPeer() *Peer { return nil } +type DropPeerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PeerName string `protobuf:"bytes,1,opt,name=peer_name,json=peerName,proto3" json:"peer_name,omitempty"` +} + +func (x *DropPeerRequest) Reset() { + *x = DropPeerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_route_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DropPeerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DropPeerRequest) ProtoMessage() {} + +func (x *DropPeerRequest) ProtoReflect() protoreflect.Message { + mi := &file_route_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DropPeerRequest.ProtoReflect.Descriptor instead. +func (*DropPeerRequest) Descriptor() ([]byte, []int) { + return file_route_proto_rawDescGZIP(), []int{8} +} + +func (x *DropPeerRequest) GetPeerName() string { + if x != nil { + return x.PeerName + } + return "" +} + +type DropPeerResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"` +} + +func (x *DropPeerResponse) Reset() { + *x = DropPeerResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_route_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DropPeerResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DropPeerResponse) ProtoMessage() {} + +func (x *DropPeerResponse) ProtoReflect() protoreflect.Message { + mi := &file_route_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DropPeerResponse.ProtoReflect.Descriptor instead. +func (*DropPeerResponse) Descriptor() ([]byte, []int) { + return file_route_proto_rawDescGZIP(), []int{9} +} + +func (x *DropPeerResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *DropPeerResponse) GetErrorMessage() string { + if x != nil { + return x.ErrorMessage + } + return "" +} + type ValidatePeerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -556,7 +658,7 @@ type ValidatePeerResponse struct { func (x *ValidatePeerResponse) Reset() { *x = ValidatePeerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[8] + mi := &file_route_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -569,7 +671,7 @@ func (x *ValidatePeerResponse) String() string { func (*ValidatePeerResponse) ProtoMessage() {} func (x *ValidatePeerResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[8] + mi := &file_route_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -582,7 +684,7 @@ func (x *ValidatePeerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePeerResponse.ProtoReflect.Descriptor instead. func (*ValidatePeerResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{8} + return file_route_proto_rawDescGZIP(), []int{10} } func (x *ValidatePeerResponse) GetStatus() ValidatePeerStatus { @@ -611,7 +713,7 @@ type CreatePeerResponse struct { func (x *CreatePeerResponse) Reset() { *x = CreatePeerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[9] + mi := &file_route_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -624,7 +726,7 @@ func (x *CreatePeerResponse) String() string { func (*CreatePeerResponse) ProtoMessage() {} func (x *CreatePeerResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[9] + mi := &file_route_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -637,7 +739,7 @@ func (x *CreatePeerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreatePeerResponse.ProtoReflect.Descriptor instead. func (*CreatePeerResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{9} + return file_route_proto_rawDescGZIP(), []int{11} } func (x *CreatePeerResponse) GetStatus() CreatePeerStatus { @@ -665,7 +767,7 @@ type MirrorStatusRequest struct { func (x *MirrorStatusRequest) Reset() { *x = MirrorStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[10] + mi := &file_route_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -678,7 +780,7 @@ func (x *MirrorStatusRequest) String() string { func (*MirrorStatusRequest) ProtoMessage() {} func (x *MirrorStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[10] + mi := &file_route_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -691,7 +793,7 @@ func (x *MirrorStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MirrorStatusRequest.ProtoReflect.Descriptor instead. func (*MirrorStatusRequest) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{10} + return file_route_proto_rawDescGZIP(), []int{12} } func (x *MirrorStatusRequest) GetFlowJobName() string { @@ -715,7 +817,7 @@ type PartitionStatus struct { func (x *PartitionStatus) Reset() { *x = PartitionStatus{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[11] + mi := &file_route_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -728,7 +830,7 @@ func (x *PartitionStatus) String() string { func (*PartitionStatus) ProtoMessage() {} func (x *PartitionStatus) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[11] + mi := &file_route_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -741,7 +843,7 @@ func (x *PartitionStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use PartitionStatus.ProtoReflect.Descriptor instead. func (*PartitionStatus) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{11} + return file_route_proto_rawDescGZIP(), []int{13} } func (x *PartitionStatus) GetPartitionId() string { @@ -784,7 +886,7 @@ type QRepMirrorStatus struct { func (x *QRepMirrorStatus) Reset() { *x = QRepMirrorStatus{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[12] + mi := &file_route_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -797,7 +899,7 @@ func (x *QRepMirrorStatus) String() string { func (*QRepMirrorStatus) ProtoMessage() {} func (x *QRepMirrorStatus) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[12] + mi := &file_route_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -810,7 +912,7 @@ func (x *QRepMirrorStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use QRepMirrorStatus.ProtoReflect.Descriptor instead. func (*QRepMirrorStatus) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{12} + return file_route_proto_rawDescGZIP(), []int{14} } func (x *QRepMirrorStatus) GetConfig() *QRepConfig { @@ -842,7 +944,7 @@ type CDCSyncStatus struct { func (x *CDCSyncStatus) Reset() { *x = CDCSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[13] + mi := &file_route_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -855,7 +957,7 @@ func (x *CDCSyncStatus) String() string { func (*CDCSyncStatus) ProtoMessage() {} func (x *CDCSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[13] + mi := &file_route_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -868,7 +970,7 @@ func (x *CDCSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CDCSyncStatus.ProtoReflect.Descriptor instead. func (*CDCSyncStatus) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{13} + return file_route_proto_rawDescGZIP(), []int{15} } func (x *CDCSyncStatus) GetStartLsn() int64 { @@ -917,7 +1019,7 @@ type PeerSchemasResponse struct { func (x *PeerSchemasResponse) Reset() { *x = PeerSchemasResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[14] + mi := &file_route_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1032,7 @@ func (x *PeerSchemasResponse) String() string { func (*PeerSchemasResponse) ProtoMessage() {} func (x *PeerSchemasResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[14] + mi := &file_route_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1045,7 @@ func (x *PeerSchemasResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeerSchemasResponse.ProtoReflect.Descriptor instead. func (*PeerSchemasResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{14} + return file_route_proto_rawDescGZIP(), []int{16} } func (x *PeerSchemasResponse) GetSchemas() []string { @@ -965,7 +1067,7 @@ type SchemaTablesRequest struct { func (x *SchemaTablesRequest) Reset() { *x = SchemaTablesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[15] + mi := &file_route_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -978,7 +1080,7 @@ func (x *SchemaTablesRequest) String() string { func (*SchemaTablesRequest) ProtoMessage() {} func (x *SchemaTablesRequest) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[15] + mi := &file_route_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -991,7 +1093,7 @@ func (x *SchemaTablesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SchemaTablesRequest.ProtoReflect.Descriptor instead. func (*SchemaTablesRequest) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{15} + return file_route_proto_rawDescGZIP(), []int{17} } func (x *SchemaTablesRequest) GetPeerName() string { @@ -1019,7 +1121,7 @@ type SchemaTablesResponse struct { func (x *SchemaTablesResponse) Reset() { *x = SchemaTablesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[16] + mi := &file_route_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1032,7 +1134,7 @@ func (x *SchemaTablesResponse) String() string { func (*SchemaTablesResponse) ProtoMessage() {} func (x *SchemaTablesResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[16] + mi := &file_route_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1045,7 +1147,7 @@ func (x *SchemaTablesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SchemaTablesResponse.ProtoReflect.Descriptor instead. func (*SchemaTablesResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{16} + return file_route_proto_rawDescGZIP(), []int{18} } func (x *SchemaTablesResponse) GetTables() []string { @@ -1068,7 +1170,7 @@ type TableColumnsRequest struct { func (x *TableColumnsRequest) Reset() { *x = TableColumnsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[17] + mi := &file_route_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1081,7 +1183,7 @@ func (x *TableColumnsRequest) String() string { func (*TableColumnsRequest) ProtoMessage() {} func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[17] + mi := &file_route_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1094,7 +1196,7 @@ func (x *TableColumnsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TableColumnsRequest.ProtoReflect.Descriptor instead. func (*TableColumnsRequest) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{17} + return file_route_proto_rawDescGZIP(), []int{19} } func (x *TableColumnsRequest) GetPeerName() string { @@ -1129,7 +1231,7 @@ type TableColumnsResponse struct { func (x *TableColumnsResponse) Reset() { *x = TableColumnsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[18] + mi := &file_route_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1142,7 +1244,7 @@ func (x *TableColumnsResponse) String() string { func (*TableColumnsResponse) ProtoMessage() {} func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[18] + mi := &file_route_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1155,7 +1257,7 @@ func (x *TableColumnsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TableColumnsResponse.ProtoReflect.Descriptor instead. func (*TableColumnsResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{18} + return file_route_proto_rawDescGZIP(), []int{20} } func (x *TableColumnsResponse) GetColumns() []string { @@ -1176,7 +1278,7 @@ type PostgresPeerActivityInfoRequest struct { func (x *PostgresPeerActivityInfoRequest) Reset() { *x = PostgresPeerActivityInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[19] + mi := &file_route_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1189,7 +1291,7 @@ func (x *PostgresPeerActivityInfoRequest) String() string { func (*PostgresPeerActivityInfoRequest) ProtoMessage() {} func (x *PostgresPeerActivityInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[19] + mi := &file_route_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1202,7 +1304,7 @@ func (x *PostgresPeerActivityInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PostgresPeerActivityInfoRequest.ProtoReflect.Descriptor instead. func (*PostgresPeerActivityInfoRequest) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{19} + return file_route_proto_rawDescGZIP(), []int{21} } func (x *PostgresPeerActivityInfoRequest) GetPeerName() string { @@ -1227,7 +1329,7 @@ type SlotInfo struct { func (x *SlotInfo) Reset() { *x = SlotInfo{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[20] + mi := &file_route_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1342,7 @@ func (x *SlotInfo) String() string { func (*SlotInfo) ProtoMessage() {} func (x *SlotInfo) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[20] + mi := &file_route_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1355,7 @@ func (x *SlotInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SlotInfo.ProtoReflect.Descriptor instead. func (*SlotInfo) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{20} + return file_route_proto_rawDescGZIP(), []int{22} } func (x *SlotInfo) GetSlotName() string { @@ -1307,7 +1409,7 @@ type StatInfo struct { func (x *StatInfo) Reset() { *x = StatInfo{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[21] + mi := &file_route_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1320,7 +1422,7 @@ func (x *StatInfo) String() string { func (*StatInfo) ProtoMessage() {} func (x *StatInfo) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[21] + mi := &file_route_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1333,7 +1435,7 @@ func (x *StatInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StatInfo.ProtoReflect.Descriptor instead. func (*StatInfo) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{21} + return file_route_proto_rawDescGZIP(), []int{23} } func (x *StatInfo) GetPid() int64 { @@ -1389,7 +1491,7 @@ type PeerSlotResponse struct { func (x *PeerSlotResponse) Reset() { *x = PeerSlotResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[22] + mi := &file_route_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1402,7 +1504,7 @@ func (x *PeerSlotResponse) String() string { func (*PeerSlotResponse) ProtoMessage() {} func (x *PeerSlotResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[22] + mi := &file_route_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1415,7 +1517,7 @@ func (x *PeerSlotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeerSlotResponse.ProtoReflect.Descriptor instead. func (*PeerSlotResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{22} + return file_route_proto_rawDescGZIP(), []int{24} } func (x *PeerSlotResponse) GetSlotData() []*SlotInfo { @@ -1436,7 +1538,7 @@ type PeerStatResponse struct { func (x *PeerStatResponse) Reset() { *x = PeerStatResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[23] + mi := &file_route_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1449,7 +1551,7 @@ func (x *PeerStatResponse) String() string { func (*PeerStatResponse) ProtoMessage() {} func (x *PeerStatResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[23] + mi := &file_route_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1462,7 +1564,7 @@ func (x *PeerStatResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PeerStatResponse.ProtoReflect.Descriptor instead. func (*PeerStatResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{23} + return file_route_proto_rawDescGZIP(), []int{25} } func (x *PeerStatResponse) GetStatData() []*StatInfo { @@ -1483,7 +1585,7 @@ type SnapshotStatus struct { func (x *SnapshotStatus) Reset() { *x = SnapshotStatus{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[24] + mi := &file_route_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1496,7 +1598,7 @@ func (x *SnapshotStatus) String() string { func (*SnapshotStatus) ProtoMessage() {} func (x *SnapshotStatus) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[24] + mi := &file_route_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1509,7 +1611,7 @@ func (x *SnapshotStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use SnapshotStatus.ProtoReflect.Descriptor instead. func (*SnapshotStatus) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{24} + return file_route_proto_rawDescGZIP(), []int{26} } func (x *SnapshotStatus) GetClones() []*QRepMirrorStatus { @@ -1532,7 +1634,7 @@ type CDCMirrorStatus struct { func (x *CDCMirrorStatus) Reset() { *x = CDCMirrorStatus{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[25] + mi := &file_route_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1545,7 +1647,7 @@ func (x *CDCMirrorStatus) String() string { func (*CDCMirrorStatus) ProtoMessage() {} func (x *CDCMirrorStatus) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[25] + mi := &file_route_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1558,7 +1660,7 @@ func (x *CDCMirrorStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CDCMirrorStatus.ProtoReflect.Descriptor instead. func (*CDCMirrorStatus) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{25} + return file_route_proto_rawDescGZIP(), []int{27} } func (x *CDCMirrorStatus) GetConfig() *FlowConnectionConfigs { @@ -1599,7 +1701,7 @@ type MirrorStatusResponse struct { func (x *MirrorStatusResponse) Reset() { *x = MirrorStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_route_proto_msgTypes[26] + mi := &file_route_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1612,7 +1714,7 @@ func (x *MirrorStatusResponse) String() string { func (*MirrorStatusResponse) ProtoMessage() {} func (x *MirrorStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_route_proto_msgTypes[26] + mi := &file_route_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1625,7 +1727,7 @@ func (x *MirrorStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MirrorStatusResponse.ProtoReflect.Descriptor instead. func (*MirrorStatusResponse) Descriptor() ([]byte, []int) { - return file_route_proto_rawDescGZIP(), []int{26} + return file_route_proto_rawDescGZIP(), []int{28} } func (x *MirrorStatusResponse) GetFlowJobName() string { @@ -1739,247 +1841,261 @@ var file_route_proto_rawDesc = []byte{ 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x70, 0x65, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2e, - 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0x6a, 0x0a, 0x14, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x66, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x39, - 0x0a, 0x13, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6a, 0x6f, - 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x6c, - 0x6f, 0x77, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x0f, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x50, 0x65, 0x65, 0x72, 0x52, 0x04, 0x70, 0x65, 0x65, 0x72, 0x22, 0x2e, 0x0a, 0x0f, 0x44, 0x72, + 0x6f, 0x70, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x10, 0x44, 0x72, + 0x6f, 0x70, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x14, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x66, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x39, 0x0a, 0x13, 0x4d, 0x69, 0x72, 0x72, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x6c, 0x6f, 0x77, 0x4a, 0x6f, 0x62, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x22, 0x82, 0x01, - 0x0a, 0x10, 0x51, 0x52, 0x65, 0x70, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x66, 0x6c, 0x6f, 0x77, - 0x2e, 0x51, 0x52, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0xd2, 0x01, 0x0a, 0x0d, 0x43, 0x44, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x73, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x73, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x65, 0x6e, 0x64, 0x4c, 0x73, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, - 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, - 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, + 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, + 0x75, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x51, 0x52, 0x65, 0x70, 0x4d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x64, 0x62, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x51, 0x52, 0x65, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd2, 0x01, 0x0a, 0x0d, + 0x43, 0x44, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x73, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x6e, + 0x64, 0x5f, 0x6c, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x65, 0x6e, 0x64, + 0x4c, 0x73, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x12, 0x39, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x22, 0x53, 0x0a, 0x13, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0x2f, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x73, 0x22, 0x53, 0x0a, 0x13, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2e, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x72, 0x0a, 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x30, 0x0a, 0x14, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x22, 0x3e, 0x0a, 0x1f, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2e, 0x0a, - 0x14, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x72, 0x0a, - 0x13, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x30, 0x0a, 0x14, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, - 0x6d, 0x6e, 0x73, 0x22, 0x3e, 0x0a, 0x1f, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, - 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x08, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6c, 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x72, 0x65, 0x64, 0x6f, 0x5f, 0x6c, 0x53, 0x4e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x65, 0x64, 0x6f, 0x4c, 0x53, 0x4e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x53, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x53, 0x4e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x1a, 0x0a, 0x09, 0x6c, 0x61, 0x67, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x62, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x6c, 0x61, 0x67, 0x49, 0x6e, 0x4d, 0x62, 0x22, 0xb6, 0x01, - 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x77, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x77, - 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x47, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x53, 0x6c, - 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x73, 0x6c, - 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x6c, 0x6f, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, - 0x47, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x97, 0x01, 0x0a, + 0x08, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6c, 0x6f, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6c, + 0x6f, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x64, 0x6f, 0x5f, 0x6c, + 0x53, 0x4e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x64, 0x6f, 0x4c, 0x53, + 0x4e, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x53, 0x4e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, + 0x53, 0x4e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x09, 0x6c, 0x61, + 0x67, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x6c, + 0x61, 0x67, 0x49, 0x6e, 0x4d, 0x62, 0x22, 0xb6, 0x01, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x61, 0x69, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, + 0x61, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x47, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x73, 0x74, 0x61, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6c, - 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x65, 0x65, - 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x51, 0x52, 0x65, 0x70, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x6e, - 0x65, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x0f, 0x43, 0x44, 0x43, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, - 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x63, 0x64, 0x63, - 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x44, 0x43, 0x53, - 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x63, 0x64, 0x63, 0x53, 0x79, - 0x6e, 0x63, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x14, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, - 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x6c, 0x6f, 0x77, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x41, 0x0a, 0x0b, 0x71, 0x72, 0x65, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x51, 0x52, 0x65, 0x70, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x72, 0x65, 0x70, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x63, 0x64, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x44, 0x43, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x09, 0x63, 0x64, 0x63, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2a, 0x42, 0x0a, 0x12, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x52, 0x45, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x02, 0x2a, 0x43, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x32, 0xbc, 0x0a, 0x0a, 0x0b, - 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x0c, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x6c, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x12, - 0x1f, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0x79, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, 0x77, - 0x12, 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, - 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x2f, - 0x63, 0x64, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7d, 0x0a, 0x0e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x23, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, - 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x2f, 0x71, 0x72, - 0x65, 0x70, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x0a, 0x47, 0x65, 0x74, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, - 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x73, 0x12, 0x74, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x49, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, - 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, - 0x65, 0x72, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, - 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x65, - 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, - 0x72, 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x65, - 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, - 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x6c, 0x6f, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x6c, 0x6f, - 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x81, - 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x7d, 0x12, 0x6a, 0x0a, 0x0c, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x46, 0x6c, - 0x6f, 0x77, 0x12, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, - 0x31, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x12, 0x7a, - 0x0a, 0x0c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x69, - 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x2e, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, - 0x76, 0x31, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6c, 0x6f, 0x77, - 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x42, 0x7c, 0x0a, 0x10, 0x63, 0x6f, - 0x6d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x0a, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x10, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xa2, 0x02, - 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0xca, 0x02, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0xe2, 0x02, 0x17, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x50, 0x65, 0x65, - 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x73, 0x6c, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x10, 0x50, 0x65, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, + 0x73, 0x74, 0x61, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x22, 0x48, 0x0a, 0x0e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x51, 0x52, 0x65, 0x70, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x0f, + 0x43, 0x44, 0x43, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x46, 0x6c, + 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x0e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x63, 0x64, 0x63, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x44, 0x43, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x08, 0x63, 0x64, 0x63, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x14, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6a, 0x6f, + 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x6c, + 0x6f, 0x77, 0x4a, 0x6f, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0b, 0x71, 0x72, 0x65, + 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x51, 0x52, + 0x65, 0x70, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, + 0x52, 0x0a, 0x71, 0x72, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0a, + 0x63, 0x64, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x43, 0x44, 0x43, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, + 0x00, 0x52, 0x09, 0x63, 0x64, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x42, 0x0a, 0x12, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x52, 0x45, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x02, 0x2a, + 0x43, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x43, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, + 0x45, 0x44, 0x10, 0x02, 0x32, 0xa2, 0x0b, 0x0a, 0x0b, 0x46, 0x6c, 0x6f, 0x77, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x74, 0x0a, 0x0c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x50, 0x65, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, + 0x73, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x6c, 0x0a, 0x0a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, + 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x65, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x70, 0x65, 0x65, 0x72, + 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, + 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, + 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x64, 0x0a, 0x08, 0x44, 0x72, 0x6f, 0x70, + 0x50, 0x65, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x12, 0x79, + 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, 0x77, 0x12, + 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x44, 0x43, 0x46, 0x6c, 0x6f, 0x77, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, + 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x2f, 0x63, + 0x64, 0x63, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7d, 0x0a, 0x0e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x23, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x51, 0x52, 0x65, 0x70, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, + 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x2f, 0x71, 0x72, 0x65, + 0x70, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x79, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, 0x65, + 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, + 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x73, 0x12, 0x74, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x49, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, + 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x65, + 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, + 0x72, 0x73, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x6e, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x65, 0x65, + 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, + 0x73, 0x2f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x53, 0x6c, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x65, 0x72, + 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, + 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x53, 0x6c, 0x6f, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, + 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, 0x73, 0x6c, 0x6f, 0x74, + 0x73, 0x2f, 0x7b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x81, 0x01, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x50, 0x65, 0x65, 0x72, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x70, + 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x50, 0x65, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x6a, 0x0a, 0x0c, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x46, 0x6c, 0x6f, + 0x77, 0x12, 0x1d, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, + 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x12, 0x7a, 0x0a, + 0x0c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, + 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x4d, 0x69, 0x72, + 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, + 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x76, + 0x31, 0x2f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2f, 0x7b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, + 0x6a, 0x6f, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x42, 0x7c, 0x0a, 0x10, 0x63, 0x6f, 0x6d, + 0x2e, 0x70, 0x65, 0x65, 0x72, 0x64, 0x62, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x0a, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x10, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0xa2, 0x02, 0x03, + 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0xca, 0x02, 0x0b, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, 0xe2, + 0x02, 0x17, 0x50, 0x65, 0x65, 0x72, 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x50, 0x65, 0x65, 0x72, + 0x64, 0x62, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1995,7 +2111,7 @@ func file_route_proto_rawDescGZIP() []byte { } var file_route_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_route_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_route_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_route_proto_goTypes = []interface{}{ (ValidatePeerStatus)(0), // 0: peerdb_route.ValidatePeerStatus (CreatePeerStatus)(0), // 1: peerdb_route.CreatePeerStatus @@ -2007,77 +2123,81 @@ var file_route_proto_goTypes = []interface{}{ (*ShutdownResponse)(nil), // 7: peerdb_route.ShutdownResponse (*ValidatePeerRequest)(nil), // 8: peerdb_route.ValidatePeerRequest (*CreatePeerRequest)(nil), // 9: peerdb_route.CreatePeerRequest - (*ValidatePeerResponse)(nil), // 10: peerdb_route.ValidatePeerResponse - (*CreatePeerResponse)(nil), // 11: peerdb_route.CreatePeerResponse - (*MirrorStatusRequest)(nil), // 12: peerdb_route.MirrorStatusRequest - (*PartitionStatus)(nil), // 13: peerdb_route.PartitionStatus - (*QRepMirrorStatus)(nil), // 14: peerdb_route.QRepMirrorStatus - (*CDCSyncStatus)(nil), // 15: peerdb_route.CDCSyncStatus - (*PeerSchemasResponse)(nil), // 16: peerdb_route.PeerSchemasResponse - (*SchemaTablesRequest)(nil), // 17: peerdb_route.SchemaTablesRequest - (*SchemaTablesResponse)(nil), // 18: peerdb_route.SchemaTablesResponse - (*TableColumnsRequest)(nil), // 19: peerdb_route.TableColumnsRequest - (*TableColumnsResponse)(nil), // 20: peerdb_route.TableColumnsResponse - (*PostgresPeerActivityInfoRequest)(nil), // 21: peerdb_route.PostgresPeerActivityInfoRequest - (*SlotInfo)(nil), // 22: peerdb_route.SlotInfo - (*StatInfo)(nil), // 23: peerdb_route.StatInfo - (*PeerSlotResponse)(nil), // 24: peerdb_route.PeerSlotResponse - (*PeerStatResponse)(nil), // 25: peerdb_route.PeerStatResponse - (*SnapshotStatus)(nil), // 26: peerdb_route.SnapshotStatus - (*CDCMirrorStatus)(nil), // 27: peerdb_route.CDCMirrorStatus - (*MirrorStatusResponse)(nil), // 28: peerdb_route.MirrorStatusResponse - (*FlowConnectionConfigs)(nil), // 29: peerdb_flow.FlowConnectionConfigs - (*QRepConfig)(nil), // 30: peerdb_flow.QRepConfig - (*Peer)(nil), // 31: peerdb_peers.Peer - (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp + (*DropPeerRequest)(nil), // 10: peerdb_route.DropPeerRequest + (*DropPeerResponse)(nil), // 11: peerdb_route.DropPeerResponse + (*ValidatePeerResponse)(nil), // 12: peerdb_route.ValidatePeerResponse + (*CreatePeerResponse)(nil), // 13: peerdb_route.CreatePeerResponse + (*MirrorStatusRequest)(nil), // 14: peerdb_route.MirrorStatusRequest + (*PartitionStatus)(nil), // 15: peerdb_route.PartitionStatus + (*QRepMirrorStatus)(nil), // 16: peerdb_route.QRepMirrorStatus + (*CDCSyncStatus)(nil), // 17: peerdb_route.CDCSyncStatus + (*PeerSchemasResponse)(nil), // 18: peerdb_route.PeerSchemasResponse + (*SchemaTablesRequest)(nil), // 19: peerdb_route.SchemaTablesRequest + (*SchemaTablesResponse)(nil), // 20: peerdb_route.SchemaTablesResponse + (*TableColumnsRequest)(nil), // 21: peerdb_route.TableColumnsRequest + (*TableColumnsResponse)(nil), // 22: peerdb_route.TableColumnsResponse + (*PostgresPeerActivityInfoRequest)(nil), // 23: peerdb_route.PostgresPeerActivityInfoRequest + (*SlotInfo)(nil), // 24: peerdb_route.SlotInfo + (*StatInfo)(nil), // 25: peerdb_route.StatInfo + (*PeerSlotResponse)(nil), // 26: peerdb_route.PeerSlotResponse + (*PeerStatResponse)(nil), // 27: peerdb_route.PeerStatResponse + (*SnapshotStatus)(nil), // 28: peerdb_route.SnapshotStatus + (*CDCMirrorStatus)(nil), // 29: peerdb_route.CDCMirrorStatus + (*MirrorStatusResponse)(nil), // 30: peerdb_route.MirrorStatusResponse + (*FlowConnectionConfigs)(nil), // 31: peerdb_flow.FlowConnectionConfigs + (*QRepConfig)(nil), // 32: peerdb_flow.QRepConfig + (*Peer)(nil), // 33: peerdb_peers.Peer + (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp } var file_route_proto_depIdxs = []int32{ - 29, // 0: peerdb_route.CreateCDCFlowRequest.connection_configs:type_name -> peerdb_flow.FlowConnectionConfigs - 30, // 1: peerdb_route.CreateQRepFlowRequest.qrep_config:type_name -> peerdb_flow.QRepConfig - 31, // 2: peerdb_route.ShutdownRequest.source_peer:type_name -> peerdb_peers.Peer - 31, // 3: peerdb_route.ShutdownRequest.destination_peer:type_name -> peerdb_peers.Peer - 31, // 4: peerdb_route.ValidatePeerRequest.peer:type_name -> peerdb_peers.Peer - 31, // 5: peerdb_route.CreatePeerRequest.peer:type_name -> peerdb_peers.Peer + 31, // 0: peerdb_route.CreateCDCFlowRequest.connection_configs:type_name -> peerdb_flow.FlowConnectionConfigs + 32, // 1: peerdb_route.CreateQRepFlowRequest.qrep_config:type_name -> peerdb_flow.QRepConfig + 33, // 2: peerdb_route.ShutdownRequest.source_peer:type_name -> peerdb_peers.Peer + 33, // 3: peerdb_route.ShutdownRequest.destination_peer:type_name -> peerdb_peers.Peer + 33, // 4: peerdb_route.ValidatePeerRequest.peer:type_name -> peerdb_peers.Peer + 33, // 5: peerdb_route.CreatePeerRequest.peer:type_name -> peerdb_peers.Peer 0, // 6: peerdb_route.ValidatePeerResponse.status:type_name -> peerdb_route.ValidatePeerStatus 1, // 7: peerdb_route.CreatePeerResponse.status:type_name -> peerdb_route.CreatePeerStatus - 32, // 8: peerdb_route.PartitionStatus.start_time:type_name -> google.protobuf.Timestamp - 32, // 9: peerdb_route.PartitionStatus.end_time:type_name -> google.protobuf.Timestamp - 30, // 10: peerdb_route.QRepMirrorStatus.config:type_name -> peerdb_flow.QRepConfig - 13, // 11: peerdb_route.QRepMirrorStatus.partitions:type_name -> peerdb_route.PartitionStatus - 32, // 12: peerdb_route.CDCSyncStatus.start_time:type_name -> google.protobuf.Timestamp - 32, // 13: peerdb_route.CDCSyncStatus.end_time:type_name -> google.protobuf.Timestamp - 22, // 14: peerdb_route.PeerSlotResponse.slot_data:type_name -> peerdb_route.SlotInfo - 23, // 15: peerdb_route.PeerStatResponse.stat_data:type_name -> peerdb_route.StatInfo - 14, // 16: peerdb_route.SnapshotStatus.clones:type_name -> peerdb_route.QRepMirrorStatus - 29, // 17: peerdb_route.CDCMirrorStatus.config:type_name -> peerdb_flow.FlowConnectionConfigs - 26, // 18: peerdb_route.CDCMirrorStatus.snapshot_status:type_name -> peerdb_route.SnapshotStatus - 15, // 19: peerdb_route.CDCMirrorStatus.cdc_syncs:type_name -> peerdb_route.CDCSyncStatus - 14, // 20: peerdb_route.MirrorStatusResponse.qrep_status:type_name -> peerdb_route.QRepMirrorStatus - 27, // 21: peerdb_route.MirrorStatusResponse.cdc_status:type_name -> peerdb_route.CDCMirrorStatus + 34, // 8: peerdb_route.PartitionStatus.start_time:type_name -> google.protobuf.Timestamp + 34, // 9: peerdb_route.PartitionStatus.end_time:type_name -> google.protobuf.Timestamp + 32, // 10: peerdb_route.QRepMirrorStatus.config:type_name -> peerdb_flow.QRepConfig + 15, // 11: peerdb_route.QRepMirrorStatus.partitions:type_name -> peerdb_route.PartitionStatus + 34, // 12: peerdb_route.CDCSyncStatus.start_time:type_name -> google.protobuf.Timestamp + 34, // 13: peerdb_route.CDCSyncStatus.end_time:type_name -> google.protobuf.Timestamp + 24, // 14: peerdb_route.PeerSlotResponse.slot_data:type_name -> peerdb_route.SlotInfo + 25, // 15: peerdb_route.PeerStatResponse.stat_data:type_name -> peerdb_route.StatInfo + 16, // 16: peerdb_route.SnapshotStatus.clones:type_name -> peerdb_route.QRepMirrorStatus + 31, // 17: peerdb_route.CDCMirrorStatus.config:type_name -> peerdb_flow.FlowConnectionConfigs + 28, // 18: peerdb_route.CDCMirrorStatus.snapshot_status:type_name -> peerdb_route.SnapshotStatus + 17, // 19: peerdb_route.CDCMirrorStatus.cdc_syncs:type_name -> peerdb_route.CDCSyncStatus + 16, // 20: peerdb_route.MirrorStatusResponse.qrep_status:type_name -> peerdb_route.QRepMirrorStatus + 29, // 21: peerdb_route.MirrorStatusResponse.cdc_status:type_name -> peerdb_route.CDCMirrorStatus 8, // 22: peerdb_route.FlowService.ValidatePeer:input_type -> peerdb_route.ValidatePeerRequest 9, // 23: peerdb_route.FlowService.CreatePeer:input_type -> peerdb_route.CreatePeerRequest - 2, // 24: peerdb_route.FlowService.CreateCDCFlow:input_type -> peerdb_route.CreateCDCFlowRequest - 4, // 25: peerdb_route.FlowService.CreateQRepFlow:input_type -> peerdb_route.CreateQRepFlowRequest - 21, // 26: peerdb_route.FlowService.GetSchemas:input_type -> peerdb_route.PostgresPeerActivityInfoRequest - 17, // 27: peerdb_route.FlowService.GetTablesInSchema:input_type -> peerdb_route.SchemaTablesRequest - 19, // 28: peerdb_route.FlowService.GetColumns:input_type -> peerdb_route.TableColumnsRequest - 21, // 29: peerdb_route.FlowService.GetSlotInfo:input_type -> peerdb_route.PostgresPeerActivityInfoRequest - 21, // 30: peerdb_route.FlowService.GetStatInfo:input_type -> peerdb_route.PostgresPeerActivityInfoRequest - 6, // 31: peerdb_route.FlowService.ShutdownFlow:input_type -> peerdb_route.ShutdownRequest - 12, // 32: peerdb_route.FlowService.MirrorStatus:input_type -> peerdb_route.MirrorStatusRequest - 10, // 33: peerdb_route.FlowService.ValidatePeer:output_type -> peerdb_route.ValidatePeerResponse - 11, // 34: peerdb_route.FlowService.CreatePeer:output_type -> peerdb_route.CreatePeerResponse - 3, // 35: peerdb_route.FlowService.CreateCDCFlow:output_type -> peerdb_route.CreateCDCFlowResponse - 5, // 36: peerdb_route.FlowService.CreateQRepFlow:output_type -> peerdb_route.CreateQRepFlowResponse - 16, // 37: peerdb_route.FlowService.GetSchemas:output_type -> peerdb_route.PeerSchemasResponse - 18, // 38: peerdb_route.FlowService.GetTablesInSchema:output_type -> peerdb_route.SchemaTablesResponse - 20, // 39: peerdb_route.FlowService.GetColumns:output_type -> peerdb_route.TableColumnsResponse - 24, // 40: peerdb_route.FlowService.GetSlotInfo:output_type -> peerdb_route.PeerSlotResponse - 25, // 41: peerdb_route.FlowService.GetStatInfo:output_type -> peerdb_route.PeerStatResponse - 7, // 42: peerdb_route.FlowService.ShutdownFlow:output_type -> peerdb_route.ShutdownResponse - 28, // 43: peerdb_route.FlowService.MirrorStatus:output_type -> peerdb_route.MirrorStatusResponse - 33, // [33:44] is the sub-list for method output_type - 22, // [22:33] is the sub-list for method input_type + 10, // 24: peerdb_route.FlowService.DropPeer:input_type -> peerdb_route.DropPeerRequest + 2, // 25: peerdb_route.FlowService.CreateCDCFlow:input_type -> peerdb_route.CreateCDCFlowRequest + 4, // 26: peerdb_route.FlowService.CreateQRepFlow:input_type -> peerdb_route.CreateQRepFlowRequest + 23, // 27: peerdb_route.FlowService.GetSchemas:input_type -> peerdb_route.PostgresPeerActivityInfoRequest + 19, // 28: peerdb_route.FlowService.GetTablesInSchema:input_type -> peerdb_route.SchemaTablesRequest + 21, // 29: peerdb_route.FlowService.GetColumns:input_type -> peerdb_route.TableColumnsRequest + 23, // 30: peerdb_route.FlowService.GetSlotInfo:input_type -> peerdb_route.PostgresPeerActivityInfoRequest + 23, // 31: peerdb_route.FlowService.GetStatInfo:input_type -> peerdb_route.PostgresPeerActivityInfoRequest + 6, // 32: peerdb_route.FlowService.ShutdownFlow:input_type -> peerdb_route.ShutdownRequest + 14, // 33: peerdb_route.FlowService.MirrorStatus:input_type -> peerdb_route.MirrorStatusRequest + 12, // 34: peerdb_route.FlowService.ValidatePeer:output_type -> peerdb_route.ValidatePeerResponse + 13, // 35: peerdb_route.FlowService.CreatePeer:output_type -> peerdb_route.CreatePeerResponse + 11, // 36: peerdb_route.FlowService.DropPeer:output_type -> peerdb_route.DropPeerResponse + 3, // 37: peerdb_route.FlowService.CreateCDCFlow:output_type -> peerdb_route.CreateCDCFlowResponse + 5, // 38: peerdb_route.FlowService.CreateQRepFlow:output_type -> peerdb_route.CreateQRepFlowResponse + 18, // 39: peerdb_route.FlowService.GetSchemas:output_type -> peerdb_route.PeerSchemasResponse + 20, // 40: peerdb_route.FlowService.GetTablesInSchema:output_type -> peerdb_route.SchemaTablesResponse + 22, // 41: peerdb_route.FlowService.GetColumns:output_type -> peerdb_route.TableColumnsResponse + 26, // 42: peerdb_route.FlowService.GetSlotInfo:output_type -> peerdb_route.PeerSlotResponse + 27, // 43: peerdb_route.FlowService.GetStatInfo:output_type -> peerdb_route.PeerStatResponse + 7, // 44: peerdb_route.FlowService.ShutdownFlow:output_type -> peerdb_route.ShutdownResponse + 30, // 45: peerdb_route.FlowService.MirrorStatus:output_type -> peerdb_route.MirrorStatusResponse + 34, // [34:46] is the sub-list for method output_type + 22, // [22:34] is the sub-list for method input_type 22, // [22:22] is the sub-list for extension type_name 22, // [22:22] is the sub-list for extension extendee 0, // [0:22] is the sub-list for field type_name @@ -2188,7 +2308,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePeerResponse); i { + switch v := v.(*DropPeerRequest); i { case 0: return &v.state case 1: @@ -2200,7 +2320,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreatePeerResponse); i { + switch v := v.(*DropPeerResponse); i { case 0: return &v.state case 1: @@ -2212,7 +2332,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MirrorStatusRequest); i { + switch v := v.(*ValidatePeerResponse); i { case 0: return &v.state case 1: @@ -2224,7 +2344,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartitionStatus); i { + switch v := v.(*CreatePeerResponse); i { case 0: return &v.state case 1: @@ -2236,7 +2356,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QRepMirrorStatus); i { + switch v := v.(*MirrorStatusRequest); i { case 0: return &v.state case 1: @@ -2248,7 +2368,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CDCSyncStatus); i { + switch v := v.(*PartitionStatus); i { case 0: return &v.state case 1: @@ -2260,7 +2380,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerSchemasResponse); i { + switch v := v.(*QRepMirrorStatus); i { case 0: return &v.state case 1: @@ -2272,7 +2392,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SchemaTablesRequest); i { + switch v := v.(*CDCSyncStatus); i { case 0: return &v.state case 1: @@ -2284,7 +2404,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SchemaTablesResponse); i { + switch v := v.(*PeerSchemasResponse); i { case 0: return &v.state case 1: @@ -2296,7 +2416,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsRequest); i { + switch v := v.(*SchemaTablesRequest); i { case 0: return &v.state case 1: @@ -2308,7 +2428,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TableColumnsResponse); i { + switch v := v.(*SchemaTablesResponse); i { case 0: return &v.state case 1: @@ -2320,7 +2440,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PostgresPeerActivityInfoRequest); i { + switch v := v.(*TableColumnsRequest); i { case 0: return &v.state case 1: @@ -2332,7 +2452,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SlotInfo); i { + switch v := v.(*TableColumnsResponse); i { case 0: return &v.state case 1: @@ -2344,7 +2464,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatInfo); i { + switch v := v.(*PostgresPeerActivityInfoRequest); i { case 0: return &v.state case 1: @@ -2356,7 +2476,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerSlotResponse); i { + switch v := v.(*SlotInfo); i { case 0: return &v.state case 1: @@ -2368,7 +2488,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeerStatResponse); i { + switch v := v.(*StatInfo); i { case 0: return &v.state case 1: @@ -2380,7 +2500,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotStatus); i { + switch v := v.(*PeerSlotResponse); i { case 0: return &v.state case 1: @@ -2392,7 +2512,7 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CDCMirrorStatus); i { + switch v := v.(*PeerStatResponse); i { case 0: return &v.state case 1: @@ -2404,6 +2524,30 @@ func file_route_proto_init() { } } file_route_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SnapshotStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_route_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CDCMirrorStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_route_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MirrorStatusResponse); i { case 0: return &v.state @@ -2416,7 +2560,7 @@ func file_route_proto_init() { } } } - file_route_proto_msgTypes[26].OneofWrappers = []interface{}{ + file_route_proto_msgTypes[28].OneofWrappers = []interface{}{ (*MirrorStatusResponse_QrepStatus)(nil), (*MirrorStatusResponse_CdcStatus)(nil), } @@ -2426,7 +2570,7 @@ func file_route_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_route_proto_rawDesc, NumEnums: 2, - NumMessages: 27, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/flow/generated/protos/route.pb.gw.go b/flow/generated/protos/route.pb.gw.go index 8f2266af9..020ba2536 100644 --- a/flow/generated/protos/route.pb.gw.go +++ b/flow/generated/protos/route.pb.gw.go @@ -99,6 +99,40 @@ func local_request_FlowService_CreatePeer_0(ctx context.Context, marshaler runti } +func request_FlowService_DropPeer_0(ctx context.Context, marshaler runtime.Marshaler, client FlowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DropPeerRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DropPeer(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_FlowService_DropPeer_0(ctx context.Context, marshaler runtime.Marshaler, server FlowServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DropPeerRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DropPeer(ctx, &protoReq) + return msg, metadata, err + +} + func request_FlowService_CreateCDCFlow_0(ctx context.Context, marshaler runtime.Marshaler, client FlowServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateCDCFlowRequest var metadata runtime.ServerMetadata @@ -521,6 +555,31 @@ func RegisterFlowServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_FlowService_DropPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/peerdb_route.FlowService/DropPeer", runtime.WithHTTPPathPattern("/v1/peers/drop")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_FlowService_DropPeer_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_FlowService_DropPeer_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_FlowService_CreateCDCFlow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -831,6 +890,28 @@ func RegisterFlowServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux }) + mux.Handle("POST", pattern_FlowService_DropPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/peerdb_route.FlowService/DropPeer", runtime.WithHTTPPathPattern("/v1/peers/drop")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_FlowService_DropPeer_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_FlowService_DropPeer_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_FlowService_CreateCDCFlow_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1037,6 +1118,8 @@ var ( pattern_FlowService_CreatePeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "peers", "create"}, "")) + pattern_FlowService_DropPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "peers", "drop"}, "")) + pattern_FlowService_CreateCDCFlow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "flows", "cdc", "create"}, "")) pattern_FlowService_CreateQRepFlow_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "flows", "qrep", "create"}, "")) @@ -1061,6 +1144,8 @@ var ( forward_FlowService_CreatePeer_0 = runtime.ForwardResponseMessage + forward_FlowService_DropPeer_0 = runtime.ForwardResponseMessage + forward_FlowService_CreateCDCFlow_0 = runtime.ForwardResponseMessage forward_FlowService_CreateQRepFlow_0 = runtime.ForwardResponseMessage diff --git a/flow/generated/protos/route_grpc.pb.go b/flow/generated/protos/route_grpc.pb.go index 23a597d9a..05136fecc 100644 --- a/flow/generated/protos/route_grpc.pb.go +++ b/flow/generated/protos/route_grpc.pb.go @@ -21,6 +21,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( FlowService_ValidatePeer_FullMethodName = "/peerdb_route.FlowService/ValidatePeer" FlowService_CreatePeer_FullMethodName = "/peerdb_route.FlowService/CreatePeer" + FlowService_DropPeer_FullMethodName = "/peerdb_route.FlowService/DropPeer" FlowService_CreateCDCFlow_FullMethodName = "/peerdb_route.FlowService/CreateCDCFlow" FlowService_CreateQRepFlow_FullMethodName = "/peerdb_route.FlowService/CreateQRepFlow" FlowService_GetSchemas_FullMethodName = "/peerdb_route.FlowService/GetSchemas" @@ -38,6 +39,7 @@ const ( type FlowServiceClient interface { ValidatePeer(ctx context.Context, in *ValidatePeerRequest, opts ...grpc.CallOption) (*ValidatePeerResponse, error) CreatePeer(ctx context.Context, in *CreatePeerRequest, opts ...grpc.CallOption) (*CreatePeerResponse, error) + DropPeer(ctx context.Context, in *DropPeerRequest, opts ...grpc.CallOption) (*DropPeerResponse, error) CreateCDCFlow(ctx context.Context, in *CreateCDCFlowRequest, opts ...grpc.CallOption) (*CreateCDCFlowResponse, error) CreateQRepFlow(ctx context.Context, in *CreateQRepFlowRequest, opts ...grpc.CallOption) (*CreateQRepFlowResponse, error) GetSchemas(ctx context.Context, in *PostgresPeerActivityInfoRequest, opts ...grpc.CallOption) (*PeerSchemasResponse, error) @@ -75,6 +77,15 @@ func (c *flowServiceClient) CreatePeer(ctx context.Context, in *CreatePeerReques return out, nil } +func (c *flowServiceClient) DropPeer(ctx context.Context, in *DropPeerRequest, opts ...grpc.CallOption) (*DropPeerResponse, error) { + out := new(DropPeerResponse) + err := c.cc.Invoke(ctx, FlowService_DropPeer_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *flowServiceClient) CreateCDCFlow(ctx context.Context, in *CreateCDCFlowRequest, opts ...grpc.CallOption) (*CreateCDCFlowResponse, error) { out := new(CreateCDCFlowResponse) err := c.cc.Invoke(ctx, FlowService_CreateCDCFlow_FullMethodName, in, out, opts...) @@ -162,6 +173,7 @@ func (c *flowServiceClient) MirrorStatus(ctx context.Context, in *MirrorStatusRe type FlowServiceServer interface { ValidatePeer(context.Context, *ValidatePeerRequest) (*ValidatePeerResponse, error) CreatePeer(context.Context, *CreatePeerRequest) (*CreatePeerResponse, error) + DropPeer(context.Context, *DropPeerRequest) (*DropPeerResponse, error) CreateCDCFlow(context.Context, *CreateCDCFlowRequest) (*CreateCDCFlowResponse, error) CreateQRepFlow(context.Context, *CreateQRepFlowRequest) (*CreateQRepFlowResponse, error) GetSchemas(context.Context, *PostgresPeerActivityInfoRequest) (*PeerSchemasResponse, error) @@ -184,6 +196,9 @@ func (UnimplementedFlowServiceServer) ValidatePeer(context.Context, *ValidatePee func (UnimplementedFlowServiceServer) CreatePeer(context.Context, *CreatePeerRequest) (*CreatePeerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreatePeer not implemented") } +func (UnimplementedFlowServiceServer) DropPeer(context.Context, *DropPeerRequest) (*DropPeerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DropPeer not implemented") +} func (UnimplementedFlowServiceServer) CreateCDCFlow(context.Context, *CreateCDCFlowRequest) (*CreateCDCFlowResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateCDCFlow not implemented") } @@ -260,6 +275,24 @@ func _FlowService_CreatePeer_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _FlowService_DropPeer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DropPeerRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FlowServiceServer).DropPeer(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: FlowService_DropPeer_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FlowServiceServer).DropPeer(ctx, req.(*DropPeerRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _FlowService_CreateCDCFlow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateCDCFlowRequest) if err := dec(in); err != nil { @@ -437,6 +470,10 @@ var FlowService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreatePeer", Handler: _FlowService_CreatePeer_Handler, }, + { + MethodName: "DropPeer", + Handler: _FlowService_DropPeer_Handler, + }, { MethodName: "CreateCDCFlow", Handler: _FlowService_CreateCDCFlow_Handler, diff --git a/nexus/analyzer/src/lib.rs b/nexus/analyzer/src/lib.rs index 0525767d6..a06abb34a 100644 --- a/nexus/analyzer/src/lib.rs +++ b/nexus/analyzer/src/lib.rs @@ -104,6 +104,10 @@ pub enum PeerDDL { peer: Box, if_not_exists: bool, }, + DropPeer { + peer_name: String, + if_exists: bool, + }, CreateMirrorForCDC { if_not_exists: bool, flow_job: FlowJob, @@ -154,12 +158,8 @@ impl<'a> StatementAnalyzer for PeerDDLAnalyzer<'a> { let mut flow_job_table_mappings = vec![]; for table_mapping in &cdc.mapping_options { flow_job_table_mappings.push(FlowJobTableMapping { - source_table_identifier: table_mapping - .source - .to_string(), - destination_table_identifier: table_mapping - .destination - .to_string(), + source_table_identifier: table_mapping.source.to_string(), + destination_table_identifier: table_mapping.destination.to_string(), partition_key: table_mapping .partition_key .clone() @@ -371,6 +371,13 @@ impl<'a> StatementAnalyzer for PeerDDLAnalyzer<'a> { if_exists: *if_exists, flow_job_name: mirror_name.to_string().to_lowercase(), })), + Statement::DropPeer { + if_exists, + peer_name, + } => Ok(Some(PeerDDL::DropPeer { + if_exists: *if_exists, + peer_name: peer_name.to_string().to_lowercase(), + })), _ => Ok(None), } } diff --git a/nexus/catalog/src/lib.rs b/nexus/catalog/src/lib.rs index eaafc3619..fb4c94296 100644 --- a/nexus/catalog/src/lib.rs +++ b/nexus/catalog/src/lib.rs @@ -564,4 +564,13 @@ impl Catalog { } Ok(()) } + + pub async fn check_peer_entry(&self, peer_name: &str) -> anyhow::Result { + let peer_check = self + .pg + .query_one("SELECT COUNT(*) FROM PEERS WHERE NAME = $1", &[&peer_name]) + .await?; + let peer_count: i64 = peer_check.get(0); + Ok(peer_count) + } } diff --git a/nexus/flow-rs/src/grpc.rs b/nexus/flow-rs/src/grpc.rs index 212d282f9..cc4a6153f 100644 --- a/nexus/flow-rs/src/grpc.rs +++ b/nexus/flow-rs/src/grpc.rs @@ -81,7 +81,7 @@ impl FlowGrpcClient { ) -> anyhow::Result { let create_qrep_flow_req = pt::peerdb_route::CreateQRepFlowRequest { qrep_config: Some(qrep_config.clone()), - create_catalog_entry:false + create_catalog_entry: false, }; let response = self.client.create_q_rep_flow(create_qrep_flow_req).await?; let workflow_id = response.into_inner().worflow_id; @@ -142,6 +142,22 @@ impl FlowGrpcClient { } } + pub async fn drop_peer(&mut self, peer_name: &str) -> anyhow::Result<()> { + let drop_peer_req = pt::peerdb_route::DropPeerRequest { + peer_name: String::from(peer_name), + }; + let response = self.client.drop_peer(drop_peer_req).await?; + let drop_response = response.into_inner(); + if drop_response.ok { + Ok(()) + } else { + Err(anyhow::anyhow!(format!( + "failed to drop peer: {:?}", + drop_response.error_message + ))) + } + } + pub async fn start_peer_flow_job( &mut self, job: &FlowJob, diff --git a/nexus/pt/src/peerdb_flow.rs b/nexus/pt/src/peerdb_flow.rs index 9407c796d..2a2cb7e49 100644 --- a/nexus/pt/src/peerdb_flow.rs +++ b/nexus/pt/src/peerdb_flow.rs @@ -2,422 +2,429 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableNameMapping { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub source_table_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub destination_table_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RelationMessageColumn { - #[prost(uint32, tag="1")] + #[prost(uint32, tag = "1")] pub flags: u32, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub name: ::prost::alloc::string::String, - #[prost(uint32, tag="3")] + #[prost(uint32, tag = "3")] pub data_type: u32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RelationMessage { - #[prost(uint32, tag="1")] + #[prost(uint32, tag = "1")] pub relation_id: u32, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub relation_name: ::prost::alloc::string::String, - #[prost(message, repeated, tag="3")] + #[prost(message, repeated, tag = "3")] pub columns: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableMapping { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub source_table_identifier: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub destination_table_identifier: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub partition_key: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct FlowConnectionConfigs { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub source: ::core::option::Option, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub destination: ::core::option::Option, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(message, optional, tag="4")] + #[prost(message, optional, tag = "4")] pub table_schema: ::core::option::Option, - #[prost(message, repeated, tag="5")] + #[prost(message, repeated, tag = "5")] pub table_mappings: ::prost::alloc::vec::Vec, - #[prost(map="uint32, string", tag="6")] + #[prost(map = "uint32, string", tag = "6")] pub src_table_id_name_mapping: ::std::collections::HashMap, - #[prost(map="string, message", tag="7")] - pub table_name_schema_mapping: ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, + #[prost(map = "string, message", tag = "7")] + pub table_name_schema_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, /// This is an optional peer that will be used to hold metadata in cases where /// the destination isn't ideal for holding metadata. - #[prost(message, optional, tag="8")] + #[prost(message, optional, tag = "8")] pub metadata_peer: ::core::option::Option, - #[prost(uint32, tag="9")] + #[prost(uint32, tag = "9")] pub max_batch_size: u32, - #[prost(bool, tag="10")] + #[prost(bool, tag = "10")] pub do_initial_copy: bool, - #[prost(string, tag="11")] + #[prost(string, tag = "11")] pub publication_name: ::prost::alloc::string::String, - #[prost(uint32, tag="12")] + #[prost(uint32, tag = "12")] pub snapshot_num_rows_per_partition: u32, /// max parallel workers is per table - #[prost(uint32, tag="13")] + #[prost(uint32, tag = "13")] pub snapshot_max_parallel_workers: u32, - #[prost(uint32, tag="14")] + #[prost(uint32, tag = "14")] pub snapshot_num_tables_in_parallel: u32, - #[prost(enumeration="QRepSyncMode", tag="15")] + #[prost(enumeration = "QRepSyncMode", tag = "15")] pub snapshot_sync_mode: i32, - #[prost(enumeration="QRepSyncMode", tag="16")] + #[prost(enumeration = "QRepSyncMode", tag = "16")] pub cdc_sync_mode: i32, - #[prost(string, tag="17")] + #[prost(string, tag = "17")] pub snapshot_staging_path: ::prost::alloc::string::String, - #[prost(string, tag="18")] + #[prost(string, tag = "18")] pub cdc_staging_path: ::prost::alloc::string::String, /// currently only works for snowflake - #[prost(bool, tag="19")] + #[prost(bool, tag = "19")] pub soft_delete: bool, - #[prost(string, tag="20")] + #[prost(string, tag = "20")] pub replication_slot_name: ::prost::alloc::string::String, /// the below two are for eventhub only - #[prost(int64, tag="21")] + #[prost(int64, tag = "21")] pub push_batch_size: i64, - #[prost(int64, tag="22")] + #[prost(int64, tag = "22")] pub push_parallelism: i64, /// if true, then the flow will be resynced - #[prost(bool, tag="23")] + #[prost(bool, tag = "23")] pub resync: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RenameTableOption { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub current_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub new_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RenameTablesInput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub peer: ::core::option::Option, - #[prost(message, repeated, tag="3")] + #[prost(message, repeated, tag = "3")] pub rename_table_options: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct RenameTablesOutput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_job_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SyncFlowOptions { - #[prost(int32, tag="1")] + #[prost(int32, tag = "1")] pub batch_size: i32, - #[prost(map="uint32, message", tag="2")] + #[prost(map = "uint32, message", tag = "2")] pub relation_message_mapping: ::std::collections::HashMap, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct NormalizeFlowOptions { - #[prost(int32, tag="1")] + #[prost(int32, tag = "1")] pub batch_size: i32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct LastSyncState { - #[prost(int64, tag="1")] + #[prost(int64, tag = "1")] pub checkpoint: i64, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub last_synced_at: ::core::option::Option<::pbjson_types::Timestamp>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StartFlowInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub last_sync_state: ::core::option::Option, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub flow_connection_configs: ::core::option::Option, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub sync_flow_options: ::core::option::Option, - #[prost(map="uint32, message", tag="4")] + #[prost(map = "uint32, message", tag = "4")] pub relation_message_mapping: ::std::collections::HashMap, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StartNormalizeInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub flow_connection_configs: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetLastSyncedIdInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EnsurePullabilityInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub source_table_identifier: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EnsurePullabilityBatchInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(string, repeated, tag="3")] + #[prost(string, repeated, tag = "3")] pub source_table_identifiers: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PostgresTableIdentifier { - #[prost(uint32, tag="1")] + #[prost(uint32, tag = "1")] pub rel_id: u32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableIdentifier { - #[prost(oneof="table_identifier::TableIdentifier", tags="1")] + #[prost(oneof = "table_identifier::TableIdentifier", tags = "1")] pub table_identifier: ::core::option::Option, } /// Nested message and enum types in `TableIdentifier`. pub mod table_identifier { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum TableIdentifier { - #[prost(message, tag="1")] + #[prost(message, tag = "1")] PostgresTableIdentifier(super::PostgresTableIdentifier), } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EnsurePullabilityOutput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub table_identifier: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EnsurePullabilityBatchOutput { - #[prost(map="string, message", tag="1")] - pub table_identifier_mapping: ::std::collections::HashMap<::prost::alloc::string::String, TableIdentifier>, + #[prost(map = "string, message", tag = "1")] + pub table_identifier_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, TableIdentifier>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupReplicationInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(map="string, string", tag="3")] - pub table_name_mapping: ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + #[prost(map = "string, string", tag = "3")] + pub table_name_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, /// replicate to destination using ctid - #[prost(message, optional, tag="4")] + #[prost(message, optional, tag = "4")] pub destination_peer: ::core::option::Option, - #[prost(bool, tag="5")] + #[prost(bool, tag = "5")] pub do_initial_copy: bool, - #[prost(string, tag="6")] + #[prost(string, tag = "6")] pub existing_publication_name: ::prost::alloc::string::String, - #[prost(string, tag="7")] + #[prost(string, tag = "7")] pub existing_replication_slot_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupReplicationOutput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub slot_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub snapshot_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateRawTableInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(map="string, string", tag="3")] - pub table_name_mapping: ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, - #[prost(enumeration="QRepSyncMode", tag="4")] + #[prost(map = "string, string", tag = "3")] + pub table_name_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + #[prost(enumeration = "QRepSyncMode", tag = "4")] pub cdc_sync_mode: i32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateRawTableOutput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub table_identifier: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableSchema { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub table_identifier: ::prost::alloc::string::String, /// list of column names and types, types can be one of the following: /// "string", "int", "float", "bool", "timestamp". - #[prost(map="string, string", tag="2")] - pub columns: ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, - #[prost(string, repeated, tag="3")] + #[prost(map = "string, string", tag = "2")] + pub columns: + ::std::collections::HashMap<::prost::alloc::string::String, ::prost::alloc::string::String>, + #[prost(string, repeated, tag = "3")] pub primary_key_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, - #[prost(bool, tag="4")] + #[prost(bool, tag = "4")] pub is_replica_identity_full: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetTableSchemaBatchInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, repeated, tag="2")] + #[prost(string, repeated, tag = "2")] pub table_identifiers: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct GetTableSchemaBatchOutput { - #[prost(map="string, message", tag="1")] - pub table_name_schema_mapping: ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, + #[prost(map = "string, message", tag = "1")] + pub table_name_schema_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupNormalizedTableInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub table_identifier: ::prost::alloc::string::String, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub source_table_schema: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupNormalizedTableBatchInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer_connection_config: ::core::option::Option, - #[prost(map="string, message", tag="2")] - pub table_name_schema_mapping: ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, + #[prost(map = "string, message", tag = "2")] + pub table_name_schema_mapping: + ::std::collections::HashMap<::prost::alloc::string::String, TableSchema>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupNormalizedTableOutput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub table_identifier: ::prost::alloc::string::String, - #[prost(bool, tag="2")] + #[prost(bool, tag = "2")] pub already_exists: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SetupNormalizedTableBatchOutput { - #[prost(map="string, bool", tag="1")] + #[prost(map = "string, bool", tag = "1")] pub table_exists_mapping: ::std::collections::HashMap<::prost::alloc::string::String, bool>, } /// partition ranges [start, end] inclusive #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct IntPartitionRange { - #[prost(int64, tag="1")] + #[prost(int64, tag = "1")] pub start: i64, - #[prost(int64, tag="2")] + #[prost(int64, tag = "2")] pub end: i64, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TimestampPartitionRange { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub start: ::core::option::Option<::pbjson_types::Timestamp>, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub end: ::core::option::Option<::pbjson_types::Timestamp>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Tid { - #[prost(uint32, tag="1")] + #[prost(uint32, tag = "1")] pub block_number: u32, - #[prost(uint32, tag="2")] + #[prost(uint32, tag = "2")] pub offset_number: u32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TidPartitionRange { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub start: ::core::option::Option, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub end: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PartitionRange { /// can be a timestamp range or an integer range - #[prost(oneof="partition_range::Range", tags="1, 2, 3")] + #[prost(oneof = "partition_range::Range", tags = "1, 2, 3")] pub range: ::core::option::Option, } /// Nested message and enum types in `PartitionRange`. pub mod partition_range { /// can be a timestamp range or an integer range #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Range { - #[prost(message, tag="1")] + #[prost(message, tag = "1")] IntRange(super::IntPartitionRange), - #[prost(message, tag="2")] + #[prost(message, tag = "2")] TimestampRange(super::TimestampPartitionRange), - #[prost(message, tag="3")] + #[prost(message, tag = "3")] TidRange(super::TidPartitionRange), } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepWriteMode { - #[prost(enumeration="QRepWriteType", tag="1")] + #[prost(enumeration = "QRepWriteType", tag = "1")] pub write_type: i32, - #[prost(string, repeated, tag="2")] + #[prost(string, repeated, tag = "2")] pub upsert_key_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub source_peer: ::core::option::Option, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub destination_peer: ::core::option::Option, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub destination_table_identifier: ::prost::alloc::string::String, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub query: ::prost::alloc::string::String, - #[prost(string, tag="6")] + #[prost(string, tag = "6")] pub watermark_table: ::prost::alloc::string::String, - #[prost(string, tag="7")] + #[prost(string, tag = "7")] pub watermark_column: ::prost::alloc::string::String, - #[prost(bool, tag="8")] + #[prost(bool, tag = "8")] pub initial_copy_only: bool, - #[prost(enumeration="QRepSyncMode", tag="9")] + #[prost(enumeration = "QRepSyncMode", tag = "9")] pub sync_mode: i32, /// DEPRECATED: eliminate when breaking changes are allowed. - #[prost(uint32, tag="10")] + #[prost(uint32, tag = "10")] pub batch_size_int: u32, /// DEPRECATED: eliminate when breaking changes are allowed. - #[prost(uint32, tag="11")] + #[prost(uint32, tag = "11")] pub batch_duration_seconds: u32, - #[prost(uint32, tag="12")] + #[prost(uint32, tag = "12")] pub max_parallel_workers: u32, /// time to wait between getting partitions to process - #[prost(uint32, tag="13")] + #[prost(uint32, tag = "13")] pub wait_between_batches_seconds: u32, - #[prost(message, optional, tag="14")] + #[prost(message, optional, tag = "14")] pub write_mode: ::core::option::Option, /// This is only used when sync_mode is AVRO /// this is the location where the avro files will be written @@ -425,71 +432,71 @@ pub struct QRepConfig { /// if this starts with s3:// then it will be written to S3 /// if nothing is specified then it will be written to local disk /// if using GCS or S3 make sure your instance has the correct permissions. - #[prost(string, tag="15")] + #[prost(string, tag = "15")] pub staging_path: ::prost::alloc::string::String, /// This setting overrides batch_size_int and batch_duration_seconds /// and instead uses the number of rows per partition to determine /// how many rows to process per batch. - #[prost(uint32, tag="16")] + #[prost(uint32, tag = "16")] pub num_rows_per_partition: u32, /// Creates the watermark table on the destination as-is, can be used for some queries. - #[prost(bool, tag="17")] + #[prost(bool, tag = "17")] pub setup_watermark_table_on_destination: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepPartition { - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub partition_id: ::prost::alloc::string::String, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub range: ::core::option::Option, - #[prost(bool, tag="4")] + #[prost(bool, tag = "4")] pub full_table_partition: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepPartitionBatch { - #[prost(int32, tag="1")] + #[prost(int32, tag = "1")] pub batch_id: i32, - #[prost(message, repeated, tag="2")] + #[prost(message, repeated, tag = "2")] pub partitions: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepParitionResult { - #[prost(message, repeated, tag="1")] + #[prost(message, repeated, tag = "1")] pub partitions: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DropFlowInput { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct DeltaAddedColumn { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub column_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub column_type: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableSchemaDelta { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub src_table_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub dst_table_name: ::prost::alloc::string::String, - #[prost(message, repeated, tag="3")] + #[prost(message, repeated, tag = "3")] pub added_columns: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ReplayTableSchemaDeltaInput { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub flow_connection_configs: ::core::option::Option, - #[prost(message, repeated, tag="2")] + #[prost(message, repeated, tag = "2")] pub table_schema_deltas: ::prost::alloc::vec::Vec, } /// protos for qrep @@ -550,4 +557,4 @@ impl QRepWriteType { } } include!("peerdb_flow.serde.rs"); -// @@protoc_insertion_point(module) \ No newline at end of file +// @@protoc_insertion_point(module) diff --git a/nexus/pt/src/peerdb_peers.rs b/nexus/pt/src/peerdb_peers.rs index f8a304b14..6bff1325f 100644 --- a/nexus/pt/src/peerdb_peers.rs +++ b/nexus/pt/src/peerdb_peers.rs @@ -2,176 +2,176 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SnowflakeConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub account_id: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub username: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub private_key: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub database: ::prost::alloc::string::String, - #[prost(string, tag="6")] + #[prost(string, tag = "6")] pub warehouse: ::prost::alloc::string::String, - #[prost(string, tag="7")] + #[prost(string, tag = "7")] pub role: ::prost::alloc::string::String, - #[prost(uint64, tag="8")] + #[prost(uint64, tag = "8")] pub query_timeout: u64, - #[prost(string, tag="9")] + #[prost(string, tag = "9")] pub s3_integration: ::prost::alloc::string::String, - #[prost(string, optional, tag="10")] + #[prost(string, optional, tag = "10")] pub password: ::core::option::Option<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct BigqueryConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub auth_type: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub project_id: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub private_key_id: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub private_key: ::prost::alloc::string::String, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub client_email: ::prost::alloc::string::String, - #[prost(string, tag="6")] + #[prost(string, tag = "6")] pub client_id: ::prost::alloc::string::String, - #[prost(string, tag="7")] + #[prost(string, tag = "7")] pub auth_uri: ::prost::alloc::string::String, - #[prost(string, tag="8")] + #[prost(string, tag = "8")] pub token_uri: ::prost::alloc::string::String, - #[prost(string, tag="9")] + #[prost(string, tag = "9")] pub auth_provider_x509_cert_url: ::prost::alloc::string::String, - #[prost(string, tag="10")] + #[prost(string, tag = "10")] pub client_x509_cert_url: ::prost::alloc::string::String, - #[prost(string, tag="11")] + #[prost(string, tag = "11")] pub dataset_id: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MongoConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub username: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub password: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub clusterurl: ::prost::alloc::string::String, - #[prost(int32, tag="4")] + #[prost(int32, tag = "4")] pub clusterport: i32, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub database: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PostgresConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub host: ::prost::alloc::string::String, - #[prost(uint32, tag="2")] + #[prost(uint32, tag = "2")] pub port: u32, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub user: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub password: ::prost::alloc::string::String, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub database: ::prost::alloc::string::String, /// this is used only in query replication mode right now. - #[prost(string, tag="6")] + #[prost(string, tag = "6")] pub transaction_snapshot: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventHubConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub namespace: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub resource_group: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub location: ::prost::alloc::string::String, - #[prost(message, optional, tag="4")] + #[prost(message, optional, tag = "4")] pub metadata_db: ::core::option::Option, /// if this is empty PeerDB uses `AZURE_SUBSCRIPTION_ID` environment variable. - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub subscription_id: ::prost::alloc::string::String, /// defaults to 3 - #[prost(uint32, tag="6")] + #[prost(uint32, tag = "6")] pub partition_count: u32, /// defaults to 7 - #[prost(uint32, tag="7")] + #[prost(uint32, tag = "7")] pub message_retention_in_days: u32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct EventHubGroupConfig { /// event hub peer name to event hub config - #[prost(map="string, message", tag="1")] + #[prost(map = "string, message", tag = "1")] pub eventhubs: ::std::collections::HashMap<::prost::alloc::string::String, EventHubConfig>, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub metadata_db: ::core::option::Option, - #[prost(string, repeated, tag="3")] + #[prost(string, repeated, tag = "3")] pub unnest_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct S3Config { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub url: ::prost::alloc::string::String, - #[prost(string, optional, tag="2")] + #[prost(string, optional, tag = "2")] pub access_key_id: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag="3")] + #[prost(string, optional, tag = "3")] pub secret_access_key: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag="4")] + #[prost(string, optional, tag = "4")] pub role_arn: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag="5")] + #[prost(string, optional, tag = "5")] pub region: ::core::option::Option<::prost::alloc::string::String>, - #[prost(string, optional, tag="6")] + #[prost(string, optional, tag = "6")] pub endpoint: ::core::option::Option<::prost::alloc::string::String>, - #[prost(message, optional, tag="7")] + #[prost(message, optional, tag = "7")] pub metadata_db: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SqlServerConfig { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub server: ::prost::alloc::string::String, - #[prost(uint32, tag="2")] + #[prost(uint32, tag = "2")] pub port: u32, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub user: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub password: ::prost::alloc::string::String, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub database: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct Peer { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub name: ::prost::alloc::string::String, - #[prost(enumeration="DbType", tag="2")] + #[prost(enumeration = "DbType", tag = "2")] pub r#type: i32, - #[prost(oneof="peer::Config", tags="3, 4, 5, 6, 7, 8, 9, 10")] + #[prost(oneof = "peer::Config", tags = "3, 4, 5, 6, 7, 8, 9, 10")] pub config: ::core::option::Option, } /// Nested message and enum types in `Peer`. pub mod peer { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Config { - #[prost(message, tag="3")] + #[prost(message, tag = "3")] SnowflakeConfig(super::SnowflakeConfig), - #[prost(message, tag="4")] + #[prost(message, tag = "4")] BigqueryConfig(super::BigqueryConfig), - #[prost(message, tag="5")] + #[prost(message, tag = "5")] MongoConfig(super::MongoConfig), - #[prost(message, tag="6")] + #[prost(message, tag = "6")] PostgresConfig(super::PostgresConfig), - #[prost(message, tag="7")] + #[prost(message, tag = "7")] EventhubConfig(super::EventHubConfig), - #[prost(message, tag="8")] + #[prost(message, tag = "8")] S3Config(super::S3Config), - #[prost(message, tag="9")] + #[prost(message, tag = "9")] SqlserverConfig(super::SqlServerConfig), - #[prost(message, tag="10")] + #[prost(message, tag = "10")] EventhubGroupConfig(super::EventHubGroupConfig), } } @@ -220,4 +220,4 @@ impl DbType { } } include!("peerdb_peers.serde.rs"); -// @@protoc_insertion_point(module) \ No newline at end of file +// @@protoc_insertion_point(module) diff --git a/nexus/pt/src/peerdb_route.rs b/nexus/pt/src/peerdb_route.rs index a618c400f..47b35d838 100644 --- a/nexus/pt/src/peerdb_route.rs +++ b/nexus/pt/src/peerdb_route.rs @@ -2,239 +2,253 @@ #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateCdcFlowRequest { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub connection_configs: ::core::option::Option, - #[prost(bool, tag="2")] + #[prost(bool, tag = "2")] pub create_catalog_entry: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateCdcFlowResponse { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub worflow_id: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateQRepFlowRequest { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub qrep_config: ::core::option::Option, - #[prost(bool, tag="2")] + #[prost(bool, tag = "2")] pub create_catalog_entry: bool, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreateQRepFlowResponse { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub worflow_id: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ShutdownRequest { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub workflow_id: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub source_peer: ::core::option::Option, - #[prost(message, optional, tag="4")] + #[prost(message, optional, tag = "4")] pub destination_peer: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ShutdownResponse { - #[prost(bool, tag="1")] + #[prost(bool, tag = "1")] pub ok: bool, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub error_message: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct ValidatePeerRequest { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreatePeerRequest { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub peer: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct DropPeerRequest { + #[prost(string, tag = "1")] + pub peer_name: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DropPeerResponse { + #[prost(bool, tag = "1")] + pub ok: bool, + #[prost(string, tag = "2")] + pub error_message: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ValidatePeerResponse { - #[prost(enumeration="ValidatePeerStatus", tag="1")] + #[prost(enumeration = "ValidatePeerStatus", tag = "1")] pub status: i32, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CreatePeerResponse { - #[prost(enumeration="CreatePeerStatus", tag="1")] + #[prost(enumeration = "CreatePeerStatus", tag = "1")] pub status: i32, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub message: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MirrorStatusRequest { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_job_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PartitionStatus { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub partition_id: ::prost::alloc::string::String, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub start_time: ::core::option::Option<::pbjson_types::Timestamp>, - #[prost(message, optional, tag="3")] + #[prost(message, optional, tag = "3")] pub end_time: ::core::option::Option<::pbjson_types::Timestamp>, - #[prost(int32, tag="4")] + #[prost(int32, tag = "4")] pub num_rows: i32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct QRepMirrorStatus { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub config: ::core::option::Option, /// TODO make note to see if we are still in initial copy /// or if we are in the continuous streaming mode. - #[prost(message, repeated, tag="2")] + #[prost(message, repeated, tag = "2")] pub partitions: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CdcSyncStatus { - #[prost(int64, tag="1")] + #[prost(int64, tag = "1")] pub start_lsn: i64, - #[prost(int64, tag="2")] + #[prost(int64, tag = "2")] pub end_lsn: i64, - #[prost(int32, tag="3")] + #[prost(int32, tag = "3")] pub num_rows: i32, - #[prost(message, optional, tag="4")] + #[prost(message, optional, tag = "4")] pub start_time: ::core::option::Option<::pbjson_types::Timestamp>, - #[prost(message, optional, tag="5")] + #[prost(message, optional, tag = "5")] pub end_time: ::core::option::Option<::pbjson_types::Timestamp>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PeerSchemasResponse { - #[prost(string, repeated, tag="1")] + #[prost(string, repeated, tag = "1")] pub schemas: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SchemaTablesRequest { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub peer_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub schema_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SchemaTablesResponse { - #[prost(string, repeated, tag="1")] + #[prost(string, repeated, tag = "1")] pub tables: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableColumnsRequest { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub peer_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub schema_name: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub table_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TableColumnsResponse { - #[prost(string, repeated, tag="1")] + #[prost(string, repeated, tag = "1")] pub columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PostgresPeerActivityInfoRequest { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub peer_name: ::prost::alloc::string::String, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SlotInfo { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub slot_name: ::prost::alloc::string::String, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub redo_l_sn: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub restart_l_sn: ::prost::alloc::string::String, - #[prost(bool, tag="4")] + #[prost(bool, tag = "4")] pub active: bool, - #[prost(float, tag="5")] + #[prost(float, tag = "5")] pub lag_in_mb: f32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct StatInfo { - #[prost(int64, tag="1")] + #[prost(int64, tag = "1")] pub pid: i64, - #[prost(string, tag="2")] + #[prost(string, tag = "2")] pub wait_event: ::prost::alloc::string::String, - #[prost(string, tag="3")] + #[prost(string, tag = "3")] pub wait_event_type: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub query_start: ::prost::alloc::string::String, - #[prost(string, tag="5")] + #[prost(string, tag = "5")] pub query: ::prost::alloc::string::String, - #[prost(float, tag="6")] + #[prost(float, tag = "6")] pub duration: f32, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PeerSlotResponse { - #[prost(message, repeated, tag="1")] + #[prost(message, repeated, tag = "1")] pub slot_data: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct PeerStatResponse { - #[prost(message, repeated, tag="1")] + #[prost(message, repeated, tag = "1")] pub stat_data: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SnapshotStatus { - #[prost(message, repeated, tag="1")] + #[prost(message, repeated, tag = "1")] pub clones: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct CdcMirrorStatus { - #[prost(message, optional, tag="1")] + #[prost(message, optional, tag = "1")] pub config: ::core::option::Option, - #[prost(message, optional, tag="2")] + #[prost(message, optional, tag = "2")] pub snapshot_status: ::core::option::Option, - #[prost(message, repeated, tag="3")] + #[prost(message, repeated, tag = "3")] pub cdc_syncs: ::prost::alloc::vec::Vec, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct MirrorStatusResponse { - #[prost(string, tag="1")] + #[prost(string, tag = "1")] pub flow_job_name: ::prost::alloc::string::String, - #[prost(string, tag="4")] + #[prost(string, tag = "4")] pub error_message: ::prost::alloc::string::String, - #[prost(oneof="mirror_status_response::Status", tags="2, 3")] + #[prost(oneof = "mirror_status_response::Status", tags = "2, 3")] pub status: ::core::option::Option, } /// Nested message and enum types in `MirrorStatusResponse`. pub mod mirror_status_response { #[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, ::prost::Oneof)] pub enum Status { - #[prost(message, tag="2")] + #[prost(message, tag = "2")] QrepStatus(super::QRepMirrorStatus), - #[prost(message, tag="3")] + #[prost(message, tag = "3")] CdcStatus(super::CdcMirrorStatus), } } @@ -298,4 +312,4 @@ impl CreatePeerStatus { } include!("peerdb_route.tonic.rs"); include!("peerdb_route.serde.rs"); -// @@protoc_insertion_point(module) \ No newline at end of file +// @@protoc_insertion_point(module) diff --git a/nexus/pt/src/peerdb_route.serde.rs b/nexus/pt/src/peerdb_route.serde.rs index 86115e95c..494216718 100644 --- a/nexus/pt/src/peerdb_route.serde.rs +++ b/nexus/pt/src/peerdb_route.serde.rs @@ -1009,6 +1009,215 @@ impl<'de> serde::Deserialize<'de> for CreateQRepFlowResponse { deserializer.deserialize_struct("peerdb_route.CreateQRepFlowResponse", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for DropPeerRequest { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if !self.peer_name.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("peerdb_route.DropPeerRequest", len)?; + if !self.peer_name.is_empty() { + struct_ser.serialize_field("peerName", &self.peer_name)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for DropPeerRequest { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "peer_name", + "peerName", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + PeerName, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "peerName" | "peer_name" => Ok(GeneratedField::PeerName), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = DropPeerRequest; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct peerdb_route.DropPeerRequest") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut peer_name__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::PeerName => { + if peer_name__.is_some() { + return Err(serde::de::Error::duplicate_field("peerName")); + } + peer_name__ = Some(map.next_value()?); + } + GeneratedField::__SkipField__ => { + let _ = map.next_value::()?; + } + } + } + Ok(DropPeerRequest { + peer_name: peer_name__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("peerdb_route.DropPeerRequest", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for DropPeerResponse { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.ok { + len += 1; + } + if !self.error_message.is_empty() { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("peerdb_route.DropPeerResponse", len)?; + if self.ok { + struct_ser.serialize_field("ok", &self.ok)?; + } + if !self.error_message.is_empty() { + struct_ser.serialize_field("errorMessage", &self.error_message)?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for DropPeerResponse { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "ok", + "error_message", + "errorMessage", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Ok, + ErrorMessage, + __SkipField__, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "ok" => Ok(GeneratedField::Ok), + "errorMessage" | "error_message" => Ok(GeneratedField::ErrorMessage), + _ => Ok(GeneratedField::__SkipField__), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = DropPeerResponse; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct peerdb_route.DropPeerResponse") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut ok__ = None; + let mut error_message__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Ok => { + if ok__.is_some() { + return Err(serde::de::Error::duplicate_field("ok")); + } + ok__ = Some(map.next_value()?); + } + GeneratedField::ErrorMessage => { + if error_message__.is_some() { + return Err(serde::de::Error::duplicate_field("errorMessage")); + } + error_message__ = Some(map.next_value()?); + } + GeneratedField::__SkipField__ => { + let _ = map.next_value::()?; + } + } + } + Ok(DropPeerResponse { + ok: ok__.unwrap_or_default(), + error_message: error_message__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("peerdb_route.DropPeerResponse", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for MirrorStatusRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/nexus/pt/src/peerdb_route.tonic.rs b/nexus/pt/src/peerdb_route.tonic.rs index 608fdecea..f2143777c 100644 --- a/nexus/pt/src/peerdb_route.tonic.rs +++ b/nexus/pt/src/peerdb_route.tonic.rs @@ -138,6 +138,32 @@ pub mod flow_service_client { self.inner.unary(req, path, codec).await } /// + pub async fn drop_peer( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/peerdb_route.FlowService/DropPeer", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("peerdb_route.FlowService", "DropPeer")); + self.inner.unary(req, path, codec).await + } + /// pub async fn create_cdc_flow( &mut self, request: impl tonic::IntoRequest, @@ -399,6 +425,14 @@ pub mod flow_service_server { tonic::Status, >; /// + async fn drop_peer( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + /// async fn create_cdc_flow( &self, request: tonic::Request, @@ -641,6 +675,50 @@ pub mod flow_service_server { }; Box::pin(fut) } + "/peerdb_route.FlowService/DropPeer" => { + #[allow(non_camel_case_types)] + struct DropPeerSvc(pub Arc); + impl< + T: FlowService, + > tonic::server::UnaryService + for DropPeerSvc { + type Response = super::DropPeerResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { (*inner).drop_peer(request).await }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = DropPeerSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/peerdb_route.FlowService/CreateCDCFlow" => { #[allow(non_camel_case_types)] struct CreateCDCFlowSvc(pub Arc); diff --git a/nexus/server/src/main.rs b/nexus/server/src/main.rs index e663b132c..c2a9032a2 100644 --- a/nexus/server/src/main.rs +++ b/nexus/server/src/main.rs @@ -492,6 +492,54 @@ impl NexusBackend { )))) } } + PeerDDL::DropPeer { + if_exists, + peer_name, + } => { + if self.flow_handler.is_none() { + return Err(PgWireError::ApiError(Box::new(PgError::Internal { + err_msg: "flow service is not configured".to_owned(), + }))); + } + + let catalog = self.catalog.lock().await; + tracing::info!("drop peer_name: {}, if_exists: {}", peer_name, if_exists); + let peer_exists = + catalog.check_peer_entry(peer_name).await.map_err(|err| { + PgWireError::ApiError(Box::new(PgError::Internal { + err_msg: format!( + "unable to query catalog for peer metadata: {:?}", + err + ), + })) + })?; + tracing::info!("peer exist count: {}", peer_exists); + if peer_exists != 0 { + let mut flow_handler = self.flow_handler.as_ref().unwrap().lock().await; + flow_handler.drop_peer(peer_name).await.map_err(|err| { + PgWireError::ApiError(Box::new(PgError::Internal { + err_msg: format!("unable to drop peer: {:?}", err), + })) + })?; + let drop_peer_success = format!("DROP PEER {}", peer_name); + Ok(vec![Response::Execution(Tag::new_for_execution( + &drop_peer_success, + None, + ))]) + } else if *if_exists { + let no_peer_success = "NO SUCH PEER"; + Ok(vec![Response::Execution(Tag::new_for_execution( + no_peer_success, + None, + ))]) + } else { + Err(PgWireError::UserError(Box::new(ErrorInfo::new( + "ERROR".to_owned(), + "error".to_owned(), + format!("no such peer: {:?}", peer_name), + )))) + } + } }, NexusStatement::PeerQuery { stmt, assoc } => { // get the query executor diff --git a/nexus/sqlparser-rs b/nexus/sqlparser-rs index 33f05e432..096cac913 160000 --- a/nexus/sqlparser-rs +++ b/nexus/sqlparser-rs @@ -1 +1 @@ -Subproject commit 33f05e4324deeaa52a123b71879b7bb4fe00186c +Subproject commit 096cac91355948cffcdb0f5c9273293ae4505760 diff --git a/protos/route.proto b/protos/route.proto index 50caa3f6b..907973c50 100644 --- a/protos/route.proto +++ b/protos/route.proto @@ -46,6 +46,15 @@ message CreatePeerRequest { peerdb_peers.Peer peer = 1; } +message DropPeerRequest { + string peer_name = 1; +} + +message DropPeerResponse { + bool ok = 1; + string error_message = 2; +} + enum ValidatePeerStatus { CREATION_UNKNOWN = 0; VALID = 1; @@ -178,6 +187,12 @@ service FlowService { body: "*" }; } + rpc DropPeer(DropPeerRequest) returns (DropPeerResponse) { + option (google.api.http) = { + post: "/v1/peers/drop", + body: "*" + }; + } rpc CreateCDCFlow(CreateCDCFlowRequest) returns (CreateCDCFlowResponse) { option (google.api.http) = { post: "/v1/flows/cdc/create", diff --git a/ui/app/api/mirrors/drop/route.ts b/ui/app/api/mirrors/drop/route.ts index 07c2db0d9..4a10f26ad 100644 --- a/ui/app/api/mirrors/drop/route.ts +++ b/ui/app/api/mirrors/drop/route.ts @@ -24,6 +24,7 @@ export async function POST(request: Request) { }); let response: UDropMirrorResponse = { dropped: dropStatus.ok, + errorMessage: dropStatus.errorMessage, }; return new Response(JSON.stringify(response)); diff --git a/ui/app/api/peers/drop/route.ts b/ui/app/api/peers/drop/route.ts new file mode 100644 index 000000000..0a7eb2541 --- /dev/null +++ b/ui/app/api/peers/drop/route.ts @@ -0,0 +1,28 @@ +import { UDropPeerResponse } from '@/app/dto/PeersDTO'; +import { DropPeerRequest, DropPeerResponse } from '@/grpc_generated/route'; +import { GetFlowHttpAddressFromEnv } from '@/rpc/http'; + +export async function POST(request: Request) { + const body = await request.json(); + const { peerName } = body; + const flowServiceAddr = GetFlowHttpAddressFromEnv(); + const req: DropPeerRequest = { + peerName, + }; + console.log('/drop/peer: req:', req); + const dropStatus: DropPeerResponse = await fetch( + `${flowServiceAddr}/v1/peers/drop`, + { + method: 'POST', + body: JSON.stringify(req), + } + ).then((res) => { + return res.json(); + }); + let response: UDropPeerResponse = { + dropped: dropStatus.ok, + errorMessage: dropStatus.errorMessage, + }; + + return new Response(JSON.stringify(response)); +} diff --git a/ui/app/dto/MirrorsDTO.ts b/ui/app/dto/MirrorsDTO.ts index 7029c5590..e0f6486b1 100644 --- a/ui/app/dto/MirrorsDTO.ts +++ b/ui/app/dto/MirrorsDTO.ts @@ -7,6 +7,7 @@ export type UCreateMirrorResponse = { export type UDropMirrorResponse = { dropped: boolean; + errorMessage: string; }; export type CDCConfig = FlowConnectionConfigs; diff --git a/ui/app/dto/PeersDTO.ts b/ui/app/dto/PeersDTO.ts index 43b6d1467..271d59822 100644 --- a/ui/app/dto/PeersDTO.ts +++ b/ui/app/dto/PeersDTO.ts @@ -22,6 +22,11 @@ export type UColumnsResponse = { columns: string[]; }; +export type UDropPeerResponse = { + dropped: boolean; + errorMessage: string; +}; + export type PeerConfig = PostgresConfig | SnowflakeConfig; export type CatalogPeer = { id: number; diff --git a/ui/app/mirrors/page.tsx b/ui/app/mirrors/page.tsx index b0bd52b9f..5827ac44e 100644 --- a/ui/app/mirrors/page.tsx +++ b/ui/app/mirrors/page.tsx @@ -91,10 +91,13 @@ async function CDCFlows() { @@ -183,10 +186,13 @@ async function QRepFlows() { diff --git a/ui/app/peers/page.tsx b/ui/app/peers/page.tsx index 73a2e3384..638f5fcd2 100644 --- a/ui/app/peers/page.tsx +++ b/ui/app/peers/page.tsx @@ -1,13 +1,12 @@ +import { DropDialog } from '@/components/DropDialog'; import { DBType, Peer } from '@/grpc_generated/peers'; import { Button } from '@/lib/Button'; -import { Checkbox } from '@/lib/Checkbox'; import { Icon } from '@/lib/Icon'; import { Label } from '@/lib/Label'; import { LayoutMain } from '@/lib/Layout'; import { Panel } from '@/lib/Panel'; import { ProgressCircle } from '@/lib/ProgressCircle'; import { SearchField } from '@/lib/SearchField'; -import { Select } from '@/lib/Select'; import { Table, TableCell, TableRow } from '@/lib/Table'; import Link from 'next/link'; import { Suspense } from 'react'; @@ -19,10 +18,7 @@ function PeerRow({ peer }: { peer: Peer }) { const peerType = DBType[peer.type]; return ( - - - - + + + + + ); } @@ -72,18 +77,22 @@ async function PeersTable({ title }: { title: string }) { }} header={ - - - - + -