From 7c32361a7daa258af2be392fade5c0516bac06f2 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 1 Jul 2022 21:43:39 -0700 Subject: [PATCH 01/17] Added SeaweedMQ_Architecture.png --- note/SeaweedMQ_Architecture.png | Bin 0 -> 139655 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 note/SeaweedMQ_Architecture.png diff --git a/note/SeaweedMQ_Architecture.png b/note/SeaweedMQ_Architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cce62301e75c02508928ef53db986901f2d287 GIT binary patch literal 139655 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ȢXb6dk(UV@< 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 N`LpL`(@q=R{Xdq1AlCo@ literal 0 HcmV?d00001 From 7df440e36f38c70473075513ef195e3d80f2c4fb Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 1 Jul 2022 21:59:50 -0700 Subject: [PATCH 02/17] rename to SeaweedMQ --- weed/command/command.go | 2 +- weed/command/{msg_broker.go => mq_broker.go} | 42 ++++++++++---------- weed/command/server.go | 28 ++++++------- 3 files changed, 36 insertions(+), 36 deletions(-) rename weed/command/{msg_broker.go => mq_broker.go} (56%) diff --git a/weed/command/command.go b/weed/command/command.go index 7635405dc..abd1b63e9 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -33,7 +33,7 @@ var Commands = []*Command{ cmdMount, cmdS3, cmdIam, - cmdMsgBroker, + cmdMqBroker, cmdScaffold, cmdServer, cmdShell, diff --git a/weed/command/msg_broker.go b/weed/command/mq_broker.go similarity index 56% rename from weed/command/msg_broker.go rename to weed/command/mq_broker.go index 3274f599b..a5a6e3566 100644 --- a/weed/command/msg_broker.go +++ b/weed/command/mq_broker.go @@ -19,10 +19,10 @@ import ( ) var ( - messageBrokerStandaloneOptions MessageBrokerOptions + mqBrokerStandaloneOptions MessageQueueBrokerOptions ) -type MessageBrokerOptions struct { +type MessageQueueBrokerOptions struct { filer *string ip *string port *int @@ -31,16 +31,16 @@ type MessageBrokerOptions struct { } func init() { - cmdMsgBroker.Run = runMsgBroker // break init cycle - messageBrokerStandaloneOptions.filer = cmdMsgBroker.Flag.String("filer", "localhost:8888", "filer server address") - messageBrokerStandaloneOptions.ip = cmdMsgBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") - messageBrokerStandaloneOptions.port = cmdMsgBroker.Flag.Int("port", 17777, "broker gRPC listen port") - messageBrokerStandaloneOptions.cpuprofile = cmdMsgBroker.Flag.String("cpuprofile", "", "cpu profile output file") - messageBrokerStandaloneOptions.memprofile = cmdMsgBroker.Flag.String("memprofile", "", "memory profile output file") + cmdMqBroker.Run = runMqBroker // break init cycle + mqBrokerStandaloneOptions.filer = cmdMqBroker.Flag.String("filer", "localhost:8888", "filer server address") + mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") + mqBrokerStandaloneOptions.port = cmdMqBroker.Flag.Int("port", 17777, "broker gRPC listen port") + mqBrokerStandaloneOptions.cpuprofile = cmdMqBroker.Flag.String("cpuprofile", "", "cpu profile output file") + mqBrokerStandaloneOptions.memprofile = cmdMqBroker.Flag.String("memprofile", "", "memory profile output file") } -var cmdMsgBroker = &Command{ - UsageLine: "msgBroker [-port=17777] [-filer=]", +var cmdMqBroker = &Command{ + UsageLine: "mq.broker [-port=17777] [-filer=]", Short: "start a message queue broker", Long: `start a message queue broker @@ -50,19 +50,19 @@ var cmdMsgBroker = &Command{ `, } -func runMsgBroker(cmd *Command, args []string) bool { +func runMqBroker(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) - return messageBrokerStandaloneOptions.startQueueServer() + return mqBrokerStandaloneOptions.startQueueServer() } -func (msgBrokerOpt *MessageBrokerOptions) startQueueServer() bool { +func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { - grace.SetupProfiling(*messageBrokerStandaloneOptions.cpuprofile, *messageBrokerStandaloneOptions.memprofile) + grace.SetupProfiling(*mqBrokerStandaloneOptions.cpuprofile, *mqBrokerStandaloneOptions.memprofile) - filerAddress := pb.ServerAddress(*msgBrokerOpt.filer) + filerAddress := pb.ServerAddress(*mqBrokerOpt.filer) grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.msg_broker") cipher := false @@ -77,10 +77,10 @@ func (msgBrokerOpt *MessageBrokerOptions) startQueueServer() bool { return nil }) if err != nil { - glog.V(0).Infof("wait to connect to filer %s grpc address %s", *msgBrokerOpt.filer, filerAddress.ToGrpcAddress()) + glog.V(0).Infof("wait to connect to filer %s grpc address %s", *mqBrokerOpt.filer, filerAddress.ToGrpcAddress()) time.Sleep(time.Second) } else { - glog.V(0).Infof("connected to filer %s grpc address %s", *msgBrokerOpt.filer, filerAddress.ToGrpcAddress()) + glog.V(0).Infof("connected to filer %s grpc address %s", *mqBrokerOpt.filer, filerAddress.ToGrpcAddress()) break } } @@ -89,15 +89,15 @@ func (msgBrokerOpt *MessageBrokerOptions) startQueueServer() bool { Filers: []pb.ServerAddress{filerAddress}, DefaultReplication: "", MaxMB: 0, - Ip: *msgBrokerOpt.ip, - Port: *msgBrokerOpt.port, + Ip: *mqBrokerOpt.ip, + Port: *mqBrokerOpt.port, Cipher: cipher, }, grpcDialOption) // start grpc listener - grpcL, _, err := util.NewIpAndLocalListeners("", *msgBrokerOpt.port, 0) + grpcL, _, err := util.NewIpAndLocalListeners("", *mqBrokerOpt.port, 0) if err != nil { - glog.Fatalf("failed to listen on grpc port %d: %v", *msgBrokerOpt.port, err) + glog.Fatalf("failed to listen on grpc port %d: %v", *mqBrokerOpt.port, err) } grpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.msg_broker")) messaging_pb.RegisterSeaweedMessagingServer(grpcS, qs) diff --git a/weed/command/server.go b/weed/command/server.go index b1812bb9b..7c14fd14f 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -24,13 +24,13 @@ type ServerOptions struct { } var ( - serverOptions ServerOptions - masterOptions MasterOptions - filerOptions FilerOptions - s3Options S3Options - iamOptions IamOptions - webdavOptions WebDavOption - msgBrokerOptions MessageBrokerOptions + serverOptions ServerOptions + masterOptions MasterOptions + filerOptions FilerOptions + s3Options S3Options + iamOptions IamOptions + webdavOptions WebDavOption + mqBrokerOptions MessageQueueBrokerOptions ) func init() { @@ -74,7 +74,7 @@ var ( isStartingS3 = cmdServer.Flag.Bool("s3", false, "whether to start S3 gateway") isStartingIam = cmdServer.Flag.Bool("iam", false, "whether to start IAM service") isStartingWebDav = cmdServer.Flag.Bool("webdav", false, "whether to start WebDAV gateway") - isStartingMsgBroker = cmdServer.Flag.Bool("msgBroker", false, "whether to start message broker") + isStartingMqBroker = cmdServer.Flag.Bool("mq.broker", false, "whether to start message queue broker") serverWhiteList []string @@ -155,7 +155,7 @@ func init() { webdavOptions.cacheDir = cmdServer.Flag.String("webdav.cacheDir", os.TempDir(), "local cache directory for file chunks") webdavOptions.cacheSizeMB = cmdServer.Flag.Int64("webdav.cacheCapacityMB", 0, "local cache capacity in MB") - msgBrokerOptions.port = cmdServer.Flag.Int("msgBroker.port", 17777, "broker gRPC listen port") + mqBrokerOptions.port = cmdServer.Flag.Int("mq.broker.port", 17777, "message queue broker gRPC listen port") } @@ -179,7 +179,7 @@ func runServer(cmd *Command, args []string) bool { if *isStartingWebDav { *isStartingFiler = true } - if *isStartingMsgBroker { + if *isStartingMqBroker { *isStartingFiler = true } @@ -208,7 +208,7 @@ func runServer(cmd *Command, args []string) bool { serverOptions.v.idleConnectionTimeout = serverTimeout serverOptions.v.dataCenter = serverDataCenter serverOptions.v.rack = serverRack - msgBrokerOptions.ip = serverIp + mqBrokerOptions.ip = serverIp // serverOptions.v.pulseSeconds = pulseSeconds // masterOptions.pulseSeconds = pulseSeconds @@ -224,7 +224,7 @@ func runServer(cmd *Command, args []string) bool { s3Options.filer = &filerAddress iamOptions.filer = &filerAddress webdavOptions.filer = &filerAddress - msgBrokerOptions.filer = &filerAddress + mqBrokerOptions.filer = &filerAddress go stats_collect.StartMetricsServer(*serverMetricsHttpPort) @@ -276,10 +276,10 @@ func runServer(cmd *Command, args []string) bool { }() } - if *isStartingMsgBroker { + if *isStartingMqBroker { go func() { time.Sleep(2 * time.Second) - msgBrokerOptions.startQueueServer() + mqBrokerOptions.startQueueServer() }() } From 5536ed85e58a438f7fccebc3d79e7475386e7cf5 Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 1 Jul 2022 22:43:25 -0700 Subject: [PATCH 03/17] renaming --- weed/command/mq_broker.go | 6 +- .../{messaging => mq}/broker/broker_append.go | 6 +- .../broker/broker_grpc_server.go | 10 +- .../broker/broker_grpc_server_discovery.go | 6 +- .../broker/broker_grpc_server_publish.go | 10 +- .../broker/broker_grpc_server_subscribe.go | 20 ++-- .../{messaging => mq}/broker/broker_server.go | 4 +- .../broker/consistent_distribution.go | 0 .../broker/consistent_distribution_test.go | 0 .../{messaging => mq}/broker/topic_manager.go | 6 +- .../msgclient/chan_config.go | 0 weed/{messaging => mq}/msgclient/chan_pub.go | 14 +-- weed/{messaging => mq}/msgclient/chan_sub.go | 8 +- weed/{messaging => mq}/msgclient/client.go | 8 +- weed/{messaging => mq}/msgclient/config.go | 18 ++-- weed/{messaging => mq}/msgclient/publisher.go | 28 ++--- .../{messaging => mq}/msgclient/subscriber.go | 26 ++--- weed/pb/Makefile | 2 +- weed/pb/grpc_client_server.go | 6 +- weed/pb/messaging.proto | 2 +- weed/pb/mount_pb/mount.pb.go | 8 +- weed/pb/mount_pb/mount_grpc.pb.go | 6 +- .../{messaging_pb => mq_pb}/messaging.pb.go | 100 +++++++++--------- .../messaging_grpc.pb.go | 26 ++--- weed/pb/s3_pb/s3.pb.go | 24 ++--- weed/pb/s3_pb/s3_grpc.pb.go | 6 +- weed/util/log_buffer/log_read.go | 2 +- 27 files changed, 176 insertions(+), 176 deletions(-) rename weed/{messaging => mq}/broker/broker_append.go (92%) rename weed/{messaging => mq}/broker/broker_grpc_server.go (70%) rename weed/{messaging => mq}/broker/broker_grpc_server_discovery.go (94%) rename weed/{messaging => mq}/broker/broker_grpc_server_publish.go (86%) rename weed/{messaging => mq}/broker/broker_grpc_server_subscribe.go (88%) rename weed/{messaging => mq}/broker/broker_server.go (96%) rename weed/{messaging => mq}/broker/consistent_distribution.go (100%) rename weed/{messaging => mq}/broker/consistent_distribution_test.go (100%) rename weed/{messaging => mq}/broker/topic_manager.go (92%) rename weed/{messaging => mq}/msgclient/chan_config.go (100%) rename weed/{messaging => mq}/msgclient/chan_pub.go (78%) rename weed/{messaging => mq}/msgclient/chan_sub.go (86%) rename weed/{messaging => mq}/msgclient/client.go (83%) rename weed/{messaging => mq}/msgclient/config.go (62%) rename weed/{messaging => mq}/msgclient/publisher.go (65%) rename weed/{messaging => mq}/msgclient/subscriber.go (70%) rename weed/pb/{messaging_pb => mq_pb}/messaging.pb.go (92%) rename weed/pb/{messaging_pb => mq_pb}/messaging_grpc.pb.go (93%) diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index a5a6e3566..da7f59596 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -10,10 +10,10 @@ import ( "github.com/chrislusf/seaweedfs/weed/util/grace" "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" + "github.com/chrislusf/seaweedfs/weed/mq/broker" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" ) @@ -100,7 +100,7 @@ func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { glog.Fatalf("failed to listen on grpc port %d: %v", *mqBrokerOpt.port, err) } grpcS := pb.NewGrpcServer(security.LoadServerTLS(util.GetViper(), "grpc.msg_broker")) - messaging_pb.RegisterSeaweedMessagingServer(grpcS, qs) + mq_pb.RegisterSeaweedMessagingServer(grpcS, qs) reflection.Register(grpcS) grpcS.Serve(grpcL) diff --git a/weed/messaging/broker/broker_append.go b/weed/mq/broker/broker_append.go similarity index 92% rename from weed/messaging/broker/broker_append.go rename to weed/mq/broker/broker_append.go index 9a31a8ac0..4f3af0ff8 100644 --- a/weed/messaging/broker/broker_append.go +++ b/weed/mq/broker/broker_append.go @@ -10,11 +10,11 @@ import ( "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/util" ) -func (broker *MessageBroker) appendToFile(targetFile string, topicConfig *messaging_pb.TopicConfiguration, data []byte) error { +func (broker *MessageBroker) appendToFile(targetFile string, topicConfig *mq_pb.TopicConfiguration, data []byte) error { assignResult, uploadResult, err2 := broker.assignAndUpload(topicConfig, data) if err2 != nil { @@ -46,7 +46,7 @@ func (broker *MessageBroker) appendToFile(targetFile string, topicConfig *messag return nil } -func (broker *MessageBroker) assignAndUpload(topicConfig *messaging_pb.TopicConfiguration, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { +func (broker *MessageBroker) assignAndUpload(topicConfig *mq_pb.TopicConfiguration, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { var assignResult = &operation.AssignResult{} diff --git a/weed/messaging/broker/broker_grpc_server.go b/weed/mq/broker/broker_grpc_server.go similarity index 70% rename from weed/messaging/broker/broker_grpc_server.go rename to weed/mq/broker/broker_grpc_server.go index ba141fdd0..9aa9b1908 100644 --- a/weed/messaging/broker/broker_grpc_server.go +++ b/weed/mq/broker/broker_grpc_server.go @@ -6,15 +6,15 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) ConfigureTopic(c context.Context, request *messaging_pb.ConfigureTopicRequest) (*messaging_pb.ConfigureTopicResponse, error) { +func (broker *MessageBroker) ConfigureTopic(c context.Context, request *mq_pb.ConfigureTopicRequest) (*mq_pb.ConfigureTopicResponse, error) { panic("implement me") } -func (broker *MessageBroker) DeleteTopic(c context.Context, request *messaging_pb.DeleteTopicRequest) (*messaging_pb.DeleteTopicResponse, error) { - resp := &messaging_pb.DeleteTopicResponse{} +func (broker *MessageBroker) DeleteTopic(c context.Context, request *mq_pb.DeleteTopicRequest) (*mq_pb.DeleteTopicResponse, error) { + resp := &mq_pb.DeleteTopicResponse{} dir, entry := genTopicDirEntry(request.Namespace, request.Topic) if exists, err := filer_pb.Exists(broker, dir, entry, true); err != nil { return nil, err @@ -24,7 +24,7 @@ func (broker *MessageBroker) DeleteTopic(c context.Context, request *messaging_p return resp, nil } -func (broker *MessageBroker) GetTopicConfiguration(c context.Context, request *messaging_pb.GetTopicConfigurationRequest) (*messaging_pb.GetTopicConfigurationResponse, error) { +func (broker *MessageBroker) GetTopicConfiguration(c context.Context, request *mq_pb.GetTopicConfigurationRequest) (*mq_pb.GetTopicConfigurationResponse, error) { panic("implement me") } diff --git a/weed/messaging/broker/broker_grpc_server_discovery.go b/weed/mq/broker/broker_grpc_server_discovery.go similarity index 94% rename from weed/messaging/broker/broker_grpc_server_discovery.go rename to weed/mq/broker/broker_grpc_server_discovery.go index 5cd8edd33..0c8d70e68 100644 --- a/weed/messaging/broker/broker_grpc_server_discovery.go +++ b/weed/mq/broker/broker_grpc_server_discovery.go @@ -10,7 +10,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) /* @@ -26,9 +26,9 @@ If one of the pub or sub connects very late, and the system topo changed quite a */ -func (broker *MessageBroker) FindBroker(c context.Context, request *messaging_pb.FindBrokerRequest) (*messaging_pb.FindBrokerResponse, error) { +func (broker *MessageBroker) FindBroker(c context.Context, request *mq_pb.FindBrokerRequest) (*mq_pb.FindBrokerResponse, error) { - t := &messaging_pb.FindBrokerResponse{} + t := &mq_pb.FindBrokerResponse{} var peers []string targetTopicPartition := fmt.Sprintf(TopicPartitionFmt, request.Namespace, request.Topic, request.Parition) diff --git a/weed/messaging/broker/broker_grpc_server_publish.go b/weed/mq/broker/broker_grpc_server_publish.go similarity index 86% rename from weed/messaging/broker/broker_grpc_server_publish.go rename to weed/mq/broker/broker_grpc_server_publish.go index 6e6b723d1..4ff9ad809 100644 --- a/weed/messaging/broker/broker_grpc_server_publish.go +++ b/weed/mq/broker/broker_grpc_server_publish.go @@ -10,10 +10,10 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_PublishServer) error { +func (broker *MessageBroker) Publish(stream mq_pb.SeaweedMessaging_PublishServer) error { // process initial request in, err := stream.Recv() @@ -25,12 +25,12 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis } // TODO look it up - topicConfig := &messaging_pb.TopicConfiguration{ + topicConfig := &mq_pb.TopicConfiguration{ // IsTransient: true, } // send init response - initResponse := &messaging_pb.PublishResponse{ + initResponse := &mq_pb.PublishResponse{ Config: nil, Redirect: nil, } @@ -104,7 +104,7 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis // send the close ack // println("server send ack closing") - if err := stream.Send(&messaging_pb.PublishResponse{IsClosed: true}); err != nil { + if err := stream.Send(&mq_pb.PublishResponse{IsClosed: true}); err != nil { glog.V(0).Infof("err sending close response: %v", err) } return nil diff --git a/weed/messaging/broker/broker_grpc_server_subscribe.go b/weed/mq/broker/broker_grpc_server_subscribe.go similarity index 88% rename from weed/messaging/broker/broker_grpc_server_subscribe.go rename to weed/mq/broker/broker_grpc_server_subscribe.go index 20d529239..1a9c62d75 100644 --- a/weed/messaging/broker/broker_grpc_server_subscribe.go +++ b/weed/mq/broker/broker_grpc_server_subscribe.go @@ -13,10 +13,10 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) Subscribe(stream messaging_pb.SeaweedMessaging_SubscribeServer) error { +func (broker *MessageBroker) Subscribe(stream mq_pb.SeaweedMessaging_SubscribeServer) error { // process initial request in, err := stream.Recv() @@ -32,7 +32,7 @@ func (broker *MessageBroker) Subscribe(stream messaging_pb.SeaweedMessaging_Subs subscriberId := in.Init.SubscriberId // TODO look it up - topicConfig := &messaging_pb.TopicConfiguration{ + topicConfig := &mq_pb.TopicConfiguration{ // IsTransient: true, } @@ -63,17 +63,17 @@ func (broker *MessageBroker) Subscribe(stream messaging_pb.SeaweedMessaging_Subs lastReadTime := time.Now() switch in.Init.StartPosition { - case messaging_pb.SubscriberMessage_InitMessage_TIMESTAMP: + case mq_pb.SubscriberMessage_InitMessage_TIMESTAMP: lastReadTime = time.Unix(0, in.Init.TimestampNs) - case messaging_pb.SubscriberMessage_InitMessage_LATEST: - case messaging_pb.SubscriberMessage_InitMessage_EARLIEST: + case mq_pb.SubscriberMessage_InitMessage_LATEST: + case mq_pb.SubscriberMessage_InitMessage_EARLIEST: lastReadTime = time.Unix(0, 0) } // how to process each message // an error returned will end the subscription - eachMessageFn := func(m *messaging_pb.Message) error { - err := stream.Send(&messaging_pb.BrokerMessage{ + eachMessageFn := func(m *mq_pb.Message) error { + err := stream.Send(&mq_pb.BrokerMessage{ Data: m, }) if err != nil { @@ -83,9 +83,9 @@ func (broker *MessageBroker) Subscribe(stream messaging_pb.SeaweedMessaging_Subs } eachLogEntryFn := func(logEntry *filer_pb.LogEntry) error { - m := &messaging_pb.Message{} + m := &mq_pb.Message{} if err = proto.Unmarshal(logEntry.Data, m); err != nil { - glog.Errorf("unexpected unmarshal messaging_pb.Message: %v", err) + glog.Errorf("unexpected unmarshal mq_pb.Message: %v", err) return err } // fmt.Printf("sending : %d bytes ts %d\n", len(m.Value), logEntry.TsNs) diff --git a/weed/messaging/broker/broker_server.go b/weed/mq/broker/broker_server.go similarity index 96% rename from weed/messaging/broker/broker_server.go rename to weed/mq/broker/broker_server.go index acf2d6d34..5aa5285c9 100644 --- a/weed/messaging/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -2,7 +2,7 @@ package broker import ( "context" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "time" "google.golang.org/grpc" @@ -23,7 +23,7 @@ type MessageBrokerOption struct { } type MessageBroker struct { - messaging_pb.UnimplementedSeaweedMessagingServer + mq_pb.UnimplementedSeaweedMessagingServer option *MessageBrokerOption grpcDialOption grpc.DialOption topicManager *TopicManager diff --git a/weed/messaging/broker/consistent_distribution.go b/weed/mq/broker/consistent_distribution.go similarity index 100% rename from weed/messaging/broker/consistent_distribution.go rename to weed/mq/broker/consistent_distribution.go diff --git a/weed/messaging/broker/consistent_distribution_test.go b/weed/mq/broker/consistent_distribution_test.go similarity index 100% rename from weed/messaging/broker/consistent_distribution_test.go rename to weed/mq/broker/consistent_distribution_test.go diff --git a/weed/messaging/broker/topic_manager.go b/weed/mq/broker/topic_manager.go similarity index 92% rename from weed/messaging/broker/topic_manager.go rename to weed/mq/broker/topic_manager.go index c303c29b3..1acf085fa 100644 --- a/weed/messaging/broker/topic_manager.go +++ b/weed/mq/broker/topic_manager.go @@ -7,7 +7,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/util/log_buffer" ) @@ -46,7 +46,7 @@ func NewTopicManager(messageBroker *MessageBroker) *TopicManager { } } -func (tm *TopicManager) buildLogBuffer(tl *TopicControl, tp TopicPartition, topicConfig *messaging_pb.TopicConfiguration) *log_buffer.LogBuffer { +func (tm *TopicManager) buildLogBuffer(tl *TopicControl, tp TopicPartition, topicConfig *mq_pb.TopicConfiguration) *log_buffer.LogBuffer { flushFn := func(startTime, stopTime time.Time, buf []byte) { @@ -75,7 +75,7 @@ func (tm *TopicManager) buildLogBuffer(tl *TopicControl, tp TopicPartition, topi return logBuffer } -func (tm *TopicManager) RequestLock(partition TopicPartition, topicConfig *messaging_pb.TopicConfiguration, isPublisher bool) *TopicControl { +func (tm *TopicManager) RequestLock(partition TopicPartition, topicConfig *mq_pb.TopicConfiguration, isPublisher bool) *TopicControl { tm.Lock() defer tm.Unlock() diff --git a/weed/messaging/msgclient/chan_config.go b/weed/mq/msgclient/chan_config.go similarity index 100% rename from weed/messaging/msgclient/chan_config.go rename to weed/mq/msgclient/chan_config.go diff --git a/weed/messaging/msgclient/chan_pub.go b/weed/mq/msgclient/chan_pub.go similarity index 78% rename from weed/messaging/msgclient/chan_pub.go rename to weed/mq/msgclient/chan_pub.go index 9bc88f7c0..f4ffe832a 100644 --- a/weed/messaging/msgclient/chan_pub.go +++ b/weed/mq/msgclient/chan_pub.go @@ -8,12 +8,12 @@ import ( "google.golang.org/grpc" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/mq/broker" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) type PubChannel struct { - client messaging_pb.SeaweedMessaging_PublishClient + client mq_pb.SeaweedMessaging_PublishClient grpcConnection *grpc.ClientConn md5hash hash.Hash } @@ -40,8 +40,8 @@ func (mc *MessagingClient) NewPubChannel(chanName string) (*PubChannel, error) { } func (pc *PubChannel) Publish(m []byte) error { - err := pc.client.Send(&messaging_pb.PublishRequest{ - Data: &messaging_pb.Message{ + err := pc.client.Send(&mq_pb.PublishRequest{ + Data: &mq_pb.Message{ Value: m, }, }) @@ -53,8 +53,8 @@ func (pc *PubChannel) Publish(m []byte) error { func (pc *PubChannel) Close() error { // println("send closing") - if err := pc.client.Send(&messaging_pb.PublishRequest{ - Data: &messaging_pb.Message{ + if err := pc.client.Send(&mq_pb.PublishRequest{ + Data: &mq_pb.Message{ IsClose: true, }, }); err != nil { diff --git a/weed/messaging/msgclient/chan_sub.go b/weed/mq/msgclient/chan_sub.go similarity index 86% rename from weed/messaging/msgclient/chan_sub.go rename to weed/mq/msgclient/chan_sub.go index 213ff4666..859b482ef 100644 --- a/weed/messaging/msgclient/chan_sub.go +++ b/weed/mq/msgclient/chan_sub.go @@ -8,13 +8,13 @@ import ( "log" "time" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/mq/broker" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) type SubChannel struct { ch chan []byte - stream messaging_pb.SeaweedMessaging_SubscribeClient + stream mq_pb.SeaweedMessaging_SubscribeClient md5hash hash.Hash cancel context.CancelFunc } @@ -57,7 +57,7 @@ func (mc *MessagingClient) NewSubChannel(subscriberId, chanName string) (*SubCha continue } if resp.Data.IsClose { - t.stream.Send(&messaging_pb.SubscriberMessage{ + t.stream.Send(&mq_pb.SubscriberMessage{ IsClose: true, }) close(t.ch) diff --git a/weed/messaging/msgclient/client.go b/weed/mq/msgclient/client.go similarity index 83% rename from weed/messaging/msgclient/client.go rename to weed/mq/msgclient/client.go index 4d7ef2b8e..cc64f1acb 100644 --- a/weed/messaging/msgclient/client.go +++ b/weed/mq/msgclient/client.go @@ -7,9 +7,9 @@ import ( "google.golang.org/grpc" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" + "github.com/chrislusf/seaweedfs/weed/mq/broker" "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" ) @@ -38,8 +38,8 @@ func (mc *MessagingClient) findBroker(tp broker.TopicPartition) (*grpc.ClientCon } defer grpcConnection.Close() - resp, err := messaging_pb.NewSeaweedMessagingClient(grpcConnection).FindBroker(context.Background(), - &messaging_pb.FindBrokerRequest{ + resp, err := mq_pb.NewSeaweedMessagingClient(grpcConnection).FindBroker(context.Background(), + &mq_pb.FindBrokerRequest{ Namespace: tp.Namespace, Topic: tp.Topic, Parition: tp.Partition, diff --git a/weed/messaging/msgclient/config.go b/weed/mq/msgclient/config.go similarity index 62% rename from weed/messaging/msgclient/config.go rename to weed/mq/msgclient/config.go index 2b9eba1a8..263ee856e 100644 --- a/weed/messaging/msgclient/config.go +++ b/weed/mq/msgclient/config.go @@ -4,19 +4,19 @@ import ( "context" "log" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" + "github.com/chrislusf/seaweedfs/weed/mq/broker" "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) func (mc *MessagingClient) configureTopic(tp broker.TopicPartition) error { - return mc.withAnyBroker(func(client messaging_pb.SeaweedMessagingClient) error { + return mc.withAnyBroker(func(client mq_pb.SeaweedMessagingClient) error { _, err := client.ConfigureTopic(context.Background(), - &messaging_pb.ConfigureTopicRequest{ + &mq_pb.ConfigureTopicRequest{ Namespace: tp.Namespace, Topic: tp.Topic, - Configuration: &messaging_pb.TopicConfiguration{ + Configuration: &mq_pb.TopicConfiguration{ PartitionCount: 0, Collection: "", Replication: "", @@ -31,9 +31,9 @@ func (mc *MessagingClient) configureTopic(tp broker.TopicPartition) error { func (mc *MessagingClient) DeleteTopic(namespace, topic string) error { - return mc.withAnyBroker(func(client messaging_pb.SeaweedMessagingClient) error { + return mc.withAnyBroker(func(client mq_pb.SeaweedMessagingClient) error { _, err := client.DeleteTopic(context.Background(), - &messaging_pb.DeleteTopicRequest{ + &mq_pb.DeleteTopicRequest{ Namespace: namespace, Topic: topic, }) @@ -41,7 +41,7 @@ func (mc *MessagingClient) DeleteTopic(namespace, topic string) error { }) } -func (mc *MessagingClient) withAnyBroker(fn func(client messaging_pb.SeaweedMessagingClient) error) error { +func (mc *MessagingClient) withAnyBroker(fn func(client mq_pb.SeaweedMessagingClient) error) error { var lastErr error for _, broker := range mc.bootstrapBrokers { @@ -52,7 +52,7 @@ func (mc *MessagingClient) withAnyBroker(fn func(client messaging_pb.SeaweedMess } defer grpcConnection.Close() - err = fn(messaging_pb.NewSeaweedMessagingClient(grpcConnection)) + err = fn(mq_pb.NewSeaweedMessagingClient(grpcConnection)) if err == nil { return nil } diff --git a/weed/messaging/msgclient/publisher.go b/weed/mq/msgclient/publisher.go similarity index 65% rename from weed/messaging/msgclient/publisher.go rename to weed/mq/msgclient/publisher.go index 1aa483ff8..823791d10 100644 --- a/weed/messaging/msgclient/publisher.go +++ b/weed/mq/msgclient/publisher.go @@ -6,23 +6,23 @@ import ( "github.com/OneOfOne/xxhash" "google.golang.org/grpc" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/mq/broker" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) type Publisher struct { - publishClients []messaging_pb.SeaweedMessaging_PublishClient - topicConfiguration *messaging_pb.TopicConfiguration + publishClients []mq_pb.SeaweedMessaging_PublishClient + topicConfiguration *mq_pb.TopicConfiguration messageCount uint64 publisherId string } func (mc *MessagingClient) NewPublisher(publisherId, namespace, topic string) (*Publisher, error) { // read topic configuration - topicConfiguration := &messaging_pb.TopicConfiguration{ + topicConfiguration := &mq_pb.TopicConfiguration{ PartitionCount: 4, } - publishClients := make([]messaging_pb.SeaweedMessaging_PublishClient, topicConfiguration.PartitionCount) + publishClients := make([]mq_pb.SeaweedMessaging_PublishClient, topicConfiguration.PartitionCount) for i := 0; i < int(topicConfiguration.PartitionCount); i++ { tp := broker.TopicPartition{ Namespace: namespace, @@ -45,16 +45,16 @@ func (mc *MessagingClient) NewPublisher(publisherId, namespace, topic string) (* }, nil } -func setupPublisherClient(grpcConnection *grpc.ClientConn, tp broker.TopicPartition) (messaging_pb.SeaweedMessaging_PublishClient, error) { +func setupPublisherClient(grpcConnection *grpc.ClientConn, tp broker.TopicPartition) (mq_pb.SeaweedMessaging_PublishClient, error) { - stream, err := messaging_pb.NewSeaweedMessagingClient(grpcConnection).Publish(context.Background()) + stream, err := mq_pb.NewSeaweedMessagingClient(grpcConnection).Publish(context.Background()) if err != nil { return nil, err } // send init message - err = stream.Send(&messaging_pb.PublishRequest{ - Init: &messaging_pb.PublishRequest_InitMessage{ + err = stream.Send(&mq_pb.PublishRequest{ + Init: &mq_pb.PublishRequest_InitMessage{ Namespace: tp.Namespace, Topic: tp.Topic, Partition: tp.Partition, @@ -95,14 +95,14 @@ func setupPublisherClient(grpcConnection *grpc.ClientConn, tp broker.TopicPartit } -func (p *Publisher) Publish(m *messaging_pb.Message) error { +func (p *Publisher) Publish(m *mq_pb.Message) error { hashValue := p.messageCount p.messageCount++ - if p.topicConfiguration.Partitoning == messaging_pb.TopicConfiguration_NonNullKeyHash { + if p.topicConfiguration.Partitoning == mq_pb.TopicConfiguration_NonNullKeyHash { if m.Key != nil { hashValue = xxhash.Checksum64(m.Key) } - } else if p.topicConfiguration.Partitoning == messaging_pb.TopicConfiguration_KeyHash { + } else if p.topicConfiguration.Partitoning == mq_pb.TopicConfiguration_KeyHash { hashValue = xxhash.Checksum64(m.Key) } else { // round robin @@ -112,7 +112,7 @@ func (p *Publisher) Publish(m *messaging_pb.Message) error { if idx < 0 { idx += len(p.publishClients) } - return p.publishClients[idx].Send(&messaging_pb.PublishRequest{ + return p.publishClients[idx].Send(&mq_pb.PublishRequest{ Data: m, }) } diff --git a/weed/messaging/msgclient/subscriber.go b/weed/mq/msgclient/subscriber.go similarity index 70% rename from weed/messaging/msgclient/subscriber.go rename to weed/mq/msgclient/subscriber.go index 6c7dc1ab7..f3da40fb3 100644 --- a/weed/messaging/msgclient/subscriber.go +++ b/weed/mq/msgclient/subscriber.go @@ -6,23 +6,23 @@ import ( "sync" "time" - "github.com/chrislusf/seaweedfs/weed/messaging/broker" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/mq/broker" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "google.golang.org/grpc" ) type Subscriber struct { - subscriberClients []messaging_pb.SeaweedMessaging_SubscribeClient + subscriberClients []mq_pb.SeaweedMessaging_SubscribeClient subscriberCancels []context.CancelFunc subscriberId string } func (mc *MessagingClient) NewSubscriber(subscriberId, namespace, topic string, partitionId int, startTime time.Time) (*Subscriber, error) { // read topic configuration - topicConfiguration := &messaging_pb.TopicConfiguration{ + topicConfiguration := &mq_pb.TopicConfiguration{ PartitionCount: 4, } - subscriberClients := make([]messaging_pb.SeaweedMessaging_SubscribeClient, topicConfiguration.PartitionCount) + subscriberClients := make([]mq_pb.SeaweedMessaging_SubscribeClient, topicConfiguration.PartitionCount) subscriberCancels := make([]context.CancelFunc, topicConfiguration.PartitionCount) for i := 0; i < int(topicConfiguration.PartitionCount); i++ { @@ -54,19 +54,19 @@ func (mc *MessagingClient) NewSubscriber(subscriberId, namespace, topic string, }, nil } -func setupSubscriberClient(ctx context.Context, grpcConnection *grpc.ClientConn, tp broker.TopicPartition, subscriberId string, startTime time.Time) (stream messaging_pb.SeaweedMessaging_SubscribeClient, err error) { - stream, err = messaging_pb.NewSeaweedMessagingClient(grpcConnection).Subscribe(ctx) +func setupSubscriberClient(ctx context.Context, grpcConnection *grpc.ClientConn, tp broker.TopicPartition, subscriberId string, startTime time.Time) (stream mq_pb.SeaweedMessaging_SubscribeClient, err error) { + stream, err = mq_pb.NewSeaweedMessagingClient(grpcConnection).Subscribe(ctx) if err != nil { return } // send init message - err = stream.Send(&messaging_pb.SubscriberMessage{ - Init: &messaging_pb.SubscriberMessage_InitMessage{ + err = stream.Send(&mq_pb.SubscriberMessage{ + Init: &mq_pb.SubscriberMessage_InitMessage{ Namespace: tp.Namespace, Topic: tp.Topic, Partition: tp.Partition, - StartPosition: messaging_pb.SubscriberMessage_InitMessage_TIMESTAMP, + StartPosition: mq_pb.SubscriberMessage_InitMessage_TIMESTAMP, TimestampNs: startTime.UnixNano(), SubscriberId: subscriberId, }, @@ -78,7 +78,7 @@ func setupSubscriberClient(ctx context.Context, grpcConnection *grpc.ClientConn, return stream, nil } -func doSubscribe(subscriberClient messaging_pb.SeaweedMessaging_SubscribeClient, processFn func(m *messaging_pb.Message)) error { +func doSubscribe(subscriberClient mq_pb.SeaweedMessaging_SubscribeClient, processFn func(m *mq_pb.Message)) error { for { resp, listenErr := subscriberClient.Recv() if listenErr == io.EOF { @@ -97,12 +97,12 @@ func doSubscribe(subscriberClient messaging_pb.SeaweedMessaging_SubscribeClient, } // Subscribe starts goroutines to process the messages -func (s *Subscriber) Subscribe(processFn func(m *messaging_pb.Message)) { +func (s *Subscriber) Subscribe(processFn func(m *mq_pb.Message)) { var wg sync.WaitGroup for i := 0; i < len(s.subscriberClients); i++ { if s.subscriberClients[i] != nil { wg.Add(1) - go func(subscriberClient messaging_pb.SeaweedMessaging_SubscribeClient) { + go func(subscriberClient mq_pb.SeaweedMessaging_SubscribeClient) { defer wg.Done() doSubscribe(subscriberClient, processFn) }(s.subscriberClients[i]) diff --git a/weed/pb/Makefile b/weed/pb/Makefile index a8992bde2..01322ffda 100644 --- a/weed/pb/Makefile +++ b/weed/pb/Makefile @@ -10,6 +10,6 @@ gen: protoc iam.proto --go_out=./iam_pb --go-grpc_out=./iam_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protoc mount.proto --go_out=./mount_pb --go-grpc_out=./mount_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protoc s3.proto --go_out=./s3_pb --go-grpc_out=./s3_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative - protoc messaging.proto --go_out=./messaging_pb --go-grpc_out=./messaging_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative + protoc mq.proto --go_out=./mq_pb --go-grpc_out=./mq_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative # protoc filer.proto --java_out=../../other/java/client/src/main/java cp filer.proto ../../other/java/client/src/main/proto diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index c7cb82a22..0a0d65a87 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -18,7 +18,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" - "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) const ( @@ -231,10 +231,10 @@ func WithOneOfGrpcMasterClients(streamingMode bool, masterGrpcAddresses map[stri return err } -func WithBrokerGrpcClient(streamingMode bool, brokerGrpcAddress string, grpcDialOption grpc.DialOption, fn func(client messaging_pb.SeaweedMessagingClient) error) error { +func WithBrokerGrpcClient(streamingMode bool, brokerGrpcAddress string, grpcDialOption grpc.DialOption, fn func(client mq_pb.SeaweedMessagingClient) error) error { return WithGrpcClient(streamingMode, func(grpcConnection *grpc.ClientConn) error { - client := messaging_pb.NewSeaweedMessagingClient(grpcConnection) + client := mq_pb.NewSeaweedMessagingClient(grpcConnection) return fn(client) }, brokerGrpcAddress, grpcDialOption) diff --git a/weed/pb/messaging.proto b/weed/pb/messaging.proto index 04446ad16..a73bc99a6 100644 --- a/weed/pb/messaging.proto +++ b/weed/pb/messaging.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package messaging_pb; -option go_package = "github.com/chrislusf/seaweedfs/weed/pb/messaging_pb"; +option go_package = "github.com/chrislusf/seaweedfs/weed/pb/mq_pb"; option java_package = "seaweedfs.client"; option java_outer_classname = "MessagingProto"; diff --git a/weed/pb/mount_pb/mount.pb.go b/weed/pb/mount_pb/mount.pb.go index cbaf533fe..642ffe59c 100644 --- a/weed/pb/mount_pb/mount.pb.go +++ b/weed/pb/mount_pb/mount.pb.go @@ -143,12 +143,12 @@ func file_mount_proto_rawDescGZIP() []byte { var file_mount_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_mount_proto_goTypes = []interface{}{ - (*ConfigureRequest)(nil), // 0: messaging_pb.ConfigureRequest - (*ConfigureResponse)(nil), // 1: messaging_pb.ConfigureResponse + (*ConfigureRequest)(nil), // 0: mq_pb.ConfigureRequest + (*ConfigureResponse)(nil), // 1: mq_pb.ConfigureResponse } var file_mount_proto_depIdxs = []int32{ - 0, // 0: messaging_pb.SeaweedMount.Configure:input_type -> messaging_pb.ConfigureRequest - 1, // 1: messaging_pb.SeaweedMount.Configure:output_type -> messaging_pb.ConfigureResponse + 0, // 0: mq_pb.SeaweedMount.Configure:input_type -> mq_pb.ConfigureRequest + 1, // 1: mq_pb.SeaweedMount.Configure:output_type -> mq_pb.ConfigureResponse 1, // [1:2] is the sub-list for method output_type 0, // [0:1] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name diff --git a/weed/pb/mount_pb/mount_grpc.pb.go b/weed/pb/mount_pb/mount_grpc.pb.go index 41737aa21..1da6542dc 100644 --- a/weed/pb/mount_pb/mount_grpc.pb.go +++ b/weed/pb/mount_pb/mount_grpc.pb.go @@ -31,7 +31,7 @@ func NewSeaweedMountClient(cc grpc.ClientConnInterface) SeaweedMountClient { func (c *seaweedMountClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*ConfigureResponse, error) { out := new(ConfigureResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMount/Configure", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMount/Configure", in, out, opts...) if err != nil { return nil, err } @@ -76,7 +76,7 @@ func _SeaweedMount_Configure_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMount/Configure", + FullMethod: "/mq_pb.SeaweedMount/Configure", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMountServer).Configure(ctx, req.(*ConfigureRequest)) @@ -88,7 +88,7 @@ func _SeaweedMount_Configure_Handler(srv interface{}, ctx context.Context, dec f // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedMount_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "messaging_pb.SeaweedMount", + ServiceName: "mq_pb.SeaweedMount", HandlerType: (*SeaweedMountServer)(nil), Methods: []grpc.MethodDesc{ { diff --git a/weed/pb/messaging_pb/messaging.pb.go b/weed/pb/mq_pb/messaging.pb.go similarity index 92% rename from weed/pb/messaging_pb/messaging.pb.go rename to weed/pb/mq_pb/messaging.pb.go index 5b9ca1ee3..8de152f1b 100644 --- a/weed/pb/messaging_pb/messaging.pb.go +++ b/weed/pb/mq_pb/messaging.pb.go @@ -2,9 +2,9 @@ // versions: // protoc-gen-go v1.26.0 // protoc v3.17.3 -// source: messaging.proto +// source: mq.proto -package messaging_pb +package mq_pb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -840,7 +840,7 @@ type TopicConfiguration struct { Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` Replication string `protobuf:"bytes,3,opt,name=replication,proto3" json:"replication,omitempty"` IsTransient bool `protobuf:"varint,4,opt,name=is_transient,json=isTransient,proto3" json:"is_transient,omitempty"` - Partitoning TopicConfiguration_Partitioning `protobuf:"varint,5,opt,name=partitoning,proto3,enum=messaging_pb.TopicConfiguration_Partitioning" json:"partitoning,omitempty"` + Partitoning TopicConfiguration_Partitioning `protobuf:"varint,5,opt,name=partitoning,proto3,enum=mq_pb.TopicConfiguration_Partitioning" json:"partitoning,omitempty"` } func (x *TopicConfiguration) Reset() { @@ -918,7 +918,7 @@ type SubscriberMessage_InitMessage struct { Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` - StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,proto3,enum=messaging_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` // Where to begin consuming from + StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,proto3,enum=mq_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` // Where to begin consuming from TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs,proto3" json:"timestampNs,omitempty"` // timestamp in nano seconds SubscriberId string `protobuf:"bytes,6,opt,name=subscriber_id,json=subscriberId,proto3" json:"subscriber_id,omitempty"` // uniquely identify a subscriber to track consumption } @@ -1407,54 +1407,54 @@ func file_messaging_proto_rawDescGZIP() []byte { var file_messaging_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_messaging_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_messaging_proto_goTypes = []interface{}{ - (SubscriberMessage_InitMessage_StartPosition)(0), // 0: messaging_pb.SubscriberMessage.InitMessage.StartPosition - (TopicConfiguration_Partitioning)(0), // 1: messaging_pb.TopicConfiguration.Partitioning - (*SubscriberMessage)(nil), // 2: messaging_pb.SubscriberMessage - (*Message)(nil), // 3: messaging_pb.Message - (*BrokerMessage)(nil), // 4: messaging_pb.BrokerMessage - (*PublishRequest)(nil), // 5: messaging_pb.PublishRequest - (*PublishResponse)(nil), // 6: messaging_pb.PublishResponse - (*DeleteTopicRequest)(nil), // 7: messaging_pb.DeleteTopicRequest - (*DeleteTopicResponse)(nil), // 8: messaging_pb.DeleteTopicResponse - (*ConfigureTopicRequest)(nil), // 9: messaging_pb.ConfigureTopicRequest - (*ConfigureTopicResponse)(nil), // 10: messaging_pb.ConfigureTopicResponse - (*GetTopicConfigurationRequest)(nil), // 11: messaging_pb.GetTopicConfigurationRequest - (*GetTopicConfigurationResponse)(nil), // 12: messaging_pb.GetTopicConfigurationResponse - (*FindBrokerRequest)(nil), // 13: messaging_pb.FindBrokerRequest - (*FindBrokerResponse)(nil), // 14: messaging_pb.FindBrokerResponse - (*TopicConfiguration)(nil), // 15: messaging_pb.TopicConfiguration - (*SubscriberMessage_InitMessage)(nil), // 16: messaging_pb.SubscriberMessage.InitMessage - (*SubscriberMessage_AckMessage)(nil), // 17: messaging_pb.SubscriberMessage.AckMessage - nil, // 18: messaging_pb.Message.HeadersEntry - (*PublishRequest_InitMessage)(nil), // 19: messaging_pb.PublishRequest.InitMessage - (*PublishResponse_ConfigMessage)(nil), // 20: messaging_pb.PublishResponse.ConfigMessage - (*PublishResponse_RedirectMessage)(nil), // 21: messaging_pb.PublishResponse.RedirectMessage + (SubscriberMessage_InitMessage_StartPosition)(0), // 0: mq_pb.SubscriberMessage.InitMessage.StartPosition + (TopicConfiguration_Partitioning)(0), // 1: mq_pb.TopicConfiguration.Partitioning + (*SubscriberMessage)(nil), // 2: mq_pb.SubscriberMessage + (*Message)(nil), // 3: mq_pb.Message + (*BrokerMessage)(nil), // 4: mq_pb.BrokerMessage + (*PublishRequest)(nil), // 5: mq_pb.PublishRequest + (*PublishResponse)(nil), // 6: mq_pb.PublishResponse + (*DeleteTopicRequest)(nil), // 7: mq_pb.DeleteTopicRequest + (*DeleteTopicResponse)(nil), // 8: mq_pb.DeleteTopicResponse + (*ConfigureTopicRequest)(nil), // 9: mq_pb.ConfigureTopicRequest + (*ConfigureTopicResponse)(nil), // 10: mq_pb.ConfigureTopicResponse + (*GetTopicConfigurationRequest)(nil), // 11: mq_pb.GetTopicConfigurationRequest + (*GetTopicConfigurationResponse)(nil), // 12: mq_pb.GetTopicConfigurationResponse + (*FindBrokerRequest)(nil), // 13: mq_pb.FindBrokerRequest + (*FindBrokerResponse)(nil), // 14: mq_pb.FindBrokerResponse + (*TopicConfiguration)(nil), // 15: mq_pb.TopicConfiguration + (*SubscriberMessage_InitMessage)(nil), // 16: mq_pb.SubscriberMessage.InitMessage + (*SubscriberMessage_AckMessage)(nil), // 17: mq_pb.SubscriberMessage.AckMessage + nil, // 18: mq_pb.Message.HeadersEntry + (*PublishRequest_InitMessage)(nil), // 19: mq_pb.PublishRequest.InitMessage + (*PublishResponse_ConfigMessage)(nil), // 20: mq_pb.PublishResponse.ConfigMessage + (*PublishResponse_RedirectMessage)(nil), // 21: mq_pb.PublishResponse.RedirectMessage } var file_messaging_proto_depIdxs = []int32{ - 16, // 0: messaging_pb.SubscriberMessage.init:type_name -> messaging_pb.SubscriberMessage.InitMessage - 17, // 1: messaging_pb.SubscriberMessage.ack:type_name -> messaging_pb.SubscriberMessage.AckMessage - 18, // 2: messaging_pb.Message.headers:type_name -> messaging_pb.Message.HeadersEntry - 3, // 3: messaging_pb.BrokerMessage.data:type_name -> messaging_pb.Message - 19, // 4: messaging_pb.PublishRequest.init:type_name -> messaging_pb.PublishRequest.InitMessage - 3, // 5: messaging_pb.PublishRequest.data:type_name -> messaging_pb.Message - 20, // 6: messaging_pb.PublishResponse.config:type_name -> messaging_pb.PublishResponse.ConfigMessage - 21, // 7: messaging_pb.PublishResponse.redirect:type_name -> messaging_pb.PublishResponse.RedirectMessage - 15, // 8: messaging_pb.ConfigureTopicRequest.configuration:type_name -> messaging_pb.TopicConfiguration - 15, // 9: messaging_pb.GetTopicConfigurationResponse.configuration:type_name -> messaging_pb.TopicConfiguration - 1, // 10: messaging_pb.TopicConfiguration.partitoning:type_name -> messaging_pb.TopicConfiguration.Partitioning - 0, // 11: messaging_pb.SubscriberMessage.InitMessage.startPosition:type_name -> messaging_pb.SubscriberMessage.InitMessage.StartPosition - 2, // 12: messaging_pb.SeaweedMessaging.Subscribe:input_type -> messaging_pb.SubscriberMessage - 5, // 13: messaging_pb.SeaweedMessaging.Publish:input_type -> messaging_pb.PublishRequest - 7, // 14: messaging_pb.SeaweedMessaging.DeleteTopic:input_type -> messaging_pb.DeleteTopicRequest - 9, // 15: messaging_pb.SeaweedMessaging.ConfigureTopic:input_type -> messaging_pb.ConfigureTopicRequest - 11, // 16: messaging_pb.SeaweedMessaging.GetTopicConfiguration:input_type -> messaging_pb.GetTopicConfigurationRequest - 13, // 17: messaging_pb.SeaweedMessaging.FindBroker:input_type -> messaging_pb.FindBrokerRequest - 4, // 18: messaging_pb.SeaweedMessaging.Subscribe:output_type -> messaging_pb.BrokerMessage - 6, // 19: messaging_pb.SeaweedMessaging.Publish:output_type -> messaging_pb.PublishResponse - 8, // 20: messaging_pb.SeaweedMessaging.DeleteTopic:output_type -> messaging_pb.DeleteTopicResponse - 10, // 21: messaging_pb.SeaweedMessaging.ConfigureTopic:output_type -> messaging_pb.ConfigureTopicResponse - 12, // 22: messaging_pb.SeaweedMessaging.GetTopicConfiguration:output_type -> messaging_pb.GetTopicConfigurationResponse - 14, // 23: messaging_pb.SeaweedMessaging.FindBroker:output_type -> messaging_pb.FindBrokerResponse + 16, // 0: mq_pb.SubscriberMessage.init:type_name -> mq_pb.SubscriberMessage.InitMessage + 17, // 1: mq_pb.SubscriberMessage.ack:type_name -> mq_pb.SubscriberMessage.AckMessage + 18, // 2: mq_pb.Message.headers:type_name -> mq_pb.Message.HeadersEntry + 3, // 3: mq_pb.BrokerMessage.data:type_name -> mq_pb.Message + 19, // 4: mq_pb.PublishRequest.init:type_name -> mq_pb.PublishRequest.InitMessage + 3, // 5: mq_pb.PublishRequest.data:type_name -> mq_pb.Message + 20, // 6: mq_pb.PublishResponse.config:type_name -> mq_pb.PublishResponse.ConfigMessage + 21, // 7: mq_pb.PublishResponse.redirect:type_name -> mq_pb.PublishResponse.RedirectMessage + 15, // 8: mq_pb.ConfigureTopicRequest.configuration:type_name -> mq_pb.TopicConfiguration + 15, // 9: mq_pb.GetTopicConfigurationResponse.configuration:type_name -> mq_pb.TopicConfiguration + 1, // 10: mq_pb.TopicConfiguration.partitoning:type_name -> mq_pb.TopicConfiguration.Partitioning + 0, // 11: mq_pb.SubscriberMessage.InitMessage.startPosition:type_name -> mq_pb.SubscriberMessage.InitMessage.StartPosition + 2, // 12: mq_pb.SeaweedMessaging.Subscribe:input_type -> mq_pb.SubscriberMessage + 5, // 13: mq_pb.SeaweedMessaging.Publish:input_type -> mq_pb.PublishRequest + 7, // 14: mq_pb.SeaweedMessaging.DeleteTopic:input_type -> mq_pb.DeleteTopicRequest + 9, // 15: mq_pb.SeaweedMessaging.ConfigureTopic:input_type -> mq_pb.ConfigureTopicRequest + 11, // 16: mq_pb.SeaweedMessaging.GetTopicConfiguration:input_type -> mq_pb.GetTopicConfigurationRequest + 13, // 17: mq_pb.SeaweedMessaging.FindBroker:input_type -> mq_pb.FindBrokerRequest + 4, // 18: mq_pb.SeaweedMessaging.Subscribe:output_type -> mq_pb.BrokerMessage + 6, // 19: mq_pb.SeaweedMessaging.Publish:output_type -> mq_pb.PublishResponse + 8, // 20: mq_pb.SeaweedMessaging.DeleteTopic:output_type -> mq_pb.DeleteTopicResponse + 10, // 21: mq_pb.SeaweedMessaging.ConfigureTopic:output_type -> mq_pb.ConfigureTopicResponse + 12, // 22: mq_pb.SeaweedMessaging.GetTopicConfiguration:output_type -> mq_pb.GetTopicConfigurationResponse + 14, // 23: mq_pb.SeaweedMessaging.FindBroker:output_type -> mq_pb.FindBrokerResponse 18, // [18:24] is the sub-list for method output_type 12, // [12:18] is the sub-list for method input_type 12, // [12:12] is the sub-list for extension type_name diff --git a/weed/pb/messaging_pb/messaging_grpc.pb.go b/weed/pb/mq_pb/messaging_grpc.pb.go similarity index 93% rename from weed/pb/messaging_pb/messaging_grpc.pb.go rename to weed/pb/mq_pb/messaging_grpc.pb.go index 234cffa95..0249a0b9c 100644 --- a/weed/pb/messaging_pb/messaging_grpc.pb.go +++ b/weed/pb/mq_pb/messaging_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -package messaging_pb +package mq_pb import ( context "context" @@ -35,7 +35,7 @@ func NewSeaweedMessagingClient(cc grpc.ClientConnInterface) SeaweedMessagingClie } func (c *seaweedMessagingClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[0], "/messaging_pb.SeaweedMessaging/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[0], "/mq_pb.SeaweedMessaging/Subscribe", opts...) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (x *seaweedMessagingSubscribeClient) Recv() (*BrokerMessage, error) { } func (c *seaweedMessagingClient) Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[1], "/messaging_pb.SeaweedMessaging/Publish", opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[1], "/mq_pb.SeaweedMessaging/Publish", opts...) if err != nil { return nil, err } @@ -98,7 +98,7 @@ func (x *seaweedMessagingPublishClient) Recv() (*PublishResponse, error) { func (c *seaweedMessagingClient) DeleteTopic(ctx context.Context, in *DeleteTopicRequest, opts ...grpc.CallOption) (*DeleteTopicResponse, error) { out := new(DeleteTopicResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/DeleteTopic", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/DeleteTopic", in, out, opts...) if err != nil { return nil, err } @@ -107,7 +107,7 @@ func (c *seaweedMessagingClient) DeleteTopic(ctx context.Context, in *DeleteTopi func (c *seaweedMessagingClient) ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) { out := new(ConfigureTopicResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/ConfigureTopic", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/ConfigureTopic", in, out, opts...) if err != nil { return nil, err } @@ -116,7 +116,7 @@ func (c *seaweedMessagingClient) ConfigureTopic(ctx context.Context, in *Configu func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) { out := new(GetTopicConfigurationResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/GetTopicConfiguration", in, out, opts...) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in * func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) { out := new(FindBrokerResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/FindBroker", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/FindBroker", in, out, opts...) if err != nil { return nil, err } @@ -242,7 +242,7 @@ func _SeaweedMessaging_DeleteTopic_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/DeleteTopic", + FullMethod: "/mq_pb.SeaweedMessaging/DeleteTopic", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).DeleteTopic(ctx, req.(*DeleteTopicRequest)) @@ -260,7 +260,7 @@ func _SeaweedMessaging_ConfigureTopic_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/ConfigureTopic", + FullMethod: "/mq_pb.SeaweedMessaging/ConfigureTopic", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).ConfigureTopic(ctx, req.(*ConfigureTopicRequest)) @@ -278,7 +278,7 @@ func _SeaweedMessaging_GetTopicConfiguration_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", + FullMethod: "/mq_pb.SeaweedMessaging/GetTopicConfiguration", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).GetTopicConfiguration(ctx, req.(*GetTopicConfigurationRequest)) @@ -296,7 +296,7 @@ func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/FindBroker", + FullMethod: "/mq_pb.SeaweedMessaging/FindBroker", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).FindBroker(ctx, req.(*FindBrokerRequest)) @@ -308,7 +308,7 @@ func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "messaging_pb.SeaweedMessaging", + ServiceName: "mq_pb.SeaweedMessaging", HandlerType: (*SeaweedMessagingServer)(nil), Methods: []grpc.MethodDesc{ { @@ -342,5 +342,5 @@ var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ ClientStreams: true, }, }, - Metadata: "messaging.proto", + Metadata: "mq.proto", } diff --git a/weed/pb/s3_pb/s3.pb.go b/weed/pb/s3_pb/s3.pb.go index c1bd23556..9923961a8 100644 --- a/weed/pb/s3_pb/s3.pb.go +++ b/weed/pb/s3_pb/s3.pb.go @@ -283,20 +283,20 @@ func file_s3_proto_rawDescGZIP() []byte { var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_s3_proto_goTypes = []interface{}{ - (*S3ConfigureRequest)(nil), // 0: messaging_pb.S3ConfigureRequest - (*S3ConfigureResponse)(nil), // 1: messaging_pb.S3ConfigureResponse - (*S3CircuitBreakerConfig)(nil), // 2: messaging_pb.S3CircuitBreakerConfig - (*S3CircuitBreakerOptions)(nil), // 3: messaging_pb.S3CircuitBreakerOptions - nil, // 4: messaging_pb.S3CircuitBreakerConfig.BucketsEntry - nil, // 5: messaging_pb.S3CircuitBreakerOptions.ActionsEntry + (*S3ConfigureRequest)(nil), // 0: mq_pb.S3ConfigureRequest + (*S3ConfigureResponse)(nil), // 1: mq_pb.S3ConfigureResponse + (*S3CircuitBreakerConfig)(nil), // 2: mq_pb.S3CircuitBreakerConfig + (*S3CircuitBreakerOptions)(nil), // 3: mq_pb.S3CircuitBreakerOptions + nil, // 4: mq_pb.S3CircuitBreakerConfig.BucketsEntry + nil, // 5: mq_pb.S3CircuitBreakerOptions.ActionsEntry } var file_s3_proto_depIdxs = []int32{ - 3, // 0: messaging_pb.S3CircuitBreakerConfig.global:type_name -> messaging_pb.S3CircuitBreakerOptions - 4, // 1: messaging_pb.S3CircuitBreakerConfig.buckets:type_name -> messaging_pb.S3CircuitBreakerConfig.BucketsEntry - 5, // 2: messaging_pb.S3CircuitBreakerOptions.actions:type_name -> messaging_pb.S3CircuitBreakerOptions.ActionsEntry - 3, // 3: messaging_pb.S3CircuitBreakerConfig.BucketsEntry.value:type_name -> messaging_pb.S3CircuitBreakerOptions - 0, // 4: messaging_pb.SeaweedS3.Configure:input_type -> messaging_pb.S3ConfigureRequest - 1, // 5: messaging_pb.SeaweedS3.Configure:output_type -> messaging_pb.S3ConfigureResponse + 3, // 0: mq_pb.S3CircuitBreakerConfig.global:type_name -> mq_pb.S3CircuitBreakerOptions + 4, // 1: mq_pb.S3CircuitBreakerConfig.buckets:type_name -> mq_pb.S3CircuitBreakerConfig.BucketsEntry + 5, // 2: mq_pb.S3CircuitBreakerOptions.actions:type_name -> mq_pb.S3CircuitBreakerOptions.ActionsEntry + 3, // 3: mq_pb.S3CircuitBreakerConfig.BucketsEntry.value:type_name -> mq_pb.S3CircuitBreakerOptions + 0, // 4: mq_pb.SeaweedS3.Configure:input_type -> mq_pb.S3ConfigureRequest + 1, // 5: mq_pb.SeaweedS3.Configure:output_type -> mq_pb.S3ConfigureResponse 5, // [5:6] is the sub-list for method output_type 4, // [4:5] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name diff --git a/weed/pb/s3_pb/s3_grpc.pb.go b/weed/pb/s3_pb/s3_grpc.pb.go index 1bc956be6..c00268bad 100644 --- a/weed/pb/s3_pb/s3_grpc.pb.go +++ b/weed/pb/s3_pb/s3_grpc.pb.go @@ -31,7 +31,7 @@ func NewSeaweedS3Client(cc grpc.ClientConnInterface) SeaweedS3Client { func (c *seaweedS3Client) Configure(ctx context.Context, in *S3ConfigureRequest, opts ...grpc.CallOption) (*S3ConfigureResponse, error) { out := new(S3ConfigureResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedS3/Configure", in, out, opts...) + err := c.cc.Invoke(ctx, "/mq_pb.SeaweedS3/Configure", in, out, opts...) if err != nil { return nil, err } @@ -76,7 +76,7 @@ func _SeaweedS3_Configure_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedS3/Configure", + FullMethod: "/mq_pb.SeaweedS3/Configure", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedS3Server).Configure(ctx, req.(*S3ConfigureRequest)) @@ -88,7 +88,7 @@ func _SeaweedS3_Configure_Handler(srv interface{}, ctx context.Context, dec func // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedS3_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "messaging_pb.SeaweedS3", + ServiceName: "mq_pb.SeaweedS3", HandlerType: (*SeaweedS3Server)(nil), Methods: []grpc.MethodDesc{ { diff --git a/weed/util/log_buffer/log_read.go b/weed/util/log_buffer/log_read.go index 99532b47b..35bc8ffd5 100644 --- a/weed/util/log_buffer/log_read.go +++ b/weed/util/log_buffer/log_read.go @@ -68,7 +68,7 @@ func (logBuffer *LogBuffer) LoopProcessLogData(readerName string, startReadTime logEntry := &filer_pb.LogEntry{} if err = proto.Unmarshal(entryData, logEntry); err != nil { - glog.Errorf("unexpected unmarshal messaging_pb.Message: %v", err) + glog.Errorf("unexpected unmarshal mq_pb.Message: %v", err) pos += 4 + int(size) continue } From ffc2c0a2ef3652159801faa568c12609f2702dbc Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 1 Jul 2022 22:44:28 -0700 Subject: [PATCH 04/17] renaming --- weed/mq/broker/broker_append.go | 10 +++++----- weed/mq/broker/broker_grpc_server_subscribe.go | 4 ++-- weed/mq/broker/broker_server.go | 16 ++++++++-------- weed/mq/broker/topic_manager.go | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/weed/mq/broker/broker_append.go b/weed/mq/broker/broker_append.go index 4f3af0ff8..c8e0da93c 100644 --- a/weed/mq/broker/broker_append.go +++ b/weed/mq/broker/broker_append.go @@ -14,7 +14,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" ) -func (broker *MessageBroker) appendToFile(targetFile string, topicConfig *mq_pb.TopicConfiguration, data []byte) error { +func (broker *MessageQueueBroker) appendToFile(targetFile string, topicConfig *mq_pb.TopicConfiguration, data []byte) error { assignResult, uploadResult, err2 := broker.assignAndUpload(topicConfig, data) if err2 != nil { @@ -46,7 +46,7 @@ func (broker *MessageBroker) appendToFile(targetFile string, topicConfig *mq_pb. return nil } -func (broker *MessageBroker) assignAndUpload(topicConfig *mq_pb.TopicConfiguration, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { +func (broker *MessageQueueBroker) assignAndUpload(topicConfig *mq_pb.TopicConfiguration, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { var assignResult = &operation.AssignResult{} @@ -106,9 +106,9 @@ func (broker *MessageBroker) assignAndUpload(topicConfig *mq_pb.TopicConfigurati return assignResult, uploadResult, nil } -var _ = filer_pb.FilerClient(&MessageBroker{}) +var _ = filer_pb.FilerClient(&MessageQueueBroker{}) -func (broker *MessageBroker) WithFilerClient(streamingMode bool, fn func(filer_pb.SeaweedFilerClient) error) (err error) { +func (broker *MessageQueueBroker) WithFilerClient(streamingMode bool, fn func(filer_pb.SeaweedFilerClient) error) (err error) { for _, filer := range broker.option.Filers { if err = pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn); err != nil { @@ -125,6 +125,6 @@ func (broker *MessageBroker) WithFilerClient(streamingMode bool, fn func(filer_p } -func (broker *MessageBroker) AdjustedUrl(location *filer_pb.Location) string { +func (broker *MessageQueueBroker) AdjustedUrl(location *filer_pb.Location) string { return location.Url } diff --git a/weed/mq/broker/broker_grpc_server_subscribe.go b/weed/mq/broker/broker_grpc_server_subscribe.go index 1a9c62d75..3743218b1 100644 --- a/weed/mq/broker/broker_grpc_server_subscribe.go +++ b/weed/mq/broker/broker_grpc_server_subscribe.go @@ -16,7 +16,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) Subscribe(stream mq_pb.SeaweedMessaging_SubscribeServer) error { +func (broker *MessageQueueBroker) Subscribe(stream mq_pb.SeaweedMessaging_SubscribeServer) error { // process initial request in, err := stream.Recv() @@ -138,7 +138,7 @@ func (broker *MessageBroker) Subscribe(stream mq_pb.SeaweedMessaging_SubscribeSe } -func (broker *MessageBroker) readPersistedLogBuffer(tp *TopicPartition, startTime time.Time, eachLogEntryFn func(logEntry *filer_pb.LogEntry) error) (err error) { +func (broker *MessageQueueBroker) readPersistedLogBuffer(tp *TopicPartition, startTime time.Time, eachLogEntryFn func(logEntry *filer_pb.LogEntry) error) (err error) { startTime = startTime.UTC() startDate := fmt.Sprintf("%04d-%02d-%02d", startTime.Year(), startTime.Month(), startTime.Day()) startHourMinute := fmt.Sprintf("%02d-%02d", startTime.Hour(), startTime.Minute()) diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 5aa5285c9..3fd01fb53 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -13,7 +13,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/master_pb" ) -type MessageBrokerOption struct { +type MessageQueueBrokerOption struct { Filers []pb.ServerAddress DefaultReplication string MaxMB int @@ -22,16 +22,16 @@ type MessageBrokerOption struct { Cipher bool } -type MessageBroker struct { +type MessageQueueBroker struct { mq_pb.UnimplementedSeaweedMessagingServer - option *MessageBrokerOption + option *MessageQueueBrokerOption grpcDialOption grpc.DialOption topicManager *TopicManager } -func NewMessageBroker(option *MessageBrokerOption, grpcDialOption grpc.DialOption) (messageBroker *MessageBroker, err error) { +func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.DialOption) (messageBroker *MessageQueueBroker, err error) { - messageBroker = &MessageBroker{ + messageBroker = &MessageQueueBroker{ option: option, grpcDialOption: grpcDialOption, } @@ -45,7 +45,7 @@ func NewMessageBroker(option *MessageBrokerOption, grpcDialOption grpc.DialOptio return messageBroker, nil } -func (broker *MessageBroker) keepConnectedToOneFiler() { +func (broker *MessageQueueBroker) keepConnectedToOneFiler() { for { for _, filer := range broker.option.Filers { @@ -101,13 +101,13 @@ func (broker *MessageBroker) keepConnectedToOneFiler() { } -func (broker *MessageBroker) withFilerClient(streamingMode bool, filer pb.ServerAddress, fn func(filer_pb.SeaweedFilerClient) error) error { +func (broker *MessageQueueBroker) withFilerClient(streamingMode bool, filer pb.ServerAddress, fn func(filer_pb.SeaweedFilerClient) error) error { return pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn) } -func (broker *MessageBroker) withMasterClient(streamingMode bool, master pb.ServerAddress, fn func(client master_pb.SeaweedClient) error) error { +func (broker *MessageQueueBroker) withMasterClient(streamingMode bool, master pb.ServerAddress, fn func(client master_pb.SeaweedClient) error) error { return pb.WithMasterClient(streamingMode, master, broker.grpcDialOption, func(client master_pb.SeaweedClient) error { return fn(client) diff --git a/weed/mq/broker/topic_manager.go b/weed/mq/broker/topic_manager.go index 1acf085fa..34f063d9a 100644 --- a/weed/mq/broker/topic_manager.go +++ b/weed/mq/broker/topic_manager.go @@ -36,10 +36,10 @@ type TopicControl struct { type TopicManager struct { sync.Mutex topicControls map[TopicPartition]*TopicControl - broker *MessageBroker + broker *MessageQueueBroker } -func NewTopicManager(messageBroker *MessageBroker) *TopicManager { +func NewTopicManager(messageBroker *MessageQueueBroker) *TopicManager { return &TopicManager{ topicControls: make(map[TopicPartition]*TopicControl), broker: messageBroker, From 857a42565ea167a59551ffe8bf9b6586573b3120 Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 1 Jul 2022 23:34:51 -0700 Subject: [PATCH 05/17] cluster.ps can list brokers --- weed/command/command.go | 4 +-- weed/command/mq_broker.go | 8 +++++- weed/command/server.go | 1 + weed/mq/broker/broker_grpc_server.go | 6 ++--- .../mq/broker/broker_grpc_server_discovery.go | 4 +-- weed/mq/broker/broker_grpc_server_publish.go | 2 +- weed/mq/broker/broker_server.go | 19 +++++++++----- weed/shell/command_cluster_ps.go | 26 +++++++++++++++++++ 8 files changed, 55 insertions(+), 15 deletions(-) diff --git a/weed/command/command.go b/weed/command/command.go index abd1b63e9..512cd6f8f 100644 --- a/weed/command/command.go +++ b/weed/command/command.go @@ -28,12 +28,12 @@ var Commands = []*Command{ cmdFilerSynchronize, cmdFix, cmdFuse, + cmdIam, cmdMaster, cmdMasterFollower, cmdMount, - cmdS3, - cmdIam, cmdMqBroker, + cmdS3, cmdScaffold, cmdServer, cmdShell, diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index da7f59596..c87cccd2c 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -23,6 +23,8 @@ var ( ) type MessageQueueBrokerOptions struct { + masters *string + filerGroup *string filer *string ip *string port *int @@ -32,7 +34,9 @@ type MessageQueueBrokerOptions struct { func init() { cmdMqBroker.Run = runMqBroker // break init cycle + mqBrokerStandaloneOptions.masters = cmdMqBroker.Flag.String("master", "localhost:9333", "comma-separated master servers") mqBrokerStandaloneOptions.filer = cmdMqBroker.Flag.String("filer", "localhost:8888", "filer server address") + mqBrokerStandaloneOptions.filerGroup = cmdMqBroker.Flag.String("filerGroup", "", "share metadata with other filers in the same filerGroup") mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") mqBrokerStandaloneOptions.port = cmdMqBroker.Flag.Int("port", 17777, "broker gRPC listen port") mqBrokerStandaloneOptions.cpuprofile = cmdMqBroker.Flag.String("cpuprofile", "", "cpu profile output file") @@ -85,7 +89,9 @@ func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { } } - qs, err := broker.NewMessageBroker(&broker.MessageBrokerOption{ + qs, err := broker.NewMessageBroker(&broker.MessageQueueBrokerOption{ + Masters: pb.ServerAddresses(*mqBrokerOpt.masters).ToAddressMap(), + FilerGroup: *mqBrokerOpt.filerGroup, Filers: []pb.ServerAddress{filerAddress}, DefaultReplication: "", MaxMB: 0, diff --git a/weed/command/server.go b/weed/command/server.go index 7c14fd14f..2c363087c 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -225,6 +225,7 @@ func runServer(cmd *Command, args []string) bool { iamOptions.filer = &filerAddress webdavOptions.filer = &filerAddress mqBrokerOptions.filer = &filerAddress + mqBrokerOptions.filerGroup = filerOptions.filerGroup go stats_collect.StartMetricsServer(*serverMetricsHttpPort) diff --git a/weed/mq/broker/broker_grpc_server.go b/weed/mq/broker/broker_grpc_server.go index 9aa9b1908..2cb4187ae 100644 --- a/weed/mq/broker/broker_grpc_server.go +++ b/weed/mq/broker/broker_grpc_server.go @@ -9,11 +9,11 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) ConfigureTopic(c context.Context, request *mq_pb.ConfigureTopicRequest) (*mq_pb.ConfigureTopicResponse, error) { +func (broker *MessageQueueBroker) ConfigureTopic(c context.Context, request *mq_pb.ConfigureTopicRequest) (*mq_pb.ConfigureTopicResponse, error) { panic("implement me") } -func (broker *MessageBroker) DeleteTopic(c context.Context, request *mq_pb.DeleteTopicRequest) (*mq_pb.DeleteTopicResponse, error) { +func (broker *MessageQueueBroker) DeleteTopic(c context.Context, request *mq_pb.DeleteTopicRequest) (*mq_pb.DeleteTopicResponse, error) { resp := &mq_pb.DeleteTopicResponse{} dir, entry := genTopicDirEntry(request.Namespace, request.Topic) if exists, err := filer_pb.Exists(broker, dir, entry, true); err != nil { @@ -24,7 +24,7 @@ func (broker *MessageBroker) DeleteTopic(c context.Context, request *mq_pb.Delet return resp, nil } -func (broker *MessageBroker) GetTopicConfiguration(c context.Context, request *mq_pb.GetTopicConfigurationRequest) (*mq_pb.GetTopicConfigurationResponse, error) { +func (broker *MessageQueueBroker) GetTopicConfiguration(c context.Context, request *mq_pb.GetTopicConfigurationRequest) (*mq_pb.GetTopicConfigurationResponse, error) { panic("implement me") } diff --git a/weed/mq/broker/broker_grpc_server_discovery.go b/weed/mq/broker/broker_grpc_server_discovery.go index 0c8d70e68..e276091a9 100644 --- a/weed/mq/broker/broker_grpc_server_discovery.go +++ b/weed/mq/broker/broker_grpc_server_discovery.go @@ -26,7 +26,7 @@ If one of the pub or sub connects very late, and the system topo changed quite a */ -func (broker *MessageBroker) FindBroker(c context.Context, request *mq_pb.FindBrokerRequest) (*mq_pb.FindBrokerResponse, error) { +func (broker *MessageQueueBroker) FindBroker(c context.Context, request *mq_pb.FindBrokerRequest) (*mq_pb.FindBrokerResponse, error) { t := &mq_pb.FindBrokerResponse{} var peers []string @@ -61,7 +61,7 @@ func (broker *MessageBroker) FindBroker(c context.Context, request *mq_pb.FindBr } -func (broker *MessageBroker) checkFilers() { +func (broker *MessageQueueBroker) checkFilers() { // contact a filer about masters var masters []pb.ServerAddress diff --git a/weed/mq/broker/broker_grpc_server_publish.go b/weed/mq/broker/broker_grpc_server_publish.go index 4ff9ad809..eb76dd5dc 100644 --- a/weed/mq/broker/broker_grpc_server_publish.go +++ b/weed/mq/broker/broker_grpc_server_publish.go @@ -13,7 +13,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -func (broker *MessageBroker) Publish(stream mq_pb.SeaweedMessaging_PublishServer) error { +func (broker *MessageQueueBroker) Publish(stream mq_pb.SeaweedMessaging_PublishServer) error { // process initial request in, err := stream.Recv() diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 3fd01fb53..dbd854250 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -2,7 +2,9 @@ package broker import ( "context" + "github.com/chrislusf/seaweedfs/weed/cluster" "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" + "github.com/chrislusf/seaweedfs/weed/wdclient" "time" "google.golang.org/grpc" @@ -14,6 +16,8 @@ import ( ) type MessageQueueBrokerOption struct { + Masters map[string]pb.ServerAddress + FilerGroup string Filers []pb.ServerAddress DefaultReplication string MaxMB int @@ -26,23 +30,26 @@ type MessageQueueBroker struct { mq_pb.UnimplementedSeaweedMessagingServer option *MessageQueueBrokerOption grpcDialOption grpc.DialOption + MasterClient *wdclient.MasterClient topicManager *TopicManager } -func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.DialOption) (messageBroker *MessageQueueBroker, err error) { +func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.DialOption) (mqBroker *MessageQueueBroker, err error) { - messageBroker = &MessageQueueBroker{ + mqBroker = &MessageQueueBroker{ option: option, grpcDialOption: grpcDialOption, + MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), "", option.Masters), } - messageBroker.topicManager = NewTopicManager(messageBroker) + mqBroker.topicManager = NewTopicManager(mqBroker) - messageBroker.checkFilers() + mqBroker.checkFilers() - go messageBroker.keepConnectedToOneFiler() + go mqBroker.keepConnectedToOneFiler() + go mqBroker.MasterClient.KeepConnectedToMaster() - return messageBroker, nil + return mqBroker, nil } func (broker *MessageQueueBroker) keepConnectedToOneFiler() { diff --git a/weed/shell/command_cluster_ps.go b/weed/shell/command_cluster_ps.go index 21d3587fb..fc5f801b1 100644 --- a/weed/shell/command_cluster_ps.go +++ b/weed/shell/command_cluster_ps.go @@ -40,7 +40,9 @@ func (c *commandClusterPs) Do(args []string, commandEnv *CommandEnv, writer io.W } var filerNodes []*master_pb.ListClusterNodesResponse_ClusterNode + var mqBrokerNodes []*master_pb.ListClusterNodesResponse_ClusterNode + // get the list of filers err = commandEnv.MasterClient.WithClient(false, func(client master_pb.SeaweedClient) error { resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ ClientType: cluster.FilerType, @@ -57,6 +59,30 @@ func (c *commandClusterPs) Do(args []string, commandEnv *CommandEnv, writer io.W return } + // get the list of message queue brokers + err = commandEnv.MasterClient.WithClient(false, func(client master_pb.SeaweedClient) error { + resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ + ClientType: cluster.BrokerType, + FilerGroup: *commandEnv.option.FilerGroup, + }) + if err != nil { + return err + } + + mqBrokerNodes = resp.ClusterNodes + return err + }) + if err != nil { + return + } + + if len(mqBrokerNodes) > 0 { + fmt.Fprintf(writer, "* message queue brokers %d\n", len(mqBrokerNodes)) + for _, node := range mqBrokerNodes { + fmt.Fprintf(writer, " * %s (%v)\n", node.Address, node.Version) + } + } + fmt.Fprintf(writer, "* filers %d\n", len(filerNodes)) for _, node := range filerNodes { fmt.Fprintf(writer, " * %s (%v)\n", node.Address, node.Version) From 0f5d7ed242657b15ca35a6e46304068cf89bca17 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sat, 2 Jul 2022 09:28:24 -0700 Subject: [PATCH 06/17] mq broker adds data center and rack --- weed/command/mq_broker.go | 4 ++++ weed/command/server.go | 2 ++ 2 files changed, 6 insertions(+) diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index c87cccd2c..a80e3da70 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -28,6 +28,8 @@ type MessageQueueBrokerOptions struct { filer *string ip *string port *int + dataCenter *string + rack *string cpuprofile *string memprofile *string } @@ -39,6 +41,8 @@ func init() { mqBrokerStandaloneOptions.filerGroup = cmdMqBroker.Flag.String("filerGroup", "", "share metadata with other filers in the same filerGroup") mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") mqBrokerStandaloneOptions.port = cmdMqBroker.Flag.Int("port", 17777, "broker gRPC listen port") + mqBrokerStandaloneOptions.dataCenter = cmdMqBroker.Flag.String("dataCenter", "", "prefer to read and write to volumes in this data center") + mqBrokerStandaloneOptions.rack = cmdMqBroker.Flag.String("rack", "", "prefer to write to volumes in this rack") mqBrokerStandaloneOptions.cpuprofile = cmdMqBroker.Flag.String("cpuprofile", "", "cpu profile output file") mqBrokerStandaloneOptions.memprofile = cmdMqBroker.Flag.String("memprofile", "", "memory profile output file") } diff --git a/weed/command/server.go b/weed/command/server.go index 2c363087c..9e1cea07d 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -217,6 +217,8 @@ func runServer(cmd *Command, args []string) bool { filerOptions.dataCenter = serverDataCenter filerOptions.rack = serverRack + mqBrokerOptions.dataCenter = serverDataCenter + mqBrokerOptions.rack = serverRack filerOptions.disableHttp = serverDisableHttp masterOptions.disableHttp = serverDisableHttp From 9f20d3ebd1a756d27169bc0299401a0c76f787ff Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 3 Jul 2022 00:29:25 -0700 Subject: [PATCH 07/17] add dc and rack --- weed/cluster/cluster.go | 82 +- weed/cluster/cluster_test.go | 22 +- weed/command/benchmark.go | 2 +- weed/command/mq_broker.go | 2 + weed/filer/filer.go | 2 +- weed/iamapi/iamapi_server.go | 2 +- weed/mq/broker/broker_server.go | 4 +- weed/pb/master.proto | 2 + weed/pb/master_pb/master.pb.go | 971 +++++++++--------- weed/pb/mount_pb/mount.pb.go | 8 +- weed/pb/mount_pb/mount_grpc.pb.go | 6 +- weed/pb/{messaging.proto => mq.proto} | 4 +- weed/pb/mq_pb/{messaging.pb.go => mq.pb.go} | 671 ++++++------ .../{messaging_grpc.pb.go => mq_grpc.pb.go} | 22 +- weed/pb/remote_pb/remote.pb.go | 241 ++--- weed/pb/s3_pb/s3.pb.go | 28 +- weed/pb/s3_pb/s3_grpc.pb.go | 6 +- weed/server/master_grpc_server.go | 5 +- weed/server/master_server.go | 2 +- weed/shell/commands.go | 2 +- weed/wdclient/masterclient.go | 6 +- 21 files changed, 1056 insertions(+), 1034 deletions(-) rename weed/pb/{messaging.proto => mq.proto} (97%) rename weed/pb/mq_pb/{messaging.pb.go => mq.pb.go} (59%) rename weed/pb/mq_pb/{messaging_grpc.pb.go => mq_grpc.pb.go} (93%) diff --git a/weed/cluster/cluster.go b/weed/cluster/cluster.go index ad6e6b879..1802ecda0 100644 --- a/weed/cluster/cluster.go +++ b/weed/cluster/cluster.go @@ -24,6 +24,15 @@ type Leaders struct { leaders [3]pb.ServerAddress } +type DataCenter string +type Rack string +type DataCenterBrokers struct { + brokers map[Rack]*RackBrokers +} +type RackBrokers struct { + brokers map[pb.ServerAddress]*ClusterNode +} + type ClusterNode struct { Address pb.ServerAddress Version string @@ -34,14 +43,14 @@ type ClusterNode struct { type Cluster struct { filerGroup2filers map[FilerGroup]*Filers filersLock sync.RWMutex - brokers map[pb.ServerAddress]*ClusterNode + brokers map[DataCenter]*DataCenterBrokers brokersLock sync.RWMutex } func NewCluster() *Cluster { return &Cluster{ filerGroup2filers: make(map[FilerGroup]*Filers), - brokers: make(map[pb.ServerAddress]*ClusterNode), + brokers: make(map[DataCenter]*DataCenterBrokers), } } @@ -57,7 +66,7 @@ func (cluster *Cluster) getFilers(filerGroup FilerGroup, createIfNotFound bool) return filers } -func (cluster *Cluster) AddClusterNode(ns, nodeType string, address pb.ServerAddress, version string) []*master_pb.KeepConnectedResponse { +func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) []*master_pb.KeepConnectedResponse { filerGroup := FilerGroup(ns) switch nodeType { case FilerType: @@ -78,11 +87,24 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, address pb.ServerAdd case BrokerType: cluster.brokersLock.Lock() defer cluster.brokersLock.Unlock() - if existingNode, found := cluster.brokers[address]; found { - existingNode.counter++ + existingDataCenterBrokers, foundDataCenter := cluster.brokers[dataCenter] + if !foundDataCenter { + existingDataCenterBrokers = &DataCenterBrokers{ + brokers: make(map[Rack]*RackBrokers), + } + } + existingRackBrokers, foundRack := existingDataCenterBrokers.brokers[rack] + if !foundRack { + existingRackBrokers = &RackBrokers{ + brokers: make(map[pb.ServerAddress]*ClusterNode), + } + } + + if existingBroker, found := existingRackBrokers.brokers[address]; found { + existingBroker.counter++ return nil } - cluster.brokers[address] = &ClusterNode{ + existingRackBrokers.brokers[address] = &ClusterNode{ Address: address, Version: version, counter: 1, @@ -111,7 +133,7 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, address pb.ServerAdd return nil } -func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, address pb.ServerAddress) []*master_pb.KeepConnectedResponse { +func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress) []*master_pb.KeepConnectedResponse { filerGroup := FilerGroup(ns) switch nodeType { case FilerType: @@ -133,23 +155,35 @@ func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, address pb case BrokerType: cluster.brokersLock.Lock() defer cluster.brokersLock.Unlock() - if existingNode, found := cluster.brokers[address]; !found { + + existingDataCenterBrokers, foundDataCenter := cluster.brokers[dataCenter] + if !foundDataCenter { return nil - } else { - existingNode.counter-- - if existingNode.counter <= 0 { - delete(cluster.brokers, address) - return []*master_pb.KeepConnectedResponse{ - { - ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ - NodeType: nodeType, - Address: string(address), - IsAdd: false, - }, + } + existingRackBrokers, foundRack := existingDataCenterBrokers.brokers[Rack(rack)] + if !foundRack { + return nil + } + + existingBroker, found := existingRackBrokers.brokers[address] + if !found { + return nil + } + existingBroker.counter-- + if existingBroker.counter <= 0 { + delete(existingRackBrokers.brokers, address) + return []*master_pb.KeepConnectedResponse{ + { + ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ + NodeType: nodeType, + Address: string(address), + IsAdd: false, }, - } + }, } } + return nil + case MasterType: return []*master_pb.KeepConnectedResponse{ { @@ -179,8 +213,12 @@ func (cluster *Cluster) ListClusterNode(filerGroup FilerGroup, nodeType string) case BrokerType: cluster.brokersLock.RLock() defer cluster.brokersLock.RUnlock() - for _, node := range cluster.brokers { - nodes = append(nodes, node) + for _, dcNodes := range cluster.brokers { + for _, rackNodes := range dcNodes.brokers { + for _, node := range rackNodes.brokers { + nodes = append(nodes, node) + } + } } case MasterType: } diff --git a/weed/cluster/cluster_test.go b/weed/cluster/cluster_test.go index 1187642de..76cff2a3e 100644 --- a/weed/cluster/cluster_test.go +++ b/weed/cluster/cluster_test.go @@ -11,24 +11,24 @@ import ( func TestClusterAddRemoveNodes(t *testing.T) { c := NewCluster() - c.AddClusterNode("", "filer", pb.ServerAddress("111:1"), "23.45") - c.AddClusterNode("", "filer", pb.ServerAddress("111:2"), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:1"), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:2"), "23.45") assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), }, c.getFilers("", false).leaders.GetLeaders()) - c.AddClusterNode("", "filer", pb.ServerAddress("111:3"), "23.45") - c.AddClusterNode("", "filer", pb.ServerAddress("111:4"), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:3"), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:4"), "23.45") assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), pb.ServerAddress("111:3"), }, c.getFilers("", false).leaders.GetLeaders()) - c.AddClusterNode("", "filer", pb.ServerAddress("111:5"), "23.45") - c.AddClusterNode("", "filer", pb.ServerAddress("111:6"), "23.45") - c.RemoveClusterNode("", "filer", pb.ServerAddress("111:4")) + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:5"), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:6"), "23.45") + c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:4")) assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), @@ -36,7 +36,7 @@ func TestClusterAddRemoveNodes(t *testing.T) { }, c.getFilers("", false).leaders.GetLeaders()) // remove oldest - c.RemoveClusterNode("", "filer", pb.ServerAddress("111:1")) + c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:1")) assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:6"), pb.ServerAddress("111:2"), @@ -44,7 +44,7 @@ func TestClusterAddRemoveNodes(t *testing.T) { }, c.getFilers("", false).leaders.GetLeaders()) // remove oldest - c.RemoveClusterNode("", "filer", pb.ServerAddress("111:1")) + c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:1")) } @@ -56,7 +56,7 @@ func TestConcurrentAddRemoveNodes(t *testing.T) { go func(i int) { defer wg.Done() address := strconv.Itoa(i) - c.AddClusterNode("", "filer", pb.ServerAddress(address), "23.45") + c.AddClusterNode("", "filer", "", "", pb.ServerAddress(address), "23.45") }(i) } wg.Wait() @@ -66,7 +66,7 @@ func TestConcurrentAddRemoveNodes(t *testing.T) { go func(i int) { defer wg.Done() address := strconv.Itoa(i) - node := c.RemoveClusterNode("", "filer", pb.ServerAddress(address)) + node := c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress(address)) if len(node) == 0 { t.Errorf("TestConcurrentAddRemoveNodes: node[%s] not found", address) diff --git a/weed/command/benchmark.go b/weed/command/benchmark.go index 9f18cc5b9..d600e32b5 100644 --- a/weed/command/benchmark.go +++ b/weed/command/benchmark.go @@ -129,7 +129,7 @@ func runBenchmark(cmd *Command, args []string) bool { defer pprof.StopCPUProfile() } - b.masterClient = wdclient.NewMasterClient(b.grpcDialOption, "", "client", "", "", pb.ServerAddresses(*b.masters).ToAddressMap()) + b.masterClient = wdclient.NewMasterClient(b.grpcDialOption, "", "client", "", "", "", pb.ServerAddresses(*b.masters).ToAddressMap()) go b.masterClient.KeepConnectedToMaster() b.masterClient.WaitUntilConnected() diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index a80e3da70..65f49e673 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -96,6 +96,8 @@ func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { qs, err := broker.NewMessageBroker(&broker.MessageQueueBrokerOption{ Masters: pb.ServerAddresses(*mqBrokerOpt.masters).ToAddressMap(), FilerGroup: *mqBrokerOpt.filerGroup, + DataCenter: *mqBrokerOpt.dataCenter, + Rack: *mqBrokerOpt.rack, Filers: []pb.ServerAddress{filerAddress}, DefaultReplication: "", MaxMB: 0, diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 86827c50e..b1582bd30 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -51,7 +51,7 @@ type Filer struct { func NewFiler(masters map[string]pb.ServerAddress, grpcDialOption grpc.DialOption, filerHost pb.ServerAddress, filerGroup string, collection string, replication string, dataCenter string, notifyFn func()) *Filer { f := &Filer{ - MasterClient: wdclient.NewMasterClient(grpcDialOption, filerGroup, cluster.FilerType, filerHost, dataCenter, masters), + MasterClient: wdclient.NewMasterClient(grpcDialOption, filerGroup, cluster.FilerType, filerHost, dataCenter, "", masters), fileIdDeletionQueue: util.NewUnboundedQueue(), GrpcDialOption: grpcDialOption, FilerConf: NewFilerConf(), diff --git a/weed/iamapi/iamapi_server.go b/weed/iamapi/iamapi_server.go index 62c7f867c..8a464782a 100644 --- a/weed/iamapi/iamapi_server.go +++ b/weed/iamapi/iamapi_server.go @@ -49,7 +49,7 @@ var s3ApiConfigure IamS3ApiConfig func NewIamApiServer(router *mux.Router, option *IamServerOption) (iamApiServer *IamApiServer, err error) { s3ApiConfigure = IamS3ApiConfigure{ option: option, - masterClient: wdclient.NewMasterClient(option.GrpcDialOption, "", "iam", "", "", option.Masters), + masterClient: wdclient.NewMasterClient(option.GrpcDialOption, "", "iam", "", "", "", option.Masters), } s3Option := s3api.S3ApiServerOption{Filer: option.Filer} iamApiServer = &IamApiServer{ diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index dbd854250..1887498d2 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -18,6 +18,8 @@ import ( type MessageQueueBrokerOption struct { Masters map[string]pb.ServerAddress FilerGroup string + DataCenter string + Rack string Filers []pb.ServerAddress DefaultReplication string MaxMB int @@ -39,7 +41,7 @@ func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.Dial mqBroker = &MessageQueueBroker{ option: option, grpcDialOption: grpcDialOption, - MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), "", option.Masters), + MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), option.DataCenter, "", option.Masters), } mqBroker.topicManager = NewTopicManager(mqBroker) diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 84ec7374b..cb89913ac 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -139,6 +139,8 @@ message KeepConnectedRequest { string client_address = 3; string version = 4; string filer_group = 5; + string data_center = 6; + string rack = 7; } message VolumeLocation { diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 4ffa7fb69..dce816000 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -767,6 +767,8 @@ type KeepConnectedRequest struct { ClientAddress string `protobuf:"bytes,3,opt,name=client_address,json=clientAddress,proto3" json:"client_address,omitempty"` Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"` FilerGroup string `protobuf:"bytes,5,opt,name=filer_group,json=filerGroup,proto3" json:"filer_group,omitempty"` + DataCenter string `protobuf:"bytes,6,opt,name=data_center,json=dataCenter,proto3" json:"data_center,omitempty"` + Rack string `protobuf:"bytes,7,opt,name=rack,proto3" json:"rack,omitempty"` } func (x *KeepConnectedRequest) Reset() { @@ -829,6 +831,20 @@ func (x *KeepConnectedRequest) GetFilerGroup() string { return "" } +func (x *KeepConnectedRequest) GetDataCenter() string { + if x != nil { + return x.DataCenter + } + return "" +} + +func (x *KeepConnectedRequest) GetRack() string { + if x != nil { + return x.Rack + } + return "" +} + type VolumeLocation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3831,7 +3847,7 @@ var file_master_proto_rawDesc = []byte{ 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x22, 0x99, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x14, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, @@ -3841,489 +3857,492 @@ var file_master_proto_rawDesc = []byte{ 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, - 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x9d, 0x02, 0x0a, 0x0e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, - 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, - 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x07, 0x6e, 0x65, 0x77, 0x56, 0x69, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x56, 0x69, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x69, 0x64, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x45, 0x63, 0x56, 0x69, 0x64, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x63, 0x5f, - 0x76, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x45, 0x63, 0x56, 0x69, 0x64, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x11, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x41, 0x64, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x22, - 0xa9, 0x01, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, - 0x13, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x62, 0x0a, 0x13, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6f, 0x72, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x95, 0x02, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x13, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, - 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x9a, 0x01, 0x0a, 0x10, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x29, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4f, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x22, 0x58, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, - 0x74, 0x22, 0xd0, 0x02, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, - 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x32, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x70, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, - 0x65, 0x4d, 0x62, 0x12, 0x32, 0x0a, 0x15, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x13, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, - 0x54, 0x79, 0x70, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x11, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x75, 0x73, 0x65, 0x64, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, - 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x91, 0x03, 0x0a, 0x08, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x66, 0x72, 0x65, 0x65, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x65, 0x63, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x63, 0x53, - 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x65, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x0c, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x67, - 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf0, 0x01, 0x0a, 0x08, - 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, - 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x40, 0x0a, 0x09, 0x64, 0x69, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, - 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xef, - 0x01, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x72, 0x61, 0x63, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, + 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, + 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x22, 0x9d, + 0x02, 0x0a, 0x0e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x56, 0x69, 0x64, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x56, 0x69, 0x64, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, + 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x65, 0x63, + 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x09, 0x6e, 0x65, 0x77, + 0x45, 0x63, 0x56, 0x69, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x69, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x63, 0x56, 0x69, 0x64, 0x73, 0x22, 0xc3, + 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x69, + 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x61, + 0x64, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x41, 0x64, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x4e, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x15, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x11, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x22, 0x62, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x72, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x95, 0x02, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, + 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x9a, 0x01, 0x0a, 0x10, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6f, + 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x22, 0x58, 0x0a, 0x08, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, + 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, + 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xd0, 0x02, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, + 0x74, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x6d, + 0x61, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6d, 0x62, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x70, 0x4d, + 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x62, 0x12, 0x32, 0x0a, 0x15, 0x57, 0x72, 0x69, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x57, 0x72, 0x69, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x66, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x12, 0x2f, + 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, + 0x2f, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x84, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x69, + 0x73, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x22, 0x6f, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7b, 0x0a, 0x15, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x6f, 0x72, 0x6d, + 0x61, 0x6c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x65, 0x63, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x45, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x51, 0x0a, 0x16, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2d, 0x0a, 0x17, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x03, 0x0a, 0x08, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x66, 0x72, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x2e, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x46, 0x0a, 0x0c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x50, 0x0a, 0x0e, 0x65, 0x63, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0c, 0x65, 0x63, 0x53, + 0x68, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x0c, 0x44, 0x61, + 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xfe, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, - 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x51, - 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x69, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x12, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, - 0x0d, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x14, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x6d, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x62, 0x22, 0x34, 0x0a, 0x15, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x49, 0x64, 0x22, 0xfb, 0x01, 0x0a, 0x16, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x61, 0x0a, 0x12, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x61, 0x0a, - 0x11, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x31, 0x0a, - 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x7f, 0x0a, 0x13, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x61, 0x72, 0x62, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x10, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf3, 0x02, 0x0a, 0x1e, 0x47, - 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, - 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x12, 0x44, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x30, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x5f, 0x62, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x22, 0xf0, 0x01, 0x0a, 0x08, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, + 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0d, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x40, + 0x0a, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, + 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xef, 0x01, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x32, 0x0a, 0x0a, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x72, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x09, 0x64, 0x69, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfe, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x45, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x64, 0x61, + 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x44, 0x0a, + 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x64, 0x69, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x73, 0x1a, 0x51, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x13, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x12, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2f, 0x0a, 0x14, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, - 0x42, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x22, 0x5b, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xf5, 0x01, - 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x1a, 0x82, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x4e, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, - 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, - 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, - 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x22, 0x56, 0x0a, 0x14, - 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, - 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, - 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x1a, - 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x61, - 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x1e, - 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, - 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x32, 0xaf, 0x0c, 0x0a, 0x07, 0x53, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, - 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, - 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, - 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, - 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, - 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, - 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, - 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, - 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, + 0x62, 0x22, 0x34, 0x0a, 0x15, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x22, 0xfb, 0x01, 0x0a, 0x16, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, + 0x61, 0x0a, 0x12, 0x73, 0x68, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, + 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x10, 0x73, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x61, 0x0a, 0x11, 0x45, 0x63, 0x53, 0x68, 0x61, 0x72, 0x64, 0x49, 0x64, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x73, 0x68, 0x61, 0x72, 0x64, + 0x49, 0x64, 0x12, 0x31, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x13, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, + 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xf3, 0x02, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x52, 0x0f, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x5f, 0x62, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x42, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x5b, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x22, 0xf5, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x54, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x82, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, + 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, - 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, + 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, + 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, + 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, + 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, + 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x4e, + 0x73, 0x22, 0x56, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x61, 0x66, + 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1f, 0x0a, 0x1d, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xdb, 0x01, 0x0a, 0x1e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x32, 0xaf, + 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, + 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, + 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, + 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x18, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, + 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, + 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x04, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, - 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, - 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, - 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, - 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, - 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x39, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x61, + 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x52, + 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, + 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, + 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/weed/pb/mount_pb/mount.pb.go b/weed/pb/mount_pb/mount.pb.go index 642ffe59c..cbaf533fe 100644 --- a/weed/pb/mount_pb/mount.pb.go +++ b/weed/pb/mount_pb/mount.pb.go @@ -143,12 +143,12 @@ func file_mount_proto_rawDescGZIP() []byte { var file_mount_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_mount_proto_goTypes = []interface{}{ - (*ConfigureRequest)(nil), // 0: mq_pb.ConfigureRequest - (*ConfigureResponse)(nil), // 1: mq_pb.ConfigureResponse + (*ConfigureRequest)(nil), // 0: messaging_pb.ConfigureRequest + (*ConfigureResponse)(nil), // 1: messaging_pb.ConfigureResponse } var file_mount_proto_depIdxs = []int32{ - 0, // 0: mq_pb.SeaweedMount.Configure:input_type -> mq_pb.ConfigureRequest - 1, // 1: mq_pb.SeaweedMount.Configure:output_type -> mq_pb.ConfigureResponse + 0, // 0: messaging_pb.SeaweedMount.Configure:input_type -> messaging_pb.ConfigureRequest + 1, // 1: messaging_pb.SeaweedMount.Configure:output_type -> messaging_pb.ConfigureResponse 1, // [1:2] is the sub-list for method output_type 0, // [0:1] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name diff --git a/weed/pb/mount_pb/mount_grpc.pb.go b/weed/pb/mount_pb/mount_grpc.pb.go index 1da6542dc..41737aa21 100644 --- a/weed/pb/mount_pb/mount_grpc.pb.go +++ b/weed/pb/mount_pb/mount_grpc.pb.go @@ -31,7 +31,7 @@ func NewSeaweedMountClient(cc grpc.ClientConnInterface) SeaweedMountClient { func (c *seaweedMountClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*ConfigureResponse, error) { out := new(ConfigureResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMount/Configure", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMount/Configure", in, out, opts...) if err != nil { return nil, err } @@ -76,7 +76,7 @@ func _SeaweedMount_Configure_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedMount/Configure", + FullMethod: "/messaging_pb.SeaweedMount/Configure", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMountServer).Configure(ctx, req.(*ConfigureRequest)) @@ -88,7 +88,7 @@ func _SeaweedMount_Configure_Handler(srv interface{}, ctx context.Context, dec f // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedMount_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "mq_pb.SeaweedMount", + ServiceName: "messaging_pb.SeaweedMount", HandlerType: (*SeaweedMountServer)(nil), Methods: []grpc.MethodDesc{ { diff --git a/weed/pb/messaging.proto b/weed/pb/mq.proto similarity index 97% rename from weed/pb/messaging.proto rename to weed/pb/mq.proto index a73bc99a6..abe538485 100644 --- a/weed/pb/messaging.proto +++ b/weed/pb/mq.proto @@ -3,8 +3,8 @@ syntax = "proto3"; package messaging_pb; option go_package = "github.com/chrislusf/seaweedfs/weed/pb/mq_pb"; -option java_package = "seaweedfs.client"; -option java_outer_classname = "MessagingProto"; +option java_package = "seaweedfs.mq"; +option java_outer_classname = "MessagQueueProto"; ////////////////////////////////////////////////// diff --git a/weed/pb/mq_pb/messaging.pb.go b/weed/pb/mq_pb/mq.pb.go similarity index 59% rename from weed/pb/mq_pb/messaging.pb.go rename to weed/pb/mq_pb/mq.pb.go index 8de152f1b..a47ce128d 100644 --- a/weed/pb/mq_pb/messaging.pb.go +++ b/weed/pb/mq_pb/mq.pb.go @@ -53,11 +53,11 @@ func (x SubscriberMessage_InitMessage_StartPosition) String() string { } func (SubscriberMessage_InitMessage_StartPosition) Descriptor() protoreflect.EnumDescriptor { - return file_messaging_proto_enumTypes[0].Descriptor() + return file_mq_proto_enumTypes[0].Descriptor() } func (SubscriberMessage_InitMessage_StartPosition) Type() protoreflect.EnumType { - return &file_messaging_proto_enumTypes[0] + return &file_mq_proto_enumTypes[0] } func (x SubscriberMessage_InitMessage_StartPosition) Number() protoreflect.EnumNumber { @@ -66,7 +66,7 @@ func (x SubscriberMessage_InitMessage_StartPosition) Number() protoreflect.EnumN // Deprecated: Use SubscriberMessage_InitMessage_StartPosition.Descriptor instead. func (SubscriberMessage_InitMessage_StartPosition) EnumDescriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{0, 0, 0} + return file_mq_proto_rawDescGZIP(), []int{0, 0, 0} } type TopicConfiguration_Partitioning int32 @@ -102,11 +102,11 @@ func (x TopicConfiguration_Partitioning) String() string { } func (TopicConfiguration_Partitioning) Descriptor() protoreflect.EnumDescriptor { - return file_messaging_proto_enumTypes[1].Descriptor() + return file_mq_proto_enumTypes[1].Descriptor() } func (TopicConfiguration_Partitioning) Type() protoreflect.EnumType { - return &file_messaging_proto_enumTypes[1] + return &file_mq_proto_enumTypes[1] } func (x TopicConfiguration_Partitioning) Number() protoreflect.EnumNumber { @@ -115,7 +115,7 @@ func (x TopicConfiguration_Partitioning) Number() protoreflect.EnumNumber { // Deprecated: Use TopicConfiguration_Partitioning.Descriptor instead. func (TopicConfiguration_Partitioning) EnumDescriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{13, 0} + return file_mq_proto_rawDescGZIP(), []int{13, 0} } type SubscriberMessage struct { @@ -131,7 +131,7 @@ type SubscriberMessage struct { func (x *SubscriberMessage) Reset() { *x = SubscriberMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[0] + mi := &file_mq_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -144,7 +144,7 @@ func (x *SubscriberMessage) String() string { func (*SubscriberMessage) ProtoMessage() {} func (x *SubscriberMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[0] + mi := &file_mq_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -157,7 +157,7 @@ func (x *SubscriberMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriberMessage.ProtoReflect.Descriptor instead. func (*SubscriberMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{0} + return file_mq_proto_rawDescGZIP(), []int{0} } func (x *SubscriberMessage) GetInit() *SubscriberMessage_InitMessage { @@ -196,7 +196,7 @@ type Message struct { func (x *Message) Reset() { *x = Message{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[1] + mi := &file_mq_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -209,7 +209,7 @@ func (x *Message) String() string { func (*Message) ProtoMessage() {} func (x *Message) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[1] + mi := &file_mq_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -222,7 +222,7 @@ func (x *Message) ProtoReflect() protoreflect.Message { // Deprecated: Use Message.ProtoReflect.Descriptor instead. func (*Message) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{1} + return file_mq_proto_rawDescGZIP(), []int{1} } func (x *Message) GetEventTimeNs() int64 { @@ -271,7 +271,7 @@ type BrokerMessage struct { func (x *BrokerMessage) Reset() { *x = BrokerMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[2] + mi := &file_mq_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -284,7 +284,7 @@ func (x *BrokerMessage) String() string { func (*BrokerMessage) ProtoMessage() {} func (x *BrokerMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[2] + mi := &file_mq_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -297,7 +297,7 @@ func (x *BrokerMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use BrokerMessage.ProtoReflect.Descriptor instead. func (*BrokerMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{2} + return file_mq_proto_rawDescGZIP(), []int{2} } func (x *BrokerMessage) GetData() *Message { @@ -319,7 +319,7 @@ type PublishRequest struct { func (x *PublishRequest) Reset() { *x = PublishRequest{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[3] + mi := &file_mq_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -332,7 +332,7 @@ func (x *PublishRequest) String() string { func (*PublishRequest) ProtoMessage() {} func (x *PublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[3] + mi := &file_mq_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -345,7 +345,7 @@ func (x *PublishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead. func (*PublishRequest) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{3} + return file_mq_proto_rawDescGZIP(), []int{3} } func (x *PublishRequest) GetInit() *PublishRequest_InitMessage { @@ -375,7 +375,7 @@ type PublishResponse struct { func (x *PublishResponse) Reset() { *x = PublishResponse{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[4] + mi := &file_mq_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -388,7 +388,7 @@ func (x *PublishResponse) String() string { func (*PublishResponse) ProtoMessage() {} func (x *PublishResponse) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[4] + mi := &file_mq_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -401,7 +401,7 @@ func (x *PublishResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishResponse.ProtoReflect.Descriptor instead. func (*PublishResponse) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{4} + return file_mq_proto_rawDescGZIP(), []int{4} } func (x *PublishResponse) GetConfig() *PublishResponse_ConfigMessage { @@ -437,7 +437,7 @@ type DeleteTopicRequest struct { func (x *DeleteTopicRequest) Reset() { *x = DeleteTopicRequest{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[5] + mi := &file_mq_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -450,7 +450,7 @@ func (x *DeleteTopicRequest) String() string { func (*DeleteTopicRequest) ProtoMessage() {} func (x *DeleteTopicRequest) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[5] + mi := &file_mq_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -463,7 +463,7 @@ func (x *DeleteTopicRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTopicRequest.ProtoReflect.Descriptor instead. func (*DeleteTopicRequest) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{5} + return file_mq_proto_rawDescGZIP(), []int{5} } func (x *DeleteTopicRequest) GetNamespace() string { @@ -489,7 +489,7 @@ type DeleteTopicResponse struct { func (x *DeleteTopicResponse) Reset() { *x = DeleteTopicResponse{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[6] + mi := &file_mq_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -502,7 +502,7 @@ func (x *DeleteTopicResponse) String() string { func (*DeleteTopicResponse) ProtoMessage() {} func (x *DeleteTopicResponse) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[6] + mi := &file_mq_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -515,7 +515,7 @@ func (x *DeleteTopicResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteTopicResponse.ProtoReflect.Descriptor instead. func (*DeleteTopicResponse) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{6} + return file_mq_proto_rawDescGZIP(), []int{6} } type ConfigureTopicRequest struct { @@ -531,7 +531,7 @@ type ConfigureTopicRequest struct { func (x *ConfigureTopicRequest) Reset() { *x = ConfigureTopicRequest{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[7] + mi := &file_mq_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -544,7 +544,7 @@ func (x *ConfigureTopicRequest) String() string { func (*ConfigureTopicRequest) ProtoMessage() {} func (x *ConfigureTopicRequest) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[7] + mi := &file_mq_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -557,7 +557,7 @@ func (x *ConfigureTopicRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigureTopicRequest.ProtoReflect.Descriptor instead. func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{7} + return file_mq_proto_rawDescGZIP(), []int{7} } func (x *ConfigureTopicRequest) GetNamespace() string { @@ -590,7 +590,7 @@ type ConfigureTopicResponse struct { func (x *ConfigureTopicResponse) Reset() { *x = ConfigureTopicResponse{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[8] + mi := &file_mq_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -603,7 +603,7 @@ func (x *ConfigureTopicResponse) String() string { func (*ConfigureTopicResponse) ProtoMessage() {} func (x *ConfigureTopicResponse) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[8] + mi := &file_mq_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -616,7 +616,7 @@ func (x *ConfigureTopicResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigureTopicResponse.ProtoReflect.Descriptor instead. func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{8} + return file_mq_proto_rawDescGZIP(), []int{8} } type GetTopicConfigurationRequest struct { @@ -631,7 +631,7 @@ type GetTopicConfigurationRequest struct { func (x *GetTopicConfigurationRequest) Reset() { *x = GetTopicConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[9] + mi := &file_mq_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -644,7 +644,7 @@ func (x *GetTopicConfigurationRequest) String() string { func (*GetTopicConfigurationRequest) ProtoMessage() {} func (x *GetTopicConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[9] + mi := &file_mq_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -657,7 +657,7 @@ func (x *GetTopicConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopicConfigurationRequest.ProtoReflect.Descriptor instead. func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{9} + return file_mq_proto_rawDescGZIP(), []int{9} } func (x *GetTopicConfigurationRequest) GetNamespace() string { @@ -685,7 +685,7 @@ type GetTopicConfigurationResponse struct { func (x *GetTopicConfigurationResponse) Reset() { *x = GetTopicConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[10] + mi := &file_mq_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -698,7 +698,7 @@ func (x *GetTopicConfigurationResponse) String() string { func (*GetTopicConfigurationResponse) ProtoMessage() {} func (x *GetTopicConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[10] + mi := &file_mq_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -711,7 +711,7 @@ func (x *GetTopicConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopicConfigurationResponse.ProtoReflect.Descriptor instead. func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{10} + return file_mq_proto_rawDescGZIP(), []int{10} } func (x *GetTopicConfigurationResponse) GetConfiguration() *TopicConfiguration { @@ -734,7 +734,7 @@ type FindBrokerRequest struct { func (x *FindBrokerRequest) Reset() { *x = FindBrokerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[11] + mi := &file_mq_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -747,7 +747,7 @@ func (x *FindBrokerRequest) String() string { func (*FindBrokerRequest) ProtoMessage() {} func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[11] + mi := &file_mq_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -760,7 +760,7 @@ func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindBrokerRequest.ProtoReflect.Descriptor instead. func (*FindBrokerRequest) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{11} + return file_mq_proto_rawDescGZIP(), []int{11} } func (x *FindBrokerRequest) GetNamespace() string { @@ -795,7 +795,7 @@ type FindBrokerResponse struct { func (x *FindBrokerResponse) Reset() { *x = FindBrokerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[12] + mi := &file_mq_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -808,7 +808,7 @@ func (x *FindBrokerResponse) String() string { func (*FindBrokerResponse) ProtoMessage() {} func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[12] + mi := &file_mq_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -821,7 +821,7 @@ func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindBrokerResponse.ProtoReflect.Descriptor instead. func (*FindBrokerResponse) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{12} + return file_mq_proto_rawDescGZIP(), []int{12} } func (x *FindBrokerResponse) GetBroker() string { @@ -840,13 +840,13 @@ type TopicConfiguration struct { Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` Replication string `protobuf:"bytes,3,opt,name=replication,proto3" json:"replication,omitempty"` IsTransient bool `protobuf:"varint,4,opt,name=is_transient,json=isTransient,proto3" json:"is_transient,omitempty"` - Partitoning TopicConfiguration_Partitioning `protobuf:"varint,5,opt,name=partitoning,proto3,enum=mq_pb.TopicConfiguration_Partitioning" json:"partitoning,omitempty"` + Partitoning TopicConfiguration_Partitioning `protobuf:"varint,5,opt,name=partitoning,proto3,enum=messaging_pb.TopicConfiguration_Partitioning" json:"partitoning,omitempty"` } func (x *TopicConfiguration) Reset() { *x = TopicConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[13] + mi := &file_mq_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -859,7 +859,7 @@ func (x *TopicConfiguration) String() string { func (*TopicConfiguration) ProtoMessage() {} func (x *TopicConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[13] + mi := &file_mq_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -872,7 +872,7 @@ func (x *TopicConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use TopicConfiguration.ProtoReflect.Descriptor instead. func (*TopicConfiguration) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{13} + return file_mq_proto_rawDescGZIP(), []int{13} } func (x *TopicConfiguration) GetPartitionCount() int32 { @@ -918,7 +918,7 @@ type SubscriberMessage_InitMessage struct { Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` - StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,proto3,enum=mq_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` // Where to begin consuming from + StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,proto3,enum=messaging_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` // Where to begin consuming from TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs,proto3" json:"timestampNs,omitempty"` // timestamp in nano seconds SubscriberId string `protobuf:"bytes,6,opt,name=subscriber_id,json=subscriberId,proto3" json:"subscriber_id,omitempty"` // uniquely identify a subscriber to track consumption } @@ -926,7 +926,7 @@ type SubscriberMessage_InitMessage struct { func (x *SubscriberMessage_InitMessage) Reset() { *x = SubscriberMessage_InitMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[14] + mi := &file_mq_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -939,7 +939,7 @@ func (x *SubscriberMessage_InitMessage) String() string { func (*SubscriberMessage_InitMessage) ProtoMessage() {} func (x *SubscriberMessage_InitMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[14] + mi := &file_mq_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -952,7 +952,7 @@ func (x *SubscriberMessage_InitMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriberMessage_InitMessage.ProtoReflect.Descriptor instead. func (*SubscriberMessage_InitMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{0, 0} + return file_mq_proto_rawDescGZIP(), []int{0, 0} } func (x *SubscriberMessage_InitMessage) GetNamespace() string { @@ -1008,7 +1008,7 @@ type SubscriberMessage_AckMessage struct { func (x *SubscriberMessage_AckMessage) Reset() { *x = SubscriberMessage_AckMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[15] + mi := &file_mq_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1021,7 +1021,7 @@ func (x *SubscriberMessage_AckMessage) String() string { func (*SubscriberMessage_AckMessage) ProtoMessage() {} func (x *SubscriberMessage_AckMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[15] + mi := &file_mq_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1034,7 +1034,7 @@ func (x *SubscriberMessage_AckMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriberMessage_AckMessage.ProtoReflect.Descriptor instead. func (*SubscriberMessage_AckMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{0, 1} + return file_mq_proto_rawDescGZIP(), []int{0, 1} } func (x *SubscriberMessage_AckMessage) GetMessageId() int64 { @@ -1057,7 +1057,7 @@ type PublishRequest_InitMessage struct { func (x *PublishRequest_InitMessage) Reset() { *x = PublishRequest_InitMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[17] + mi := &file_mq_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1070,7 +1070,7 @@ func (x *PublishRequest_InitMessage) String() string { func (*PublishRequest_InitMessage) ProtoMessage() {} func (x *PublishRequest_InitMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[17] + mi := &file_mq_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1083,7 +1083,7 @@ func (x *PublishRequest_InitMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishRequest_InitMessage.ProtoReflect.Descriptor instead. func (*PublishRequest_InitMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{3, 0} + return file_mq_proto_rawDescGZIP(), []int{3, 0} } func (x *PublishRequest_InitMessage) GetNamespace() string { @@ -1118,7 +1118,7 @@ type PublishResponse_ConfigMessage struct { func (x *PublishResponse_ConfigMessage) Reset() { *x = PublishResponse_ConfigMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[18] + mi := &file_mq_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1131,7 +1131,7 @@ func (x *PublishResponse_ConfigMessage) String() string { func (*PublishResponse_ConfigMessage) ProtoMessage() {} func (x *PublishResponse_ConfigMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[18] + mi := &file_mq_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1144,7 +1144,7 @@ func (x *PublishResponse_ConfigMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishResponse_ConfigMessage.ProtoReflect.Descriptor instead. func (*PublishResponse_ConfigMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{4, 0} + return file_mq_proto_rawDescGZIP(), []int{4, 0} } func (x *PublishResponse_ConfigMessage) GetPartitionCount() int32 { @@ -1165,7 +1165,7 @@ type PublishResponse_RedirectMessage struct { func (x *PublishResponse_RedirectMessage) Reset() { *x = PublishResponse_RedirectMessage{} if protoimpl.UnsafeEnabled { - mi := &file_messaging_proto_msgTypes[19] + mi := &file_mq_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1178,7 @@ func (x *PublishResponse_RedirectMessage) String() string { func (*PublishResponse_RedirectMessage) ProtoMessage() {} func (x *PublishResponse_RedirectMessage) ProtoReflect() protoreflect.Message { - mi := &file_messaging_proto_msgTypes[19] + mi := &file_mq_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1191,7 @@ func (x *PublishResponse_RedirectMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishResponse_RedirectMessage.ProtoReflect.Descriptor instead. func (*PublishResponse_RedirectMessage) Descriptor() ([]byte, []int) { - return file_messaging_proto_rawDescGZIP(), []int{4, 1} + return file_mq_proto_rawDescGZIP(), []int{4, 1} } func (x *PublishResponse_RedirectMessage) GetNewBroker() string { @@ -1201,260 +1201,259 @@ func (x *PublishResponse_RedirectMessage) GetNewBroker() string { return "" } -var File_messaging_proto protoreflect.FileDescriptor - -var file_messaging_proto_rawDesc = []byte{ - 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, - 0x9e, 0x04, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x3c, 0x0a, 0x03, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x03, 0x61, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, - 0xc1, 0x02, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x70, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x5f, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x4e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, - 0x54, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x41, 0x52, 0x4c, 0x49, 0x45, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, - 0x50, 0x10, 0x02, 0x1a, 0x2b, 0x0a, 0x0a, 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, - 0x22, 0xee, 0x01, 0x0a, 0x07, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0d, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x07, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, - 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xda, 0x01, - 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3c, 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x69, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x29, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x69, +var File_mq_proto protoreflect.FileDescriptor + +var file_mq_proto_rawDesc = []byte{ + 0x0a, 0x08, 0x6d, 0x71, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x9e, 0x04, 0x0a, 0x11, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, + 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, + 0x3c, 0x0a, 0x03, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x63, + 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x61, 0x63, 0x6b, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0xc1, 0x02, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaa, 0x02, 0x0a, 0x0f, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x39, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, + 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x54, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, + 0x0c, 0x0a, 0x08, 0x45, 0x41, 0x52, 0x4c, 0x49, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x1a, 0x2b, 0x0a, 0x0a, + 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x07, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0x3a, + 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x42, 0x72, + 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xda, 0x01, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x69, 0x6e, 0x69, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, + 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x1a, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xaa, 0x02, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x08, + 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x1a, 0x38, 0x0a, 0x0d, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x30, 0x0a, 0x0f, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, - 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, - 0x77, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x22, 0x48, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, - 0x63, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x72, + 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x1a, 0x38, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x30, + 0x0a, 0x0f, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x22, 0x48, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, + 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, + 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x18, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x52, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x67, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, + 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x18, - 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x67, 0x0a, 0x1d, - 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, 0x12, 0x46, 0x69, - 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, - 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, - 0x67, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3f, - 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, - 0x0a, 0x0e, 0x4e, 0x6f, 0x6e, 0x4e, 0x75, 0x6c, 0x6c, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x10, 0x01, 0x12, - 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x10, 0x02, 0x32, - 0xad, 0x04, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x69, 0x6e, 0x67, 0x12, 0x4f, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x1a, 0x1b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, - 0x62, 0x2e, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4c, 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x12, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x23, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, - 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, - 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x57, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x42, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, - 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, + 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, 0x12, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x6f, 0x6e, 0x4e, 0x75, + 0x6c, 0x6c, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4b, + 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x10, 0x02, 0x32, 0xad, 0x04, 0x0a, 0x10, 0x53, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x4f, 0x0a, + 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1b, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4c, + 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x20, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, + 0x6f, 0x70, 0x69, 0x63, 0x12, 0x23, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x72, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, + 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, + 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, + 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, + 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_messaging_proto_rawDescOnce sync.Once - file_messaging_proto_rawDescData = file_messaging_proto_rawDesc + file_mq_proto_rawDescOnce sync.Once + file_mq_proto_rawDescData = file_mq_proto_rawDesc ) -func file_messaging_proto_rawDescGZIP() []byte { - file_messaging_proto_rawDescOnce.Do(func() { - file_messaging_proto_rawDescData = protoimpl.X.CompressGZIP(file_messaging_proto_rawDescData) +func file_mq_proto_rawDescGZIP() []byte { + file_mq_proto_rawDescOnce.Do(func() { + file_mq_proto_rawDescData = protoimpl.X.CompressGZIP(file_mq_proto_rawDescData) }) - return file_messaging_proto_rawDescData -} - -var file_messaging_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_messaging_proto_msgTypes = make([]protoimpl.MessageInfo, 20) -var file_messaging_proto_goTypes = []interface{}{ - (SubscriberMessage_InitMessage_StartPosition)(0), // 0: mq_pb.SubscriberMessage.InitMessage.StartPosition - (TopicConfiguration_Partitioning)(0), // 1: mq_pb.TopicConfiguration.Partitioning - (*SubscriberMessage)(nil), // 2: mq_pb.SubscriberMessage - (*Message)(nil), // 3: mq_pb.Message - (*BrokerMessage)(nil), // 4: mq_pb.BrokerMessage - (*PublishRequest)(nil), // 5: mq_pb.PublishRequest - (*PublishResponse)(nil), // 6: mq_pb.PublishResponse - (*DeleteTopicRequest)(nil), // 7: mq_pb.DeleteTopicRequest - (*DeleteTopicResponse)(nil), // 8: mq_pb.DeleteTopicResponse - (*ConfigureTopicRequest)(nil), // 9: mq_pb.ConfigureTopicRequest - (*ConfigureTopicResponse)(nil), // 10: mq_pb.ConfigureTopicResponse - (*GetTopicConfigurationRequest)(nil), // 11: mq_pb.GetTopicConfigurationRequest - (*GetTopicConfigurationResponse)(nil), // 12: mq_pb.GetTopicConfigurationResponse - (*FindBrokerRequest)(nil), // 13: mq_pb.FindBrokerRequest - (*FindBrokerResponse)(nil), // 14: mq_pb.FindBrokerResponse - (*TopicConfiguration)(nil), // 15: mq_pb.TopicConfiguration - (*SubscriberMessage_InitMessage)(nil), // 16: mq_pb.SubscriberMessage.InitMessage - (*SubscriberMessage_AckMessage)(nil), // 17: mq_pb.SubscriberMessage.AckMessage - nil, // 18: mq_pb.Message.HeadersEntry - (*PublishRequest_InitMessage)(nil), // 19: mq_pb.PublishRequest.InitMessage - (*PublishResponse_ConfigMessage)(nil), // 20: mq_pb.PublishResponse.ConfigMessage - (*PublishResponse_RedirectMessage)(nil), // 21: mq_pb.PublishResponse.RedirectMessage -} -var file_messaging_proto_depIdxs = []int32{ - 16, // 0: mq_pb.SubscriberMessage.init:type_name -> mq_pb.SubscriberMessage.InitMessage - 17, // 1: mq_pb.SubscriberMessage.ack:type_name -> mq_pb.SubscriberMessage.AckMessage - 18, // 2: mq_pb.Message.headers:type_name -> mq_pb.Message.HeadersEntry - 3, // 3: mq_pb.BrokerMessage.data:type_name -> mq_pb.Message - 19, // 4: mq_pb.PublishRequest.init:type_name -> mq_pb.PublishRequest.InitMessage - 3, // 5: mq_pb.PublishRequest.data:type_name -> mq_pb.Message - 20, // 6: mq_pb.PublishResponse.config:type_name -> mq_pb.PublishResponse.ConfigMessage - 21, // 7: mq_pb.PublishResponse.redirect:type_name -> mq_pb.PublishResponse.RedirectMessage - 15, // 8: mq_pb.ConfigureTopicRequest.configuration:type_name -> mq_pb.TopicConfiguration - 15, // 9: mq_pb.GetTopicConfigurationResponse.configuration:type_name -> mq_pb.TopicConfiguration - 1, // 10: mq_pb.TopicConfiguration.partitoning:type_name -> mq_pb.TopicConfiguration.Partitioning - 0, // 11: mq_pb.SubscriberMessage.InitMessage.startPosition:type_name -> mq_pb.SubscriberMessage.InitMessage.StartPosition - 2, // 12: mq_pb.SeaweedMessaging.Subscribe:input_type -> mq_pb.SubscriberMessage - 5, // 13: mq_pb.SeaweedMessaging.Publish:input_type -> mq_pb.PublishRequest - 7, // 14: mq_pb.SeaweedMessaging.DeleteTopic:input_type -> mq_pb.DeleteTopicRequest - 9, // 15: mq_pb.SeaweedMessaging.ConfigureTopic:input_type -> mq_pb.ConfigureTopicRequest - 11, // 16: mq_pb.SeaweedMessaging.GetTopicConfiguration:input_type -> mq_pb.GetTopicConfigurationRequest - 13, // 17: mq_pb.SeaweedMessaging.FindBroker:input_type -> mq_pb.FindBrokerRequest - 4, // 18: mq_pb.SeaweedMessaging.Subscribe:output_type -> mq_pb.BrokerMessage - 6, // 19: mq_pb.SeaweedMessaging.Publish:output_type -> mq_pb.PublishResponse - 8, // 20: mq_pb.SeaweedMessaging.DeleteTopic:output_type -> mq_pb.DeleteTopicResponse - 10, // 21: mq_pb.SeaweedMessaging.ConfigureTopic:output_type -> mq_pb.ConfigureTopicResponse - 12, // 22: mq_pb.SeaweedMessaging.GetTopicConfiguration:output_type -> mq_pb.GetTopicConfigurationResponse - 14, // 23: mq_pb.SeaweedMessaging.FindBroker:output_type -> mq_pb.FindBrokerResponse + return file_mq_proto_rawDescData +} + +var file_mq_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_mq_proto_goTypes = []interface{}{ + (SubscriberMessage_InitMessage_StartPosition)(0), // 0: messaging_pb.SubscriberMessage.InitMessage.StartPosition + (TopicConfiguration_Partitioning)(0), // 1: messaging_pb.TopicConfiguration.Partitioning + (*SubscriberMessage)(nil), // 2: messaging_pb.SubscriberMessage + (*Message)(nil), // 3: messaging_pb.Message + (*BrokerMessage)(nil), // 4: messaging_pb.BrokerMessage + (*PublishRequest)(nil), // 5: messaging_pb.PublishRequest + (*PublishResponse)(nil), // 6: messaging_pb.PublishResponse + (*DeleteTopicRequest)(nil), // 7: messaging_pb.DeleteTopicRequest + (*DeleteTopicResponse)(nil), // 8: messaging_pb.DeleteTopicResponse + (*ConfigureTopicRequest)(nil), // 9: messaging_pb.ConfigureTopicRequest + (*ConfigureTopicResponse)(nil), // 10: messaging_pb.ConfigureTopicResponse + (*GetTopicConfigurationRequest)(nil), // 11: messaging_pb.GetTopicConfigurationRequest + (*GetTopicConfigurationResponse)(nil), // 12: messaging_pb.GetTopicConfigurationResponse + (*FindBrokerRequest)(nil), // 13: messaging_pb.FindBrokerRequest + (*FindBrokerResponse)(nil), // 14: messaging_pb.FindBrokerResponse + (*TopicConfiguration)(nil), // 15: messaging_pb.TopicConfiguration + (*SubscriberMessage_InitMessage)(nil), // 16: messaging_pb.SubscriberMessage.InitMessage + (*SubscriberMessage_AckMessage)(nil), // 17: messaging_pb.SubscriberMessage.AckMessage + nil, // 18: messaging_pb.Message.HeadersEntry + (*PublishRequest_InitMessage)(nil), // 19: messaging_pb.PublishRequest.InitMessage + (*PublishResponse_ConfigMessage)(nil), // 20: messaging_pb.PublishResponse.ConfigMessage + (*PublishResponse_RedirectMessage)(nil), // 21: messaging_pb.PublishResponse.RedirectMessage +} +var file_mq_proto_depIdxs = []int32{ + 16, // 0: messaging_pb.SubscriberMessage.init:type_name -> messaging_pb.SubscriberMessage.InitMessage + 17, // 1: messaging_pb.SubscriberMessage.ack:type_name -> messaging_pb.SubscriberMessage.AckMessage + 18, // 2: messaging_pb.Message.headers:type_name -> messaging_pb.Message.HeadersEntry + 3, // 3: messaging_pb.BrokerMessage.data:type_name -> messaging_pb.Message + 19, // 4: messaging_pb.PublishRequest.init:type_name -> messaging_pb.PublishRequest.InitMessage + 3, // 5: messaging_pb.PublishRequest.data:type_name -> messaging_pb.Message + 20, // 6: messaging_pb.PublishResponse.config:type_name -> messaging_pb.PublishResponse.ConfigMessage + 21, // 7: messaging_pb.PublishResponse.redirect:type_name -> messaging_pb.PublishResponse.RedirectMessage + 15, // 8: messaging_pb.ConfigureTopicRequest.configuration:type_name -> messaging_pb.TopicConfiguration + 15, // 9: messaging_pb.GetTopicConfigurationResponse.configuration:type_name -> messaging_pb.TopicConfiguration + 1, // 10: messaging_pb.TopicConfiguration.partitoning:type_name -> messaging_pb.TopicConfiguration.Partitioning + 0, // 11: messaging_pb.SubscriberMessage.InitMessage.startPosition:type_name -> messaging_pb.SubscriberMessage.InitMessage.StartPosition + 2, // 12: messaging_pb.SeaweedMessaging.Subscribe:input_type -> messaging_pb.SubscriberMessage + 5, // 13: messaging_pb.SeaweedMessaging.Publish:input_type -> messaging_pb.PublishRequest + 7, // 14: messaging_pb.SeaweedMessaging.DeleteTopic:input_type -> messaging_pb.DeleteTopicRequest + 9, // 15: messaging_pb.SeaweedMessaging.ConfigureTopic:input_type -> messaging_pb.ConfigureTopicRequest + 11, // 16: messaging_pb.SeaweedMessaging.GetTopicConfiguration:input_type -> messaging_pb.GetTopicConfigurationRequest + 13, // 17: messaging_pb.SeaweedMessaging.FindBroker:input_type -> messaging_pb.FindBrokerRequest + 4, // 18: messaging_pb.SeaweedMessaging.Subscribe:output_type -> messaging_pb.BrokerMessage + 6, // 19: messaging_pb.SeaweedMessaging.Publish:output_type -> messaging_pb.PublishResponse + 8, // 20: messaging_pb.SeaweedMessaging.DeleteTopic:output_type -> messaging_pb.DeleteTopicResponse + 10, // 21: messaging_pb.SeaweedMessaging.ConfigureTopic:output_type -> messaging_pb.ConfigureTopicResponse + 12, // 22: messaging_pb.SeaweedMessaging.GetTopicConfiguration:output_type -> messaging_pb.GetTopicConfigurationResponse + 14, // 23: messaging_pb.SeaweedMessaging.FindBroker:output_type -> messaging_pb.FindBrokerResponse 18, // [18:24] is the sub-list for method output_type 12, // [12:18] is the sub-list for method input_type 12, // [12:12] is the sub-list for extension type_name @@ -1462,13 +1461,13 @@ var file_messaging_proto_depIdxs = []int32{ 0, // [0:12] is the sub-list for field type_name } -func init() { file_messaging_proto_init() } -func file_messaging_proto_init() { - if File_messaging_proto != nil { +func init() { file_mq_proto_init() } +func file_mq_proto_init() { + if File_mq_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_messaging_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscriberMessage); i { case 0: return &v.state @@ -1480,7 +1479,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Message); i { case 0: return &v.state @@ -1492,7 +1491,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BrokerMessage); i { case 0: return &v.state @@ -1504,7 +1503,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PublishRequest); i { case 0: return &v.state @@ -1516,7 +1515,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PublishResponse); i { case 0: return &v.state @@ -1528,7 +1527,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteTopicRequest); i { case 0: return &v.state @@ -1540,7 +1539,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteTopicResponse); i { case 0: return &v.state @@ -1552,7 +1551,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConfigureTopicRequest); i { case 0: return &v.state @@ -1564,7 +1563,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConfigureTopicResponse); i { case 0: return &v.state @@ -1576,7 +1575,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTopicConfigurationRequest); i { case 0: return &v.state @@ -1588,7 +1587,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTopicConfigurationResponse); i { case 0: return &v.state @@ -1600,7 +1599,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindBrokerRequest); i { case 0: return &v.state @@ -1612,7 +1611,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindBrokerResponse); i { case 0: return &v.state @@ -1624,7 +1623,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TopicConfiguration); i { case 0: return &v.state @@ -1636,7 +1635,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscriberMessage_InitMessage); i { case 0: return &v.state @@ -1648,7 +1647,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscriberMessage_AckMessage); i { case 0: return &v.state @@ -1660,7 +1659,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PublishRequest_InitMessage); i { case 0: return &v.state @@ -1672,7 +1671,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PublishResponse_ConfigMessage); i { case 0: return &v.state @@ -1684,7 +1683,7 @@ func file_messaging_proto_init() { return nil } } - file_messaging_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PublishResponse_RedirectMessage); i { case 0: return &v.state @@ -1701,19 +1700,19 @@ func file_messaging_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_messaging_proto_rawDesc, + RawDescriptor: file_mq_proto_rawDesc, NumEnums: 2, NumMessages: 20, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_messaging_proto_goTypes, - DependencyIndexes: file_messaging_proto_depIdxs, - EnumInfos: file_messaging_proto_enumTypes, - MessageInfos: file_messaging_proto_msgTypes, + GoTypes: file_mq_proto_goTypes, + DependencyIndexes: file_mq_proto_depIdxs, + EnumInfos: file_mq_proto_enumTypes, + MessageInfos: file_mq_proto_msgTypes, }.Build() - File_messaging_proto = out.File - file_messaging_proto_rawDesc = nil - file_messaging_proto_goTypes = nil - file_messaging_proto_depIdxs = nil + File_mq_proto = out.File + file_mq_proto_rawDesc = nil + file_mq_proto_goTypes = nil + file_mq_proto_depIdxs = nil } diff --git a/weed/pb/mq_pb/messaging_grpc.pb.go b/weed/pb/mq_pb/mq_grpc.pb.go similarity index 93% rename from weed/pb/mq_pb/messaging_grpc.pb.go rename to weed/pb/mq_pb/mq_grpc.pb.go index 0249a0b9c..3c986fc78 100644 --- a/weed/pb/mq_pb/messaging_grpc.pb.go +++ b/weed/pb/mq_pb/mq_grpc.pb.go @@ -35,7 +35,7 @@ func NewSeaweedMessagingClient(cc grpc.ClientConnInterface) SeaweedMessagingClie } func (c *seaweedMessagingClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[0], "/mq_pb.SeaweedMessaging/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[0], "/messaging_pb.SeaweedMessaging/Subscribe", opts...) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (x *seaweedMessagingSubscribeClient) Recv() (*BrokerMessage, error) { } func (c *seaweedMessagingClient) Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[1], "/mq_pb.SeaweedMessaging/Publish", opts...) + stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[1], "/messaging_pb.SeaweedMessaging/Publish", opts...) if err != nil { return nil, err } @@ -98,7 +98,7 @@ func (x *seaweedMessagingPublishClient) Recv() (*PublishResponse, error) { func (c *seaweedMessagingClient) DeleteTopic(ctx context.Context, in *DeleteTopicRequest, opts ...grpc.CallOption) (*DeleteTopicResponse, error) { out := new(DeleteTopicResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/DeleteTopic", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/DeleteTopic", in, out, opts...) if err != nil { return nil, err } @@ -107,7 +107,7 @@ func (c *seaweedMessagingClient) DeleteTopic(ctx context.Context, in *DeleteTopi func (c *seaweedMessagingClient) ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) { out := new(ConfigureTopicResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/ConfigureTopic", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/ConfigureTopic", in, out, opts...) if err != nil { return nil, err } @@ -116,7 +116,7 @@ func (c *seaweedMessagingClient) ConfigureTopic(ctx context.Context, in *Configu func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) { out := new(GetTopicConfigurationResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/GetTopicConfiguration", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", in, out, opts...) if err != nil { return nil, err } @@ -125,7 +125,7 @@ func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in * func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) { out := new(FindBrokerResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedMessaging/FindBroker", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/FindBroker", in, out, opts...) if err != nil { return nil, err } @@ -242,7 +242,7 @@ func _SeaweedMessaging_DeleteTopic_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedMessaging/DeleteTopic", + FullMethod: "/messaging_pb.SeaweedMessaging/DeleteTopic", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).DeleteTopic(ctx, req.(*DeleteTopicRequest)) @@ -260,7 +260,7 @@ func _SeaweedMessaging_ConfigureTopic_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedMessaging/ConfigureTopic", + FullMethod: "/messaging_pb.SeaweedMessaging/ConfigureTopic", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).ConfigureTopic(ctx, req.(*ConfigureTopicRequest)) @@ -278,7 +278,7 @@ func _SeaweedMessaging_GetTopicConfiguration_Handler(srv interface{}, ctx contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedMessaging/GetTopicConfiguration", + FullMethod: "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).GetTopicConfiguration(ctx, req.(*GetTopicConfigurationRequest)) @@ -296,7 +296,7 @@ func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedMessaging/FindBroker", + FullMethod: "/messaging_pb.SeaweedMessaging/FindBroker", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedMessagingServer).FindBroker(ctx, req.(*FindBrokerRequest)) @@ -308,7 +308,7 @@ func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "mq_pb.SeaweedMessaging", + ServiceName: "messaging_pb.SeaweedMessaging", HandlerType: (*SeaweedMessagingServer)(nil), Methods: []grpc.MethodDesc{ { diff --git a/weed/pb/remote_pb/remote.pb.go b/weed/pb/remote_pb/remote.pb.go index f746333ff..a9514c212 100644 --- a/weed/pb/remote_pb/remote.pb.go +++ b/weed/pb/remote_pb/remote.pb.go @@ -28,51 +28,47 @@ type RemoteConf struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - S3AccessKey string `protobuf:"bytes,4,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` - S3SecretKey string `protobuf:"bytes,5,opt,name=s3_secret_key,json=s3SecretKey,proto3" json:"s3_secret_key,omitempty"` - S3Region string `protobuf:"bytes,6,opt,name=s3_region,json=s3Region,proto3" json:"s3_region,omitempty"` - S3Endpoint string `protobuf:"bytes,7,opt,name=s3_endpoint,json=s3Endpoint,proto3" json:"s3_endpoint,omitempty"` - S3StorageClass string `protobuf:"bytes,8,opt,name=s3_storage_class,json=s3StorageClass,proto3" json:"s3_storage_class,omitempty"` - S3ForcePathStyle bool `protobuf:"varint,9,opt,name=s3_force_path_style,json=s3ForcePathStyle,proto3" json:"s3_force_path_style,omitempty"` - S3V4Signature bool `protobuf:"varint,11,opt,name=s3_v4_signature,json=s3V4Signature,proto3" json:"s3_v4_signature,omitempty"` - GcsGoogleApplicationCredentials string `protobuf:"bytes,10,opt,name=gcs_google_application_credentials,json=gcsGoogleApplicationCredentials,proto3" json:"gcs_google_application_credentials,omitempty"` - GcsProjectId string `protobuf:"bytes,12,opt,name=gcs_project_id,json=gcsProjectId,proto3" json:"gcs_project_id,omitempty"` - AzureAccountName string `protobuf:"bytes,15,opt,name=azure_account_name,json=azureAccountName,proto3" json:"azure_account_name,omitempty"` - AzureAccountKey string `protobuf:"bytes,16,opt,name=azure_account_key,json=azureAccountKey,proto3" json:"azure_account_key,omitempty"` - BackblazeKeyId string `protobuf:"bytes,20,opt,name=backblaze_key_id,json=backblazeKeyId,proto3" json:"backblaze_key_id,omitempty"` - BackblazeApplicationKey string `protobuf:"bytes,21,opt,name=backblaze_application_key,json=backblazeApplicationKey,proto3" json:"backblaze_application_key,omitempty"` - BackblazeEndpoint string `protobuf:"bytes,22,opt,name=backblaze_endpoint,json=backblazeEndpoint,proto3" json:"backblaze_endpoint,omitempty"` - AliyunAccessKey string `protobuf:"bytes,25,opt,name=aliyun_access_key,json=aliyunAccessKey,proto3" json:"aliyun_access_key,omitempty"` - AliyunSecretKey string `protobuf:"bytes,26,opt,name=aliyun_secret_key,json=aliyunSecretKey,proto3" json:"aliyun_secret_key,omitempty"` - AliyunEndpoint string `protobuf:"bytes,27,opt,name=aliyun_endpoint,json=aliyunEndpoint,proto3" json:"aliyun_endpoint,omitempty"` - AliyunRegion string `protobuf:"bytes,28,opt,name=aliyun_region,json=aliyunRegion,proto3" json:"aliyun_region,omitempty"` - TencentSecretId string `protobuf:"bytes,30,opt,name=tencent_secret_id,json=tencentSecretId,proto3" json:"tencent_secret_id,omitempty"` - TencentSecretKey string `protobuf:"bytes,31,opt,name=tencent_secret_key,json=tencentSecretKey,proto3" json:"tencent_secret_key,omitempty"` - TencentEndpoint string `protobuf:"bytes,32,opt,name=tencent_endpoint,json=tencentEndpoint,proto3" json:"tencent_endpoint,omitempty"` - BaiduAccessKey string `protobuf:"bytes,35,opt,name=baidu_access_key,json=baiduAccessKey,proto3" json:"baidu_access_key,omitempty"` - BaiduSecretKey string `protobuf:"bytes,36,opt,name=baidu_secret_key,json=baiduSecretKey,proto3" json:"baidu_secret_key,omitempty"` - BaiduEndpoint string `protobuf:"bytes,37,opt,name=baidu_endpoint,json=baiduEndpoint,proto3" json:"baidu_endpoint,omitempty"` - BaiduRegion string `protobuf:"bytes,38,opt,name=baidu_region,json=baiduRegion,proto3" json:"baidu_region,omitempty"` - WasabiAccessKey string `protobuf:"bytes,40,opt,name=wasabi_access_key,json=wasabiAccessKey,proto3" json:"wasabi_access_key,omitempty"` - WasabiSecretKey string `protobuf:"bytes,41,opt,name=wasabi_secret_key,json=wasabiSecretKey,proto3" json:"wasabi_secret_key,omitempty"` - WasabiEndpoint string `protobuf:"bytes,42,opt,name=wasabi_endpoint,json=wasabiEndpoint,proto3" json:"wasabi_endpoint,omitempty"` - WasabiRegion string `protobuf:"bytes,43,opt,name=wasabi_region,json=wasabiRegion,proto3" json:"wasabi_region,omitempty"` - HdfsNamenodes []string `protobuf:"bytes,50,rep,name=hdfs_namenodes,json=hdfsNamenodes,proto3" json:"hdfs_namenodes,omitempty"` - HdfsUsername string `protobuf:"bytes,51,opt,name=hdfs_username,json=hdfsUsername,proto3" json:"hdfs_username,omitempty"` - HdfsServicePrincipalName string `protobuf:"bytes,52,opt,name=hdfs_service_principal_name,json=hdfsServicePrincipalName,proto3" json:"hdfs_service_principal_name,omitempty"` - HdfsDataTransferProtection string `protobuf:"bytes,53,opt,name=hdfs_data_transfer_protection,json=hdfsDataTransferProtection,proto3" json:"hdfs_data_transfer_protection,omitempty"` - FilebaseAccessKey string `protobuf:"bytes,60,opt,name=filebase_access_key,json=filebaseAccessKey,proto3" json:"filebase_access_key,omitempty"` - FilebaseSecretKey string `protobuf:"bytes,61,opt,name=filebase_secret_key,json=filebaseSecretKey,proto3" json:"filebase_secret_key,omitempty"` - FilebaseEndpoint string `protobuf:"bytes,62,opt,name=filebase_endpoint,json=filebaseEndpoint,proto3" json:"filebase_endpoint,omitempty"` - StorjAccessKey string `protobuf:"bytes,65,opt,name=storj_access_key,json=storjAccessKey,proto3" json:"storj_access_key,omitempty"` - StorjSecretKey string `protobuf:"bytes,66,opt,name=storj_secret_key,json=storjSecretKey,proto3" json:"storj_secret_key,omitempty"` - StorjEndpoint string `protobuf:"bytes,67,opt,name=storj_endpoint,json=storjEndpoint,proto3" json:"storj_endpoint,omitempty"` - ContaboAccessKey string `protobuf:"bytes,68,opt,name=contabo_access_key,json=contaboAccessKey,proto3" json:"contabo_access_key,omitempty"` - ContaboSecretKey string `protobuf:"bytes,69,opt,name=contabo_secret_key,json=contaboSecretKey,proto3" json:"contabo_secret_key,omitempty"` - ContaboEndpoint string `protobuf:"bytes,70,opt,name=contabo_endpoint,json=contaboEndpoint,proto3" json:"contabo_endpoint,omitempty"` - ContaboRegion string `protobuf:"bytes,71,opt,name=contabo_region,json=contaboRegion,proto3" json:"contabo_region,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + S3AccessKey string `protobuf:"bytes,4,opt,name=s3_access_key,json=s3AccessKey,proto3" json:"s3_access_key,omitempty"` + S3SecretKey string `protobuf:"bytes,5,opt,name=s3_secret_key,json=s3SecretKey,proto3" json:"s3_secret_key,omitempty"` + S3Region string `protobuf:"bytes,6,opt,name=s3_region,json=s3Region,proto3" json:"s3_region,omitempty"` + S3Endpoint string `protobuf:"bytes,7,opt,name=s3_endpoint,json=s3Endpoint,proto3" json:"s3_endpoint,omitempty"` + S3StorageClass string `protobuf:"bytes,8,opt,name=s3_storage_class,json=s3StorageClass,proto3" json:"s3_storage_class,omitempty"` + S3ForcePathStyle bool `protobuf:"varint,9,opt,name=s3_force_path_style,json=s3ForcePathStyle,proto3" json:"s3_force_path_style,omitempty"` + S3V4Signature bool `protobuf:"varint,11,opt,name=s3_v4_signature,json=s3V4Signature,proto3" json:"s3_v4_signature,omitempty"` + GcsGoogleApplicationCredentials string `protobuf:"bytes,10,opt,name=gcs_google_application_credentials,json=gcsGoogleApplicationCredentials,proto3" json:"gcs_google_application_credentials,omitempty"` + GcsProjectId string `protobuf:"bytes,12,opt,name=gcs_project_id,json=gcsProjectId,proto3" json:"gcs_project_id,omitempty"` + AzureAccountName string `protobuf:"bytes,15,opt,name=azure_account_name,json=azureAccountName,proto3" json:"azure_account_name,omitempty"` + AzureAccountKey string `protobuf:"bytes,16,opt,name=azure_account_key,json=azureAccountKey,proto3" json:"azure_account_key,omitempty"` + BackblazeKeyId string `protobuf:"bytes,20,opt,name=backblaze_key_id,json=backblazeKeyId,proto3" json:"backblaze_key_id,omitempty"` + BackblazeApplicationKey string `protobuf:"bytes,21,opt,name=backblaze_application_key,json=backblazeApplicationKey,proto3" json:"backblaze_application_key,omitempty"` + BackblazeEndpoint string `protobuf:"bytes,22,opt,name=backblaze_endpoint,json=backblazeEndpoint,proto3" json:"backblaze_endpoint,omitempty"` + AliyunAccessKey string `protobuf:"bytes,25,opt,name=aliyun_access_key,json=aliyunAccessKey,proto3" json:"aliyun_access_key,omitempty"` + AliyunSecretKey string `protobuf:"bytes,26,opt,name=aliyun_secret_key,json=aliyunSecretKey,proto3" json:"aliyun_secret_key,omitempty"` + AliyunEndpoint string `protobuf:"bytes,27,opt,name=aliyun_endpoint,json=aliyunEndpoint,proto3" json:"aliyun_endpoint,omitempty"` + AliyunRegion string `protobuf:"bytes,28,opt,name=aliyun_region,json=aliyunRegion,proto3" json:"aliyun_region,omitempty"` + TencentSecretId string `protobuf:"bytes,30,opt,name=tencent_secret_id,json=tencentSecretId,proto3" json:"tencent_secret_id,omitempty"` + TencentSecretKey string `protobuf:"bytes,31,opt,name=tencent_secret_key,json=tencentSecretKey,proto3" json:"tencent_secret_key,omitempty"` + TencentEndpoint string `protobuf:"bytes,32,opt,name=tencent_endpoint,json=tencentEndpoint,proto3" json:"tencent_endpoint,omitempty"` + BaiduAccessKey string `protobuf:"bytes,35,opt,name=baidu_access_key,json=baiduAccessKey,proto3" json:"baidu_access_key,omitempty"` + BaiduSecretKey string `protobuf:"bytes,36,opt,name=baidu_secret_key,json=baiduSecretKey,proto3" json:"baidu_secret_key,omitempty"` + BaiduEndpoint string `protobuf:"bytes,37,opt,name=baidu_endpoint,json=baiduEndpoint,proto3" json:"baidu_endpoint,omitempty"` + BaiduRegion string `protobuf:"bytes,38,opt,name=baidu_region,json=baiduRegion,proto3" json:"baidu_region,omitempty"` + WasabiAccessKey string `protobuf:"bytes,40,opt,name=wasabi_access_key,json=wasabiAccessKey,proto3" json:"wasabi_access_key,omitempty"` + WasabiSecretKey string `protobuf:"bytes,41,opt,name=wasabi_secret_key,json=wasabiSecretKey,proto3" json:"wasabi_secret_key,omitempty"` + WasabiEndpoint string `protobuf:"bytes,42,opt,name=wasabi_endpoint,json=wasabiEndpoint,proto3" json:"wasabi_endpoint,omitempty"` + WasabiRegion string `protobuf:"bytes,43,opt,name=wasabi_region,json=wasabiRegion,proto3" json:"wasabi_region,omitempty"` + FilebaseAccessKey string `protobuf:"bytes,60,opt,name=filebase_access_key,json=filebaseAccessKey,proto3" json:"filebase_access_key,omitempty"` + FilebaseSecretKey string `protobuf:"bytes,61,opt,name=filebase_secret_key,json=filebaseSecretKey,proto3" json:"filebase_secret_key,omitempty"` + FilebaseEndpoint string `protobuf:"bytes,62,opt,name=filebase_endpoint,json=filebaseEndpoint,proto3" json:"filebase_endpoint,omitempty"` + StorjAccessKey string `protobuf:"bytes,65,opt,name=storj_access_key,json=storjAccessKey,proto3" json:"storj_access_key,omitempty"` + StorjSecretKey string `protobuf:"bytes,66,opt,name=storj_secret_key,json=storjSecretKey,proto3" json:"storj_secret_key,omitempty"` + StorjEndpoint string `protobuf:"bytes,67,opt,name=storj_endpoint,json=storjEndpoint,proto3" json:"storj_endpoint,omitempty"` + ContaboAccessKey string `protobuf:"bytes,68,opt,name=contabo_access_key,json=contaboAccessKey,proto3" json:"contabo_access_key,omitempty"` + ContaboSecretKey string `protobuf:"bytes,69,opt,name=contabo_secret_key,json=contaboSecretKey,proto3" json:"contabo_secret_key,omitempty"` + ContaboEndpoint string `protobuf:"bytes,70,opt,name=contabo_endpoint,json=contaboEndpoint,proto3" json:"contabo_endpoint,omitempty"` + ContaboRegion string `protobuf:"bytes,71,opt,name=contabo_region,json=contaboRegion,proto3" json:"contabo_region,omitempty"` } func (x *RemoteConf) Reset() { @@ -324,34 +320,6 @@ func (x *RemoteConf) GetWasabiRegion() string { return "" } -func (x *RemoteConf) GetHdfsNamenodes() []string { - if x != nil { - return x.HdfsNamenodes - } - return nil -} - -func (x *RemoteConf) GetHdfsUsername() string { - if x != nil { - return x.HdfsUsername - } - return "" -} - -func (x *RemoteConf) GetHdfsServicePrincipalName() string { - if x != nil { - return x.HdfsServicePrincipalName - } - return "" -} - -func (x *RemoteConf) GetHdfsDataTransferProtection() string { - if x != nil { - return x.HdfsDataTransferProtection - } - return "" -} - func (x *RemoteConf) GetFilebaseAccessKey() string { if x != nil { return x.FilebaseAccessKey @@ -544,7 +512,7 @@ var File_remote_proto protoreflect.FileDescriptor var file_remote_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x22, 0x90, 0x0f, 0x0a, 0x0a, 0x52, 0x65, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x22, 0xc2, 0x0d, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, @@ -625,75 +593,62 @@ var file_remote_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x73, 0x61, 0x62, 0x69, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x61, 0x73, 0x61, 0x62, 0x69, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x61, 0x73, 0x61, - 0x62, 0x69, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x64, 0x66, 0x73, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x32, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x68, 0x64, 0x66, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x68, 0x64, 0x66, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x33, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x68, 0x64, 0x66, 0x73, 0x55, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x68, 0x64, 0x66, 0x73, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x68, 0x64, 0x66, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x68, 0x64, 0x66, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x35, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x68, 0x64, 0x66, 0x73, - 0x44, 0x61, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x3c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x3e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x5f, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x74, 0x6f, 0x72, 0x6a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x6a, - 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x43, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2c, - 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x44, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x62, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x45, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, - 0x6f, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x46, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xff, 0x01, 0x0a, - 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, - 0x5d, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, - 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x50, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, - 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x62, 0x69, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x3c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x53, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x3e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x62, 0x61, 0x73, 0x65, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x5f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x28, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x6a, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x6f, + 0x72, 0x6a, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x43, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x6a, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x44, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2c, + 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x45, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x62, 0x6f, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x46, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x45, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x62, 0x6f, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x62, 0x6f, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0xff, + 0x01, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x49, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x1a, 0x5d, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x57, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x42, 0x50, 0x0a, 0x10, 0x73, 0x65, 0x61, + 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, + 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, + 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, + 0x62, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/weed/pb/s3_pb/s3.pb.go b/weed/pb/s3_pb/s3.pb.go index 9923961a8..44422b519 100644 --- a/weed/pb/s3_pb/s3.pb.go +++ b/weed/pb/s3_pb/s3.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.21.1 +// protoc-gen-go v1.26.0 +// protoc v3.17.3 // source: s3.proto package s3_pb @@ -283,20 +283,20 @@ func file_s3_proto_rawDescGZIP() []byte { var file_s3_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_s3_proto_goTypes = []interface{}{ - (*S3ConfigureRequest)(nil), // 0: mq_pb.S3ConfigureRequest - (*S3ConfigureResponse)(nil), // 1: mq_pb.S3ConfigureResponse - (*S3CircuitBreakerConfig)(nil), // 2: mq_pb.S3CircuitBreakerConfig - (*S3CircuitBreakerOptions)(nil), // 3: mq_pb.S3CircuitBreakerOptions - nil, // 4: mq_pb.S3CircuitBreakerConfig.BucketsEntry - nil, // 5: mq_pb.S3CircuitBreakerOptions.ActionsEntry + (*S3ConfigureRequest)(nil), // 0: messaging_pb.S3ConfigureRequest + (*S3ConfigureResponse)(nil), // 1: messaging_pb.S3ConfigureResponse + (*S3CircuitBreakerConfig)(nil), // 2: messaging_pb.S3CircuitBreakerConfig + (*S3CircuitBreakerOptions)(nil), // 3: messaging_pb.S3CircuitBreakerOptions + nil, // 4: messaging_pb.S3CircuitBreakerConfig.BucketsEntry + nil, // 5: messaging_pb.S3CircuitBreakerOptions.ActionsEntry } var file_s3_proto_depIdxs = []int32{ - 3, // 0: mq_pb.S3CircuitBreakerConfig.global:type_name -> mq_pb.S3CircuitBreakerOptions - 4, // 1: mq_pb.S3CircuitBreakerConfig.buckets:type_name -> mq_pb.S3CircuitBreakerConfig.BucketsEntry - 5, // 2: mq_pb.S3CircuitBreakerOptions.actions:type_name -> mq_pb.S3CircuitBreakerOptions.ActionsEntry - 3, // 3: mq_pb.S3CircuitBreakerConfig.BucketsEntry.value:type_name -> mq_pb.S3CircuitBreakerOptions - 0, // 4: mq_pb.SeaweedS3.Configure:input_type -> mq_pb.S3ConfigureRequest - 1, // 5: mq_pb.SeaweedS3.Configure:output_type -> mq_pb.S3ConfigureResponse + 3, // 0: messaging_pb.S3CircuitBreakerConfig.global:type_name -> messaging_pb.S3CircuitBreakerOptions + 4, // 1: messaging_pb.S3CircuitBreakerConfig.buckets:type_name -> messaging_pb.S3CircuitBreakerConfig.BucketsEntry + 5, // 2: messaging_pb.S3CircuitBreakerOptions.actions:type_name -> messaging_pb.S3CircuitBreakerOptions.ActionsEntry + 3, // 3: messaging_pb.S3CircuitBreakerConfig.BucketsEntry.value:type_name -> messaging_pb.S3CircuitBreakerOptions + 0, // 4: messaging_pb.SeaweedS3.Configure:input_type -> messaging_pb.S3ConfigureRequest + 1, // 5: messaging_pb.SeaweedS3.Configure:output_type -> messaging_pb.S3ConfigureResponse 5, // [5:6] is the sub-list for method output_type 4, // [4:5] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name diff --git a/weed/pb/s3_pb/s3_grpc.pb.go b/weed/pb/s3_pb/s3_grpc.pb.go index c00268bad..1bc956be6 100644 --- a/weed/pb/s3_pb/s3_grpc.pb.go +++ b/weed/pb/s3_pb/s3_grpc.pb.go @@ -31,7 +31,7 @@ func NewSeaweedS3Client(cc grpc.ClientConnInterface) SeaweedS3Client { func (c *seaweedS3Client) Configure(ctx context.Context, in *S3ConfigureRequest, opts ...grpc.CallOption) (*S3ConfigureResponse, error) { out := new(S3ConfigureResponse) - err := c.cc.Invoke(ctx, "/mq_pb.SeaweedS3/Configure", in, out, opts...) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedS3/Configure", in, out, opts...) if err != nil { return nil, err } @@ -76,7 +76,7 @@ func _SeaweedS3_Configure_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mq_pb.SeaweedS3/Configure", + FullMethod: "/messaging_pb.SeaweedS3/Configure", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SeaweedS3Server).Configure(ctx, req.(*S3ConfigureRequest)) @@ -88,7 +88,7 @@ func _SeaweedS3_Configure_Handler(srv interface{}, ctx context.Context, dec func // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var SeaweedS3_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "mq_pb.SeaweedS3", + ServiceName: "messaging_pb.SeaweedS3", HandlerType: (*SeaweedS3Server)(nil), Methods: []grpc.MethodDesc{ { diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 4f5455cb1..d530e238e 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "github.com/chrislusf/seaweedfs/weed/cluster" "net" "sort" "time" @@ -253,12 +254,12 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ stopChan := make(chan bool, 1) clientName, messageChan := ms.addClient(req.FilerGroup, req.ClientType, peerAddress) - for _, update := range ms.Cluster.AddClusterNode(req.FilerGroup, req.ClientType, peerAddress, req.Version) { + for _, update := range ms.Cluster.AddClusterNode(req.FilerGroup, req.ClientType, cluster.DataCenter(req.DataCenter), cluster.Rack(req.Rack), peerAddress, req.Version) { ms.broadcastToClients(update) } defer func() { - for _, update := range ms.Cluster.RemoveClusterNode(req.FilerGroup, req.ClientType, peerAddress) { + for _, update := range ms.Cluster.RemoveClusterNode(req.FilerGroup, req.ClientType, cluster.DataCenter(req.DataCenter), cluster.Rack(req.Rack), peerAddress) { ms.broadcastToClients(update) } ms.deleteClient(clientName) diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 9bf840f08..756d14dbc 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -113,7 +113,7 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers map[string]pb.Se vgCh: make(chan *topology.VolumeGrowRequest, 1<<6), clientChans: make(map[string]chan *master_pb.KeepConnectedResponse), grpcDialOption: grpcDialOption, - MasterClient: wdclient.NewMasterClient(grpcDialOption, "", cluster.MasterType, option.Master, "", peers), + MasterClient: wdclient.NewMasterClient(grpcDialOption, "", cluster.MasterType, option.Master, "", "", peers), adminLocks: NewAdminLocks(), Cluster: cluster.NewCluster(), } diff --git a/weed/shell/commands.go b/weed/shell/commands.go index 08f639d34..51b4062d5 100644 --- a/weed/shell/commands.go +++ b/weed/shell/commands.go @@ -47,7 +47,7 @@ var ( func NewCommandEnv(options *ShellOptions) *CommandEnv { ce := &CommandEnv{ env: make(map[string]string), - MasterClient: wdclient.NewMasterClient(options.GrpcDialOption, *options.FilerGroup, pb.AdminShellClient, "", "", pb.ServerAddresses(*options.Masters).ToAddressMap()), + MasterClient: wdclient.NewMasterClient(options.GrpcDialOption, *options.FilerGroup, pb.AdminShellClient, "", "", "", pb.ServerAddresses(*options.Masters).ToAddressMap()), option: options, } ce.locker = exclusive_locks.NewExclusiveLocker(ce.MasterClient, "admin") diff --git a/weed/wdclient/masterclient.go b/weed/wdclient/masterclient.go index 3e76dc0c5..667549686 100644 --- a/weed/wdclient/masterclient.go +++ b/weed/wdclient/masterclient.go @@ -18,6 +18,7 @@ type MasterClient struct { FilerGroup string clientType string clientHost pb.ServerAddress + rack string currentMaster pb.ServerAddress masters map[string]pb.ServerAddress grpcDialOption grpc.DialOption @@ -27,11 +28,12 @@ type MasterClient struct { OnPeerUpdate func(update *master_pb.ClusterNodeUpdate, startFrom time.Time) } -func NewMasterClient(grpcDialOption grpc.DialOption, filerGroup string, clientType string, clientHost pb.ServerAddress, clientDataCenter string, masters map[string]pb.ServerAddress) *MasterClient { +func NewMasterClient(grpcDialOption grpc.DialOption, filerGroup string, clientType string, clientHost pb.ServerAddress, clientDataCenter string, rack string, masters map[string]pb.ServerAddress) *MasterClient { return &MasterClient{ FilerGroup: filerGroup, clientType: clientType, clientHost: clientHost, + rack: rack, masters: masters, grpcDialOption: grpcDialOption, vidMap: newVidMap(clientDataCenter), @@ -150,6 +152,8 @@ func (mc *MasterClient) tryConnectToMaster(master pb.ServerAddress) (nextHintedL if err = stream.Send(&master_pb.KeepConnectedRequest{ FilerGroup: mc.FilerGroup, + DataCenter: mc.DataCenter, + Rack: mc.rack, ClientType: mc.clientType, ClientAddress: string(mc.clientHost), Version: util.Version(), From 3254f18343735182d36d12fe42622efa567f4787 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 3 Jul 2022 00:55:37 -0700 Subject: [PATCH 08/17] display data center and rack in cluster.ps --- weed/cluster/cluster.go | 32 +- weed/mq/broker/broker_server.go | 2 +- weed/pb/master.proto | 2 + weed/pb/master_pb/master.pb.go | 366 ++++++++++++---------- weed/server/master_grpc_server_cluster.go | 2 + weed/shell/command_cluster_ps.go | 12 + 6 files changed, 230 insertions(+), 186 deletions(-) diff --git a/weed/cluster/cluster.go b/weed/cluster/cluster.go index 1802ecda0..0d9886911 100644 --- a/weed/cluster/cluster.go +++ b/weed/cluster/cluster.go @@ -34,10 +34,12 @@ type RackBrokers struct { } type ClusterNode struct { - Address pb.ServerAddress - Version string - counter int - CreatedTs time.Time + Address pb.ServerAddress + Version string + counter int + CreatedTs time.Time + DataCenter DataCenter + Rack Rack } type Cluster struct { @@ -78,10 +80,12 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente return nil } filers.filers[address] = &ClusterNode{ - Address: address, - Version: version, - counter: 1, - CreatedTs: time.Now(), + Address: address, + Version: version, + counter: 1, + CreatedTs: time.Now(), + DataCenter: dataCenter, + Rack: rack, } return cluster.ensureFilerLeaders(filers, true, filerGroup, nodeType, address) case BrokerType: @@ -92,12 +96,14 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente existingDataCenterBrokers = &DataCenterBrokers{ brokers: make(map[Rack]*RackBrokers), } + cluster.brokers[dataCenter] = existingDataCenterBrokers } existingRackBrokers, foundRack := existingDataCenterBrokers.brokers[rack] if !foundRack { existingRackBrokers = &RackBrokers{ brokers: make(map[pb.ServerAddress]*ClusterNode), } + existingDataCenterBrokers.brokers[rack] = existingRackBrokers } if existingBroker, found := existingRackBrokers.brokers[address]; found { @@ -105,10 +111,12 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente return nil } existingRackBrokers.brokers[address] = &ClusterNode{ - Address: address, - Version: version, - counter: 1, - CreatedTs: time.Now(), + Address: address, + Version: version, + counter: 1, + CreatedTs: time.Now(), + DataCenter: dataCenter, + Rack: rack, } return []*master_pb.KeepConnectedResponse{ { diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 1887498d2..36f216a48 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -41,7 +41,7 @@ func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.Dial mqBroker = &MessageQueueBroker{ option: option, grpcDialOption: grpcDialOption, - MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), option.DataCenter, "", option.Masters), + MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), option.DataCenter, option.Rack, option.Masters), } mqBroker.topicManager = NewTopicManager(mqBroker) diff --git a/weed/pb/master.proto b/weed/pb/master.proto index cb89913ac..19d2da16c 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -324,6 +324,8 @@ message ListClusterNodesResponse { string version = 2; bool is_leader = 3; int64 created_at_ns = 4; + string data_center = 5; + string rack = 6; } repeated ClusterNode cluster_nodes = 1; } diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index dce816000..12372e62e 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -3559,6 +3559,8 @@ type ListClusterNodesResponse_ClusterNode struct { Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` IsLeader bool `protobuf:"varint,3,opt,name=is_leader,json=isLeader,proto3" json:"is_leader,omitempty"` CreatedAtNs int64 `protobuf:"varint,4,opt,name=created_at_ns,json=createdAtNs,proto3" json:"created_at_ns,omitempty"` + DataCenter string `protobuf:"bytes,5,opt,name=data_center,json=dataCenter,proto3" json:"data_center,omitempty"` + Rack string `protobuf:"bytes,6,opt,name=rack,proto3" json:"rack,omitempty"` } func (x *ListClusterNodesResponse_ClusterNode) Reset() { @@ -3621,6 +3623,20 @@ func (x *ListClusterNodesResponse_ClusterNode) GetCreatedAtNs() int64 { return 0 } +func (x *ListClusterNodesResponse_ClusterNode) GetDataCenter() string { + if x != nil { + return x.DataCenter + } + return "" +} + +func (x *ListClusterNodesResponse_ClusterNode) GetRack() string { + if x != nil { + return x.Rack + } + return "" +} + type RaftListClusterServersResponse_ClusterServers struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4155,14 +4171,14 @@ var file_master_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x22, 0xf5, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x75, 0x70, 0x22, 0xaa, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x82, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0xb7, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -4170,179 +4186,183 @@ var file_master_proto_rawDesc = []byte{ 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x16, 0x4c, - 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, - 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, - 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, - 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, 0x5f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x73, 0x4e, - 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, - 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, - 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x0a, - 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, - 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x4e, - 0x73, 0x22, 0x56, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x61, 0x66, - 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1f, 0x0a, 0x1d, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xdb, 0x01, 0x0a, 0x1e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, 0x32, 0xaf, - 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, 0x53, 0x65, - 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, - 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x18, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x22, + 0xc5, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, + 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, + 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, + 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, + 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, + 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x22, 0x56, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, + 0x0a, 0x15, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x1e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, + 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, + 0x61, 0x67, 0x65, 0x32, 0xaf, 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, + 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, + 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, - 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, - 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, - 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, 0x75, 0x75, - 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, + 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, + 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x39, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x61, - 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0d, 0x52, - 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, - 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x61, 0x73, 0x74, 0x65, - 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x6f, 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0d, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, + 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, + 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/weed/server/master_grpc_server_cluster.go b/weed/server/master_grpc_server_cluster.go index fea4a66aa..31d7a6658 100644 --- a/weed/server/master_grpc_server_cluster.go +++ b/weed/server/master_grpc_server_cluster.go @@ -19,6 +19,8 @@ func (ms *MasterServer) ListClusterNodes(ctx context.Context, req *master_pb.Lis Version: node.Version, IsLeader: ms.Cluster.IsOneLeader(filerGroup, node.Address), CreatedAtNs: node.CreatedTs.UnixNano(), + DataCenter: string(node.DataCenter), + Rack: string(node.Rack), }) } return resp, nil diff --git a/weed/shell/command_cluster_ps.go b/weed/shell/command_cluster_ps.go index fc5f801b1..974815a15 100644 --- a/weed/shell/command_cluster_ps.go +++ b/weed/shell/command_cluster_ps.go @@ -80,12 +80,24 @@ func (c *commandClusterPs) Do(args []string, commandEnv *CommandEnv, writer io.W fmt.Fprintf(writer, "* message queue brokers %d\n", len(mqBrokerNodes)) for _, node := range mqBrokerNodes { fmt.Fprintf(writer, " * %s (%v)\n", node.Address, node.Version) + if node.DataCenter != "" { + fmt.Fprintf(writer, " DataCenter: %v\n", node.DataCenter) + } + if node.Rack != "" { + fmt.Fprintf(writer, " Rack: %v\n", node.Rack) + } } } fmt.Fprintf(writer, "* filers %d\n", len(filerNodes)) for _, node := range filerNodes { fmt.Fprintf(writer, " * %s (%v)\n", node.Address, node.Version) + if node.DataCenter != "" { + fmt.Fprintf(writer, " DataCenter: %v\n", node.DataCenter) + } + if node.Rack != "" { + fmt.Fprintf(writer, " Rack: %v\n", node.Rack) + } pb.WithFilerClient(false, pb.ServerAddress(node.Address), commandEnv.option.GrpcDialOption, func(client filer_pb.SeaweedFilerClient) error { resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) if err == nil { From 7db6666b9784d48f3ac7ef621714d114ff05d537 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 10 Jul 2022 01:36:23 -0700 Subject: [PATCH 09/17] remove old code --- other/java/client/src/main/proto/filer.proto | 6 - weed/mq/broker.go | 12 + weed/mq/broker/broker_append.go | 130 -- weed/mq/broker/broker_grpc_server.go | 37 - .../mq/broker/broker_grpc_server_discovery.go | 50 - weed/mq/broker/broker_grpc_server_publish.go | 112 -- .../mq/broker/broker_grpc_server_subscribe.go | 178 -- weed/mq/broker/broker_server.go | 64 - weed/mq/broker/topic_manager.go | 124 -- weed/mq/msgclient/chan_config.go | 5 - weed/mq/msgclient/chan_pub.go | 76 - weed/mq/msgclient/chan_sub.go | 85 - weed/mq/msgclient/client.go | 55 - weed/mq/msgclient/config.go | 63 - weed/mq/msgclient/publisher.go | 118 -- weed/mq/msgclient/subscriber.go | 120 -- weed/mq/topic.go | 23 + weed/pb/filer.proto | 6 - weed/pb/filer_pb/filer.pb.go | 111 +- weed/pb/filer_pb/filer_grpc.pb.go | 104 -- weed/pb/mq.proto | 107 -- weed/pb/mq_pb/mq.pb.go | 1615 +---------------- weed/pb/mq_pb/mq_grpc.pb.go | 247 +-- weed/server/filer_grpc_server_admin.go | 72 - weed/server/filer_server.go | 4 - 25 files changed, 151 insertions(+), 3373 deletions(-) create mode 100644 weed/mq/broker.go delete mode 100644 weed/mq/broker/broker_append.go delete mode 100644 weed/mq/broker/broker_grpc_server.go delete mode 100644 weed/mq/broker/broker_grpc_server_publish.go delete mode 100644 weed/mq/broker/broker_grpc_server_subscribe.go delete mode 100644 weed/mq/broker/topic_manager.go delete mode 100644 weed/mq/msgclient/chan_config.go delete mode 100644 weed/mq/msgclient/chan_pub.go delete mode 100644 weed/mq/msgclient/chan_sub.go delete mode 100644 weed/mq/msgclient/client.go delete mode 100644 weed/mq/msgclient/config.go delete mode 100644 weed/mq/msgclient/publisher.go delete mode 100644 weed/mq/msgclient/subscriber.go create mode 100644 weed/mq/topic.go diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto index bd0932cb8..bde42a80c 100644 --- a/other/java/client/src/main/proto/filer.proto +++ b/other/java/client/src/main/proto/filer.proto @@ -60,12 +60,6 @@ service SeaweedFiler { rpc SubscribeLocalMetadata (SubscribeMetadataRequest) returns (stream SubscribeMetadataResponse) { } - rpc KeepConnected (stream KeepConnectedRequest) returns (stream KeepConnectedResponse) { - } - - rpc LocateBroker (LocateBrokerRequest) returns (LocateBrokerResponse) { - } - rpc KvGet (KvGetRequest) returns (KvGetResponse) { } diff --git a/weed/mq/broker.go b/weed/mq/broker.go new file mode 100644 index 000000000..8debcec0b --- /dev/null +++ b/weed/mq/broker.go @@ -0,0 +1,12 @@ +package mq + +const LAST_MINUTES = 10 + +type TopicStat struct { + MessageCounts [LAST_MINUTES]int64 + ByteCounts [LAST_MINUTES]int64 +} + +func NewTopicStat() *TopicStat { + return &TopicStat{} +} diff --git a/weed/mq/broker/broker_append.go b/weed/mq/broker/broker_append.go deleted file mode 100644 index c8e0da93c..000000000 --- a/weed/mq/broker/broker_append.go +++ /dev/null @@ -1,130 +0,0 @@ -package broker - -import ( - "context" - "fmt" - "github.com/chrislusf/seaweedfs/weed/security" - "io" - - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/operation" - "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" - "github.com/chrislusf/seaweedfs/weed/util" -) - -func (broker *MessageQueueBroker) appendToFile(targetFile string, topicConfig *mq_pb.TopicConfiguration, data []byte) error { - - assignResult, uploadResult, err2 := broker.assignAndUpload(topicConfig, data) - if err2 != nil { - return err2 - } - - dir, name := util.FullPath(targetFile).DirAndName() - - // append the chunk - if err := broker.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - - request := &filer_pb.AppendToEntryRequest{ - Directory: dir, - EntryName: name, - Chunks: []*filer_pb.FileChunk{uploadResult.ToPbFileChunk(assignResult.Fid, 0)}, - } - - _, err := client.AppendToEntry(context.Background(), request) - if err != nil { - glog.V(0).Infof("append to file %v: %v", request, err) - return err - } - - return nil - }); err != nil { - return fmt.Errorf("append to file %v: %v", targetFile, err) - } - - return nil -} - -func (broker *MessageQueueBroker) assignAndUpload(topicConfig *mq_pb.TopicConfiguration, data []byte) (*operation.AssignResult, *operation.UploadResult, error) { - - var assignResult = &operation.AssignResult{} - - // assign a volume location - if err := broker.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error { - - assignErr := util.Retry("assignVolume", func() error { - request := &filer_pb.AssignVolumeRequest{ - Count: 1, - Replication: topicConfig.Replication, - Collection: topicConfig.Collection, - } - - resp, err := client.AssignVolume(context.Background(), request) - if err != nil { - glog.V(0).Infof("assign volume failure %v: %v", request, err) - return err - } - if resp.Error != "" { - return fmt.Errorf("assign volume failure %v: %v", request, resp.Error) - } - - assignResult.Auth = security.EncodedJwt(resp.Auth) - assignResult.Fid = resp.FileId - assignResult.Url = resp.Location.Url - assignResult.PublicUrl = resp.Location.PublicUrl - assignResult.GrpcPort = int(resp.Location.GrpcPort) - assignResult.Count = uint64(resp.Count) - - return nil - }) - if assignErr != nil { - return assignErr - } - - return nil - }); err != nil { - return nil, nil, err - } - - // upload data - targetUrl := fmt.Sprintf("http://%s/%s", assignResult.Url, assignResult.Fid) - uploadOption := &operation.UploadOption{ - UploadUrl: targetUrl, - Filename: "", - Cipher: broker.option.Cipher, - IsInputCompressed: false, - MimeType: "", - PairMap: nil, - Jwt: assignResult.Auth, - } - uploadResult, err := operation.UploadData(data, uploadOption) - if err != nil { - return nil, nil, fmt.Errorf("upload data %s: %v", targetUrl, err) - } - // println("uploaded to", targetUrl) - return assignResult, uploadResult, nil -} - -var _ = filer_pb.FilerClient(&MessageQueueBroker{}) - -func (broker *MessageQueueBroker) WithFilerClient(streamingMode bool, fn func(filer_pb.SeaweedFilerClient) error) (err error) { - - for _, filer := range broker.option.Filers { - if err = pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn); err != nil { - if err == io.EOF { - return - } - glog.V(0).Infof("fail to connect to %s: %v", filer, err) - } else { - break - } - } - - return - -} - -func (broker *MessageQueueBroker) AdjustedUrl(location *filer_pb.Location) string { - return location.Url -} diff --git a/weed/mq/broker/broker_grpc_server.go b/weed/mq/broker/broker_grpc_server.go deleted file mode 100644 index 2cb4187ae..000000000 --- a/weed/mq/broker/broker_grpc_server.go +++ /dev/null @@ -1,37 +0,0 @@ -package broker - -import ( - "context" - "fmt" - - "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -func (broker *MessageQueueBroker) ConfigureTopic(c context.Context, request *mq_pb.ConfigureTopicRequest) (*mq_pb.ConfigureTopicResponse, error) { - panic("implement me") -} - -func (broker *MessageQueueBroker) DeleteTopic(c context.Context, request *mq_pb.DeleteTopicRequest) (*mq_pb.DeleteTopicResponse, error) { - resp := &mq_pb.DeleteTopicResponse{} - dir, entry := genTopicDirEntry(request.Namespace, request.Topic) - if exists, err := filer_pb.Exists(broker, dir, entry, true); err != nil { - return nil, err - } else if exists { - err = filer_pb.Remove(broker, dir, entry, true, true, true, false, nil) - } - return resp, nil -} - -func (broker *MessageQueueBroker) GetTopicConfiguration(c context.Context, request *mq_pb.GetTopicConfigurationRequest) (*mq_pb.GetTopicConfigurationResponse, error) { - panic("implement me") -} - -func genTopicDir(namespace, topic string) string { - return fmt.Sprintf("%s/%s/%s", filer.TopicsDir, namespace, topic) -} - -func genTopicDirEntry(namespace, topic string) (dir, entry string) { - return fmt.Sprintf("%s/%s", filer.TopicsDir, namespace), topic -} diff --git a/weed/mq/broker/broker_grpc_server_discovery.go b/weed/mq/broker/broker_grpc_server_discovery.go index e276091a9..94e89cd41 100644 --- a/weed/mq/broker/broker_grpc_server_discovery.go +++ b/weed/mq/broker/broker_grpc_server_discovery.go @@ -2,7 +2,6 @@ package broker import ( "context" - "fmt" "github.com/chrislusf/seaweedfs/weed/cluster" "github.com/chrislusf/seaweedfs/weed/pb" "time" @@ -10,57 +9,8 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" ) -/* -Topic discovery: - -When pub or sub connects, it ask for the whole broker list, and run consistent hashing to find the broker. - -The broker will check peers whether it is already hosted by some other broker, if that broker is alive and acknowledged alive, redirect to it. -Otherwise, just host the topic. - -So, if the pub or sub connects around the same time, they would connect to the same broker. Everyone is happy. -If one of the pub or sub connects very late, and the system topo changed quite a bit with new servers added or old servers died, checking peers will help. - -*/ - -func (broker *MessageQueueBroker) FindBroker(c context.Context, request *mq_pb.FindBrokerRequest) (*mq_pb.FindBrokerResponse, error) { - - t := &mq_pb.FindBrokerResponse{} - var peers []string - - targetTopicPartition := fmt.Sprintf(TopicPartitionFmt, request.Namespace, request.Topic, request.Parition) - - for _, filer := range broker.option.Filers { - err := broker.withFilerClient(false, filer, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.LocateBroker(context.Background(), &filer_pb.LocateBrokerRequest{ - Resource: targetTopicPartition, - }) - if err != nil { - return err - } - if resp.Found && len(resp.Resources) > 0 { - t.Broker = resp.Resources[0].GrpcAddresses - return nil - } - for _, b := range resp.Resources { - peers = append(peers, b.GrpcAddresses) - } - return nil - }) - if err != nil { - return nil, err - } - } - - t.Broker = PickMember(peers, []byte(targetTopicPartition)) - - return t, nil - -} - func (broker *MessageQueueBroker) checkFilers() { // contact a filer about masters diff --git a/weed/mq/broker/broker_grpc_server_publish.go b/weed/mq/broker/broker_grpc_server_publish.go deleted file mode 100644 index eb76dd5dc..000000000 --- a/weed/mq/broker/broker_grpc_server_publish.go +++ /dev/null @@ -1,112 +0,0 @@ -package broker - -import ( - "crypto/md5" - "fmt" - "io" - - "github.com/golang/protobuf/proto" - - "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -func (broker *MessageQueueBroker) Publish(stream mq_pb.SeaweedMessaging_PublishServer) error { - - // process initial request - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - // TODO look it up - topicConfig := &mq_pb.TopicConfiguration{ - // IsTransient: true, - } - - // send init response - initResponse := &mq_pb.PublishResponse{ - Config: nil, - Redirect: nil, - } - err = stream.Send(initResponse) - if err != nil { - return err - } - if initResponse.Redirect != nil { - return nil - } - - // get lock - tp := TopicPartition{ - Namespace: in.Init.Namespace, - Topic: in.Init.Topic, - Partition: in.Init.Partition, - } - - tpDir := fmt.Sprintf("%s/%s/%s", filer.TopicsDir, tp.Namespace, tp.Topic) - md5File := fmt.Sprintf("p%02d.md5", tp.Partition) - // println("chan data stored under", tpDir, "as", md5File) - - if exists, err := filer_pb.Exists(broker, tpDir, md5File, false); err == nil && exists { - return fmt.Errorf("channel is already closed") - } - - tl := broker.topicManager.RequestLock(tp, topicConfig, true) - defer broker.topicManager.ReleaseLock(tp, true) - - md5hash := md5.New() - // process each message - for { - // println("recv") - in, err := stream.Recv() - // glog.V(0).Infof("recieved %v err: %v", in, err) - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - if in.Data == nil { - continue - } - - // fmt.Printf("received: %d : %s\n", len(in.Data.Value), string(in.Data.Value)) - - data, err := proto.Marshal(in.Data) - if err != nil { - glog.Errorf("marshall error: %v\n", err) - continue - } - - tl.logBuffer.AddToBuffer(in.Data.Key, data, in.Data.EventTimeNs) - - if in.Data.IsClose { - // println("server received closing") - break - } - - md5hash.Write(in.Data.Value) - - } - - if err := broker.appendToFile(tpDir+"/"+md5File, topicConfig, md5hash.Sum(nil)); err != nil { - glog.V(0).Infof("err writing %s: %v", md5File, err) - } - - // fmt.Printf("received md5 %X\n", md5hash.Sum(nil)) - - // send the close ack - // println("server send ack closing") - if err := stream.Send(&mq_pb.PublishResponse{IsClosed: true}); err != nil { - glog.V(0).Infof("err sending close response: %v", err) - } - return nil - -} diff --git a/weed/mq/broker/broker_grpc_server_subscribe.go b/weed/mq/broker/broker_grpc_server_subscribe.go deleted file mode 100644 index 3743218b1..000000000 --- a/weed/mq/broker/broker_grpc_server_subscribe.go +++ /dev/null @@ -1,178 +0,0 @@ -package broker - -import ( - "fmt" - "github.com/chrislusf/seaweedfs/weed/util" - "github.com/chrislusf/seaweedfs/weed/util/log_buffer" - "io" - "strings" - "time" - - "github.com/golang/protobuf/proto" - - "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -func (broker *MessageQueueBroker) Subscribe(stream mq_pb.SeaweedMessaging_SubscribeServer) error { - - // process initial request - in, err := stream.Recv() - if err == io.EOF { - return nil - } - if err != nil { - return err - } - - var processedTsNs int64 - var messageCount int64 - subscriberId := in.Init.SubscriberId - - // TODO look it up - topicConfig := &mq_pb.TopicConfiguration{ - // IsTransient: true, - } - - // get lock - tp := TopicPartition{ - Namespace: in.Init.Namespace, - Topic: in.Init.Topic, - Partition: in.Init.Partition, - } - fmt.Printf("+ subscriber %s for %s\n", subscriberId, tp.String()) - defer func() { - fmt.Printf("- subscriber %s for %s %d messages last %v\n", subscriberId, tp.String(), messageCount, time.Unix(0, processedTsNs)) - }() - - lock := broker.topicManager.RequestLock(tp, topicConfig, false) - defer broker.topicManager.ReleaseLock(tp, false) - - isConnected := true - go func() { - for isConnected { - if _, err := stream.Recv(); err != nil { - // println("disconnecting connection to", subscriberId, tp.String()) - isConnected = false - lock.cond.Signal() - } - } - }() - - lastReadTime := time.Now() - switch in.Init.StartPosition { - case mq_pb.SubscriberMessage_InitMessage_TIMESTAMP: - lastReadTime = time.Unix(0, in.Init.TimestampNs) - case mq_pb.SubscriberMessage_InitMessage_LATEST: - case mq_pb.SubscriberMessage_InitMessage_EARLIEST: - lastReadTime = time.Unix(0, 0) - } - - // how to process each message - // an error returned will end the subscription - eachMessageFn := func(m *mq_pb.Message) error { - err := stream.Send(&mq_pb.BrokerMessage{ - Data: m, - }) - if err != nil { - glog.V(0).Infof("=> subscriber %v: %+v", subscriberId, err) - } - return err - } - - eachLogEntryFn := func(logEntry *filer_pb.LogEntry) error { - m := &mq_pb.Message{} - if err = proto.Unmarshal(logEntry.Data, m); err != nil { - glog.Errorf("unexpected unmarshal mq_pb.Message: %v", err) - return err - } - // fmt.Printf("sending : %d bytes ts %d\n", len(m.Value), logEntry.TsNs) - if err = eachMessageFn(m); err != nil { - glog.Errorf("sending %d bytes to %s: %s", len(m.Value), subscriberId, err) - return err - } - if m.IsClose { - // println("processed EOF") - return io.EOF - } - processedTsNs = logEntry.TsNs - messageCount++ - return nil - } - - // fmt.Printf("subscriber %s read %d on disk log %v\n", subscriberId, messageCount, lastReadTime) - - for { - - if err = broker.readPersistedLogBuffer(&tp, lastReadTime, eachLogEntryFn); err != nil { - if err != io.EOF { - // println("stopping from persisted logs", err.Error()) - return err - } - } - - if processedTsNs != 0 { - lastReadTime = time.Unix(0, processedTsNs) - } - - lastReadTime, _, err = lock.logBuffer.LoopProcessLogData("broker", lastReadTime, 0, func() bool { - lock.Mutex.Lock() - lock.cond.Wait() - lock.Mutex.Unlock() - return isConnected - }, eachLogEntryFn) - if err != nil { - if err == log_buffer.ResumeFromDiskError { - continue - } - glog.Errorf("processed to %v: %v", lastReadTime, err) - if err != log_buffer.ResumeError { - break - } - } - } - - return err - -} - -func (broker *MessageQueueBroker) readPersistedLogBuffer(tp *TopicPartition, startTime time.Time, eachLogEntryFn func(logEntry *filer_pb.LogEntry) error) (err error) { - startTime = startTime.UTC() - startDate := fmt.Sprintf("%04d-%02d-%02d", startTime.Year(), startTime.Month(), startTime.Day()) - startHourMinute := fmt.Sprintf("%02d-%02d", startTime.Hour(), startTime.Minute()) - - sizeBuf := make([]byte, 4) - startTsNs := startTime.UnixNano() - - topicDir := genTopicDir(tp.Namespace, tp.Topic) - partitionSuffix := fmt.Sprintf(".part%02d", tp.Partition) - - return filer_pb.List(broker, topicDir, "", func(dayEntry *filer_pb.Entry, isLast bool) error { - dayDir := fmt.Sprintf("%s/%s", topicDir, dayEntry.Name) - return filer_pb.List(broker, dayDir, "", func(hourMinuteEntry *filer_pb.Entry, isLast bool) error { - if dayEntry.Name == startDate { - hourMinute := util.FileNameBase(hourMinuteEntry.Name) - if strings.Compare(hourMinute, startHourMinute) < 0 { - return nil - } - } - if !strings.HasSuffix(hourMinuteEntry.Name, partitionSuffix) { - return nil - } - // println("partition", tp.Partition, "processing", dayDir, "/", hourMinuteEntry.Name) - chunkedFileReader := filer.NewChunkStreamReader(broker, hourMinuteEntry.Chunks) - defer chunkedFileReader.Close() - if _, err := filer.ReadEachLogEntry(chunkedFileReader, sizeBuf, startTsNs, 0, eachLogEntryFn); err != nil { - chunkedFileReader.Close() - if err == io.EOF { - return err - } - return fmt.Errorf("reading %s/%s: %v", dayDir, hourMinuteEntry.Name, err) - } - return nil - }, "", false, 24*60) - }, startDate, true, 366) - -} diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 36f216a48..63e248797 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -1,15 +1,11 @@ package broker import ( - "context" "github.com/chrislusf/seaweedfs/weed/cluster" "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/wdclient" - "time" - "google.golang.org/grpc" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" @@ -33,7 +29,6 @@ type MessageQueueBroker struct { option *MessageQueueBrokerOption grpcDialOption grpc.DialOption MasterClient *wdclient.MasterClient - topicManager *TopicManager } func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.DialOption) (mqBroker *MessageQueueBroker, err error) { @@ -44,72 +39,13 @@ func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.Dial MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), option.DataCenter, option.Rack, option.Masters), } - mqBroker.topicManager = NewTopicManager(mqBroker) - mqBroker.checkFilers() - go mqBroker.keepConnectedToOneFiler() go mqBroker.MasterClient.KeepConnectedToMaster() return mqBroker, nil } -func (broker *MessageQueueBroker) keepConnectedToOneFiler() { - - for { - for _, filer := range broker.option.Filers { - broker.withFilerClient(false, filer, func(client filer_pb.SeaweedFilerClient) error { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - stream, err := client.KeepConnected(ctx) - if err != nil { - glog.V(0).Infof("%s:%d failed to keep connected to %s: %v", broker.option.Ip, broker.option.Port, filer, err) - return err - } - - initRequest := &filer_pb.KeepConnectedRequest{ - Name: broker.option.Ip, - GrpcPort: uint32(broker.option.Port), - } - for _, tp := range broker.topicManager.ListTopicPartitions() { - initRequest.Resources = append(initRequest.Resources, tp.String()) - } - if err := stream.Send(&filer_pb.KeepConnectedRequest{ - Name: broker.option.Ip, - GrpcPort: uint32(broker.option.Port), - }); err != nil { - glog.V(0).Infof("broker %s:%d failed to init at %s: %v", broker.option.Ip, broker.option.Port, filer, err) - return err - } - - // TODO send events of adding/removing topics - - glog.V(0).Infof("conntected with filer: %v", filer) - for { - if err := stream.Send(&filer_pb.KeepConnectedRequest{ - Name: broker.option.Ip, - GrpcPort: uint32(broker.option.Port), - }); err != nil { - glog.V(0).Infof("%s:%d failed to sendto %s: %v", broker.option.Ip, broker.option.Port, filer, err) - return err - } - // println("send heartbeat") - if _, err := stream.Recv(); err != nil { - glog.V(0).Infof("%s:%d failed to receive from %s: %v", broker.option.Ip, broker.option.Port, filer, err) - return err - } - // println("received reply") - time.Sleep(11 * time.Second) - // println("woke up") - } - return nil - }) - time.Sleep(3 * time.Second) - } - } - -} - func (broker *MessageQueueBroker) withFilerClient(streamingMode bool, filer pb.ServerAddress, fn func(filer_pb.SeaweedFilerClient) error) error { return pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn) diff --git a/weed/mq/broker/topic_manager.go b/weed/mq/broker/topic_manager.go deleted file mode 100644 index 34f063d9a..000000000 --- a/weed/mq/broker/topic_manager.go +++ /dev/null @@ -1,124 +0,0 @@ -package broker - -import ( - "fmt" - "sync" - "time" - - "github.com/chrislusf/seaweedfs/weed/filer" - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" - "github.com/chrislusf/seaweedfs/weed/util/log_buffer" -) - -type TopicPartition struct { - Namespace string - Topic string - Partition int32 -} - -const ( - TopicPartitionFmt = "%s/%s_%02d" -) - -func (tp *TopicPartition) String() string { - return fmt.Sprintf(TopicPartitionFmt, tp.Namespace, tp.Topic, tp.Partition) -} - -type TopicControl struct { - sync.Mutex - cond *sync.Cond - subscriberCount int - publisherCount int - logBuffer *log_buffer.LogBuffer -} - -type TopicManager struct { - sync.Mutex - topicControls map[TopicPartition]*TopicControl - broker *MessageQueueBroker -} - -func NewTopicManager(messageBroker *MessageQueueBroker) *TopicManager { - return &TopicManager{ - topicControls: make(map[TopicPartition]*TopicControl), - broker: messageBroker, - } -} - -func (tm *TopicManager) buildLogBuffer(tl *TopicControl, tp TopicPartition, topicConfig *mq_pb.TopicConfiguration) *log_buffer.LogBuffer { - - flushFn := func(startTime, stopTime time.Time, buf []byte) { - - if topicConfig.IsTransient { - // return - } - - // fmt.Printf("flushing with topic config %+v\n", topicConfig) - - startTime, stopTime = startTime.UTC(), stopTime.UTC() - targetFile := fmt.Sprintf( - "%s/%s/%s/%04d-%02d-%02d/%02d-%02d.part%02d", - filer.TopicsDir, tp.Namespace, tp.Topic, - startTime.Year(), startTime.Month(), startTime.Day(), startTime.Hour(), startTime.Minute(), - tp.Partition, - ) - - if err := tm.broker.appendToFile(targetFile, topicConfig, buf); err != nil { - glog.V(0).Infof("log write failed %s: %v", targetFile, err) - } - } - logBuffer := log_buffer.NewLogBuffer("broker", time.Minute, flushFn, func() { - tl.cond.Broadcast() - }) - - return logBuffer -} - -func (tm *TopicManager) RequestLock(partition TopicPartition, topicConfig *mq_pb.TopicConfiguration, isPublisher bool) *TopicControl { - tm.Lock() - defer tm.Unlock() - - tc, found := tm.topicControls[partition] - if !found { - tc = &TopicControl{} - tc.cond = sync.NewCond(&tc.Mutex) - tm.topicControls[partition] = tc - tc.logBuffer = tm.buildLogBuffer(tc, partition, topicConfig) - } - if isPublisher { - tc.publisherCount++ - } else { - tc.subscriberCount++ - } - return tc -} - -func (tm *TopicManager) ReleaseLock(partition TopicPartition, isPublisher bool) { - tm.Lock() - defer tm.Unlock() - - lock, found := tm.topicControls[partition] - if !found { - return - } - if isPublisher { - lock.publisherCount-- - } else { - lock.subscriberCount-- - } - if lock.subscriberCount <= 0 && lock.publisherCount <= 0 { - delete(tm.topicControls, partition) - lock.logBuffer.Shutdown() - } -} - -func (tm *TopicManager) ListTopicPartitions() (tps []TopicPartition) { - tm.Lock() - defer tm.Unlock() - - for k := range tm.topicControls { - tps = append(tps, k) - } - return -} diff --git a/weed/mq/msgclient/chan_config.go b/weed/mq/msgclient/chan_config.go deleted file mode 100644 index a75678815..000000000 --- a/weed/mq/msgclient/chan_config.go +++ /dev/null @@ -1,5 +0,0 @@ -package msgclient - -func (mc *MessagingClient) DeleteChannel(chanName string) error { - return mc.DeleteTopic("chan", chanName) -} diff --git a/weed/mq/msgclient/chan_pub.go b/weed/mq/msgclient/chan_pub.go deleted file mode 100644 index f4ffe832a..000000000 --- a/weed/mq/msgclient/chan_pub.go +++ /dev/null @@ -1,76 +0,0 @@ -package msgclient - -import ( - "crypto/md5" - "hash" - "io" - "log" - - "google.golang.org/grpc" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -type PubChannel struct { - client mq_pb.SeaweedMessaging_PublishClient - grpcConnection *grpc.ClientConn - md5hash hash.Hash -} - -func (mc *MessagingClient) NewPubChannel(chanName string) (*PubChannel, error) { - tp := broker.TopicPartition{ - Namespace: "chan", - Topic: chanName, - Partition: 0, - } - grpcConnection, err := mc.findBroker(tp) - if err != nil { - return nil, err - } - pc, err := setupPublisherClient(grpcConnection, tp) - if err != nil { - return nil, err - } - return &PubChannel{ - client: pc, - grpcConnection: grpcConnection, - md5hash: md5.New(), - }, nil -} - -func (pc *PubChannel) Publish(m []byte) error { - err := pc.client.Send(&mq_pb.PublishRequest{ - Data: &mq_pb.Message{ - Value: m, - }, - }) - if err == nil { - pc.md5hash.Write(m) - } - return err -} -func (pc *PubChannel) Close() error { - - // println("send closing") - if err := pc.client.Send(&mq_pb.PublishRequest{ - Data: &mq_pb.Message{ - IsClose: true, - }, - }); err != nil { - log.Printf("err send close: %v", err) - } - // println("receive closing") - if _, err := pc.client.Recv(); err != nil && err != io.EOF { - log.Printf("err receive close: %v", err) - } - // println("close connection") - if err := pc.grpcConnection.Close(); err != nil { - log.Printf("err connection close: %v", err) - } - return nil -} - -func (pc *PubChannel) Md5() []byte { - return pc.md5hash.Sum(nil) -} diff --git a/weed/mq/msgclient/chan_sub.go b/weed/mq/msgclient/chan_sub.go deleted file mode 100644 index 859b482ef..000000000 --- a/weed/mq/msgclient/chan_sub.go +++ /dev/null @@ -1,85 +0,0 @@ -package msgclient - -import ( - "context" - "crypto/md5" - "hash" - "io" - "log" - "time" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -type SubChannel struct { - ch chan []byte - stream mq_pb.SeaweedMessaging_SubscribeClient - md5hash hash.Hash - cancel context.CancelFunc -} - -func (mc *MessagingClient) NewSubChannel(subscriberId, chanName string) (*SubChannel, error) { - tp := broker.TopicPartition{ - Namespace: "chan", - Topic: chanName, - Partition: 0, - } - grpcConnection, err := mc.findBroker(tp) - if err != nil { - return nil, err - } - ctx, cancel := context.WithCancel(context.Background()) - sc, err := setupSubscriberClient(ctx, grpcConnection, tp, subscriberId, time.Unix(0, 0)) - if err != nil { - return nil, err - } - - t := &SubChannel{ - ch: make(chan []byte), - stream: sc, - md5hash: md5.New(), - cancel: cancel, - } - - go func() { - for { - resp, subErr := t.stream.Recv() - if subErr == io.EOF { - return - } - if subErr != nil { - log.Printf("fail to receive from netchan %s: %v", chanName, subErr) - return - } - if resp.Data == nil { - // this could be heartbeat from broker - continue - } - if resp.Data.IsClose { - t.stream.Send(&mq_pb.SubscriberMessage{ - IsClose: true, - }) - close(t.ch) - cancel() - return - } - t.ch <- resp.Data.Value - t.md5hash.Write(resp.Data.Value) - } - }() - - return t, nil -} - -func (sc *SubChannel) Channel() chan []byte { - return sc.ch -} - -func (sc *SubChannel) Md5() []byte { - return sc.md5hash.Sum(nil) -} - -func (sc *SubChannel) Cancel() { - sc.cancel() -} diff --git a/weed/mq/msgclient/client.go b/weed/mq/msgclient/client.go deleted file mode 100644 index cc64f1acb..000000000 --- a/weed/mq/msgclient/client.go +++ /dev/null @@ -1,55 +0,0 @@ -package msgclient - -import ( - "context" - "fmt" - "log" - - "google.golang.org/grpc" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" - "github.com/chrislusf/seaweedfs/weed/security" - "github.com/chrislusf/seaweedfs/weed/util" -) - -type MessagingClient struct { - bootstrapBrokers []string - grpcConnections map[broker.TopicPartition]*grpc.ClientConn - grpcDialOption grpc.DialOption -} - -func NewMessagingClient(bootstrapBrokers ...string) *MessagingClient { - return &MessagingClient{ - bootstrapBrokers: bootstrapBrokers, - grpcConnections: make(map[broker.TopicPartition]*grpc.ClientConn), - grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.msg_client"), - } -} - -func (mc *MessagingClient) findBroker(tp broker.TopicPartition) (*grpc.ClientConn, error) { - - for _, broker := range mc.bootstrapBrokers { - grpcConnection, err := pb.GrpcDial(context.Background(), broker, mc.grpcDialOption) - if err != nil { - log.Printf("dial broker %s: %v", broker, err) - continue - } - defer grpcConnection.Close() - - resp, err := mq_pb.NewSeaweedMessagingClient(grpcConnection).FindBroker(context.Background(), - &mq_pb.FindBrokerRequest{ - Namespace: tp.Namespace, - Topic: tp.Topic, - Parition: tp.Partition, - }) - if err != nil { - return nil, err - } - - targetBroker := resp.Broker - return pb.GrpcDial(context.Background(), targetBroker, mc.grpcDialOption) - } - return nil, fmt.Errorf("no broker found for %+v", tp) -} diff --git a/weed/mq/msgclient/config.go b/weed/mq/msgclient/config.go deleted file mode 100644 index 263ee856e..000000000 --- a/weed/mq/msgclient/config.go +++ /dev/null @@ -1,63 +0,0 @@ -package msgclient - -import ( - "context" - "log" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -func (mc *MessagingClient) configureTopic(tp broker.TopicPartition) error { - - return mc.withAnyBroker(func(client mq_pb.SeaweedMessagingClient) error { - _, err := client.ConfigureTopic(context.Background(), - &mq_pb.ConfigureTopicRequest{ - Namespace: tp.Namespace, - Topic: tp.Topic, - Configuration: &mq_pb.TopicConfiguration{ - PartitionCount: 0, - Collection: "", - Replication: "", - IsTransient: false, - Partitoning: 0, - }, - }) - return err - }) - -} - -func (mc *MessagingClient) DeleteTopic(namespace, topic string) error { - - return mc.withAnyBroker(func(client mq_pb.SeaweedMessagingClient) error { - _, err := client.DeleteTopic(context.Background(), - &mq_pb.DeleteTopicRequest{ - Namespace: namespace, - Topic: topic, - }) - return err - }) -} - -func (mc *MessagingClient) withAnyBroker(fn func(client mq_pb.SeaweedMessagingClient) error) error { - - var lastErr error - for _, broker := range mc.bootstrapBrokers { - grpcConnection, err := pb.GrpcDial(context.Background(), broker, mc.grpcDialOption) - if err != nil { - log.Printf("dial broker %s: %v", broker, err) - continue - } - defer grpcConnection.Close() - - err = fn(mq_pb.NewSeaweedMessagingClient(grpcConnection)) - if err == nil { - return nil - } - lastErr = err - } - - return lastErr -} diff --git a/weed/mq/msgclient/publisher.go b/weed/mq/msgclient/publisher.go deleted file mode 100644 index 823791d10..000000000 --- a/weed/mq/msgclient/publisher.go +++ /dev/null @@ -1,118 +0,0 @@ -package msgclient - -import ( - "context" - - "github.com/OneOfOne/xxhash" - "google.golang.org/grpc" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" -) - -type Publisher struct { - publishClients []mq_pb.SeaweedMessaging_PublishClient - topicConfiguration *mq_pb.TopicConfiguration - messageCount uint64 - publisherId string -} - -func (mc *MessagingClient) NewPublisher(publisherId, namespace, topic string) (*Publisher, error) { - // read topic configuration - topicConfiguration := &mq_pb.TopicConfiguration{ - PartitionCount: 4, - } - publishClients := make([]mq_pb.SeaweedMessaging_PublishClient, topicConfiguration.PartitionCount) - for i := 0; i < int(topicConfiguration.PartitionCount); i++ { - tp := broker.TopicPartition{ - Namespace: namespace, - Topic: topic, - Partition: int32(i), - } - grpcClientConn, err := mc.findBroker(tp) - if err != nil { - return nil, err - } - client, err := setupPublisherClient(grpcClientConn, tp) - if err != nil { - return nil, err - } - publishClients[i] = client - } - return &Publisher{ - publishClients: publishClients, - topicConfiguration: topicConfiguration, - }, nil -} - -func setupPublisherClient(grpcConnection *grpc.ClientConn, tp broker.TopicPartition) (mq_pb.SeaweedMessaging_PublishClient, error) { - - stream, err := mq_pb.NewSeaweedMessagingClient(grpcConnection).Publish(context.Background()) - if err != nil { - return nil, err - } - - // send init message - err = stream.Send(&mq_pb.PublishRequest{ - Init: &mq_pb.PublishRequest_InitMessage{ - Namespace: tp.Namespace, - Topic: tp.Topic, - Partition: tp.Partition, - }, - }) - if err != nil { - return nil, err - } - - // process init response - initResponse, err := stream.Recv() - if err != nil { - return nil, err - } - if initResponse.Redirect != nil { - // TODO follow redirection - } - if initResponse.Config != nil { - } - - // setup looks for control messages - doneChan := make(chan error, 1) - go func() { - for { - in, err := stream.Recv() - if err != nil { - doneChan <- err - return - } - if in.Redirect != nil { - } - if in.Config != nil { - } - } - }() - - return stream, nil - -} - -func (p *Publisher) Publish(m *mq_pb.Message) error { - hashValue := p.messageCount - p.messageCount++ - if p.topicConfiguration.Partitoning == mq_pb.TopicConfiguration_NonNullKeyHash { - if m.Key != nil { - hashValue = xxhash.Checksum64(m.Key) - } - } else if p.topicConfiguration.Partitoning == mq_pb.TopicConfiguration_KeyHash { - hashValue = xxhash.Checksum64(m.Key) - } else { - // round robin - } - - idx := int(hashValue) % len(p.publishClients) - if idx < 0 { - idx += len(p.publishClients) - } - return p.publishClients[idx].Send(&mq_pb.PublishRequest{ - Data: m, - }) -} diff --git a/weed/mq/msgclient/subscriber.go b/weed/mq/msgclient/subscriber.go deleted file mode 100644 index f3da40fb3..000000000 --- a/weed/mq/msgclient/subscriber.go +++ /dev/null @@ -1,120 +0,0 @@ -package msgclient - -import ( - "context" - "io" - "sync" - "time" - - "github.com/chrislusf/seaweedfs/weed/mq/broker" - "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" - "google.golang.org/grpc" -) - -type Subscriber struct { - subscriberClients []mq_pb.SeaweedMessaging_SubscribeClient - subscriberCancels []context.CancelFunc - subscriberId string -} - -func (mc *MessagingClient) NewSubscriber(subscriberId, namespace, topic string, partitionId int, startTime time.Time) (*Subscriber, error) { - // read topic configuration - topicConfiguration := &mq_pb.TopicConfiguration{ - PartitionCount: 4, - } - subscriberClients := make([]mq_pb.SeaweedMessaging_SubscribeClient, topicConfiguration.PartitionCount) - subscriberCancels := make([]context.CancelFunc, topicConfiguration.PartitionCount) - - for i := 0; i < int(topicConfiguration.PartitionCount); i++ { - if partitionId >= 0 && i != partitionId { - continue - } - tp := broker.TopicPartition{ - Namespace: namespace, - Topic: topic, - Partition: int32(i), - } - grpcClientConn, err := mc.findBroker(tp) - if err != nil { - return nil, err - } - ctx, cancel := context.WithCancel(context.Background()) - client, err := setupSubscriberClient(ctx, grpcClientConn, tp, subscriberId, startTime) - if err != nil { - return nil, err - } - subscriberClients[i] = client - subscriberCancels[i] = cancel - } - - return &Subscriber{ - subscriberClients: subscriberClients, - subscriberCancels: subscriberCancels, - subscriberId: subscriberId, - }, nil -} - -func setupSubscriberClient(ctx context.Context, grpcConnection *grpc.ClientConn, tp broker.TopicPartition, subscriberId string, startTime time.Time) (stream mq_pb.SeaweedMessaging_SubscribeClient, err error) { - stream, err = mq_pb.NewSeaweedMessagingClient(grpcConnection).Subscribe(ctx) - if err != nil { - return - } - - // send init message - err = stream.Send(&mq_pb.SubscriberMessage{ - Init: &mq_pb.SubscriberMessage_InitMessage{ - Namespace: tp.Namespace, - Topic: tp.Topic, - Partition: tp.Partition, - StartPosition: mq_pb.SubscriberMessage_InitMessage_TIMESTAMP, - TimestampNs: startTime.UnixNano(), - SubscriberId: subscriberId, - }, - }) - if err != nil { - return - } - - return stream, nil -} - -func doSubscribe(subscriberClient mq_pb.SeaweedMessaging_SubscribeClient, processFn func(m *mq_pb.Message)) error { - for { - resp, listenErr := subscriberClient.Recv() - if listenErr == io.EOF { - return nil - } - if listenErr != nil { - println(listenErr.Error()) - return listenErr - } - if resp.Data == nil { - // this could be heartbeat from broker - continue - } - processFn(resp.Data) - } -} - -// Subscribe starts goroutines to process the messages -func (s *Subscriber) Subscribe(processFn func(m *mq_pb.Message)) { - var wg sync.WaitGroup - for i := 0; i < len(s.subscriberClients); i++ { - if s.subscriberClients[i] != nil { - wg.Add(1) - go func(subscriberClient mq_pb.SeaweedMessaging_SubscribeClient) { - defer wg.Done() - doSubscribe(subscriberClient, processFn) - }(s.subscriberClients[i]) - } - } - wg.Wait() -} - -func (s *Subscriber) Shutdown() { - for i := 0; i < len(s.subscriberClients); i++ { - if s.subscriberCancels[i] != nil { - s.subscriberCancels[i]() - } - } -} diff --git a/weed/mq/topic.go b/weed/mq/topic.go new file mode 100644 index 000000000..fc1923af1 --- /dev/null +++ b/weed/mq/topic.go @@ -0,0 +1,23 @@ +package mq + +import "time" + +type Namespace string + +type Topic struct { + namespace Namespace + name string +} + +type Partition struct { + rangeStart int + rangeStop int // exclusive + ringSize int +} + +type Segment struct { + topic Topic + id int32 + partition Partition + lastModified time.Time +} diff --git a/weed/pb/filer.proto b/weed/pb/filer.proto index bd0932cb8..bde42a80c 100644 --- a/weed/pb/filer.proto +++ b/weed/pb/filer.proto @@ -60,12 +60,6 @@ service SeaweedFiler { rpc SubscribeLocalMetadata (SubscribeMetadataRequest) returns (stream SubscribeMetadataResponse) { } - rpc KeepConnected (stream KeepConnectedRequest) returns (stream KeepConnectedResponse) { - } - - rpc LocateBroker (LocateBrokerRequest) returns (LocateBrokerResponse) { - } - rpc KvGet (KvGetRequest) returns (KvGetResponse) { } diff --git a/weed/pb/filer_pb/filer.pb.go b/weed/pb/filer_pb/filer.pb.go index 4ac560855..c42436921 100644 --- a/weed/pb/filer_pb/filer.pb.go +++ b/weed/pb/filer_pb/filer.pb.go @@ -4253,7 +4253,7 @@ var file_filer_proto_rawDesc = []byte{ 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x32, 0x82, 0x0f, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, + 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x32, 0xd9, 0x0d, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x67, 0x0a, 0x14, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x25, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, @@ -4347,39 +4347,28 @@ var file_filer_proto_rawDesc = []byte{ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x56, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x12, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, - 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, - 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, - 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x88, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, - 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, - 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, - 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x3a, 0x0a, 0x05, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x05, + 0x4b, 0x76, 0x50, 0x75, 0x74, 0x12, 0x16, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x76, 0x50, 0x75, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x88, 0x01, 0x0a, 0x1f, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x6f, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x4f, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, + 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x66, 0x69, 0x6c, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4499,35 +4488,31 @@ var file_filer_proto_depIdxs = []int32{ 39, // 39: filer_pb.SeaweedFiler.GetFilerConfiguration:input_type -> filer_pb.GetFilerConfigurationRequest 41, // 40: filer_pb.SeaweedFiler.SubscribeMetadata:input_type -> filer_pb.SubscribeMetadataRequest 41, // 41: filer_pb.SeaweedFiler.SubscribeLocalMetadata:input_type -> filer_pb.SubscribeMetadataRequest - 44, // 42: filer_pb.SeaweedFiler.KeepConnected:input_type -> filer_pb.KeepConnectedRequest - 46, // 43: filer_pb.SeaweedFiler.LocateBroker:input_type -> filer_pb.LocateBrokerRequest - 48, // 44: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest - 50, // 45: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest - 53, // 46: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:input_type -> filer_pb.CacheRemoteObjectToLocalClusterRequest - 1, // 47: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse - 3, // 48: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse - 13, // 49: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse - 15, // 50: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse - 17, // 51: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse - 19, // 52: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse - 21, // 53: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse - 23, // 54: filer_pb.SeaweedFiler.StreamRenameEntry:output_type -> filer_pb.StreamRenameEntryResponse - 25, // 55: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse - 29, // 56: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse - 32, // 57: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse - 34, // 58: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse - 36, // 59: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse - 38, // 60: filer_pb.SeaweedFiler.Ping:output_type -> filer_pb.PingResponse - 40, // 61: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse - 42, // 62: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 42, // 63: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse - 45, // 64: filer_pb.SeaweedFiler.KeepConnected:output_type -> filer_pb.KeepConnectedResponse - 47, // 65: filer_pb.SeaweedFiler.LocateBroker:output_type -> filer_pb.LocateBrokerResponse - 49, // 66: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse - 51, // 67: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse - 54, // 68: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:output_type -> filer_pb.CacheRemoteObjectToLocalClusterResponse - 47, // [47:69] is the sub-list for method output_type - 25, // [25:47] is the sub-list for method input_type + 48, // 42: filer_pb.SeaweedFiler.KvGet:input_type -> filer_pb.KvGetRequest + 50, // 43: filer_pb.SeaweedFiler.KvPut:input_type -> filer_pb.KvPutRequest + 53, // 44: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:input_type -> filer_pb.CacheRemoteObjectToLocalClusterRequest + 1, // 45: filer_pb.SeaweedFiler.LookupDirectoryEntry:output_type -> filer_pb.LookupDirectoryEntryResponse + 3, // 46: filer_pb.SeaweedFiler.ListEntries:output_type -> filer_pb.ListEntriesResponse + 13, // 47: filer_pb.SeaweedFiler.CreateEntry:output_type -> filer_pb.CreateEntryResponse + 15, // 48: filer_pb.SeaweedFiler.UpdateEntry:output_type -> filer_pb.UpdateEntryResponse + 17, // 49: filer_pb.SeaweedFiler.AppendToEntry:output_type -> filer_pb.AppendToEntryResponse + 19, // 50: filer_pb.SeaweedFiler.DeleteEntry:output_type -> filer_pb.DeleteEntryResponse + 21, // 51: filer_pb.SeaweedFiler.AtomicRenameEntry:output_type -> filer_pb.AtomicRenameEntryResponse + 23, // 52: filer_pb.SeaweedFiler.StreamRenameEntry:output_type -> filer_pb.StreamRenameEntryResponse + 25, // 53: filer_pb.SeaweedFiler.AssignVolume:output_type -> filer_pb.AssignVolumeResponse + 29, // 54: filer_pb.SeaweedFiler.LookupVolume:output_type -> filer_pb.LookupVolumeResponse + 32, // 55: filer_pb.SeaweedFiler.CollectionList:output_type -> filer_pb.CollectionListResponse + 34, // 56: filer_pb.SeaweedFiler.DeleteCollection:output_type -> filer_pb.DeleteCollectionResponse + 36, // 57: filer_pb.SeaweedFiler.Statistics:output_type -> filer_pb.StatisticsResponse + 38, // 58: filer_pb.SeaweedFiler.Ping:output_type -> filer_pb.PingResponse + 40, // 59: filer_pb.SeaweedFiler.GetFilerConfiguration:output_type -> filer_pb.GetFilerConfigurationResponse + 42, // 60: filer_pb.SeaweedFiler.SubscribeMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 42, // 61: filer_pb.SeaweedFiler.SubscribeLocalMetadata:output_type -> filer_pb.SubscribeMetadataResponse + 49, // 62: filer_pb.SeaweedFiler.KvGet:output_type -> filer_pb.KvGetResponse + 51, // 63: filer_pb.SeaweedFiler.KvPut:output_type -> filer_pb.KvPutResponse + 54, // 64: filer_pb.SeaweedFiler.CacheRemoteObjectToLocalCluster:output_type -> filer_pb.CacheRemoteObjectToLocalClusterResponse + 45, // [45:65] is the sub-list for method output_type + 25, // [25:45] is the sub-list for method input_type 25, // [25:25] is the sub-list for extension type_name 25, // [25:25] is the sub-list for extension extendee 0, // [0:25] is the sub-list for field type_name diff --git a/weed/pb/filer_pb/filer_grpc.pb.go b/weed/pb/filer_pb/filer_grpc.pb.go index 4a5f47d71..270e13e6f 100644 --- a/weed/pb/filer_pb/filer_grpc.pb.go +++ b/weed/pb/filer_pb/filer_grpc.pb.go @@ -35,8 +35,6 @@ type SeaweedFilerClient interface { GetFilerConfiguration(ctx context.Context, in *GetFilerConfigurationRequest, opts ...grpc.CallOption) (*GetFilerConfigurationResponse, error) SubscribeMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeMetadataClient, error) SubscribeLocalMetadata(ctx context.Context, in *SubscribeMetadataRequest, opts ...grpc.CallOption) (SeaweedFiler_SubscribeLocalMetadataClient, error) - KeepConnected(ctx context.Context, opts ...grpc.CallOption) (SeaweedFiler_KeepConnectedClient, error) - LocateBroker(ctx context.Context, in *LocateBrokerRequest, opts ...grpc.CallOption) (*LocateBrokerResponse, error) KvGet(ctx context.Context, in *KvGetRequest, opts ...grpc.CallOption) (*KvGetResponse, error) KvPut(ctx context.Context, in *KvPutRequest, opts ...grpc.CallOption) (*KvPutResponse, error) CacheRemoteObjectToLocalCluster(ctx context.Context, in *CacheRemoteObjectToLocalClusterRequest, opts ...grpc.CallOption) (*CacheRemoteObjectToLocalClusterResponse, error) @@ -295,46 +293,6 @@ func (x *seaweedFilerSubscribeLocalMetadataClient) Recv() (*SubscribeMetadataRes return m, nil } -func (c *seaweedFilerClient) KeepConnected(ctx context.Context, opts ...grpc.CallOption) (SeaweedFiler_KeepConnectedClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedFiler_ServiceDesc.Streams[4], "/filer_pb.SeaweedFiler/KeepConnected", opts...) - if err != nil { - return nil, err - } - x := &seaweedFilerKeepConnectedClient{stream} - return x, nil -} - -type SeaweedFiler_KeepConnectedClient interface { - Send(*KeepConnectedRequest) error - Recv() (*KeepConnectedResponse, error) - grpc.ClientStream -} - -type seaweedFilerKeepConnectedClient struct { - grpc.ClientStream -} - -func (x *seaweedFilerKeepConnectedClient) Send(m *KeepConnectedRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *seaweedFilerKeepConnectedClient) Recv() (*KeepConnectedResponse, error) { - m := new(KeepConnectedResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *seaweedFilerClient) LocateBroker(ctx context.Context, in *LocateBrokerRequest, opts ...grpc.CallOption) (*LocateBrokerResponse, error) { - out := new(LocateBrokerResponse) - err := c.cc.Invoke(ctx, "/filer_pb.SeaweedFiler/LocateBroker", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *seaweedFilerClient) KvGet(ctx context.Context, in *KvGetRequest, opts ...grpc.CallOption) (*KvGetResponse, error) { out := new(KvGetResponse) err := c.cc.Invoke(ctx, "/filer_pb.SeaweedFiler/KvGet", in, out, opts...) @@ -383,8 +341,6 @@ type SeaweedFilerServer interface { GetFilerConfiguration(context.Context, *GetFilerConfigurationRequest) (*GetFilerConfigurationResponse, error) SubscribeMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeMetadataServer) error SubscribeLocalMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeLocalMetadataServer) error - KeepConnected(SeaweedFiler_KeepConnectedServer) error - LocateBroker(context.Context, *LocateBrokerRequest) (*LocateBrokerResponse, error) KvGet(context.Context, *KvGetRequest) (*KvGetResponse, error) KvPut(context.Context, *KvPutRequest) (*KvPutResponse, error) CacheRemoteObjectToLocalCluster(context.Context, *CacheRemoteObjectToLocalClusterRequest) (*CacheRemoteObjectToLocalClusterResponse, error) @@ -446,12 +402,6 @@ func (UnimplementedSeaweedFilerServer) SubscribeMetadata(*SubscribeMetadataReque func (UnimplementedSeaweedFilerServer) SubscribeLocalMetadata(*SubscribeMetadataRequest, SeaweedFiler_SubscribeLocalMetadataServer) error { return status.Errorf(codes.Unimplemented, "method SubscribeLocalMetadata not implemented") } -func (UnimplementedSeaweedFilerServer) KeepConnected(SeaweedFiler_KeepConnectedServer) error { - return status.Errorf(codes.Unimplemented, "method KeepConnected not implemented") -} -func (UnimplementedSeaweedFilerServer) LocateBroker(context.Context, *LocateBrokerRequest) (*LocateBrokerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LocateBroker not implemented") -} func (UnimplementedSeaweedFilerServer) KvGet(context.Context, *KvGetRequest) (*KvGetResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method KvGet not implemented") } @@ -792,50 +742,6 @@ func (x *seaweedFilerSubscribeLocalMetadataServer) Send(m *SubscribeMetadataResp return x.ServerStream.SendMsg(m) } -func _SeaweedFiler_KeepConnected_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(SeaweedFilerServer).KeepConnected(&seaweedFilerKeepConnectedServer{stream}) -} - -type SeaweedFiler_KeepConnectedServer interface { - Send(*KeepConnectedResponse) error - Recv() (*KeepConnectedRequest, error) - grpc.ServerStream -} - -type seaweedFilerKeepConnectedServer struct { - grpc.ServerStream -} - -func (x *seaweedFilerKeepConnectedServer) Send(m *KeepConnectedResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *seaweedFilerKeepConnectedServer) Recv() (*KeepConnectedRequest, error) { - m := new(KeepConnectedRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _SeaweedFiler_LocateBroker_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LocateBrokerRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SeaweedFilerServer).LocateBroker(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/filer_pb.SeaweedFiler/LocateBroker", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SeaweedFilerServer).LocateBroker(ctx, req.(*LocateBrokerRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _SeaweedFiler_KvGet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(KvGetRequest) if err := dec(in); err != nil { @@ -949,10 +855,6 @@ var SeaweedFiler_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFilerConfiguration", Handler: _SeaweedFiler_GetFilerConfiguration_Handler, }, - { - MethodName: "LocateBroker", - Handler: _SeaweedFiler_LocateBroker_Handler, - }, { MethodName: "KvGet", Handler: _SeaweedFiler_KvGet_Handler, @@ -987,12 +889,6 @@ var SeaweedFiler_ServiceDesc = grpc.ServiceDesc{ Handler: _SeaweedFiler_SubscribeLocalMetadata_Handler, ServerStreams: true, }, - { - StreamName: "KeepConnected", - Handler: _SeaweedFiler_KeepConnected_Handler, - ServerStreams: true, - ClientStreams: true, - }, }, Metadata: "filer.proto", } diff --git a/weed/pb/mq.proto b/weed/pb/mq.proto index abe538485..44291c173 100644 --- a/weed/pb/mq.proto +++ b/weed/pb/mq.proto @@ -10,21 +10,6 @@ option java_outer_classname = "MessagQueueProto"; service SeaweedMessaging { - rpc Subscribe (stream SubscriberMessage) returns (stream BrokerMessage) { - } - - rpc Publish (stream PublishRequest) returns (stream PublishResponse) { - } - - rpc DeleteTopic (DeleteTopicRequest) returns (DeleteTopicResponse) { - } - - rpc ConfigureTopic (ConfigureTopicRequest) returns (ConfigureTopicResponse) { - } - - rpc GetTopicConfiguration (GetTopicConfigurationRequest) returns (GetTopicConfigurationResponse) { - } - rpc FindBroker (FindBrokerRequest) returns (FindBrokerResponse) { } @@ -32,85 +17,6 @@ service SeaweedMessaging { ////////////////////////////////////////////////// -message SubscriberMessage { - message InitMessage { - string namespace = 1; - string topic = 2; - int32 partition = 3; - enum StartPosition { - LATEST = 0; // Start at the newest message - EARLIEST = 1; // Start at the oldest message - TIMESTAMP = 2; // Start after a specified timestamp, exclusive - } - StartPosition startPosition = 4; // Where to begin consuming from - int64 timestampNs = 5; // timestamp in nano seconds - string subscriber_id = 6; // uniquely identify a subscriber to track consumption - } - InitMessage init = 1; - message AckMessage { - int64 message_id = 1; - } - AckMessage ack = 2; - bool is_close = 3; -} - -message Message { - int64 event_time_ns = 1 [jstype = JS_STRING]; - bytes key = 2; // Message key - bytes value = 3; // Message payload - map headers = 4; // Message headers - bool is_close = 5; -} - -message BrokerMessage { - Message data = 1; -} - -message PublishRequest { - message InitMessage { - string namespace = 1; // only needed on the initial request - string topic = 2; // only needed on the initial request - int32 partition = 3; - } - InitMessage init = 1; - Message data = 2; -} - -message PublishResponse { - message ConfigMessage { - int32 partition_count = 1; - } - ConfigMessage config = 1; - message RedirectMessage { - string new_broker = 1; - } - RedirectMessage redirect = 2; - bool is_closed = 3; -} - -message DeleteTopicRequest { - string namespace = 1; - string topic = 2; -} -message DeleteTopicResponse { -} - -message ConfigureTopicRequest { - string namespace = 1; - string topic = 2; - TopicConfiguration configuration = 3; -} -message ConfigureTopicResponse { -} - -message GetTopicConfigurationRequest { - string namespace = 1; - string topic = 2; -} -message GetTopicConfigurationResponse { - TopicConfiguration configuration = 1; -} - message FindBrokerRequest { string namespace = 1; string topic = 2; @@ -120,16 +26,3 @@ message FindBrokerRequest { message FindBrokerResponse { string broker = 1; } - -message TopicConfiguration { - int32 partition_count = 1; - string collection = 2; - string replication = 3; - bool is_transient = 4; - enum Partitioning { - NonNullKeyHash = 0; // If not null, hash by key value. If null, round robin - KeyHash = 1; // hash by key value - RoundRobin = 2; // round robin pick one partition - } - Partitioning partitoning = 5; -} diff --git a/weed/pb/mq_pb/mq.pb.go b/weed/pb/mq_pb/mq.pb.go index a47ce128d..dac27c959 100644 --- a/weed/pb/mq_pb/mq.pb.go +++ b/weed/pb/mq_pb/mq.pb.go @@ -20,1057 +20,33 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type SubscriberMessage_InitMessage_StartPosition int32 - -const ( - SubscriberMessage_InitMessage_LATEST SubscriberMessage_InitMessage_StartPosition = 0 // Start at the newest message - SubscriberMessage_InitMessage_EARLIEST SubscriberMessage_InitMessage_StartPosition = 1 // Start at the oldest message - SubscriberMessage_InitMessage_TIMESTAMP SubscriberMessage_InitMessage_StartPosition = 2 // Start after a specified timestamp, exclusive -) - -// Enum value maps for SubscriberMessage_InitMessage_StartPosition. -var ( - SubscriberMessage_InitMessage_StartPosition_name = map[int32]string{ - 0: "LATEST", - 1: "EARLIEST", - 2: "TIMESTAMP", - } - SubscriberMessage_InitMessage_StartPosition_value = map[string]int32{ - "LATEST": 0, - "EARLIEST": 1, - "TIMESTAMP": 2, - } -) - -func (x SubscriberMessage_InitMessage_StartPosition) Enum() *SubscriberMessage_InitMessage_StartPosition { - p := new(SubscriberMessage_InitMessage_StartPosition) - *p = x - return p -} - -func (x SubscriberMessage_InitMessage_StartPosition) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SubscriberMessage_InitMessage_StartPosition) Descriptor() protoreflect.EnumDescriptor { - return file_mq_proto_enumTypes[0].Descriptor() -} - -func (SubscriberMessage_InitMessage_StartPosition) Type() protoreflect.EnumType { - return &file_mq_proto_enumTypes[0] -} - -func (x SubscriberMessage_InitMessage_StartPosition) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SubscriberMessage_InitMessage_StartPosition.Descriptor instead. -func (SubscriberMessage_InitMessage_StartPosition) EnumDescriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{0, 0, 0} -} - -type TopicConfiguration_Partitioning int32 - -const ( - TopicConfiguration_NonNullKeyHash TopicConfiguration_Partitioning = 0 // If not null, hash by key value. If null, round robin - TopicConfiguration_KeyHash TopicConfiguration_Partitioning = 1 // hash by key value - TopicConfiguration_RoundRobin TopicConfiguration_Partitioning = 2 // round robin pick one partition -) - -// Enum value maps for TopicConfiguration_Partitioning. -var ( - TopicConfiguration_Partitioning_name = map[int32]string{ - 0: "NonNullKeyHash", - 1: "KeyHash", - 2: "RoundRobin", - } - TopicConfiguration_Partitioning_value = map[string]int32{ - "NonNullKeyHash": 0, - "KeyHash": 1, - "RoundRobin": 2, - } -) - -func (x TopicConfiguration_Partitioning) Enum() *TopicConfiguration_Partitioning { - p := new(TopicConfiguration_Partitioning) - *p = x - return p -} - -func (x TopicConfiguration_Partitioning) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (TopicConfiguration_Partitioning) Descriptor() protoreflect.EnumDescriptor { - return file_mq_proto_enumTypes[1].Descriptor() -} - -func (TopicConfiguration_Partitioning) Type() protoreflect.EnumType { - return &file_mq_proto_enumTypes[1] -} - -func (x TopicConfiguration_Partitioning) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use TopicConfiguration_Partitioning.Descriptor instead. -func (TopicConfiguration_Partitioning) EnumDescriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{13, 0} -} - -type SubscriberMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Init *SubscriberMessage_InitMessage `protobuf:"bytes,1,opt,name=init,proto3" json:"init,omitempty"` - Ack *SubscriberMessage_AckMessage `protobuf:"bytes,2,opt,name=ack,proto3" json:"ack,omitempty"` - IsClose bool `protobuf:"varint,3,opt,name=is_close,json=isClose,proto3" json:"is_close,omitempty"` -} - -func (x *SubscriberMessage) Reset() { - *x = SubscriberMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubscriberMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubscriberMessage) ProtoMessage() {} - -func (x *SubscriberMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[0] - 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 SubscriberMessage.ProtoReflect.Descriptor instead. -func (*SubscriberMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{0} -} - -func (x *SubscriberMessage) GetInit() *SubscriberMessage_InitMessage { - if x != nil { - return x.Init - } - return nil -} - -func (x *SubscriberMessage) GetAck() *SubscriberMessage_AckMessage { - if x != nil { - return x.Ack - } - return nil -} - -func (x *SubscriberMessage) GetIsClose() bool { - if x != nil { - return x.IsClose - } - return false -} - -type Message struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EventTimeNs int64 `protobuf:"varint,1,opt,name=event_time_ns,json=eventTimeNs,proto3" json:"event_time_ns,omitempty"` - Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // Message key - Value []byte `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Message payload - Headers map[string][]byte `protobuf:"bytes,4,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Message headers - IsClose bool `protobuf:"varint,5,opt,name=is_close,json=isClose,proto3" json:"is_close,omitempty"` -} - -func (x *Message) Reset() { - *x = Message{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Message) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Message) ProtoMessage() {} - -func (x *Message) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[1] - 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 Message.ProtoReflect.Descriptor instead. -func (*Message) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{1} -} - -func (x *Message) GetEventTimeNs() int64 { - if x != nil { - return x.EventTimeNs - } - return 0 -} - -func (x *Message) GetKey() []byte { - if x != nil { - return x.Key - } - return nil -} - -func (x *Message) GetValue() []byte { - if x != nil { - return x.Value - } - return nil -} - -func (x *Message) GetHeaders() map[string][]byte { - if x != nil { - return x.Headers - } - return nil -} - -func (x *Message) GetIsClose() bool { - if x != nil { - return x.IsClose - } - return false -} - -type BrokerMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data *Message `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *BrokerMessage) Reset() { - *x = BrokerMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BrokerMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BrokerMessage) ProtoMessage() {} - -func (x *BrokerMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[2] - 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 BrokerMessage.ProtoReflect.Descriptor instead. -func (*BrokerMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{2} -} - -func (x *BrokerMessage) GetData() *Message { - if x != nil { - return x.Data - } - return nil -} - -type PublishRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Init *PublishRequest_InitMessage `protobuf:"bytes,1,opt,name=init,proto3" json:"init,omitempty"` - Data *Message `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *PublishRequest) Reset() { - *x = PublishRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublishRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublishRequest) ProtoMessage() {} - -func (x *PublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[3] - 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 PublishRequest.ProtoReflect.Descriptor instead. -func (*PublishRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{3} -} - -func (x *PublishRequest) GetInit() *PublishRequest_InitMessage { - if x != nil { - return x.Init - } - return nil -} - -func (x *PublishRequest) GetData() *Message { - if x != nil { - return x.Data - } - return nil -} - -type PublishResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Config *PublishResponse_ConfigMessage `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` - Redirect *PublishResponse_RedirectMessage `protobuf:"bytes,2,opt,name=redirect,proto3" json:"redirect,omitempty"` - IsClosed bool `protobuf:"varint,3,opt,name=is_closed,json=isClosed,proto3" json:"is_closed,omitempty"` -} - -func (x *PublishResponse) Reset() { - *x = PublishResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublishResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublishResponse) ProtoMessage() {} - -func (x *PublishResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[4] - 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 PublishResponse.ProtoReflect.Descriptor instead. -func (*PublishResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{4} -} - -func (x *PublishResponse) GetConfig() *PublishResponse_ConfigMessage { - if x != nil { - return x.Config - } - return nil -} - -func (x *PublishResponse) GetRedirect() *PublishResponse_RedirectMessage { - if x != nil { - return x.Redirect - } - return nil -} - -func (x *PublishResponse) GetIsClosed() bool { - if x != nil { - return x.IsClosed - } - return false -} - -type DeleteTopicRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` -} - -func (x *DeleteTopicRequest) Reset() { - *x = DeleteTopicRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteTopicRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteTopicRequest) ProtoMessage() {} - -func (x *DeleteTopicRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[5] - 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 DeleteTopicRequest.ProtoReflect.Descriptor instead. -func (*DeleteTopicRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{5} -} - -func (x *DeleteTopicRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *DeleteTopicRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -type DeleteTopicResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *DeleteTopicResponse) Reset() { - *x = DeleteTopicResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteTopicResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteTopicResponse) ProtoMessage() {} - -func (x *DeleteTopicResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[6] - 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 DeleteTopicResponse.ProtoReflect.Descriptor instead. -func (*DeleteTopicResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{6} -} - -type ConfigureTopicRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` - Configuration *TopicConfiguration `protobuf:"bytes,3,opt,name=configuration,proto3" json:"configuration,omitempty"` -} - -func (x *ConfigureTopicRequest) Reset() { - *x = ConfigureTopicRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ConfigureTopicRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ConfigureTopicRequest) ProtoMessage() {} - -func (x *ConfigureTopicRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[7] - 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 ConfigureTopicRequest.ProtoReflect.Descriptor instead. -func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{7} -} - -func (x *ConfigureTopicRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *ConfigureTopicRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -func (x *ConfigureTopicRequest) GetConfiguration() *TopicConfiguration { - if x != nil { - return x.Configuration - } - return nil -} - -type ConfigureTopicResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *ConfigureTopicResponse) Reset() { - *x = ConfigureTopicResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ConfigureTopicResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ConfigureTopicResponse) ProtoMessage() {} - -func (x *ConfigureTopicResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_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 ConfigureTopicResponse.ProtoReflect.Descriptor instead. -func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{8} -} - -type GetTopicConfigurationRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` -} - -func (x *GetTopicConfigurationRequest) Reset() { - *x = GetTopicConfigurationRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetTopicConfigurationRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTopicConfigurationRequest) ProtoMessage() {} - -func (x *GetTopicConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_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 GetTopicConfigurationRequest.ProtoReflect.Descriptor instead. -func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{9} -} - -func (x *GetTopicConfigurationRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *GetTopicConfigurationRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -type GetTopicConfigurationResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Configuration *TopicConfiguration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` -} - -func (x *GetTopicConfigurationResponse) Reset() { - *x = GetTopicConfigurationResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetTopicConfigurationResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetTopicConfigurationResponse) ProtoMessage() {} - -func (x *GetTopicConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[10] - 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 GetTopicConfigurationResponse.ProtoReflect.Descriptor instead. -func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{10} -} - -func (x *GetTopicConfigurationResponse) GetConfiguration() *TopicConfiguration { - if x != nil { - return x.Configuration - } - return nil -} - -type FindBrokerRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` - Parition int32 `protobuf:"varint,3,opt,name=parition,proto3" json:"parition,omitempty"` -} - -func (x *FindBrokerRequest) Reset() { - *x = FindBrokerRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FindBrokerRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FindBrokerRequest) ProtoMessage() {} - -func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[11] - 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 FindBrokerRequest.ProtoReflect.Descriptor instead. -func (*FindBrokerRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{11} -} - -func (x *FindBrokerRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *FindBrokerRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -func (x *FindBrokerRequest) GetParition() int32 { - if x != nil { - return x.Parition - } - return 0 -} - -type FindBrokerResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Broker string `protobuf:"bytes,1,opt,name=broker,proto3" json:"broker,omitempty"` -} - -func (x *FindBrokerResponse) Reset() { - *x = FindBrokerResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FindBrokerResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FindBrokerResponse) ProtoMessage() {} - -func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[12] - 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 FindBrokerResponse.ProtoReflect.Descriptor instead. -func (*FindBrokerResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{12} -} - -func (x *FindBrokerResponse) GetBroker() string { - if x != nil { - return x.Broker - } - return "" -} - -type TopicConfiguration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount,proto3" json:"partition_count,omitempty"` - Collection string `protobuf:"bytes,2,opt,name=collection,proto3" json:"collection,omitempty"` - Replication string `protobuf:"bytes,3,opt,name=replication,proto3" json:"replication,omitempty"` - IsTransient bool `protobuf:"varint,4,opt,name=is_transient,json=isTransient,proto3" json:"is_transient,omitempty"` - Partitoning TopicConfiguration_Partitioning `protobuf:"varint,5,opt,name=partitoning,proto3,enum=messaging_pb.TopicConfiguration_Partitioning" json:"partitoning,omitempty"` -} - -func (x *TopicConfiguration) Reset() { - *x = TopicConfiguration{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TopicConfiguration) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TopicConfiguration) ProtoMessage() {} - -func (x *TopicConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[13] - 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 TopicConfiguration.ProtoReflect.Descriptor instead. -func (*TopicConfiguration) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{13} -} - -func (x *TopicConfiguration) GetPartitionCount() int32 { - if x != nil { - return x.PartitionCount - } - return 0 -} - -func (x *TopicConfiguration) GetCollection() string { - if x != nil { - return x.Collection - } - return "" -} - -func (x *TopicConfiguration) GetReplication() string { - if x != nil { - return x.Replication - } - return "" -} - -func (x *TopicConfiguration) GetIsTransient() bool { - if x != nil { - return x.IsTransient - } - return false -} - -func (x *TopicConfiguration) GetPartitoning() TopicConfiguration_Partitioning { - if x != nil { - return x.Partitoning - } - return TopicConfiguration_NonNullKeyHash -} - -type SubscriberMessage_InitMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` - Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` - StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,proto3,enum=messaging_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` // Where to begin consuming from - TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs,proto3" json:"timestampNs,omitempty"` // timestamp in nano seconds - SubscriberId string `protobuf:"bytes,6,opt,name=subscriber_id,json=subscriberId,proto3" json:"subscriber_id,omitempty"` // uniquely identify a subscriber to track consumption -} - -func (x *SubscriberMessage_InitMessage) Reset() { - *x = SubscriberMessage_InitMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubscriberMessage_InitMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubscriberMessage_InitMessage) ProtoMessage() {} - -func (x *SubscriberMessage_InitMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[14] - 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 SubscriberMessage_InitMessage.ProtoReflect.Descriptor instead. -func (*SubscriberMessage_InitMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *SubscriberMessage_InitMessage) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *SubscriberMessage_InitMessage) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -func (x *SubscriberMessage_InitMessage) GetPartition() int32 { - if x != nil { - return x.Partition - } - return 0 -} - -func (x *SubscriberMessage_InitMessage) GetStartPosition() SubscriberMessage_InitMessage_StartPosition { - if x != nil { - return x.StartPosition - } - return SubscriberMessage_InitMessage_LATEST -} - -func (x *SubscriberMessage_InitMessage) GetTimestampNs() int64 { - if x != nil { - return x.TimestampNs - } - return 0 -} - -func (x *SubscriberMessage_InitMessage) GetSubscriberId() string { - if x != nil { - return x.SubscriberId - } - return "" -} - -type SubscriberMessage_AckMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MessageId int64 `protobuf:"varint,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` -} - -func (x *SubscriberMessage_AckMessage) Reset() { - *x = SubscriberMessage_AckMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubscriberMessage_AckMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubscriberMessage_AckMessage) ProtoMessage() {} - -func (x *SubscriberMessage_AckMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[15] - 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 SubscriberMessage_AckMessage.ProtoReflect.Descriptor instead. -func (*SubscriberMessage_AckMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{0, 1} -} - -func (x *SubscriberMessage_AckMessage) GetMessageId() int64 { - if x != nil { - return x.MessageId - } - return 0 -} - -type PublishRequest_InitMessage struct { +type FindBrokerRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` // only needed on the initial request - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` // only needed on the initial request - Partition int32 `protobuf:"varint,3,opt,name=partition,proto3" json:"partition,omitempty"` + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` + Parition int32 `protobuf:"varint,3,opt,name=parition,proto3" json:"parition,omitempty"` } -func (x *PublishRequest_InitMessage) Reset() { - *x = PublishRequest_InitMessage{} +func (x *FindBrokerRequest) Reset() { + *x = FindBrokerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[17] + mi := &file_mq_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PublishRequest_InitMessage) String() string { +func (x *FindBrokerRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PublishRequest_InitMessage) ProtoMessage() {} +func (*FindBrokerRequest) ProtoMessage() {} -func (x *PublishRequest_InitMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[17] +func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1081,104 +57,57 @@ func (x *PublishRequest_InitMessage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PublishRequest_InitMessage.ProtoReflect.Descriptor instead. -func (*PublishRequest_InitMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{3, 0} +// Deprecated: Use FindBrokerRequest.ProtoReflect.Descriptor instead. +func (*FindBrokerRequest) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{0} } -func (x *PublishRequest_InitMessage) GetNamespace() string { +func (x *FindBrokerRequest) GetNamespace() string { if x != nil { return x.Namespace } return "" } -func (x *PublishRequest_InitMessage) GetTopic() string { +func (x *FindBrokerRequest) GetTopic() string { if x != nil { return x.Topic } return "" } -func (x *PublishRequest_InitMessage) GetPartition() int32 { - if x != nil { - return x.Partition - } - return 0 -} - -type PublishResponse_ConfigMessage struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount,proto3" json:"partition_count,omitempty"` -} - -func (x *PublishResponse_ConfigMessage) Reset() { - *x = PublishResponse_ConfigMessage{} - if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PublishResponse_ConfigMessage) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PublishResponse_ConfigMessage) ProtoMessage() {} - -func (x *PublishResponse_ConfigMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[18] - 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 PublishResponse_ConfigMessage.ProtoReflect.Descriptor instead. -func (*PublishResponse_ConfigMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{4, 0} -} - -func (x *PublishResponse_ConfigMessage) GetPartitionCount() int32 { +func (x *FindBrokerRequest) GetParition() int32 { if x != nil { - return x.PartitionCount + return x.Parition } return 0 } -type PublishResponse_RedirectMessage struct { +type FindBrokerResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NewBroker string `protobuf:"bytes,1,opt,name=new_broker,json=newBroker,proto3" json:"new_broker,omitempty"` + Broker string `protobuf:"bytes,1,opt,name=broker,proto3" json:"broker,omitempty"` } -func (x *PublishResponse_RedirectMessage) Reset() { - *x = PublishResponse_RedirectMessage{} +func (x *FindBrokerResponse) Reset() { + *x = FindBrokerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[19] + mi := &file_mq_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *PublishResponse_RedirectMessage) String() string { +func (x *FindBrokerResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*PublishResponse_RedirectMessage) ProtoMessage() {} +func (*FindBrokerResponse) ProtoMessage() {} -func (x *PublishResponse_RedirectMessage) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[19] +func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,14 +118,14 @@ func (x *PublishResponse_RedirectMessage) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use PublishResponse_RedirectMessage.ProtoReflect.Descriptor instead. -func (*PublishResponse_RedirectMessage) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{4, 1} +// Deprecated: Use FindBrokerResponse.ProtoReflect.Descriptor instead. +func (*FindBrokerResponse) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{1} } -func (x *PublishResponse_RedirectMessage) GetNewBroker() string { +func (x *FindBrokerResponse) GetBroker() string { if x != nil { - return x.NewBroker + return x.Broker } return "" } @@ -1205,190 +134,28 @@ var File_mq_proto protoreflect.FileDescriptor var file_mq_proto_rawDesc = []byte{ 0x0a, 0x08, 0x6d, 0x71, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x9e, 0x04, 0x0a, 0x11, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, - 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x49, 0x6e, - 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, - 0x3c, 0x0a, 0x03, 0x61, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x41, 0x63, - 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x03, 0x61, 0x63, 0x6b, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0xc1, 0x02, 0x0a, 0x0b, 0x49, 0x6e, 0x69, - 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x0d, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x39, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, - 0x49, 0x64, 0x22, 0x38, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x41, 0x54, 0x45, 0x53, 0x54, 0x10, 0x00, 0x12, - 0x0c, 0x0a, 0x08, 0x45, 0x41, 0x52, 0x4c, 0x49, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x02, 0x1a, 0x2b, 0x0a, 0x0a, - 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0xee, 0x01, 0x0a, 0x07, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x30, 0x01, - 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x1a, 0x3a, - 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x42, 0x72, - 0x6f, 0x6b, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xda, 0x01, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x04, 0x69, 0x6e, 0x69, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x1a, 0x5f, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0xaa, 0x02, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x08, - 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x72, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x1a, 0x38, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x30, - 0x0a, 0x0f, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x22, 0x48, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x93, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, - 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x18, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x52, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x67, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, - 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, 0x12, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x22, 0xb4, 0x02, 0x0a, 0x12, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x6f, 0x70, 0x69, 0x63, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x3f, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x6f, 0x6e, 0x4e, 0x75, - 0x6c, 0x6c, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4b, - 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x10, 0x02, 0x32, 0xad, 0x04, 0x0a, 0x10, 0x53, 0x65, 0x61, - 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x4f, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x1b, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x4c, - 0x0a, 0x07, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x54, 0x0a, 0x0b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x20, 0x2e, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, - 0x6f, 0x70, 0x69, 0x63, 0x12, 0x23, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x72, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, - 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, - 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, - 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, - 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, - 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x63, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, + 0x12, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x32, 0x65, 0x0a, 0x10, 0x53, + 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, + 0x51, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x2e, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, + 0x6d, 0x71, 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1403,62 +170,19 @@ func file_mq_proto_rawDescGZIP() []byte { return file_mq_proto_rawDescData } -var file_mq_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 20) +var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_mq_proto_goTypes = []interface{}{ - (SubscriberMessage_InitMessage_StartPosition)(0), // 0: messaging_pb.SubscriberMessage.InitMessage.StartPosition - (TopicConfiguration_Partitioning)(0), // 1: messaging_pb.TopicConfiguration.Partitioning - (*SubscriberMessage)(nil), // 2: messaging_pb.SubscriberMessage - (*Message)(nil), // 3: messaging_pb.Message - (*BrokerMessage)(nil), // 4: messaging_pb.BrokerMessage - (*PublishRequest)(nil), // 5: messaging_pb.PublishRequest - (*PublishResponse)(nil), // 6: messaging_pb.PublishResponse - (*DeleteTopicRequest)(nil), // 7: messaging_pb.DeleteTopicRequest - (*DeleteTopicResponse)(nil), // 8: messaging_pb.DeleteTopicResponse - (*ConfigureTopicRequest)(nil), // 9: messaging_pb.ConfigureTopicRequest - (*ConfigureTopicResponse)(nil), // 10: messaging_pb.ConfigureTopicResponse - (*GetTopicConfigurationRequest)(nil), // 11: messaging_pb.GetTopicConfigurationRequest - (*GetTopicConfigurationResponse)(nil), // 12: messaging_pb.GetTopicConfigurationResponse - (*FindBrokerRequest)(nil), // 13: messaging_pb.FindBrokerRequest - (*FindBrokerResponse)(nil), // 14: messaging_pb.FindBrokerResponse - (*TopicConfiguration)(nil), // 15: messaging_pb.TopicConfiguration - (*SubscriberMessage_InitMessage)(nil), // 16: messaging_pb.SubscriberMessage.InitMessage - (*SubscriberMessage_AckMessage)(nil), // 17: messaging_pb.SubscriberMessage.AckMessage - nil, // 18: messaging_pb.Message.HeadersEntry - (*PublishRequest_InitMessage)(nil), // 19: messaging_pb.PublishRequest.InitMessage - (*PublishResponse_ConfigMessage)(nil), // 20: messaging_pb.PublishResponse.ConfigMessage - (*PublishResponse_RedirectMessage)(nil), // 21: messaging_pb.PublishResponse.RedirectMessage + (*FindBrokerRequest)(nil), // 0: messaging_pb.FindBrokerRequest + (*FindBrokerResponse)(nil), // 1: messaging_pb.FindBrokerResponse } var file_mq_proto_depIdxs = []int32{ - 16, // 0: messaging_pb.SubscriberMessage.init:type_name -> messaging_pb.SubscriberMessage.InitMessage - 17, // 1: messaging_pb.SubscriberMessage.ack:type_name -> messaging_pb.SubscriberMessage.AckMessage - 18, // 2: messaging_pb.Message.headers:type_name -> messaging_pb.Message.HeadersEntry - 3, // 3: messaging_pb.BrokerMessage.data:type_name -> messaging_pb.Message - 19, // 4: messaging_pb.PublishRequest.init:type_name -> messaging_pb.PublishRequest.InitMessage - 3, // 5: messaging_pb.PublishRequest.data:type_name -> messaging_pb.Message - 20, // 6: messaging_pb.PublishResponse.config:type_name -> messaging_pb.PublishResponse.ConfigMessage - 21, // 7: messaging_pb.PublishResponse.redirect:type_name -> messaging_pb.PublishResponse.RedirectMessage - 15, // 8: messaging_pb.ConfigureTopicRequest.configuration:type_name -> messaging_pb.TopicConfiguration - 15, // 9: messaging_pb.GetTopicConfigurationResponse.configuration:type_name -> messaging_pb.TopicConfiguration - 1, // 10: messaging_pb.TopicConfiguration.partitoning:type_name -> messaging_pb.TopicConfiguration.Partitioning - 0, // 11: messaging_pb.SubscriberMessage.InitMessage.startPosition:type_name -> messaging_pb.SubscriberMessage.InitMessage.StartPosition - 2, // 12: messaging_pb.SeaweedMessaging.Subscribe:input_type -> messaging_pb.SubscriberMessage - 5, // 13: messaging_pb.SeaweedMessaging.Publish:input_type -> messaging_pb.PublishRequest - 7, // 14: messaging_pb.SeaweedMessaging.DeleteTopic:input_type -> messaging_pb.DeleteTopicRequest - 9, // 15: messaging_pb.SeaweedMessaging.ConfigureTopic:input_type -> messaging_pb.ConfigureTopicRequest - 11, // 16: messaging_pb.SeaweedMessaging.GetTopicConfiguration:input_type -> messaging_pb.GetTopicConfigurationRequest - 13, // 17: messaging_pb.SeaweedMessaging.FindBroker:input_type -> messaging_pb.FindBrokerRequest - 4, // 18: messaging_pb.SeaweedMessaging.Subscribe:output_type -> messaging_pb.BrokerMessage - 6, // 19: messaging_pb.SeaweedMessaging.Publish:output_type -> messaging_pb.PublishResponse - 8, // 20: messaging_pb.SeaweedMessaging.DeleteTopic:output_type -> messaging_pb.DeleteTopicResponse - 10, // 21: messaging_pb.SeaweedMessaging.ConfigureTopic:output_type -> messaging_pb.ConfigureTopicResponse - 12, // 22: messaging_pb.SeaweedMessaging.GetTopicConfiguration:output_type -> messaging_pb.GetTopicConfigurationResponse - 14, // 23: messaging_pb.SeaweedMessaging.FindBroker:output_type -> messaging_pb.FindBrokerResponse - 18, // [18:24] is the sub-list for method output_type - 12, // [12:18] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 0, // 0: messaging_pb.SeaweedMessaging.FindBroker:input_type -> messaging_pb.FindBrokerRequest + 1, // 1: messaging_pb.SeaweedMessaging.FindBroker:output_type -> messaging_pb.FindBrokerResponse + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name } func init() { file_mq_proto_init() } @@ -1468,138 +192,6 @@ func file_mq_proto_init() { } if !protoimpl.UnsafeEnabled { file_mq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriberMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Message); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BrokerMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublishRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublishResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTopicRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteTopicResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureTopicRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureTopicResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTopicConfigurationRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTopicConfigurationResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindBrokerRequest); i { case 0: return &v.state @@ -1611,7 +203,7 @@ func file_mq_proto_init() { return nil } } - file_mq_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_mq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindBrokerResponse); i { case 0: return &v.state @@ -1623,92 +215,19 @@ func file_mq_proto_init() { return nil } } - file_mq_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopicConfiguration); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriberMessage_InitMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriberMessage_AckMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublishRequest_InitMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublishResponse_ConfigMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_mq_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PublishResponse_RedirectMessage); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mq_proto_rawDesc, - NumEnums: 2, - NumMessages: 20, + NumEnums: 0, + NumMessages: 2, NumExtensions: 0, NumServices: 1, }, GoTypes: file_mq_proto_goTypes, DependencyIndexes: file_mq_proto_depIdxs, - EnumInfos: file_mq_proto_enumTypes, MessageInfos: file_mq_proto_msgTypes, }.Build() File_mq_proto = out.File diff --git a/weed/pb/mq_pb/mq_grpc.pb.go b/weed/pb/mq_pb/mq_grpc.pb.go index 3c986fc78..60258e23d 100644 --- a/weed/pb/mq_pb/mq_grpc.pb.go +++ b/weed/pb/mq_pb/mq_grpc.pb.go @@ -18,11 +18,6 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SeaweedMessagingClient interface { - Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) - Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) - DeleteTopic(ctx context.Context, in *DeleteTopicRequest, opts ...grpc.CallOption) (*DeleteTopicResponse, error) - ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) - GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) } @@ -34,95 +29,6 @@ func NewSeaweedMessagingClient(cc grpc.ClientConnInterface) SeaweedMessagingClie return &seaweedMessagingClient{cc} } -func (c *seaweedMessagingClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[0], "/messaging_pb.SeaweedMessaging/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &seaweedMessagingSubscribeClient{stream} - return x, nil -} - -type SeaweedMessaging_SubscribeClient interface { - Send(*SubscriberMessage) error - Recv() (*BrokerMessage, error) - grpc.ClientStream -} - -type seaweedMessagingSubscribeClient struct { - grpc.ClientStream -} - -func (x *seaweedMessagingSubscribeClient) Send(m *SubscriberMessage) error { - return x.ClientStream.SendMsg(m) -} - -func (x *seaweedMessagingSubscribeClient) Recv() (*BrokerMessage, error) { - m := new(BrokerMessage) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *seaweedMessagingClient) Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) { - stream, err := c.cc.NewStream(ctx, &SeaweedMessaging_ServiceDesc.Streams[1], "/messaging_pb.SeaweedMessaging/Publish", opts...) - if err != nil { - return nil, err - } - x := &seaweedMessagingPublishClient{stream} - return x, nil -} - -type SeaweedMessaging_PublishClient interface { - Send(*PublishRequest) error - Recv() (*PublishResponse, error) - grpc.ClientStream -} - -type seaweedMessagingPublishClient struct { - grpc.ClientStream -} - -func (x *seaweedMessagingPublishClient) Send(m *PublishRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *seaweedMessagingPublishClient) Recv() (*PublishResponse, error) { - m := new(PublishResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *seaweedMessagingClient) DeleteTopic(ctx context.Context, in *DeleteTopicRequest, opts ...grpc.CallOption) (*DeleteTopicResponse, error) { - out := new(DeleteTopicResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/DeleteTopic", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *seaweedMessagingClient) ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) { - out := new(ConfigureTopicResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/ConfigureTopic", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) { - out := new(GetTopicConfigurationResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) { out := new(FindBrokerResponse) err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/FindBroker", in, out, opts...) @@ -136,11 +42,6 @@ func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerR // All implementations must embed UnimplementedSeaweedMessagingServer // for forward compatibility type SeaweedMessagingServer interface { - Subscribe(SeaweedMessaging_SubscribeServer) error - Publish(SeaweedMessaging_PublishServer) error - DeleteTopic(context.Context, *DeleteTopicRequest) (*DeleteTopicResponse, error) - ConfigureTopic(context.Context, *ConfigureTopicRequest) (*ConfigureTopicResponse, error) - GetTopicConfiguration(context.Context, *GetTopicConfigurationRequest) (*GetTopicConfigurationResponse, error) FindBroker(context.Context, *FindBrokerRequest) (*FindBrokerResponse, error) mustEmbedUnimplementedSeaweedMessagingServer() } @@ -149,21 +50,6 @@ type SeaweedMessagingServer interface { type UnimplementedSeaweedMessagingServer struct { } -func (UnimplementedSeaweedMessagingServer) Subscribe(SeaweedMessaging_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} -func (UnimplementedSeaweedMessagingServer) Publish(SeaweedMessaging_PublishServer) error { - return status.Errorf(codes.Unimplemented, "method Publish not implemented") -} -func (UnimplementedSeaweedMessagingServer) DeleteTopic(context.Context, *DeleteTopicRequest) (*DeleteTopicResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteTopic not implemented") -} -func (UnimplementedSeaweedMessagingServer) ConfigureTopic(context.Context, *ConfigureTopicRequest) (*ConfigureTopicResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ConfigureTopic not implemented") -} -func (UnimplementedSeaweedMessagingServer) GetTopicConfiguration(context.Context, *GetTopicConfigurationRequest) (*GetTopicConfigurationResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTopicConfiguration not implemented") -} func (UnimplementedSeaweedMessagingServer) FindBroker(context.Context, *FindBrokerRequest) (*FindBrokerResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FindBroker not implemented") } @@ -180,112 +66,6 @@ func RegisterSeaweedMessagingServer(s grpc.ServiceRegistrar, srv SeaweedMessagin s.RegisterService(&SeaweedMessaging_ServiceDesc, srv) } -func _SeaweedMessaging_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(SeaweedMessagingServer).Subscribe(&seaweedMessagingSubscribeServer{stream}) -} - -type SeaweedMessaging_SubscribeServer interface { - Send(*BrokerMessage) error - Recv() (*SubscriberMessage, error) - grpc.ServerStream -} - -type seaweedMessagingSubscribeServer struct { - grpc.ServerStream -} - -func (x *seaweedMessagingSubscribeServer) Send(m *BrokerMessage) error { - return x.ServerStream.SendMsg(m) -} - -func (x *seaweedMessagingSubscribeServer) Recv() (*SubscriberMessage, error) { - m := new(SubscriberMessage) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _SeaweedMessaging_Publish_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(SeaweedMessagingServer).Publish(&seaweedMessagingPublishServer{stream}) -} - -type SeaweedMessaging_PublishServer interface { - Send(*PublishResponse) error - Recv() (*PublishRequest, error) - grpc.ServerStream -} - -type seaweedMessagingPublishServer struct { - grpc.ServerStream -} - -func (x *seaweedMessagingPublishServer) Send(m *PublishResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *seaweedMessagingPublishServer) Recv() (*PublishRequest, error) { - m := new(PublishRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func _SeaweedMessaging_DeleteTopic_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteTopicRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SeaweedMessagingServer).DeleteTopic(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/DeleteTopic", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SeaweedMessagingServer).DeleteTopic(ctx, req.(*DeleteTopicRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _SeaweedMessaging_ConfigureTopic_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ConfigureTopicRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SeaweedMessagingServer).ConfigureTopic(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/ConfigureTopic", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SeaweedMessagingServer).ConfigureTopic(ctx, req.(*ConfigureTopicRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _SeaweedMessaging_GetTopicConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTopicConfigurationRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SeaweedMessagingServer).GetTopicConfiguration(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/GetTopicConfiguration", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SeaweedMessagingServer).GetTopicConfiguration(ctx, req.(*GetTopicConfigurationRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(FindBrokerRequest) if err := dec(in); err != nil { @@ -311,36 +91,11 @@ var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ ServiceName: "messaging_pb.SeaweedMessaging", HandlerType: (*SeaweedMessagingServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "DeleteTopic", - Handler: _SeaweedMessaging_DeleteTopic_Handler, - }, - { - MethodName: "ConfigureTopic", - Handler: _SeaweedMessaging_ConfigureTopic_Handler, - }, - { - MethodName: "GetTopicConfiguration", - Handler: _SeaweedMessaging_GetTopicConfiguration_Handler, - }, { MethodName: "FindBroker", Handler: _SeaweedMessaging_FindBroker_Handler, }, }, - Streams: []grpc.StreamDesc{ - { - StreamName: "Subscribe", - Handler: _SeaweedMessaging_Subscribe_Handler, - ServerStreams: true, - ClientStreams: true, - }, - { - StreamName: "Publish", - Handler: _SeaweedMessaging_Publish_Handler, - ServerStreams: true, - ClientStreams: true, - }, - }, + Streams: []grpc.StreamDesc{}, Metadata: "mq.proto", } diff --git a/weed/server/filer_grpc_server_admin.go b/weed/server/filer_grpc_server_admin.go index df5b8fa1e..21fd8cc19 100644 --- a/weed/server/filer_grpc_server_admin.go +++ b/weed/server/filer_grpc_server_admin.go @@ -104,75 +104,3 @@ func (fs *FilerServer) GetFilerConfiguration(ctx context.Context, req *filer_pb. return t, nil } - -func (fs *FilerServer) KeepConnected(stream filer_pb.SeaweedFiler_KeepConnectedServer) error { - - req, err := stream.Recv() - if err != nil { - return err - } - - clientName := util.JoinHostPort(req.Name, int(req.GrpcPort)) - m := make(map[string]bool) - for _, tp := range req.Resources { - m[tp] = true - } - fs.brokersLock.Lock() - fs.brokers[clientName] = m - glog.V(0).Infof("+ broker %v", clientName) - fs.brokersLock.Unlock() - - defer func() { - fs.brokersLock.Lock() - delete(fs.brokers, clientName) - glog.V(0).Infof("- broker %v: %v", clientName, err) - fs.brokersLock.Unlock() - }() - - for { - if err := stream.Send(&filer_pb.KeepConnectedResponse{}); err != nil { - glog.V(0).Infof("send broker %v: %+v", clientName, err) - return err - } - // println("replied") - - if _, err := stream.Recv(); err != nil { - glog.V(0).Infof("recv broker %v: %v", clientName, err) - return err - } - // println("received") - } - -} - -func (fs *FilerServer) LocateBroker(ctx context.Context, req *filer_pb.LocateBrokerRequest) (resp *filer_pb.LocateBrokerResponse, err error) { - - resp = &filer_pb.LocateBrokerResponse{} - - fs.brokersLock.Lock() - defer fs.brokersLock.Unlock() - - var localBrokers []*filer_pb.LocateBrokerResponse_Resource - - for b, m := range fs.brokers { - if _, found := m[req.Resource]; found { - resp.Found = true - resp.Resources = []*filer_pb.LocateBrokerResponse_Resource{ - { - GrpcAddresses: b, - ResourceCount: int32(len(m)), - }, - } - return - } - localBrokers = append(localBrokers, &filer_pb.LocateBrokerResponse_Resource{ - GrpcAddresses: b, - ResourceCount: int32(len(m)), - }) - } - - resp.Resources = localBrokers - - return resp, nil - -} diff --git a/weed/server/filer_server.go b/weed/server/filer_server.go index 6bf0261ee..97282c471 100644 --- a/weed/server/filer_server.go +++ b/weed/server/filer_server.go @@ -90,9 +90,6 @@ type FilerServer struct { knownListenersLock sync.Mutex knownListeners map[int32]struct{} - brokers map[string]map[string]bool - brokersLock sync.Mutex - inFlightDataSize int64 inFlightDataLimitCond *sync.Cond } @@ -112,7 +109,6 @@ func NewFilerServer(defaultMux, readonlyMux *http.ServeMux, option *FilerOption) option: option, grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.filer"), knownListeners: make(map[int32]struct{}), - brokers: make(map[string]map[string]bool), inFlightDataLimitCond: sync.NewCond(new(sync.Mutex)), } fs.listenersCond = sync.NewCond(&fs.listenersLock) From ef93869009f12f9c7af4876dd4f9a5813ba90dec Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 10 Jul 2022 12:11:37 -0700 Subject: [PATCH 10/17] clean up --- weed/cluster/cluster.go | 22 ++-- weed/command/mq_broker.go | 27 +++-- weed/command/server.go | 2 + weed/mq/broker/brokder_grpc_admin.go | 10 ++ weed/mq/broker/consistent_distribution.go | 38 ------ .../mq/broker/consistent_distribution_test.go | 32 ----- weed/pb/mq.proto | 9 +- weed/pb/mq_pb/mq.pb.go | 112 +++++++----------- weed/pb/mq_pb/mq_grpc.pb.go | 28 ++--- 9 files changed, 97 insertions(+), 183 deletions(-) create mode 100644 weed/mq/broker/brokder_grpc_admin.go delete mode 100644 weed/mq/broker/consistent_distribution.go delete mode 100644 weed/mq/broker/consistent_distribution_test.go diff --git a/weed/cluster/cluster.go b/weed/cluster/cluster.go index 0d9886911..445b89a36 100644 --- a/weed/cluster/cluster.go +++ b/weed/cluster/cluster.go @@ -17,7 +17,7 @@ const ( type FilerGroup string type Filers struct { - filers map[pb.ServerAddress]*ClusterNode + members map[pb.ServerAddress]*ClusterNode leaders *Leaders } type Leaders struct { @@ -60,7 +60,7 @@ func (cluster *Cluster) getFilers(filerGroup FilerGroup, createIfNotFound bool) filers, found := cluster.filerGroup2filers[filerGroup] if !found && createIfNotFound { filers = &Filers{ - filers: make(map[pb.ServerAddress]*ClusterNode), + members: make(map[pb.ServerAddress]*ClusterNode), leaders: &Leaders{}, } cluster.filerGroup2filers[filerGroup] = filers @@ -75,11 +75,11 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente cluster.filersLock.Lock() defer cluster.filersLock.Unlock() filers := cluster.getFilers(filerGroup, true) - if existingNode, found := filers.filers[address]; found { + if existingNode, found := filers.members[address]; found { existingNode.counter++ return nil } - filers.filers[address] = &ClusterNode{ + filers.members[address] = &ClusterNode{ Address: address, Version: version, counter: 1, @@ -87,7 +87,7 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente DataCenter: dataCenter, Rack: rack, } - return cluster.ensureFilerLeaders(filers, true, filerGroup, nodeType, address) + return ensureFilerLeaders(filers, true, filerGroup, nodeType, address) case BrokerType: cluster.brokersLock.Lock() defer cluster.brokersLock.Unlock() @@ -151,13 +151,13 @@ func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, dataCenter if filers == nil { return nil } - if existingNode, found := filers.filers[address]; !found { + if existingNode, found := filers.members[address]; !found { return nil } else { existingNode.counter-- if existingNode.counter <= 0 { - delete(filers.filers, address) - return cluster.ensureFilerLeaders(filers, false, filerGroup, nodeType, address) + delete(filers.members, address) + return ensureFilerLeaders(filers, false, filerGroup, nodeType, address) } } case BrokerType: @@ -215,7 +215,7 @@ func (cluster *Cluster) ListClusterNode(filerGroup FilerGroup, nodeType string) if filers == nil { return } - for _, node := range filers.filers { + for _, node := range filers.members { nodes = append(nodes, node) } case BrokerType: @@ -241,7 +241,7 @@ func (cluster *Cluster) IsOneLeader(filerGroup FilerGroup, address pb.ServerAddr return filers.leaders.isOneLeader(address) } -func (cluster *Cluster) ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeType string, address pb.ServerAddress) (result []*master_pb.KeepConnectedResponse) { +func ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeType string, address pb.ServerAddress) (result []*master_pb.KeepConnectedResponse) { if isAdd { if filers.leaders.addLeaderIfVacant(address) { // has added the address as one leader @@ -282,7 +282,7 @@ func (cluster *Cluster) ensureFilerLeaders(filers *Filers, isAdd bool, filerGrou var shortestDuration int64 = math.MaxInt64 now := time.Now() var candidateAddress pb.ServerAddress - for _, node := range filers.filers { + for _, node := range filers.members { if filers.leaders.isOneLeader(node.Address) { continue } diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index 65f49e673..cce77bf8e 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -23,20 +23,21 @@ var ( ) type MessageQueueBrokerOptions struct { - masters *string - filerGroup *string - filer *string - ip *string - port *int - dataCenter *string - rack *string - cpuprofile *string - memprofile *string + masters map[string]pb.ServerAddress + mastersString *string + filerGroup *string + filer *string + ip *string + port *int + dataCenter *string + rack *string + cpuprofile *string + memprofile *string } func init() { cmdMqBroker.Run = runMqBroker // break init cycle - mqBrokerStandaloneOptions.masters = cmdMqBroker.Flag.String("master", "localhost:9333", "comma-separated master servers") + mqBrokerStandaloneOptions.mastersString = cmdMqBroker.Flag.String("master", "localhost:9333", "comma-separated master servers") mqBrokerStandaloneOptions.filer = cmdMqBroker.Flag.String("filer", "localhost:8888", "filer server address") mqBrokerStandaloneOptions.filerGroup = cmdMqBroker.Flag.String("filerGroup", "", "share metadata with other filers in the same filerGroup") mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") @@ -48,7 +49,7 @@ func init() { } var cmdMqBroker = &Command{ - UsageLine: "mq.broker [-port=17777] [-filer=]", + UsageLine: "mq.broker [-port=17777] [-master=]", Short: "start a message queue broker", Long: `start a message queue broker @@ -62,6 +63,8 @@ func runMqBroker(cmd *Command, args []string) bool { util.LoadConfiguration("security", false) + mqBrokerStandaloneOptions.masters = pb.ServerAddresses(*mqBrokerStandaloneOptions.mastersString).ToAddressMap() + return mqBrokerStandaloneOptions.startQueueServer() } @@ -94,7 +97,7 @@ func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { } qs, err := broker.NewMessageBroker(&broker.MessageQueueBrokerOption{ - Masters: pb.ServerAddresses(*mqBrokerOpt.masters).ToAddressMap(), + Masters: mqBrokerOpt.masters, FilerGroup: *mqBrokerOpt.filerGroup, DataCenter: *mqBrokerOpt.dataCenter, Rack: *mqBrokerOpt.rack, diff --git a/weed/command/server.go b/weed/command/server.go index 9e1cea07d..04b07ed51 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -209,6 +209,8 @@ func runServer(cmd *Command, args []string) bool { serverOptions.v.dataCenter = serverDataCenter serverOptions.v.rack = serverRack mqBrokerOptions.ip = serverIp + mqBrokerOptions.masters = filerOptions.masters + mqBrokerOptions.filerGroup = filerOptions.filerGroup // serverOptions.v.pulseSeconds = pulseSeconds // masterOptions.pulseSeconds = pulseSeconds diff --git a/weed/mq/broker/brokder_grpc_admin.go b/weed/mq/broker/brokder_grpc_admin.go new file mode 100644 index 000000000..e8914cbed --- /dev/null +++ b/weed/mq/broker/brokder_grpc_admin.go @@ -0,0 +1,10 @@ +package broker + +import ( + "context" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" +) + +func (broker *MessageQueueBroker) FindBrokerLeader(c context.Context, request *mq_pb.FindBrokerLeaderRequest) (*mq_pb.FindBrokerLeaderResponse, error) { + panic("implement me") +} diff --git a/weed/mq/broker/consistent_distribution.go b/weed/mq/broker/consistent_distribution.go deleted file mode 100644 index 465a2a8f2..000000000 --- a/weed/mq/broker/consistent_distribution.go +++ /dev/null @@ -1,38 +0,0 @@ -package broker - -import ( - "github.com/buraksezer/consistent" - "github.com/cespare/xxhash" -) - -type Member string - -func (m Member) String() string { - return string(m) -} - -type hasher struct{} - -func (h hasher) Sum64(data []byte) uint64 { - return xxhash.Sum64(data) -} - -func PickMember(members []string, key []byte) string { - cfg := consistent.Config{ - PartitionCount: 9791, - ReplicationFactor: 2, - Load: 1.25, - Hasher: hasher{}, - } - - cmembers := []consistent.Member{} - for _, m := range members { - cmembers = append(cmembers, Member(m)) - } - - c := consistent.New(cmembers, cfg) - - m := c.LocateKey(key) - - return m.String() -} diff --git a/weed/mq/broker/consistent_distribution_test.go b/weed/mq/broker/consistent_distribution_test.go deleted file mode 100644 index f58fe4e0e..000000000 --- a/weed/mq/broker/consistent_distribution_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package broker - -import ( - "fmt" - "testing" -) - -func TestPickMember(t *testing.T) { - - servers := []string{ - "s1:port", - "s2:port", - "s3:port", - "s5:port", - "s4:port", - } - - total := 1000 - - distribution := make(map[string]int) - for i := 0; i < total; i++ { - tp := fmt.Sprintf("tp:%2d", i) - m := PickMember(servers, []byte(tp)) - // println(tp, "=>", m) - distribution[m]++ - } - - for member, count := range distribution { - fmt.Printf("member: %s, key count: %d load=%.2f\n", member, count, float64(count*100)/float64(total/len(servers))) - } - -} diff --git a/weed/pb/mq.proto b/weed/pb/mq.proto index 44291c173..47bd1775e 100644 --- a/weed/pb/mq.proto +++ b/weed/pb/mq.proto @@ -10,19 +10,16 @@ option java_outer_classname = "MessagQueueProto"; service SeaweedMessaging { - rpc FindBroker (FindBrokerRequest) returns (FindBrokerResponse) { + rpc FindBrokerLeader (FindBrokerLeader) returns (FindBrokerLeaderResponse) { } } ////////////////////////////////////////////////// -message FindBrokerRequest { - string namespace = 1; - string topic = 2; - int32 parition = 3; +message FindBrokerLeaderRequest { } -message FindBrokerResponse { +message FindBrokerLeaderResponse { string broker = 1; } diff --git a/weed/pb/mq_pb/mq.pb.go b/weed/pb/mq_pb/mq.pb.go index dac27c959..a5d63c8d9 100644 --- a/weed/pb/mq_pb/mq.pb.go +++ b/weed/pb/mq_pb/mq.pb.go @@ -20,18 +20,14 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type FindBrokerRequest struct { +type FindBrokerLeaderRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` - Parition int32 `protobuf:"varint,3,opt,name=parition,proto3" json:"parition,omitempty"` } -func (x *FindBrokerRequest) Reset() { - *x = FindBrokerRequest{} +func (x *FindBrokerLeaderRequest) Reset() { + *x = FindBrokerLeaderRequest{} if protoimpl.UnsafeEnabled { mi := &file_mq_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -39,13 +35,13 @@ func (x *FindBrokerRequest) Reset() { } } -func (x *FindBrokerRequest) String() string { +func (x *FindBrokerLeaderRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FindBrokerRequest) ProtoMessage() {} +func (*FindBrokerLeaderRequest) ProtoMessage() {} -func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { +func (x *FindBrokerLeaderRequest) ProtoReflect() protoreflect.Message { mi := &file_mq_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -57,33 +53,12 @@ func (x *FindBrokerRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FindBrokerRequest.ProtoReflect.Descriptor instead. -func (*FindBrokerRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use FindBrokerLeaderRequest.ProtoReflect.Descriptor instead. +func (*FindBrokerLeaderRequest) Descriptor() ([]byte, []int) { return file_mq_proto_rawDescGZIP(), []int{0} } -func (x *FindBrokerRequest) GetNamespace() string { - if x != nil { - return x.Namespace - } - return "" -} - -func (x *FindBrokerRequest) GetTopic() string { - if x != nil { - return x.Topic - } - return "" -} - -func (x *FindBrokerRequest) GetParition() int32 { - if x != nil { - return x.Parition - } - return 0 -} - -type FindBrokerResponse struct { +type FindBrokerLeaderResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -91,8 +66,8 @@ type FindBrokerResponse struct { Broker string `protobuf:"bytes,1,opt,name=broker,proto3" json:"broker,omitempty"` } -func (x *FindBrokerResponse) Reset() { - *x = FindBrokerResponse{} +func (x *FindBrokerLeaderResponse) Reset() { + *x = FindBrokerLeaderResponse{} if protoimpl.UnsafeEnabled { mi := &file_mq_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -100,13 +75,13 @@ func (x *FindBrokerResponse) Reset() { } } -func (x *FindBrokerResponse) String() string { +func (x *FindBrokerLeaderResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*FindBrokerResponse) ProtoMessage() {} +func (*FindBrokerLeaderResponse) ProtoMessage() {} -func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { +func (x *FindBrokerLeaderResponse) ProtoReflect() protoreflect.Message { mi := &file_mq_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -118,12 +93,12 @@ func (x *FindBrokerResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FindBrokerResponse.ProtoReflect.Descriptor instead. -func (*FindBrokerResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use FindBrokerLeaderResponse.ProtoReflect.Descriptor instead. +func (*FindBrokerLeaderResponse) Descriptor() ([]byte, []int) { return file_mq_proto_rawDescGZIP(), []int{1} } -func (x *FindBrokerResponse) GetBroker() string { +func (x *FindBrokerLeaderResponse) GetBroker() string { if x != nil { return x.Broker } @@ -134,28 +109,25 @@ var File_mq_proto protoreflect.FileDescriptor var file_mq_proto_rawDesc = []byte{ 0x0a, 0x08, 0x6d, 0x71, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x63, 0x0a, 0x11, 0x46, 0x69, 0x6e, 0x64, - 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, - 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x72, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, - 0x12, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x32, 0x65, 0x0a, 0x10, 0x53, - 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, - 0x51, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x2e, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, - 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, - 0x6d, 0x71, 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, - 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x19, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x32, 0x77, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x10, 0x46, + 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, + 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, + 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, + 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -172,12 +144,12 @@ func file_mq_proto_rawDescGZIP() []byte { var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_mq_proto_goTypes = []interface{}{ - (*FindBrokerRequest)(nil), // 0: messaging_pb.FindBrokerRequest - (*FindBrokerResponse)(nil), // 1: messaging_pb.FindBrokerResponse + (*FindBrokerLeaderRequest)(nil), // 0: messaging_pb.FindBrokerLeaderRequest + (*FindBrokerLeaderResponse)(nil), // 1: messaging_pb.FindBrokerLeaderResponse } var file_mq_proto_depIdxs = []int32{ - 0, // 0: messaging_pb.SeaweedMessaging.FindBroker:input_type -> messaging_pb.FindBrokerRequest - 1, // 1: messaging_pb.SeaweedMessaging.FindBroker:output_type -> messaging_pb.FindBrokerResponse + 0, // 0: messaging_pb.SeaweedMessaging.FindBrokerLeader:input_type -> messaging_pb.FindBrokerLeaderRequest + 1, // 1: messaging_pb.SeaweedMessaging.FindBrokerLeader:output_type -> messaging_pb.FindBrokerLeaderResponse 1, // [1:2] is the sub-list for method output_type 0, // [0:1] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name @@ -192,7 +164,7 @@ func file_mq_proto_init() { } if !protoimpl.UnsafeEnabled { file_mq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindBrokerRequest); i { + switch v := v.(*FindBrokerLeaderRequest); i { case 0: return &v.state case 1: @@ -204,7 +176,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindBrokerResponse); i { + switch v := v.(*FindBrokerLeaderResponse); i { case 0: return &v.state case 1: diff --git a/weed/pb/mq_pb/mq_grpc.pb.go b/weed/pb/mq_pb/mq_grpc.pb.go index 60258e23d..5851632cc 100644 --- a/weed/pb/mq_pb/mq_grpc.pb.go +++ b/weed/pb/mq_pb/mq_grpc.pb.go @@ -18,7 +18,7 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SeaweedMessagingClient interface { - FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) + FindBrokerLeader(ctx context.Context, in *FindBrokerLeaderRequest, opts ...grpc.CallOption) (*FindBrokerLeaderResponse, error) } type seaweedMessagingClient struct { @@ -29,9 +29,9 @@ func NewSeaweedMessagingClient(cc grpc.ClientConnInterface) SeaweedMessagingClie return &seaweedMessagingClient{cc} } -func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerRequest, opts ...grpc.CallOption) (*FindBrokerResponse, error) { - out := new(FindBrokerResponse) - err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/FindBroker", in, out, opts...) +func (c *seaweedMessagingClient) FindBrokerLeader(ctx context.Context, in *FindBrokerLeaderRequest, opts ...grpc.CallOption) (*FindBrokerLeaderResponse, error) { + out := new(FindBrokerLeaderResponse) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/FindBrokerLeader", in, out, opts...) if err != nil { return nil, err } @@ -42,7 +42,7 @@ func (c *seaweedMessagingClient) FindBroker(ctx context.Context, in *FindBrokerR // All implementations must embed UnimplementedSeaweedMessagingServer // for forward compatibility type SeaweedMessagingServer interface { - FindBroker(context.Context, *FindBrokerRequest) (*FindBrokerResponse, error) + FindBrokerLeader(context.Context, *FindBrokerLeaderRequest) (*FindBrokerLeaderResponse, error) mustEmbedUnimplementedSeaweedMessagingServer() } @@ -50,8 +50,8 @@ type SeaweedMessagingServer interface { type UnimplementedSeaweedMessagingServer struct { } -func (UnimplementedSeaweedMessagingServer) FindBroker(context.Context, *FindBrokerRequest) (*FindBrokerResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method FindBroker not implemented") +func (UnimplementedSeaweedMessagingServer) FindBrokerLeader(context.Context, *FindBrokerLeaderRequest) (*FindBrokerLeaderResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FindBrokerLeader not implemented") } func (UnimplementedSeaweedMessagingServer) mustEmbedUnimplementedSeaweedMessagingServer() {} @@ -66,20 +66,20 @@ func RegisterSeaweedMessagingServer(s grpc.ServiceRegistrar, srv SeaweedMessagin s.RegisterService(&SeaweedMessaging_ServiceDesc, srv) } -func _SeaweedMessaging_FindBroker_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(FindBrokerRequest) +func _SeaweedMessaging_FindBrokerLeader_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FindBrokerLeaderRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(SeaweedMessagingServer).FindBroker(ctx, in) + return srv.(SeaweedMessagingServer).FindBrokerLeader(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/messaging_pb.SeaweedMessaging/FindBroker", + FullMethod: "/messaging_pb.SeaweedMessaging/FindBrokerLeader", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SeaweedMessagingServer).FindBroker(ctx, req.(*FindBrokerRequest)) + return srv.(SeaweedMessagingServer).FindBrokerLeader(ctx, req.(*FindBrokerLeaderRequest)) } return interceptor(ctx, in, info, handler) } @@ -92,8 +92,8 @@ var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ HandlerType: (*SeaweedMessagingServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "FindBroker", - Handler: _SeaweedMessaging_FindBroker_Handler, + MethodName: "FindBrokerLeader", + Handler: _SeaweedMessaging_FindBrokerLeader_Handler, }, }, Streams: []grpc.StreamDesc{}, From 24291e23eb91db9b830bc93462bc8af347109992 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sun, 10 Jul 2022 14:01:53 -0700 Subject: [PATCH 11/17] refactor --- weed/cluster/cluster.go | 295 ++++++++++------------ weed/cluster/cluster_test.go | 16 +- weed/server/master_grpc_server.go | 2 +- weed/server/master_grpc_server_cluster.go | 8 +- weed/server/master_server.go | 2 +- 5 files changed, 147 insertions(+), 176 deletions(-) diff --git a/weed/cluster/cluster.go b/weed/cluster/cluster.go index 445b89a36..8496a7f6e 100644 --- a/weed/cluster/cluster.go +++ b/weed/cluster/cluster.go @@ -15,24 +15,13 @@ const ( BrokerType = "broker" ) -type FilerGroup string -type Filers struct { - members map[pb.ServerAddress]*ClusterNode - leaders *Leaders -} -type Leaders struct { - leaders [3]pb.ServerAddress -} - +type FilerGroupName string type DataCenter string type Rack string -type DataCenterBrokers struct { - brokers map[Rack]*RackBrokers -} -type RackBrokers struct { - brokers map[pb.ServerAddress]*ClusterNode -} +type Leaders struct { + leaders [3]pb.ServerAddress +} type ClusterNode struct { Address pb.ServerAddress Version string @@ -41,92 +30,131 @@ type ClusterNode struct { DataCenter DataCenter Rack Rack } - +type GroupMembers struct { + members map[pb.ServerAddress]*ClusterNode + leaders *Leaders +} +type ClusterNodeGroups struct { + groupMembers map[FilerGroupName]*GroupMembers + sync.RWMutex +} type Cluster struct { - filerGroup2filers map[FilerGroup]*Filers - filersLock sync.RWMutex - brokers map[DataCenter]*DataCenterBrokers - brokersLock sync.RWMutex + filerGroups *ClusterNodeGroups + brokerGroups *ClusterNodeGroups } -func NewCluster() *Cluster { - return &Cluster{ - filerGroup2filers: make(map[FilerGroup]*Filers), - brokers: make(map[DataCenter]*DataCenterBrokers), +func newClusterNodeGroups() *ClusterNodeGroups { + return &ClusterNodeGroups{ + groupMembers: map[FilerGroupName]*GroupMembers{}, } } - -func (cluster *Cluster) getFilers(filerGroup FilerGroup, createIfNotFound bool) *Filers { - filers, found := cluster.filerGroup2filers[filerGroup] +func (g *ClusterNodeGroups) getGroupMembers(filerGroup FilerGroupName, createIfNotFound bool) *GroupMembers { + filers, found := g.groupMembers[filerGroup] if !found && createIfNotFound { - filers = &Filers{ + filers = &GroupMembers{ members: make(map[pb.ServerAddress]*ClusterNode), leaders: &Leaders{}, } - cluster.filerGroup2filers[filerGroup] = filers + g.groupMembers[filerGroup] = filers } return filers } -func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) []*master_pb.KeepConnectedResponse { - filerGroup := FilerGroup(ns) +func (m *GroupMembers) addMember(dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) *ClusterNode { + if existingNode, found := m.members[address]; found { + existingNode.counter++ + return nil + } + t := &ClusterNode{ + Address: address, + Version: version, + counter: 1, + CreatedTs: time.Now(), + DataCenter: dataCenter, + Rack: rack, + } + m.members[address] = t + return t +} +func (m *GroupMembers) removeMember(address pb.ServerAddress) bool { + if existingNode, found := m.members[address]; !found { + return false + } else { + existingNode.counter-- + if existingNode.counter <= 0 { + delete(m.members, address) + return true + } + } + return false +} + +func (g *ClusterNodeGroups) AddClusterNode(filerGroup FilerGroupName, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) []*master_pb.KeepConnectedResponse { + g.Lock() + defer g.Unlock() + m := g.getGroupMembers(filerGroup, true) + if t := m.addMember(dataCenter, rack, address, version); t != nil { + return ensureGroupLeaders(m, true, filerGroup, nodeType, address) + } + return nil +} +func (g *ClusterNodeGroups) RemoveClusterNode(filerGroup FilerGroupName, nodeType string, address pb.ServerAddress) []*master_pb.KeepConnectedResponse { + g.Lock() + defer g.Unlock() + m := g.getGroupMembers(filerGroup, false) + if m == nil { + return nil + } + if m.removeMember(address) { + return ensureGroupLeaders(m, false, filerGroup, nodeType, address) + } + return nil +} +func (g *ClusterNodeGroups) ListClusterNode(filerGroup FilerGroupName) (nodes []*ClusterNode) { + g.Lock() + defer g.Unlock() + m := g.getGroupMembers(filerGroup, false) + if m == nil { + return nil + } + for _, node := range m.members { + nodes = append(nodes, node) + } + return +} +func (g *ClusterNodeGroups) IsOneLeader(filerGroup FilerGroupName, address pb.ServerAddress) bool { + g.Lock() + defer g.Unlock() + m := g.getGroupMembers(filerGroup, false) + if m == nil { + return false + } + return m.leaders.isOneLeader(address) +} +func NewCluster() *Cluster { + return &Cluster{ + filerGroups: newClusterNodeGroups(), + brokerGroups: newClusterNodeGroups(), + } +} + +func (cluster *Cluster) getGroupMembers(filerGroup FilerGroupName, nodeType string, createIfNotFound bool) *GroupMembers { switch nodeType { case FilerType: - cluster.filersLock.Lock() - defer cluster.filersLock.Unlock() - filers := cluster.getFilers(filerGroup, true) - if existingNode, found := filers.members[address]; found { - existingNode.counter++ - return nil - } - filers.members[address] = &ClusterNode{ - Address: address, - Version: version, - counter: 1, - CreatedTs: time.Now(), - DataCenter: dataCenter, - Rack: rack, - } - return ensureFilerLeaders(filers, true, filerGroup, nodeType, address) + return cluster.filerGroups.getGroupMembers(filerGroup, createIfNotFound) case BrokerType: - cluster.brokersLock.Lock() - defer cluster.brokersLock.Unlock() - existingDataCenterBrokers, foundDataCenter := cluster.brokers[dataCenter] - if !foundDataCenter { - existingDataCenterBrokers = &DataCenterBrokers{ - brokers: make(map[Rack]*RackBrokers), - } - cluster.brokers[dataCenter] = existingDataCenterBrokers - } - existingRackBrokers, foundRack := existingDataCenterBrokers.brokers[rack] - if !foundRack { - existingRackBrokers = &RackBrokers{ - brokers: make(map[pb.ServerAddress]*ClusterNode), - } - existingDataCenterBrokers.brokers[rack] = existingRackBrokers - } + return cluster.brokerGroups.getGroupMembers(filerGroup, createIfNotFound) + } + return nil +} - if existingBroker, found := existingRackBrokers.brokers[address]; found { - existingBroker.counter++ - return nil - } - existingRackBrokers.brokers[address] = &ClusterNode{ - Address: address, - Version: version, - counter: 1, - CreatedTs: time.Now(), - DataCenter: dataCenter, - Rack: rack, - } - return []*master_pb.KeepConnectedResponse{ - { - ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ - NodeType: nodeType, - Address: string(address), - IsAdd: true, - }, - }, - } +func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) []*master_pb.KeepConnectedResponse { + filerGroup := FilerGroupName(ns) + switch nodeType { + case FilerType: + return cluster.filerGroups.AddClusterNode(filerGroup, nodeType, dataCenter, rack, address, version) + case BrokerType: + return cluster.brokerGroups.AddClusterNode(filerGroup, nodeType, dataCenter, rack, address, version) case MasterType: return []*master_pb.KeepConnectedResponse{ { @@ -141,57 +169,13 @@ func (cluster *Cluster) AddClusterNode(ns, nodeType string, dataCenter DataCente return nil } -func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, dataCenter DataCenter, rack Rack, address pb.ServerAddress) []*master_pb.KeepConnectedResponse { - filerGroup := FilerGroup(ns) +func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, address pb.ServerAddress) []*master_pb.KeepConnectedResponse { + filerGroup := FilerGroupName(ns) switch nodeType { case FilerType: - cluster.filersLock.Lock() - defer cluster.filersLock.Unlock() - filers := cluster.getFilers(filerGroup, false) - if filers == nil { - return nil - } - if existingNode, found := filers.members[address]; !found { - return nil - } else { - existingNode.counter-- - if existingNode.counter <= 0 { - delete(filers.members, address) - return ensureFilerLeaders(filers, false, filerGroup, nodeType, address) - } - } + return cluster.filerGroups.RemoveClusterNode(filerGroup, nodeType, address) case BrokerType: - cluster.brokersLock.Lock() - defer cluster.brokersLock.Unlock() - - existingDataCenterBrokers, foundDataCenter := cluster.brokers[dataCenter] - if !foundDataCenter { - return nil - } - existingRackBrokers, foundRack := existingDataCenterBrokers.brokers[Rack(rack)] - if !foundRack { - return nil - } - - existingBroker, found := existingRackBrokers.brokers[address] - if !found { - return nil - } - existingBroker.counter-- - if existingBroker.counter <= 0 { - delete(existingRackBrokers.brokers, address) - return []*master_pb.KeepConnectedResponse{ - { - ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ - NodeType: nodeType, - Address: string(address), - IsAdd: false, - }, - }, - } - } - return nil - + return cluster.brokerGroups.RemoveClusterNode(filerGroup, nodeType, address) case MasterType: return []*master_pb.KeepConnectedResponse{ { @@ -206,44 +190,31 @@ func (cluster *Cluster) RemoveClusterNode(ns string, nodeType string, dataCenter return nil } -func (cluster *Cluster) ListClusterNode(filerGroup FilerGroup, nodeType string) (nodes []*ClusterNode) { +func (cluster *Cluster) ListClusterNode(filerGroup FilerGroupName, nodeType string) (nodes []*ClusterNode) { switch nodeType { case FilerType: - cluster.filersLock.RLock() - defer cluster.filersLock.RUnlock() - filers := cluster.getFilers(filerGroup, false) - if filers == nil { - return - } - for _, node := range filers.members { - nodes = append(nodes, node) - } + return cluster.filerGroups.ListClusterNode(filerGroup) case BrokerType: - cluster.brokersLock.RLock() - defer cluster.brokersLock.RUnlock() - for _, dcNodes := range cluster.brokers { - for _, rackNodes := range dcNodes.brokers { - for _, node := range rackNodes.brokers { - nodes = append(nodes, node) - } - } - } + return cluster.brokerGroups.ListClusterNode(filerGroup) case MasterType: } return } -func (cluster *Cluster) IsOneLeader(filerGroup FilerGroup, address pb.ServerAddress) bool { - filers := cluster.getFilers(filerGroup, false) - if filers == nil { - return false +func (cluster *Cluster) IsOneLeader(filerGroup FilerGroupName, nodeType string, address pb.ServerAddress) bool { + switch nodeType { + case FilerType: + return cluster.filerGroups.IsOneLeader(filerGroup, address) + case BrokerType: + return cluster.brokerGroups.IsOneLeader(filerGroup, address) + case MasterType: } - return filers.leaders.isOneLeader(address) + return false } -func ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeType string, address pb.ServerAddress) (result []*master_pb.KeepConnectedResponse) { +func ensureGroupLeaders(m *GroupMembers, isAdd bool, filerGroup FilerGroupName, nodeType string, address pb.ServerAddress) (result []*master_pb.KeepConnectedResponse) { if isAdd { - if filers.leaders.addLeaderIfVacant(address) { + if m.leaders.addLeaderIfVacant(address) { // has added the address as one leader result = append(result, &master_pb.KeepConnectedResponse{ ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ @@ -266,7 +237,7 @@ func ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeT }) } } else { - if filers.leaders.removeLeaderIfExists(address) { + if m.leaders.removeLeaderIfExists(address) { result = append(result, &master_pb.KeepConnectedResponse{ ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ @@ -282,8 +253,8 @@ func ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeT var shortestDuration int64 = math.MaxInt64 now := time.Now() var candidateAddress pb.ServerAddress - for _, node := range filers.members { - if filers.leaders.isOneLeader(node.Address) { + for _, node := range m.members { + if m.leaders.isOneLeader(node.Address) { continue } duration := now.Sub(node.CreatedTs).Nanoseconds() @@ -293,7 +264,7 @@ func ensureFilerLeaders(filers *Filers, isAdd bool, filerGroup FilerGroup, nodeT } } if candidateAddress != "" { - filers.leaders.addLeaderIfVacant(candidateAddress) + m.leaders.addLeaderIfVacant(candidateAddress) // added a new leader result = append(result, &master_pb.KeepConnectedResponse{ ClusterNodeUpdate: &master_pb.ClusterNodeUpdate{ diff --git a/weed/cluster/cluster_test.go b/weed/cluster/cluster_test.go index 76cff2a3e..57ee4a023 100644 --- a/weed/cluster/cluster_test.go +++ b/weed/cluster/cluster_test.go @@ -16,7 +16,7 @@ func TestClusterAddRemoveNodes(t *testing.T) { assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), - }, c.getFilers("", false).leaders.GetLeaders()) + }, c.getGroupMembers("", "filer", true).leaders.GetLeaders()) c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:3"), "23.45") c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:4"), "23.45") @@ -24,27 +24,27 @@ func TestClusterAddRemoveNodes(t *testing.T) { pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), pb.ServerAddress("111:3"), - }, c.getFilers("", false).leaders.GetLeaders()) + }, c.getGroupMembers("", "filer", true).leaders.GetLeaders()) c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:5"), "23.45") c.AddClusterNode("", "filer", "", "", pb.ServerAddress("111:6"), "23.45") - c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:4")) + c.RemoveClusterNode("", "filer", pb.ServerAddress("111:4")) assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:1"), pb.ServerAddress("111:2"), pb.ServerAddress("111:3"), - }, c.getFilers("", false).leaders.GetLeaders()) + }, c.getGroupMembers("", "filer", true).leaders.GetLeaders()) // remove oldest - c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:1")) + c.RemoveClusterNode("", "filer", pb.ServerAddress("111:1")) assert.Equal(t, []pb.ServerAddress{ pb.ServerAddress("111:6"), pb.ServerAddress("111:2"), pb.ServerAddress("111:3"), - }, c.getFilers("", false).leaders.GetLeaders()) + }, c.getGroupMembers("", "filer", true).leaders.GetLeaders()) // remove oldest - c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress("111:1")) + c.RemoveClusterNode("", "filer", pb.ServerAddress("111:1")) } @@ -66,7 +66,7 @@ func TestConcurrentAddRemoveNodes(t *testing.T) { go func(i int) { defer wg.Done() address := strconv.Itoa(i) - node := c.RemoveClusterNode("", "filer", "", "", pb.ServerAddress(address)) + node := c.RemoveClusterNode("", "filer", pb.ServerAddress(address)) if len(node) == 0 { t.Errorf("TestConcurrentAddRemoveNodes: node[%s] not found", address) diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index d530e238e..363aa2979 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -259,7 +259,7 @@ func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServ } defer func() { - for _, update := range ms.Cluster.RemoveClusterNode(req.FilerGroup, req.ClientType, cluster.DataCenter(req.DataCenter), cluster.Rack(req.Rack), peerAddress) { + for _, update := range ms.Cluster.RemoveClusterNode(req.FilerGroup, req.ClientType, peerAddress) { ms.broadcastToClients(update) } ms.deleteClient(clientName) diff --git a/weed/server/master_grpc_server_cluster.go b/weed/server/master_grpc_server_cluster.go index 31d7a6658..e368cb763 100644 --- a/weed/server/master_grpc_server_cluster.go +++ b/weed/server/master_grpc_server_cluster.go @@ -10,14 +10,14 @@ import ( func (ms *MasterServer) ListClusterNodes(ctx context.Context, req *master_pb.ListClusterNodesRequest) (*master_pb.ListClusterNodesResponse, error) { resp := &master_pb.ListClusterNodesResponse{} - filerGroup := cluster.FilerGroup(req.FilerGroup) + filerGroup := cluster.FilerGroupName(req.FilerGroup) clusterNodes := ms.Cluster.ListClusterNode(filerGroup, req.ClientType) for _, node := range clusterNodes { resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{ Address: string(node.Address), Version: node.Version, - IsLeader: ms.Cluster.IsOneLeader(filerGroup, node.Address), + IsLeader: ms.Cluster.IsOneLeader(filerGroup, req.ClientType, node.Address), CreatedAtNs: node.CreatedTs.UnixNano(), DataCenter: string(node.DataCenter), Rack: string(node.Rack), @@ -26,13 +26,13 @@ func (ms *MasterServer) ListClusterNodes(ctx context.Context, req *master_pb.Lis return resp, nil } -func (ms *MasterServer) GetOneFiler(filerGroup cluster.FilerGroup) pb.ServerAddress { +func (ms *MasterServer) GetOneFiler(filerGroup cluster.FilerGroupName) pb.ServerAddress { clusterNodes := ms.Cluster.ListClusterNode(filerGroup, cluster.FilerType) var filers []pb.ServerAddress for _, node := range clusterNodes { - if ms.Cluster.IsOneLeader(filerGroup, node.Address) { + if ms.Cluster.IsOneLeader(filerGroup, cluster.FilerType, node.Address) { filers = append(filers, node.Address) } } diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 756d14dbc..92d38d648 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -287,7 +287,7 @@ func (ms *MasterServer) startAdminScripts() { for { time.Sleep(time.Duration(sleepMinutes) * time.Minute) if ms.Topo.IsLeader() { - shellOptions.FilerAddress = ms.GetOneFiler(cluster.FilerGroup(*shellOptions.FilerGroup)) + shellOptions.FilerAddress = ms.GetOneFiler(cluster.FilerGroupName(*shellOptions.FilerGroup)) if shellOptions.FilerAddress == "" { continue } From 1112dab4f325ec594353b687d9b73a3d9f9c06de Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 11 Jul 2022 00:20:27 -0700 Subject: [PATCH 12/17] allocate brokers to serve segments --- weed/cluster/cluster.go | 29 +- weed/mq/broker/brokder_grpc_admin.go | 204 ++++++- weed/mq/broker/broker_server.go | 8 + weed/mq/topic.go | 33 +- weed/pb/grpc_client_server.go | 8 + weed/pb/master.proto | 2 + weed/pb/master_pb/master.pb.go | 413 +++++++------- weed/pb/mq.proto | 47 +- weed/pb/mq_pb/mq.pb.go | 657 +++++++++++++++++++++- weed/pb/mq_pb/mq_grpc.pb.go | 108 ++++ weed/server/master_grpc_server_cluster.go | 49 +- weed/shell/command_cluster_ps.go | 3 + 12 files changed, 1309 insertions(+), 252 deletions(-) diff --git a/weed/cluster/cluster.go b/weed/cluster/cluster.go index 8496a7f6e..c320065d5 100644 --- a/weed/cluster/cluster.go +++ b/weed/cluster/cluster.go @@ -49,15 +49,15 @@ func newClusterNodeGroups() *ClusterNodeGroups { } } func (g *ClusterNodeGroups) getGroupMembers(filerGroup FilerGroupName, createIfNotFound bool) *GroupMembers { - filers, found := g.groupMembers[filerGroup] + members, found := g.groupMembers[filerGroup] if !found && createIfNotFound { - filers = &GroupMembers{ + members = &GroupMembers{ members: make(map[pb.ServerAddress]*ClusterNode), leaders: &Leaders{}, } - g.groupMembers[filerGroup] = filers + g.groupMembers[filerGroup] = members } - return filers + return members } func (m *GroupMembers) addMember(dataCenter DataCenter, rack Rack, address pb.ServerAddress, version string) *ClusterNode { @@ -131,6 +131,16 @@ func (g *ClusterNodeGroups) IsOneLeader(filerGroup FilerGroupName, address pb.Se } return m.leaders.isOneLeader(address) } +func (g *ClusterNodeGroups) ListClusterNodeLeaders(filerGroup FilerGroupName) (nodes []pb.ServerAddress) { + g.Lock() + defer g.Unlock() + m := g.getGroupMembers(filerGroup, false) + if m == nil { + return nil + } + return m.leaders.GetLeaders() +} + func NewCluster() *Cluster { return &Cluster{ filerGroups: newClusterNodeGroups(), @@ -201,6 +211,17 @@ func (cluster *Cluster) ListClusterNode(filerGroup FilerGroupName, nodeType stri return } +func (cluster *Cluster) ListClusterNodeLeaders(filerGroup FilerGroupName, nodeType string) (nodes []pb.ServerAddress) { + switch nodeType { + case FilerType: + return cluster.filerGroups.ListClusterNodeLeaders(filerGroup) + case BrokerType: + return cluster.brokerGroups.ListClusterNodeLeaders(filerGroup) + case MasterType: + } + return +} + func (cluster *Cluster) IsOneLeader(filerGroup FilerGroupName, nodeType string, address pb.ServerAddress) bool { switch nodeType { case FilerType: diff --git a/weed/mq/broker/brokder_grpc_admin.go b/weed/mq/broker/brokder_grpc_admin.go index e8914cbed..31b5bb84e 100644 --- a/weed/mq/broker/brokder_grpc_admin.go +++ b/weed/mq/broker/brokder_grpc_admin.go @@ -2,9 +2,211 @@ package broker import ( "context" + "github.com/chrislusf/seaweedfs/weed/cluster" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/mq" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" + "sort" + "sync" ) func (broker *MessageQueueBroker) FindBrokerLeader(c context.Context, request *mq_pb.FindBrokerLeaderRequest) (*mq_pb.FindBrokerLeaderResponse, error) { - panic("implement me") + ret := &mq_pb.FindBrokerLeaderResponse{} + err := broker.withMasterClient(false, broker.MasterClient.GetMaster(), func(client master_pb.SeaweedClient) error { + resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ + ClientType: cluster.BrokerType, + FilerGroup: request.FilerGroup, + IsLeaderOnly: true, + }) + if err != nil { + return err + } + if len(resp.ClusterNodes) == 0 { + return nil + } + ret.Broker = resp.ClusterNodes[0].Address + return nil + }) + return ret, err +} + +func (broker *MessageQueueBroker) CheckSegmentStatus(c context.Context, request *mq_pb.CheckSegmentStatusRequest) (*mq_pb.CheckSegmentStatusResponse, error) { + ret := &mq_pb.CheckSegmentStatusResponse{} + // TODO add in memory active segment + return ret, nil +} + +func (broker *MessageQueueBroker) CheckBrokerLoad(c context.Context, request *mq_pb.CheckBrokerLoadRequest) (*mq_pb.CheckBrokerLoadResponse, error) { + ret := &mq_pb.CheckBrokerLoadResponse{} + // TODO read broker's load + return ret, nil +} + +func (broker *MessageQueueBroker) AssignSegmentBrokers(c context.Context, request *mq_pb.AssignSegmentBrokersRequest) (*mq_pb.AssignSegmentBrokersResponse, error) { + ret := &mq_pb.AssignSegmentBrokersResponse{} + segment := mq.FromPbSegment(request.Segment) + + // check existing segment locations on filer + existingBrokers, err := broker.checkSegmentOnFiler(segment) + if err != nil { + return ret, err + } + // good if the segment is still on the brokers + isActive, err := broker.checkSegmentsOnBrokers(segment, existingBrokers) + if err != nil { + return ret, err + } + if isActive { + for _, broker := range existingBrokers { + ret.Brokers = append(ret.Brokers, string(broker)) + } + return ret, nil + } + + // randomly pick up to 10 brokers, and find the ones with the lightest load + selectedBrokers, err := broker.selectBrokers() + if err != nil { + return ret, err + } + + // save the allocated brokers info for this segment on the filer + if err := broker.saveSegmentOnFiler(segment, selectedBrokers); err != nil { + return ret, err + } + + for _, broker := range selectedBrokers { + ret.Brokers = append(ret.Brokers, string(broker)) + } + return ret, nil +} + +func (broker *MessageQueueBroker) checkSegmentOnFiler(segment *mq.Segment) (brokers []pb.ServerAddress, err error) { + return +} + +func (broker *MessageQueueBroker) checkSegmentsOnBrokers(segment *mq.Segment, brokers []pb.ServerAddress) (active bool, err error) { + var wg sync.WaitGroup + + for _, candidate := range brokers { + wg.Add(1) + go func(candidate pb.ServerAddress) { + defer wg.Done() + broker.withBrokerClient(false, candidate, func(client mq_pb.SeaweedMessagingClient) error { + resp, checkErr := client.CheckSegmentStatus(context.Background(), &mq_pb.CheckSegmentStatusRequest{ + Segment: &mq_pb.Segment{ + Namespace: string(segment.Topic.Namespace), + Topic: segment.Topic.Name, + Id: segment.Id, + }, + }) + if checkErr != nil { + err = checkErr + glog.V(0).Infof("check segment status on %s: %v", candidate, checkErr) + return nil + } + if resp.IsActive == false { + active = false + } + return nil + }) + }(candidate) + } + wg.Wait() + return +} + +func (broker *MessageQueueBroker) selectBrokers() (brokers []pb.ServerAddress, err error) { + candidates, err := broker.selectCandidatesFromMaster(10) + if err != nil { + return + } + brokers, err = broker.pickLightestCandidates(candidates, 3) + return +} + +func (broker *MessageQueueBroker) selectCandidatesFromMaster(limit int32) (candidates []pb.ServerAddress, err error) { + err = broker.withMasterClient(false, broker.MasterClient.GetMaster(), func(client master_pb.SeaweedClient) error { + resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ + ClientType: cluster.BrokerType, + FilerGroup: broker.option.FilerGroup, + Limit: limit, + }) + if err != nil { + return err + } + if len(resp.ClusterNodes) == 0 { + return nil + } + for _, node := range resp.ClusterNodes { + candidates = append(candidates, pb.ServerAddress(node.Address)) + } + return nil + }) + return +} + +type CandidateStatus struct { + address pb.ServerAddress + messageCount int64 + bytesCount int64 + load int64 +} + +func (broker *MessageQueueBroker) pickLightestCandidates(candidates []pb.ServerAddress, limit int) (selected []pb.ServerAddress, err error) { + + if len(candidates) <= limit { + return candidates, nil + } + + candidateStatuses, err := broker.checkBrokerStatus(candidates) + if err != nil { + return nil, err + } + + sort.Slice(candidateStatuses, func(i, j int) bool { + return candidateStatuses[i].load < candidateStatuses[j].load + }) + + for i, candidate := range candidateStatuses { + if i >= limit { + break + } + selected = append(selected, candidate.address) + } + + return +} + +func (broker *MessageQueueBroker) checkBrokerStatus(candidates []pb.ServerAddress) (candidateStatuses []*CandidateStatus, err error) { + + candidateStatuses = make([]*CandidateStatus, len(candidates)) + var wg sync.WaitGroup + for i, candidate := range candidates { + wg.Add(1) + go func(i int, candidate pb.ServerAddress) { + defer wg.Done() + err = broker.withBrokerClient(false, candidate, func(client mq_pb.SeaweedMessagingClient) error { + resp, checkErr := client.CheckBrokerLoad(context.Background(), &mq_pb.CheckBrokerLoadRequest{}) + if checkErr != nil { + err = checkErr + return err + } + candidateStatuses[i] = &CandidateStatus{ + address: candidate, + messageCount: resp.MessageCount, + bytesCount: resp.BytesCount, + load: resp.MessageCount + resp.BytesCount/(64*1024), + } + return nil + }) + }(i, candidate) + } + wg.Wait() + return +} + +func (broker *MessageQueueBroker) saveSegmentOnFiler(segment *mq.Segment, brokers []pb.ServerAddress) (err error) { + return } diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 63e248797..64ea7c666 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -59,3 +59,11 @@ func (broker *MessageQueueBroker) withMasterClient(streamingMode bool, master pb }) } + +func (broker *MessageQueueBroker) withBrokerClient(streamingMode bool, server pb.ServerAddress, fn func(client mq_pb.SeaweedMessagingClient) error) error { + + return pb.WithBrokerClient(streamingMode, server, broker.grpcDialOption, func(client mq_pb.SeaweedMessagingClient) error { + return fn(client) + }) + +} diff --git a/weed/mq/topic.go b/weed/mq/topic.go index fc1923af1..87621fca7 100644 --- a/weed/mq/topic.go +++ b/weed/mq/topic.go @@ -1,23 +1,36 @@ package mq -import "time" +import ( + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" + "time" +) type Namespace string type Topic struct { - namespace Namespace - name string + Namespace Namespace + Name string } type Partition struct { - rangeStart int - rangeStop int // exclusive - ringSize int + RangeStart int + RangeStop int // exclusive + RingSize int } type Segment struct { - topic Topic - id int32 - partition Partition - lastModified time.Time + Topic Topic + Id int32 + Partition Partition + LastModified time.Time +} + +func FromPbSegment(segment *mq_pb.Segment) *Segment { + return &Segment{ + Topic: Topic{ + Namespace: Namespace(segment.Namespace), + Name: segment.Topic, + }, + Id: segment.Id, + } } diff --git a/weed/pb/grpc_client_server.go b/weed/pb/grpc_client_server.go index 0a0d65a87..a97135060 100644 --- a/weed/pb/grpc_client_server.go +++ b/weed/pb/grpc_client_server.go @@ -216,6 +216,14 @@ func WithVolumeServerClient(streamingMode bool, volumeServer ServerAddress, grpc } +func WithBrokerClient(streamingMode bool, broker ServerAddress, grpcDialOption grpc.DialOption, fn func(client mq_pb.SeaweedMessagingClient) error) error { + return WithGrpcClient(streamingMode, func(grpcConnection *grpc.ClientConn) error { + client := mq_pb.NewSeaweedMessagingClient(grpcConnection) + return fn(client) + }, broker.ToGrpcAddress(), grpcDialOption) + +} + func WithOneOfGrpcMasterClients(streamingMode bool, masterGrpcAddresses map[string]ServerAddress, grpcDialOption grpc.DialOption, fn func(client master_pb.SeaweedClient) error) (err error) { for _, masterGrpcAddress := range masterGrpcAddresses { diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 19d2da16c..3f115c22a 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -317,6 +317,8 @@ message GetMasterConfigurationResponse { message ListClusterNodesRequest { string client_type = 1; string filer_group = 2; + bool is_leader_only = 3; + int32 limit = 4; } message ListClusterNodesResponse { message ClusterNode { diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 12372e62e..0a0d451da 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -2632,8 +2632,10 @@ type ListClusterNodesRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ClientType string `protobuf:"bytes,1,opt,name=client_type,json=clientType,proto3" json:"client_type,omitempty"` - FilerGroup string `protobuf:"bytes,2,opt,name=filer_group,json=filerGroup,proto3" json:"filer_group,omitempty"` + ClientType string `protobuf:"bytes,1,opt,name=client_type,json=clientType,proto3" json:"client_type,omitempty"` + FilerGroup string `protobuf:"bytes,2,opt,name=filer_group,json=filerGroup,proto3" json:"filer_group,omitempty"` + IsLeaderOnly bool `protobuf:"varint,3,opt,name=is_leader_only,json=isLeaderOnly,proto3" json:"is_leader_only,omitempty"` + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` } func (x *ListClusterNodesRequest) Reset() { @@ -2682,6 +2684,20 @@ func (x *ListClusterNodesRequest) GetFilerGroup() string { return "" } +func (x *ListClusterNodesRequest) GetIsLeaderOnly() bool { + if x != nil { + return x.IsLeaderOnly + } + return false +} + +func (x *ListClusterNodesRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + type ListClusterNodesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4165,204 +4181,207 @@ var file_master_proto_rawDesc = []byte{ 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x42, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x5b, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x22, 0xaa, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x54, 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0xb7, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x64, 0x61, 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x22, - 0xc5, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, - 0x63, 0x6b, 0x54, 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, - 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, - 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x22, 0x56, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, - 0x0a, 0x15, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x1e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, - 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, - 0x61, 0x67, 0x65, 0x32, 0xaf, 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, - 0x49, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x12, 0x14, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, - 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, - 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x28, 0x01, 0x30, 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x12, 0x18, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, - 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, - 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, - 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, + 0x6f, 0x63, 0x61, 0x74, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x24, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x4c, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xaa, 0x02, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0d, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x1a, 0xb7, 0x01, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x4e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, + 0x74, 0x61, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x63, 0x6b, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x61, 0x63, 0x6b, 0x22, 0xc5, 0x01, 0x0a, + 0x16, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, + 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x17, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x73, + 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x54, + 0x73, 0x4e, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, + 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4c, 0x6f, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x46, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4e, + 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x4e, 0x73, 0x22, 0x56, 0x0a, 0x14, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x22, 0x17, 0x0a, 0x15, 0x52, + 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x17, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x1e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x61, 0x0a, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x56, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x66, 0x66, 0x72, 0x61, 0x67, 0x65, + 0x32, 0xaf, 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x0d, + 0x53, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x14, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x58, 0x0a, 0x0d, 0x4b, 0x65, 0x65, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x51, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x6f, 0x6b, 0x75, 0x70, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x18, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x45, 0x63, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x45, 0x63, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x51, 0x0a, 0x0c, 0x56, 0x61, 0x63, 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, + 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x56, 0x61, 0x63, + 0x75, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, + 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, - 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, + 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, + 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, - 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, - 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, - 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6f, 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, - 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x41, 0x64, 0x6d, + 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x39, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x2e, 0x6d, 0x61, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x16, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0d, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, - 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, - 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, - 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, - 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0d, 0x52, 0x61, 0x66, 0x74, 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x1f, + 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x41, + 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, + 0x41, 0x64, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, + 0x73, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x66, 0x74, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, + 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x61, 0x73, + 0x74, 0x65, 0x72, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/weed/pb/mq.proto b/weed/pb/mq.proto index 47bd1775e..1f91170fd 100644 --- a/weed/pb/mq.proto +++ b/weed/pb/mq.proto @@ -10,7 +10,13 @@ option java_outer_classname = "MessagQueueProto"; service SeaweedMessaging { - rpc FindBrokerLeader (FindBrokerLeader) returns (FindBrokerLeaderResponse) { + rpc FindBrokerLeader (FindBrokerLeaderRequest) returns (FindBrokerLeaderResponse) { + } + rpc AssignSegmentBrokers (AssignSegmentBrokersRequest) returns (AssignSegmentBrokersResponse) { + } + rpc CheckSegmentStatus (CheckSegmentStatusRequest) returns (CheckSegmentStatusResponse) { + } + rpc CheckBrokerLoad (CheckBrokerLoadRequest) returns (CheckBrokerLoadResponse) { } } @@ -18,8 +24,47 @@ service SeaweedMessaging { ////////////////////////////////////////////////// message FindBrokerLeaderRequest { + string filer_group = 1; } message FindBrokerLeaderResponse { string broker = 1; } + +message Partition { + int32 ring_size = 1; + int32 range_start = 2; + int32 range_stop = 3; +} + +message Segment { + string namespace = 1; + string topic = 2; + int32 id = 3; + Partition partition = 4; +} + +message AssignSegmentBrokersRequest { + Segment segment = 1; +} + +message AssignSegmentBrokersResponse { + repeated string brokers = 1; +} + +message CheckSegmentStatusRequest { + Segment segment = 1; +} + +message CheckSegmentStatusResponse { + bool is_active = 1; +} + +message CheckBrokerLoadRequest { +} + +message CheckBrokerLoadResponse { + int64 message_count = 1; + int64 bytes_count = 2; + +} diff --git a/weed/pb/mq_pb/mq.pb.go b/weed/pb/mq_pb/mq.pb.go index a5d63c8d9..e305ba8d0 100644 --- a/weed/pb/mq_pb/mq.pb.go +++ b/weed/pb/mq_pb/mq.pb.go @@ -24,6 +24,8 @@ type FindBrokerLeaderRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + FilerGroup string `protobuf:"bytes,1,opt,name=filer_group,json=filerGroup,proto3" json:"filer_group,omitempty"` } func (x *FindBrokerLeaderRequest) Reset() { @@ -58,6 +60,13 @@ func (*FindBrokerLeaderRequest) Descriptor() ([]byte, []int) { return file_mq_proto_rawDescGZIP(), []int{0} } +func (x *FindBrokerLeaderRequest) GetFilerGroup() string { + if x != nil { + return x.FilerGroup + } + return "" +} + type FindBrokerLeaderResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -105,29 +114,506 @@ func (x *FindBrokerLeaderResponse) GetBroker() string { return "" } +type Partition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RingSize int32 `protobuf:"varint,1,opt,name=ring_size,json=ringSize,proto3" json:"ring_size,omitempty"` + RangeStart int32 `protobuf:"varint,2,opt,name=range_start,json=rangeStart,proto3" json:"range_start,omitempty"` + RangeStop int32 `protobuf:"varint,3,opt,name=range_stop,json=rangeStop,proto3" json:"range_stop,omitempty"` +} + +func (x *Partition) Reset() { + *x = Partition{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Partition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Partition) ProtoMessage() {} + +func (x *Partition) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[2] + 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 Partition.ProtoReflect.Descriptor instead. +func (*Partition) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{2} +} + +func (x *Partition) GetRingSize() int32 { + if x != nil { + return x.RingSize + } + return 0 +} + +func (x *Partition) GetRangeStart() int32 { + if x != nil { + return x.RangeStart + } + return 0 +} + +func (x *Partition) GetRangeStop() int32 { + if x != nil { + return x.RangeStop + } + return 0 +} + +type Segment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Namespace string `protobuf:"bytes,1,opt,name=namespace,proto3" json:"namespace,omitempty"` + Topic string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"` + Id int32 `protobuf:"varint,3,opt,name=id,proto3" json:"id,omitempty"` + Partition *Partition `protobuf:"bytes,4,opt,name=partition,proto3" json:"partition,omitempty"` +} + +func (x *Segment) Reset() { + *x = Segment{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Segment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Segment) ProtoMessage() {} + +func (x *Segment) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[3] + 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 Segment.ProtoReflect.Descriptor instead. +func (*Segment) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{3} +} + +func (x *Segment) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Segment) GetTopic() string { + if x != nil { + return x.Topic + } + return "" +} + +func (x *Segment) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Segment) GetPartition() *Partition { + if x != nil { + return x.Partition + } + return nil +} + +type AssignSegmentBrokersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Segment *Segment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"` +} + +func (x *AssignSegmentBrokersRequest) Reset() { + *x = AssignSegmentBrokersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssignSegmentBrokersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignSegmentBrokersRequest) ProtoMessage() {} + +func (x *AssignSegmentBrokersRequest) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[4] + 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 AssignSegmentBrokersRequest.ProtoReflect.Descriptor instead. +func (*AssignSegmentBrokersRequest) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{4} +} + +func (x *AssignSegmentBrokersRequest) GetSegment() *Segment { + if x != nil { + return x.Segment + } + return nil +} + +type AssignSegmentBrokersResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Brokers []string `protobuf:"bytes,1,rep,name=brokers,proto3" json:"brokers,omitempty"` +} + +func (x *AssignSegmentBrokersResponse) Reset() { + *x = AssignSegmentBrokersResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssignSegmentBrokersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignSegmentBrokersResponse) ProtoMessage() {} + +func (x *AssignSegmentBrokersResponse) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[5] + 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 AssignSegmentBrokersResponse.ProtoReflect.Descriptor instead. +func (*AssignSegmentBrokersResponse) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{5} +} + +func (x *AssignSegmentBrokersResponse) GetBrokers() []string { + if x != nil { + return x.Brokers + } + return nil +} + +type CheckSegmentStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Segment *Segment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"` +} + +func (x *CheckSegmentStatusRequest) Reset() { + *x = CheckSegmentStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckSegmentStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckSegmentStatusRequest) ProtoMessage() {} + +func (x *CheckSegmentStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[6] + 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 CheckSegmentStatusRequest.ProtoReflect.Descriptor instead. +func (*CheckSegmentStatusRequest) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{6} +} + +func (x *CheckSegmentStatusRequest) GetSegment() *Segment { + if x != nil { + return x.Segment + } + return nil +} + +type CheckSegmentStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsActive bool `protobuf:"varint,1,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"` +} + +func (x *CheckSegmentStatusResponse) Reset() { + *x = CheckSegmentStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckSegmentStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckSegmentStatusResponse) ProtoMessage() {} + +func (x *CheckSegmentStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[7] + 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 CheckSegmentStatusResponse.ProtoReflect.Descriptor instead. +func (*CheckSegmentStatusResponse) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{7} +} + +func (x *CheckSegmentStatusResponse) GetIsActive() bool { + if x != nil { + return x.IsActive + } + return false +} + +type CheckBrokerLoadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CheckBrokerLoadRequest) Reset() { + *x = CheckBrokerLoadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckBrokerLoadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckBrokerLoadRequest) ProtoMessage() {} + +func (x *CheckBrokerLoadRequest) ProtoReflect() protoreflect.Message { + mi := &file_mq_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 CheckBrokerLoadRequest.ProtoReflect.Descriptor instead. +func (*CheckBrokerLoadRequest) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{8} +} + +type CheckBrokerLoadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageCount int64 `protobuf:"varint,1,opt,name=message_count,json=messageCount,proto3" json:"message_count,omitempty"` + BytesCount int64 `protobuf:"varint,2,opt,name=bytes_count,json=bytesCount,proto3" json:"bytes_count,omitempty"` +} + +func (x *CheckBrokerLoadResponse) Reset() { + *x = CheckBrokerLoadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckBrokerLoadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckBrokerLoadResponse) ProtoMessage() {} + +func (x *CheckBrokerLoadResponse) ProtoReflect() protoreflect.Message { + mi := &file_mq_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 CheckBrokerLoadResponse.ProtoReflect.Descriptor instead. +func (*CheckBrokerLoadResponse) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{9} +} + +func (x *CheckBrokerLoadResponse) GetMessageCount() int64 { + if x != nil { + return x.MessageCount + } + return 0 +} + +func (x *CheckBrokerLoadResponse) GetBytesCount() int64 { + if x != nil { + return x.BytesCount + } + return 0 +} + var File_mq_proto protoreflect.FileDescriptor var file_mq_proto_rawDesc = []byte{ 0x0a, 0x08, 0x6d, 0x71, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x19, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x3a, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x32, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x32, 0x77, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, 0x65, - 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x10, 0x46, - 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, - 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, - 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, - 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, - 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, - 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x22, 0x32, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, + 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, + 0x6f, 0x70, 0x22, 0x84, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, + 0x69, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, + 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x1b, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x1c, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x73, 0x22, 0x4c, 0x0a, 0x19, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x39, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x18, 0x0a, 0x16, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xb5, 0x03, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, + 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x10, + 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x12, 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, + 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x69, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, + 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, + 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, 0x42, + 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, + 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, + 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -142,19 +628,36 @@ func file_mq_proto_rawDescGZIP() []byte { return file_mq_proto_rawDescData } -var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_mq_proto_goTypes = []interface{}{ - (*FindBrokerLeaderRequest)(nil), // 0: messaging_pb.FindBrokerLeaderRequest - (*FindBrokerLeaderResponse)(nil), // 1: messaging_pb.FindBrokerLeaderResponse + (*FindBrokerLeaderRequest)(nil), // 0: messaging_pb.FindBrokerLeaderRequest + (*FindBrokerLeaderResponse)(nil), // 1: messaging_pb.FindBrokerLeaderResponse + (*Partition)(nil), // 2: messaging_pb.Partition + (*Segment)(nil), // 3: messaging_pb.Segment + (*AssignSegmentBrokersRequest)(nil), // 4: messaging_pb.AssignSegmentBrokersRequest + (*AssignSegmentBrokersResponse)(nil), // 5: messaging_pb.AssignSegmentBrokersResponse + (*CheckSegmentStatusRequest)(nil), // 6: messaging_pb.CheckSegmentStatusRequest + (*CheckSegmentStatusResponse)(nil), // 7: messaging_pb.CheckSegmentStatusResponse + (*CheckBrokerLoadRequest)(nil), // 8: messaging_pb.CheckBrokerLoadRequest + (*CheckBrokerLoadResponse)(nil), // 9: messaging_pb.CheckBrokerLoadResponse } var file_mq_proto_depIdxs = []int32{ - 0, // 0: messaging_pb.SeaweedMessaging.FindBrokerLeader:input_type -> messaging_pb.FindBrokerLeaderRequest - 1, // 1: messaging_pb.SeaweedMessaging.FindBrokerLeader:output_type -> messaging_pb.FindBrokerLeaderResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 2, // 0: messaging_pb.Segment.partition:type_name -> messaging_pb.Partition + 3, // 1: messaging_pb.AssignSegmentBrokersRequest.segment:type_name -> messaging_pb.Segment + 3, // 2: messaging_pb.CheckSegmentStatusRequest.segment:type_name -> messaging_pb.Segment + 0, // 3: messaging_pb.SeaweedMessaging.FindBrokerLeader:input_type -> messaging_pb.FindBrokerLeaderRequest + 4, // 4: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:input_type -> messaging_pb.AssignSegmentBrokersRequest + 6, // 5: messaging_pb.SeaweedMessaging.CheckSegmentStatus:input_type -> messaging_pb.CheckSegmentStatusRequest + 8, // 6: messaging_pb.SeaweedMessaging.CheckBrokerLoad:input_type -> messaging_pb.CheckBrokerLoadRequest + 1, // 7: messaging_pb.SeaweedMessaging.FindBrokerLeader:output_type -> messaging_pb.FindBrokerLeaderResponse + 5, // 8: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:output_type -> messaging_pb.AssignSegmentBrokersResponse + 7, // 9: messaging_pb.SeaweedMessaging.CheckSegmentStatus:output_type -> messaging_pb.CheckSegmentStatusResponse + 9, // 10: messaging_pb.SeaweedMessaging.CheckBrokerLoad:output_type -> messaging_pb.CheckBrokerLoadResponse + 7, // [7:11] is the sub-list for method output_type + 3, // [3:7] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_mq_proto_init() } @@ -187,6 +690,102 @@ func file_mq_proto_init() { return nil } } + file_mq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Partition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Segment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AssignSegmentBrokersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AssignSegmentBrokersResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckSegmentStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckSegmentStatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckBrokerLoadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckBrokerLoadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -194,7 +793,7 @@ func file_mq_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mq_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 10, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/pb/mq_pb/mq_grpc.pb.go b/weed/pb/mq_pb/mq_grpc.pb.go index 5851632cc..463888dac 100644 --- a/weed/pb/mq_pb/mq_grpc.pb.go +++ b/weed/pb/mq_pb/mq_grpc.pb.go @@ -19,6 +19,9 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SeaweedMessagingClient interface { FindBrokerLeader(ctx context.Context, in *FindBrokerLeaderRequest, opts ...grpc.CallOption) (*FindBrokerLeaderResponse, error) + AssignSegmentBrokers(ctx context.Context, in *AssignSegmentBrokersRequest, opts ...grpc.CallOption) (*AssignSegmentBrokersResponse, error) + CheckSegmentStatus(ctx context.Context, in *CheckSegmentStatusRequest, opts ...grpc.CallOption) (*CheckSegmentStatusResponse, error) + CheckBrokerLoad(ctx context.Context, in *CheckBrokerLoadRequest, opts ...grpc.CallOption) (*CheckBrokerLoadResponse, error) } type seaweedMessagingClient struct { @@ -38,11 +41,41 @@ func (c *seaweedMessagingClient) FindBrokerLeader(ctx context.Context, in *FindB return out, nil } +func (c *seaweedMessagingClient) AssignSegmentBrokers(ctx context.Context, in *AssignSegmentBrokersRequest, opts ...grpc.CallOption) (*AssignSegmentBrokersResponse, error) { + out := new(AssignSegmentBrokersResponse) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/AssignSegmentBrokers", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *seaweedMessagingClient) CheckSegmentStatus(ctx context.Context, in *CheckSegmentStatusRequest, opts ...grpc.CallOption) (*CheckSegmentStatusResponse, error) { + out := new(CheckSegmentStatusResponse) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/CheckSegmentStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *seaweedMessagingClient) CheckBrokerLoad(ctx context.Context, in *CheckBrokerLoadRequest, opts ...grpc.CallOption) (*CheckBrokerLoadResponse, error) { + out := new(CheckBrokerLoadResponse) + err := c.cc.Invoke(ctx, "/messaging_pb.SeaweedMessaging/CheckBrokerLoad", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // SeaweedMessagingServer is the server API for SeaweedMessaging service. // All implementations must embed UnimplementedSeaweedMessagingServer // for forward compatibility type SeaweedMessagingServer interface { FindBrokerLeader(context.Context, *FindBrokerLeaderRequest) (*FindBrokerLeaderResponse, error) + AssignSegmentBrokers(context.Context, *AssignSegmentBrokersRequest) (*AssignSegmentBrokersResponse, error) + CheckSegmentStatus(context.Context, *CheckSegmentStatusRequest) (*CheckSegmentStatusResponse, error) + CheckBrokerLoad(context.Context, *CheckBrokerLoadRequest) (*CheckBrokerLoadResponse, error) mustEmbedUnimplementedSeaweedMessagingServer() } @@ -53,6 +86,15 @@ type UnimplementedSeaweedMessagingServer struct { func (UnimplementedSeaweedMessagingServer) FindBrokerLeader(context.Context, *FindBrokerLeaderRequest) (*FindBrokerLeaderResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FindBrokerLeader not implemented") } +func (UnimplementedSeaweedMessagingServer) AssignSegmentBrokers(context.Context, *AssignSegmentBrokersRequest) (*AssignSegmentBrokersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AssignSegmentBrokers not implemented") +} +func (UnimplementedSeaweedMessagingServer) CheckSegmentStatus(context.Context, *CheckSegmentStatusRequest) (*CheckSegmentStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckSegmentStatus not implemented") +} +func (UnimplementedSeaweedMessagingServer) CheckBrokerLoad(context.Context, *CheckBrokerLoadRequest) (*CheckBrokerLoadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CheckBrokerLoad not implemented") +} func (UnimplementedSeaweedMessagingServer) mustEmbedUnimplementedSeaweedMessagingServer() {} // UnsafeSeaweedMessagingServer may be embedded to opt out of forward compatibility for this service. @@ -84,6 +126,60 @@ func _SeaweedMessaging_FindBrokerLeader_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _SeaweedMessaging_AssignSegmentBrokers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AssignSegmentBrokersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SeaweedMessagingServer).AssignSegmentBrokers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/messaging_pb.SeaweedMessaging/AssignSegmentBrokers", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SeaweedMessagingServer).AssignSegmentBrokers(ctx, req.(*AssignSegmentBrokersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SeaweedMessaging_CheckSegmentStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CheckSegmentStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SeaweedMessagingServer).CheckSegmentStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/messaging_pb.SeaweedMessaging/CheckSegmentStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SeaweedMessagingServer).CheckSegmentStatus(ctx, req.(*CheckSegmentStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SeaweedMessaging_CheckBrokerLoad_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CheckBrokerLoadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SeaweedMessagingServer).CheckBrokerLoad(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/messaging_pb.SeaweedMessaging/CheckBrokerLoad", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SeaweedMessagingServer).CheckBrokerLoad(ctx, req.(*CheckBrokerLoadRequest)) + } + return interceptor(ctx, in, info, handler) +} + // SeaweedMessaging_ServiceDesc is the grpc.ServiceDesc for SeaweedMessaging service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -95,6 +191,18 @@ var SeaweedMessaging_ServiceDesc = grpc.ServiceDesc{ MethodName: "FindBrokerLeader", Handler: _SeaweedMessaging_FindBrokerLeader_Handler, }, + { + MethodName: "AssignSegmentBrokers", + Handler: _SeaweedMessaging_AssignSegmentBrokers_Handler, + }, + { + MethodName: "CheckSegmentStatus", + Handler: _SeaweedMessaging_CheckSegmentStatus_Handler, + }, + { + MethodName: "CheckBrokerLoad", + Handler: _SeaweedMessaging_CheckBrokerLoad_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "mq.proto", diff --git a/weed/server/master_grpc_server_cluster.go b/weed/server/master_grpc_server_cluster.go index e368cb763..6a8852bee 100644 --- a/weed/server/master_grpc_server_cluster.go +++ b/weed/server/master_grpc_server_cluster.go @@ -11,17 +11,28 @@ import ( func (ms *MasterServer) ListClusterNodes(ctx context.Context, req *master_pb.ListClusterNodesRequest) (*master_pb.ListClusterNodesResponse, error) { resp := &master_pb.ListClusterNodesResponse{} filerGroup := cluster.FilerGroupName(req.FilerGroup) - clusterNodes := ms.Cluster.ListClusterNode(filerGroup, req.ClientType) - for _, node := range clusterNodes { - resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{ - Address: string(node.Address), - Version: node.Version, - IsLeader: ms.Cluster.IsOneLeader(filerGroup, req.ClientType, node.Address), - CreatedAtNs: node.CreatedTs.UnixNano(), - DataCenter: string(node.DataCenter), - Rack: string(node.Rack), - }) + if req.IsLeaderOnly { + leaders := ms.Cluster.ListClusterNodeLeaders(filerGroup, req.ClientType) + for _, node := range leaders { + resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{ + Address: string(node), + IsLeader: true, + }) + } + } else { + clusterNodes := ms.Cluster.ListClusterNode(filerGroup, req.ClientType) + clusterNodes = limitTo(clusterNodes, req.Limit) + for _, node := range clusterNodes { + resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{ + Address: string(node.Address), + Version: node.Version, + IsLeader: ms.Cluster.IsOneLeader(filerGroup, req.ClientType, node.Address), + CreatedAtNs: node.CreatedTs.UnixNano(), + DataCenter: string(node.DataCenter), + Rack: string(node.Rack), + }) + } } return resp, nil } @@ -41,3 +52,21 @@ func (ms *MasterServer) GetOneFiler(filerGroup cluster.FilerGroupName) pb.Server } return "localhost:8888" } + +func limitTo(nodes []*cluster.ClusterNode, limit int32) (selected []*cluster.ClusterNode) { + if limit <= 0 || len(nodes) < int(limit) { + return nodes + } + seletedSet := make(map[pb.ServerAddress]*cluster.ClusterNode) + for i := 0; i < int(limit)*3; i++ { + x := rand.Intn(len(nodes)) + if _, found := seletedSet[nodes[x].Address]; found { + continue + } + seletedSet[nodes[x].Address] = nodes[x] + } + for _, node := range seletedSet { + selected = append(selected, node) + } + return +} diff --git a/weed/shell/command_cluster_ps.go b/weed/shell/command_cluster_ps.go index 974815a15..f620df3f7 100644 --- a/weed/shell/command_cluster_ps.go +++ b/weed/shell/command_cluster_ps.go @@ -86,6 +86,9 @@ func (c *commandClusterPs) Do(args []string, commandEnv *CommandEnv, writer io.W if node.Rack != "" { fmt.Fprintf(writer, " Rack: %v\n", node.Rack) } + if node.IsLeader { + fmt.Fprintf(writer, " IsLeader: %v\n", true) + } } } From 11d79615c882b8ab635a882ee6654d8cb1e38468 Mon Sep 17 00:00:00 2001 From: chrislu Date: Tue, 12 Jul 2022 02:00:54 -0700 Subject: [PATCH 13/17] dynamically connect to a filer --- weed/cluster/master_client.go | 34 +++++++++ weed/command/mq_broker.go | 30 -------- weed/command/server.go | 1 - weed/filer/filer.go | 23 +----- .../mq/broker/broker_grpc_server_discovery.go | 72 ------------------- weed/mq/broker/broker_server.go | 40 ++++++++++- 6 files changed, 72 insertions(+), 128 deletions(-) create mode 100644 weed/cluster/master_client.go delete mode 100644 weed/mq/broker/broker_grpc_server_discovery.go diff --git a/weed/cluster/master_client.go b/weed/cluster/master_client.go new file mode 100644 index 000000000..b9b1673f3 --- /dev/null +++ b/weed/cluster/master_client.go @@ -0,0 +1,34 @@ +package cluster + +import ( + "context" + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/master_pb" + "google.golang.org/grpc" +) + +func ListExistingPeerUpdates(master pb.ServerAddress, grpcDialOption grpc.DialOption, filerGroup string, clientType string) (existingNodes []*master_pb.ClusterNodeUpdate) { + + if grpcErr := pb.WithMasterClient(false, master, grpcDialOption, func(client master_pb.SeaweedClient) error { + resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ + ClientType: clientType, + FilerGroup: filerGroup, + }) + + glog.V(0).Infof("the cluster has %d %s\n", len(resp.ClusterNodes), clientType) + for _, node := range resp.ClusterNodes { + existingNodes = append(existingNodes, &master_pb.ClusterNodeUpdate{ + NodeType: FilerType, + Address: node.Address, + IsLeader: node.IsLeader, + IsAdd: true, + CreatedAtNs: node.CreatedAtNs, + }) + } + return err + }); grpcErr != nil { + glog.V(0).Infof("connect to %s: %v", master, grpcErr) + } + return +} diff --git a/weed/command/mq_broker.go b/weed/command/mq_broker.go index cce77bf8e..1b31d0141 100644 --- a/weed/command/mq_broker.go +++ b/weed/command/mq_broker.go @@ -1,10 +1,6 @@ package command import ( - "context" - "fmt" - "time" - "google.golang.org/grpc/reflection" "github.com/chrislusf/seaweedfs/weed/util/grace" @@ -12,7 +8,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/mq/broker" "github.com/chrislusf/seaweedfs/weed/pb" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/security" "github.com/chrislusf/seaweedfs/weed/util" @@ -26,7 +21,6 @@ type MessageQueueBrokerOptions struct { masters map[string]pb.ServerAddress mastersString *string filerGroup *string - filer *string ip *string port *int dataCenter *string @@ -38,7 +32,6 @@ type MessageQueueBrokerOptions struct { func init() { cmdMqBroker.Run = runMqBroker // break init cycle mqBrokerStandaloneOptions.mastersString = cmdMqBroker.Flag.String("master", "localhost:9333", "comma-separated master servers") - mqBrokerStandaloneOptions.filer = cmdMqBroker.Flag.String("filer", "localhost:8888", "filer server address") mqBrokerStandaloneOptions.filerGroup = cmdMqBroker.Flag.String("filerGroup", "", "share metadata with other filers in the same filerGroup") mqBrokerStandaloneOptions.ip = cmdMqBroker.Flag.String("ip", util.DetectedHostAddress(), "broker host address") mqBrokerStandaloneOptions.port = cmdMqBroker.Flag.Int("port", 17777, "broker gRPC listen port") @@ -73,40 +66,17 @@ func (mqBrokerOpt *MessageQueueBrokerOptions) startQueueServer() bool { grace.SetupProfiling(*mqBrokerStandaloneOptions.cpuprofile, *mqBrokerStandaloneOptions.memprofile) - filerAddress := pb.ServerAddress(*mqBrokerOpt.filer) - grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.msg_broker") - cipher := false - - for { - err := pb.WithGrpcFilerClient(false, filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) - if err != nil { - return fmt.Errorf("get filer %s configuration: %v", filerAddress, err) - } - cipher = resp.Cipher - return nil - }) - if err != nil { - glog.V(0).Infof("wait to connect to filer %s grpc address %s", *mqBrokerOpt.filer, filerAddress.ToGrpcAddress()) - time.Sleep(time.Second) - } else { - glog.V(0).Infof("connected to filer %s grpc address %s", *mqBrokerOpt.filer, filerAddress.ToGrpcAddress()) - break - } - } qs, err := broker.NewMessageBroker(&broker.MessageQueueBrokerOption{ Masters: mqBrokerOpt.masters, FilerGroup: *mqBrokerOpt.filerGroup, DataCenter: *mqBrokerOpt.dataCenter, Rack: *mqBrokerOpt.rack, - Filers: []pb.ServerAddress{filerAddress}, DefaultReplication: "", MaxMB: 0, Ip: *mqBrokerOpt.ip, Port: *mqBrokerOpt.port, - Cipher: cipher, }, grpcDialOption) // start grpc listener diff --git a/weed/command/server.go b/weed/command/server.go index 04b07ed51..b993d9428 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -228,7 +228,6 @@ func runServer(cmd *Command, args []string) bool { s3Options.filer = &filerAddress iamOptions.filer = &filerAddress webdavOptions.filer = &filerAddress - mqBrokerOptions.filer = &filerAddress mqBrokerOptions.filerGroup = filerOptions.filerGroup go stats_collect.StartMetricsServer(*serverMetricsHttpPort) diff --git a/weed/filer/filer.go b/weed/filer/filer.go index b1582bd30..386d27898 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -99,28 +99,7 @@ func (f *Filer) AggregateFromPeers(self pb.ServerAddress, existingNodes []*maste } func (f *Filer) ListExistingPeerUpdates() (existingNodes []*master_pb.ClusterNodeUpdate) { - - if grpcErr := pb.WithMasterClient(false, f.MasterClient.GetMaster(), f.GrpcDialOption, func(client master_pb.SeaweedClient) error { - resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ - ClientType: cluster.FilerType, - FilerGroup: f.MasterClient.FilerGroup, - }) - - glog.V(0).Infof("the cluster has %d filers\n", len(resp.ClusterNodes)) - for _, node := range resp.ClusterNodes { - existingNodes = append(existingNodes, &master_pb.ClusterNodeUpdate{ - NodeType: cluster.FilerType, - Address: node.Address, - IsLeader: node.IsLeader, - IsAdd: true, - CreatedAtNs: node.CreatedAtNs, - }) - } - return err - }); grpcErr != nil { - glog.V(0).Infof("connect to %s: %v", f.MasterClient.GetMaster(), grpcErr) - } - return + return cluster.ListExistingPeerUpdates(f.GetMaster(), f.GrpcDialOption, f.MasterClient.FilerGroup, cluster.FilerType) } func (f *Filer) SetStore(store FilerStore) (isFresh bool) { diff --git a/weed/mq/broker/broker_grpc_server_discovery.go b/weed/mq/broker/broker_grpc_server_discovery.go deleted file mode 100644 index 94e89cd41..000000000 --- a/weed/mq/broker/broker_grpc_server_discovery.go +++ /dev/null @@ -1,72 +0,0 @@ -package broker - -import ( - "context" - "github.com/chrislusf/seaweedfs/weed/cluster" - "github.com/chrislusf/seaweedfs/weed/pb" - "time" - - "github.com/chrislusf/seaweedfs/weed/glog" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" - "github.com/chrislusf/seaweedfs/weed/pb/master_pb" -) - -func (broker *MessageQueueBroker) checkFilers() { - - // contact a filer about masters - var masters []pb.ServerAddress - found := false - for !found { - for _, filer := range broker.option.Filers { - err := broker.withFilerClient(false, filer, func(client filer_pb.SeaweedFilerClient) error { - resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{}) - if err != nil { - return err - } - for _, m := range resp.Masters { - masters = append(masters, pb.ServerAddress(m)) - } - return nil - }) - if err == nil { - found = true - break - } - glog.V(0).Infof("failed to read masters from %+v: %v", broker.option.Filers, err) - time.Sleep(time.Second) - } - } - glog.V(0).Infof("received master list: %s", masters) - - // contact each masters for filers - var filers []pb.ServerAddress - found = false - for !found { - for _, master := range masters { - err := broker.withMasterClient(false, master, func(client master_pb.SeaweedClient) error { - resp, err := client.ListClusterNodes(context.Background(), &master_pb.ListClusterNodesRequest{ - ClientType: cluster.FilerType, - }) - if err != nil { - return err - } - - for _, clusterNode := range resp.ClusterNodes { - filers = append(filers, pb.ServerAddress(clusterNode.Address)) - } - - return nil - }) - if err == nil { - found = true - break - } - glog.V(0).Infof("failed to list filers: %v", err) - time.Sleep(time.Second) - } - } - glog.V(0).Infof("received filer list: %s", filers) - - broker.option.Filers = filers - -} diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index 64ea7c666..f940b00c3 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -5,6 +5,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "github.com/chrislusf/seaweedfs/weed/wdclient" "google.golang.org/grpc" + "time" "github.com/chrislusf/seaweedfs/weed/pb" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" @@ -16,7 +17,6 @@ type MessageQueueBrokerOption struct { FilerGroup string DataCenter string Rack string - Filers []pb.ServerAddress DefaultReplication string MaxMB int Ip string @@ -29,6 +29,8 @@ type MessageQueueBroker struct { option *MessageQueueBrokerOption grpcDialOption grpc.DialOption MasterClient *wdclient.MasterClient + filers map[pb.ServerAddress]struct{} + currentFiler pb.ServerAddress } func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.DialOption) (mqBroker *MessageQueueBroker, err error) { @@ -37,15 +39,47 @@ func NewMessageBroker(option *MessageQueueBrokerOption, grpcDialOption grpc.Dial option: option, grpcDialOption: grpcDialOption, MasterClient: wdclient.NewMasterClient(grpcDialOption, option.FilerGroup, cluster.BrokerType, pb.NewServerAddress(option.Ip, option.Port, 0), option.DataCenter, option.Rack, option.Masters), + filers: make(map[pb.ServerAddress]struct{}), } - - mqBroker.checkFilers() + mqBroker.MasterClient.OnPeerUpdate = mqBroker.OnBrokerUpdate go mqBroker.MasterClient.KeepConnectedToMaster() + existingNodes := cluster.ListExistingPeerUpdates(mqBroker.MasterClient.GetMaster(), grpcDialOption, option.FilerGroup, cluster.FilerType) + for _, newNode := range existingNodes { + mqBroker.OnBrokerUpdate(newNode, time.Now()) + } + return mqBroker, nil } +func (broker *MessageQueueBroker) OnBrokerUpdate(update *master_pb.ClusterNodeUpdate, startFrom time.Time) { + if update.NodeType != cluster.FilerType { + return + } + + address := pb.ServerAddress(update.Address) + if update.IsAdd { + broker.filers[address] = struct{}{} + if broker.currentFiler == "" { + broker.currentFiler = address + } + } else { + delete(broker.filers, address) + if broker.currentFiler == address { + for filer, _ := range broker.filers { + broker.currentFiler = filer + break + } + } + } + +} + +func (broker *MessageQueueBroker) GetFiler() pb.ServerAddress { + return broker.currentFiler +} + func (broker *MessageQueueBroker) withFilerClient(streamingMode bool, filer pb.ServerAddress, fn func(filer_pb.SeaweedFilerClient) error) error { return pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn) From 113a4546fd36b9a0eb78c4e462f38f7488cf1e88 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sat, 16 Jul 2022 10:49:34 -0700 Subject: [PATCH 14/17] segment serde --- weed/mq/broker/brokder_grpc_admin.go | 31 +- weed/mq/broker/broker_segment_serde.go | 89 ++++++ weed/mq/broker/broker_server.go | 10 +- weed/mq/topic.go | 32 +- weed/pb/mq.proto | 10 + weed/pb/mq_pb/mq.pb.go | 407 ++++++++++++++++--------- 6 files changed, 411 insertions(+), 168 deletions(-) create mode 100644 weed/mq/broker/broker_segment_serde.go diff --git a/weed/mq/broker/brokder_grpc_admin.go b/weed/mq/broker/brokder_grpc_admin.go index 31b5bb84e..0dfb69c50 100644 --- a/weed/mq/broker/brokder_grpc_admin.go +++ b/weed/mq/broker/brokder_grpc_admin.go @@ -53,16 +53,19 @@ func (broker *MessageQueueBroker) AssignSegmentBrokers(c context.Context, reques if err != nil { return ret, err } - // good if the segment is still on the brokers - isActive, err := broker.checkSegmentsOnBrokers(segment, existingBrokers) - if err != nil { - return ret, err - } - if isActive { - for _, broker := range existingBrokers { - ret.Brokers = append(ret.Brokers, string(broker)) + + if len(existingBrokers) > 0 { + // good if the segment is still on the brokers + isActive, err := broker.checkSegmentsOnBrokers(segment, existingBrokers) + if err != nil { + return ret, err + } + if isActive { + for _, broker := range existingBrokers { + ret.Brokers = append(ret.Brokers, string(broker)) + } + return ret, nil } - return ret, nil } // randomly pick up to 10 brokers, and find the ones with the lightest load @@ -72,7 +75,7 @@ func (broker *MessageQueueBroker) AssignSegmentBrokers(c context.Context, reques } // save the allocated brokers info for this segment on the filer - if err := broker.saveSegmentOnFiler(segment, selectedBrokers); err != nil { + if err := broker.saveSegmentBrokersOnFiler(segment, selectedBrokers); err != nil { return ret, err } @@ -82,10 +85,6 @@ func (broker *MessageQueueBroker) AssignSegmentBrokers(c context.Context, reques return ret, nil } -func (broker *MessageQueueBroker) checkSegmentOnFiler(segment *mq.Segment) (brokers []pb.ServerAddress, err error) { - return -} - func (broker *MessageQueueBroker) checkSegmentsOnBrokers(segment *mq.Segment, brokers []pb.ServerAddress) (active bool, err error) { var wg sync.WaitGroup @@ -206,7 +205,3 @@ func (broker *MessageQueueBroker) checkBrokerStatus(candidates []pb.ServerAddres wg.Wait() return } - -func (broker *MessageQueueBroker) saveSegmentOnFiler(segment *mq.Segment, brokers []pb.ServerAddress) (err error) { - return -} diff --git a/weed/mq/broker/broker_segment_serde.go b/weed/mq/broker/broker_segment_serde.go new file mode 100644 index 000000000..25fca005b --- /dev/null +++ b/weed/mq/broker/broker_segment_serde.go @@ -0,0 +1,89 @@ +package broker + +import ( + "bytes" + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" + "github.com/chrislusf/seaweedfs/weed/mq" + "github.com/chrislusf/seaweedfs/weed/pb" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" + "github.com/golang/protobuf/jsonpb" + "time" +) + +func (broker *MessageQueueBroker) checkSegmentOnFiler(segment *mq.Segment) (brokers []pb.ServerAddress, err error) { + info, found, err := broker.readSegmentOnFiler(segment) + if err != nil { + return + } + if !found { + return + } + for _, b := range info.Brokers { + brokers = append(brokers, pb.ServerAddress(b)) + } + + return +} + +func (broker *MessageQueueBroker) saveSegmentBrokersOnFiler(segment *mq.Segment, brokers []pb.ServerAddress) (err error) { + var nodes []string + for _, b := range brokers { + nodes = append(nodes, string(b)) + } + broker.saveSegmentToFiler(segment, &mq_pb.SegmentInfo{ + Segment: segment.ToPbSegment(), + StartTsNs: time.Now().UnixNano(), + Brokers: nodes, + StopTsNs: 0, + PreviousSegments: nil, + NextSegments: nil, + }) + return +} + +func (broker *MessageQueueBroker) readSegmentOnFiler(segment *mq.Segment) (info *mq_pb.SegmentInfo, found bool, err error) { + dir, name := segment.DirAndName() + + found, err = filer_pb.Exists(broker, dir, name, false) + if !found || err != nil { + return + } + + err = pb.WithFilerClient(false, broker.GetFiler(), broker.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + // read filer conf first + data, err := filer.ReadInsideFiler(client, dir, name) + if err != nil { + return fmt.Errorf("ReadEntry: %v", err) + } + + // parse into filer conf object + info = &mq_pb.SegmentInfo{} + if err = jsonpb.Unmarshal(bytes.NewReader(data), info); err != nil { + return err + } + found = true + return nil + }) + + return +} + +func (broker *MessageQueueBroker) saveSegmentToFiler(segment *mq.Segment, info *mq_pb.SegmentInfo) (err error) { + dir, name := segment.DirAndName() + + var buf bytes.Buffer + filer.ProtoToText(&buf, info) + + err = pb.WithFilerClient(false, broker.GetFiler(), broker.grpcDialOption, func(client filer_pb.SeaweedFilerClient) error { + // read filer conf first + err := filer.SaveInsideFiler(client, dir, name, buf.Bytes()) + if err != nil { + return fmt.Errorf("save segment info: %v", err) + } + return nil + }) + + return +} diff --git a/weed/mq/broker/broker_server.go b/weed/mq/broker/broker_server.go index f940b00c3..b95db0ecf 100644 --- a/weed/mq/broker/broker_server.go +++ b/weed/mq/broker/broker_server.go @@ -80,9 +80,15 @@ func (broker *MessageQueueBroker) GetFiler() pb.ServerAddress { return broker.currentFiler } -func (broker *MessageQueueBroker) withFilerClient(streamingMode bool, filer pb.ServerAddress, fn func(filer_pb.SeaweedFilerClient) error) error { +func (broker *MessageQueueBroker) WithFilerClient(streamingMode bool, fn func(filer_pb.SeaweedFilerClient) error) error { - return pb.WithFilerClient(streamingMode, filer, broker.grpcDialOption, fn) + return pb.WithFilerClient(streamingMode, broker.GetFiler(), broker.grpcDialOption, fn) + +} + +func (broker *MessageQueueBroker) AdjustedUrl(location *filer_pb.Location) string { + + return location.Url } diff --git a/weed/mq/topic.go b/weed/mq/topic.go index 87621fca7..12a749133 100644 --- a/weed/mq/topic.go +++ b/weed/mq/topic.go @@ -1,6 +1,8 @@ package mq import ( + "fmt" + "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/pb/mq_pb" "time" ) @@ -13,9 +15,9 @@ type Topic struct { } type Partition struct { - RangeStart int - RangeStop int // exclusive - RingSize int + RangeStart int32 + RangeStop int32 // exclusive + RingSize int32 } type Segment struct { @@ -32,5 +34,29 @@ func FromPbSegment(segment *mq_pb.Segment) *Segment { Name: segment.Topic, }, Id: segment.Id, + Partition: Partition{ + RangeStart: segment.Partition.RangeStart, + RangeStop: segment.Partition.RangeStop, + RingSize: segment.Partition.RingSize, + }, } } + +func (segment *Segment) ToPbSegment() *mq_pb.Segment { + return &mq_pb.Segment{ + Namespace: string(segment.Topic.Namespace), + Topic: segment.Topic.Name, + Id: segment.Id, + Partition: &mq_pb.Partition{ + RingSize: segment.Partition.RingSize, + RangeStart: segment.Partition.RangeStart, + RangeStop: segment.Partition.RangeStop, + }, + } +} + +func (segment *Segment) DirAndName() (dir string, name string) { + dir = fmt.Sprintf("%s/%s/%s", filer.TopicsDir, segment.Topic.Namespace, segment.Topic.Name) + name = fmt.Sprintf("%4d.segment", segment.Id) + return +} diff --git a/weed/pb/mq.proto b/weed/pb/mq.proto index 1f91170fd..2cbe79839 100644 --- a/weed/pb/mq.proto +++ b/weed/pb/mq.proto @@ -21,6 +21,16 @@ service SeaweedMessaging { } +////////////////////////////////////////////////// +message SegmentInfo { + Segment segment = 1; + int64 start_ts_ns = 2; + repeated string brokers = 3; + int64 stop_ts_ns = 4; + repeated int32 previous_segments = 5; + repeated int32 next_segments = 6; +} + ////////////////////////////////////////////////// message FindBrokerLeaderRequest { diff --git a/weed/pb/mq_pb/mq.pb.go b/weed/pb/mq_pb/mq.pb.go index e305ba8d0..3323179ee 100644 --- a/weed/pb/mq_pb/mq.pb.go +++ b/weed/pb/mq_pb/mq.pb.go @@ -20,6 +20,94 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +////////////////////////////////////////////////// +type SegmentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Segment *Segment `protobuf:"bytes,1,opt,name=segment,proto3" json:"segment,omitempty"` + StartTsNs int64 `protobuf:"varint,2,opt,name=start_ts_ns,json=startTsNs,proto3" json:"start_ts_ns,omitempty"` + Brokers []string `protobuf:"bytes,3,rep,name=brokers,proto3" json:"brokers,omitempty"` + StopTsNs int64 `protobuf:"varint,4,opt,name=stop_ts_ns,json=stopTsNs,proto3" json:"stop_ts_ns,omitempty"` + PreviousSegments []int32 `protobuf:"varint,5,rep,packed,name=previous_segments,json=previousSegments,proto3" json:"previous_segments,omitempty"` + NextSegments []int32 `protobuf:"varint,6,rep,packed,name=next_segments,json=nextSegments,proto3" json:"next_segments,omitempty"` +} + +func (x *SegmentInfo) Reset() { + *x = SegmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_mq_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SegmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SegmentInfo) ProtoMessage() {} + +func (x *SegmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_mq_proto_msgTypes[0] + 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 SegmentInfo.ProtoReflect.Descriptor instead. +func (*SegmentInfo) Descriptor() ([]byte, []int) { + return file_mq_proto_rawDescGZIP(), []int{0} +} + +func (x *SegmentInfo) GetSegment() *Segment { + if x != nil { + return x.Segment + } + return nil +} + +func (x *SegmentInfo) GetStartTsNs() int64 { + if x != nil { + return x.StartTsNs + } + return 0 +} + +func (x *SegmentInfo) GetBrokers() []string { + if x != nil { + return x.Brokers + } + return nil +} + +func (x *SegmentInfo) GetStopTsNs() int64 { + if x != nil { + return x.StopTsNs + } + return 0 +} + +func (x *SegmentInfo) GetPreviousSegments() []int32 { + if x != nil { + return x.PreviousSegments + } + return nil +} + +func (x *SegmentInfo) GetNextSegments() []int32 { + if x != nil { + return x.NextSegments + } + return nil +} + type FindBrokerLeaderRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -31,7 +119,7 @@ type FindBrokerLeaderRequest struct { func (x *FindBrokerLeaderRequest) Reset() { *x = FindBrokerLeaderRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[0] + mi := &file_mq_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -44,7 +132,7 @@ func (x *FindBrokerLeaderRequest) String() string { func (*FindBrokerLeaderRequest) ProtoMessage() {} func (x *FindBrokerLeaderRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[0] + mi := &file_mq_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -57,7 +145,7 @@ func (x *FindBrokerLeaderRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FindBrokerLeaderRequest.ProtoReflect.Descriptor instead. func (*FindBrokerLeaderRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{0} + return file_mq_proto_rawDescGZIP(), []int{1} } func (x *FindBrokerLeaderRequest) GetFilerGroup() string { @@ -78,7 +166,7 @@ type FindBrokerLeaderResponse struct { func (x *FindBrokerLeaderResponse) Reset() { *x = FindBrokerLeaderResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[1] + mi := &file_mq_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -91,7 +179,7 @@ func (x *FindBrokerLeaderResponse) String() string { func (*FindBrokerLeaderResponse) ProtoMessage() {} func (x *FindBrokerLeaderResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[1] + mi := &file_mq_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -104,7 +192,7 @@ func (x *FindBrokerLeaderResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FindBrokerLeaderResponse.ProtoReflect.Descriptor instead. func (*FindBrokerLeaderResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{1} + return file_mq_proto_rawDescGZIP(), []int{2} } func (x *FindBrokerLeaderResponse) GetBroker() string { @@ -127,7 +215,7 @@ type Partition struct { func (x *Partition) Reset() { *x = Partition{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[2] + mi := &file_mq_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -140,7 +228,7 @@ func (x *Partition) String() string { func (*Partition) ProtoMessage() {} func (x *Partition) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[2] + mi := &file_mq_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -153,7 +241,7 @@ func (x *Partition) ProtoReflect() protoreflect.Message { // Deprecated: Use Partition.ProtoReflect.Descriptor instead. func (*Partition) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{2} + return file_mq_proto_rawDescGZIP(), []int{3} } func (x *Partition) GetRingSize() int32 { @@ -191,7 +279,7 @@ type Segment struct { func (x *Segment) Reset() { *x = Segment{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[3] + mi := &file_mq_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -204,7 +292,7 @@ func (x *Segment) String() string { func (*Segment) ProtoMessage() {} func (x *Segment) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[3] + mi := &file_mq_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -217,7 +305,7 @@ func (x *Segment) ProtoReflect() protoreflect.Message { // Deprecated: Use Segment.ProtoReflect.Descriptor instead. func (*Segment) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{3} + return file_mq_proto_rawDescGZIP(), []int{4} } func (x *Segment) GetNamespace() string { @@ -259,7 +347,7 @@ type AssignSegmentBrokersRequest struct { func (x *AssignSegmentBrokersRequest) Reset() { *x = AssignSegmentBrokersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[4] + mi := &file_mq_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -272,7 +360,7 @@ func (x *AssignSegmentBrokersRequest) String() string { func (*AssignSegmentBrokersRequest) ProtoMessage() {} func (x *AssignSegmentBrokersRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[4] + mi := &file_mq_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -285,7 +373,7 @@ func (x *AssignSegmentBrokersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignSegmentBrokersRequest.ProtoReflect.Descriptor instead. func (*AssignSegmentBrokersRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{4} + return file_mq_proto_rawDescGZIP(), []int{5} } func (x *AssignSegmentBrokersRequest) GetSegment() *Segment { @@ -306,7 +394,7 @@ type AssignSegmentBrokersResponse struct { func (x *AssignSegmentBrokersResponse) Reset() { *x = AssignSegmentBrokersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[5] + mi := &file_mq_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -319,7 +407,7 @@ func (x *AssignSegmentBrokersResponse) String() string { func (*AssignSegmentBrokersResponse) ProtoMessage() {} func (x *AssignSegmentBrokersResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[5] + mi := &file_mq_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -332,7 +420,7 @@ func (x *AssignSegmentBrokersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignSegmentBrokersResponse.ProtoReflect.Descriptor instead. func (*AssignSegmentBrokersResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{5} + return file_mq_proto_rawDescGZIP(), []int{6} } func (x *AssignSegmentBrokersResponse) GetBrokers() []string { @@ -353,7 +441,7 @@ type CheckSegmentStatusRequest struct { func (x *CheckSegmentStatusRequest) Reset() { *x = CheckSegmentStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[6] + mi := &file_mq_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +454,7 @@ func (x *CheckSegmentStatusRequest) String() string { func (*CheckSegmentStatusRequest) ProtoMessage() {} func (x *CheckSegmentStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[6] + mi := &file_mq_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -379,7 +467,7 @@ func (x *CheckSegmentStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckSegmentStatusRequest.ProtoReflect.Descriptor instead. func (*CheckSegmentStatusRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{6} + return file_mq_proto_rawDescGZIP(), []int{7} } func (x *CheckSegmentStatusRequest) GetSegment() *Segment { @@ -400,7 +488,7 @@ type CheckSegmentStatusResponse struct { func (x *CheckSegmentStatusResponse) Reset() { *x = CheckSegmentStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[7] + mi := &file_mq_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -413,7 +501,7 @@ func (x *CheckSegmentStatusResponse) String() string { func (*CheckSegmentStatusResponse) ProtoMessage() {} func (x *CheckSegmentStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[7] + mi := &file_mq_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -426,7 +514,7 @@ func (x *CheckSegmentStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckSegmentStatusResponse.ProtoReflect.Descriptor instead. func (*CheckSegmentStatusResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{7} + return file_mq_proto_rawDescGZIP(), []int{8} } func (x *CheckSegmentStatusResponse) GetIsActive() bool { @@ -445,7 +533,7 @@ type CheckBrokerLoadRequest struct { func (x *CheckBrokerLoadRequest) Reset() { *x = CheckBrokerLoadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[8] + mi := &file_mq_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -458,7 +546,7 @@ func (x *CheckBrokerLoadRequest) String() string { func (*CheckBrokerLoadRequest) ProtoMessage() {} func (x *CheckBrokerLoadRequest) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[8] + mi := &file_mq_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -471,7 +559,7 @@ func (x *CheckBrokerLoadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckBrokerLoadRequest.ProtoReflect.Descriptor instead. func (*CheckBrokerLoadRequest) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{8} + return file_mq_proto_rawDescGZIP(), []int{9} } type CheckBrokerLoadResponse struct { @@ -486,7 +574,7 @@ type CheckBrokerLoadResponse struct { func (x *CheckBrokerLoadResponse) Reset() { *x = CheckBrokerLoadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mq_proto_msgTypes[9] + mi := &file_mq_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -499,7 +587,7 @@ func (x *CheckBrokerLoadResponse) String() string { func (*CheckBrokerLoadResponse) ProtoMessage() {} func (x *CheckBrokerLoadResponse) ProtoReflect() protoreflect.Message { - mi := &file_mq_proto_msgTypes[9] + mi := &file_mq_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -512,7 +600,7 @@ func (x *CheckBrokerLoadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckBrokerLoadResponse.ProtoReflect.Descriptor instead. func (*CheckBrokerLoadResponse) Descriptor() ([]byte, []int) { - return file_mq_proto_rawDescGZIP(), []int{9} + return file_mq_proto_rawDescGZIP(), []int{10} } func (x *CheckBrokerLoadResponse) GetMessageCount() int64 { @@ -533,87 +621,102 @@ var File_mq_proto protoreflect.FileDescriptor var file_mq_proto_rawDesc = []byte{ 0x0a, 0x08, 0x6d, 0x71, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0x3a, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, - 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x22, 0x32, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, - 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, - 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, - 0x6f, 0x70, 0x22, 0x84, 0x01, 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x35, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x1b, 0x41, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x22, 0xe8, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x1c, 0x41, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x6f, - 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x6b, - 0x65, 0x72, 0x73, 0x22, 0x4c, 0x0a, 0x19, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0x39, 0x0a, 0x1a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x18, 0x0a, 0x16, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, - 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0xb5, 0x03, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, - 0x65, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x10, - 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, - 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x73, 0x5f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x73, 0x4e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, 0x73, 0x5f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x73, 0x4e, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x10, 0x70, 0x72, + 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, + 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, + 0x32, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x22, 0x68, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x22, 0x84, 0x01, + 0x0a, 0x07, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, + 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x1b, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x1c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x22, 0x4c, + 0x0a, 0x19, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x39, 0x0a, 0x1a, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x5f, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, + 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x32, 0xb5, 0x03, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x63, 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x64, 0x42, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, + 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, + 0x6b, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x69, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x0f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, - 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, - 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x4e, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, 0x42, - 0x10, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, - 0x72, 0x69, 0x73, 0x6c, 0x75, 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, - 0x73, 0x2f, 0x77, 0x65, 0x65, 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x72, 0x6f, 0x6b, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, + 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x0f, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x62, + 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x4c, 0x6f, 0x61, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x0c, 0x73, 0x65, + 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2e, 0x6d, 0x71, 0x42, 0x10, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x51, 0x75, 0x65, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2c, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x68, 0x72, 0x69, 0x73, 0x6c, 0x75, + 0x73, 0x66, 0x2f, 0x73, 0x65, 0x61, 0x77, 0x65, 0x65, 0x64, 0x66, 0x73, 0x2f, 0x77, 0x65, 0x65, + 0x64, 0x2f, 0x70, 0x62, 0x2f, 0x6d, 0x71, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -628,36 +731,38 @@ func file_mq_proto_rawDescGZIP() []byte { return file_mq_proto_rawDescData } -var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_mq_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_mq_proto_goTypes = []interface{}{ - (*FindBrokerLeaderRequest)(nil), // 0: messaging_pb.FindBrokerLeaderRequest - (*FindBrokerLeaderResponse)(nil), // 1: messaging_pb.FindBrokerLeaderResponse - (*Partition)(nil), // 2: messaging_pb.Partition - (*Segment)(nil), // 3: messaging_pb.Segment - (*AssignSegmentBrokersRequest)(nil), // 4: messaging_pb.AssignSegmentBrokersRequest - (*AssignSegmentBrokersResponse)(nil), // 5: messaging_pb.AssignSegmentBrokersResponse - (*CheckSegmentStatusRequest)(nil), // 6: messaging_pb.CheckSegmentStatusRequest - (*CheckSegmentStatusResponse)(nil), // 7: messaging_pb.CheckSegmentStatusResponse - (*CheckBrokerLoadRequest)(nil), // 8: messaging_pb.CheckBrokerLoadRequest - (*CheckBrokerLoadResponse)(nil), // 9: messaging_pb.CheckBrokerLoadResponse + (*SegmentInfo)(nil), // 0: messaging_pb.SegmentInfo + (*FindBrokerLeaderRequest)(nil), // 1: messaging_pb.FindBrokerLeaderRequest + (*FindBrokerLeaderResponse)(nil), // 2: messaging_pb.FindBrokerLeaderResponse + (*Partition)(nil), // 3: messaging_pb.Partition + (*Segment)(nil), // 4: messaging_pb.Segment + (*AssignSegmentBrokersRequest)(nil), // 5: messaging_pb.AssignSegmentBrokersRequest + (*AssignSegmentBrokersResponse)(nil), // 6: messaging_pb.AssignSegmentBrokersResponse + (*CheckSegmentStatusRequest)(nil), // 7: messaging_pb.CheckSegmentStatusRequest + (*CheckSegmentStatusResponse)(nil), // 8: messaging_pb.CheckSegmentStatusResponse + (*CheckBrokerLoadRequest)(nil), // 9: messaging_pb.CheckBrokerLoadRequest + (*CheckBrokerLoadResponse)(nil), // 10: messaging_pb.CheckBrokerLoadResponse } var file_mq_proto_depIdxs = []int32{ - 2, // 0: messaging_pb.Segment.partition:type_name -> messaging_pb.Partition - 3, // 1: messaging_pb.AssignSegmentBrokersRequest.segment:type_name -> messaging_pb.Segment - 3, // 2: messaging_pb.CheckSegmentStatusRequest.segment:type_name -> messaging_pb.Segment - 0, // 3: messaging_pb.SeaweedMessaging.FindBrokerLeader:input_type -> messaging_pb.FindBrokerLeaderRequest - 4, // 4: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:input_type -> messaging_pb.AssignSegmentBrokersRequest - 6, // 5: messaging_pb.SeaweedMessaging.CheckSegmentStatus:input_type -> messaging_pb.CheckSegmentStatusRequest - 8, // 6: messaging_pb.SeaweedMessaging.CheckBrokerLoad:input_type -> messaging_pb.CheckBrokerLoadRequest - 1, // 7: messaging_pb.SeaweedMessaging.FindBrokerLeader:output_type -> messaging_pb.FindBrokerLeaderResponse - 5, // 8: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:output_type -> messaging_pb.AssignSegmentBrokersResponse - 7, // 9: messaging_pb.SeaweedMessaging.CheckSegmentStatus:output_type -> messaging_pb.CheckSegmentStatusResponse - 9, // 10: messaging_pb.SeaweedMessaging.CheckBrokerLoad:output_type -> messaging_pb.CheckBrokerLoadResponse - 7, // [7:11] is the sub-list for method output_type - 3, // [3:7] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 4, // 0: messaging_pb.SegmentInfo.segment:type_name -> messaging_pb.Segment + 3, // 1: messaging_pb.Segment.partition:type_name -> messaging_pb.Partition + 4, // 2: messaging_pb.AssignSegmentBrokersRequest.segment:type_name -> messaging_pb.Segment + 4, // 3: messaging_pb.CheckSegmentStatusRequest.segment:type_name -> messaging_pb.Segment + 1, // 4: messaging_pb.SeaweedMessaging.FindBrokerLeader:input_type -> messaging_pb.FindBrokerLeaderRequest + 5, // 5: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:input_type -> messaging_pb.AssignSegmentBrokersRequest + 7, // 6: messaging_pb.SeaweedMessaging.CheckSegmentStatus:input_type -> messaging_pb.CheckSegmentStatusRequest + 9, // 7: messaging_pb.SeaweedMessaging.CheckBrokerLoad:input_type -> messaging_pb.CheckBrokerLoadRequest + 2, // 8: messaging_pb.SeaweedMessaging.FindBrokerLeader:output_type -> messaging_pb.FindBrokerLeaderResponse + 6, // 9: messaging_pb.SeaweedMessaging.AssignSegmentBrokers:output_type -> messaging_pb.AssignSegmentBrokersResponse + 8, // 10: messaging_pb.SeaweedMessaging.CheckSegmentStatus:output_type -> messaging_pb.CheckSegmentStatusResponse + 10, // 11: messaging_pb.SeaweedMessaging.CheckBrokerLoad:output_type -> messaging_pb.CheckBrokerLoadResponse + 8, // [8:12] is the sub-list for method output_type + 4, // [4:8] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_mq_proto_init() } @@ -667,7 +772,7 @@ func file_mq_proto_init() { } if !protoimpl.UnsafeEnabled { file_mq_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindBrokerLeaderRequest); i { + switch v := v.(*SegmentInfo); i { case 0: return &v.state case 1: @@ -679,7 +784,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindBrokerLeaderResponse); i { + switch v := v.(*FindBrokerLeaderRequest); i { case 0: return &v.state case 1: @@ -691,7 +796,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Partition); i { + switch v := v.(*FindBrokerLeaderResponse); i { case 0: return &v.state case 1: @@ -703,7 +808,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Segment); i { + switch v := v.(*Partition); i { case 0: return &v.state case 1: @@ -715,7 +820,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssignSegmentBrokersRequest); i { + switch v := v.(*Segment); i { case 0: return &v.state case 1: @@ -727,7 +832,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssignSegmentBrokersResponse); i { + switch v := v.(*AssignSegmentBrokersRequest); i { case 0: return &v.state case 1: @@ -739,7 +844,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckSegmentStatusRequest); i { + switch v := v.(*AssignSegmentBrokersResponse); i { case 0: return &v.state case 1: @@ -751,7 +856,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckSegmentStatusResponse); i { + switch v := v.(*CheckSegmentStatusRequest); i { case 0: return &v.state case 1: @@ -763,7 +868,7 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckBrokerLoadRequest); i { + switch v := v.(*CheckSegmentStatusResponse); i { case 0: return &v.state case 1: @@ -775,6 +880,18 @@ func file_mq_proto_init() { } } file_mq_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CheckBrokerLoadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mq_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckBrokerLoadResponse); i { case 0: return &v.state @@ -793,7 +910,7 @@ func file_mq_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mq_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 11, NumExtensions: 0, NumServices: 1, }, From 1f2c5ee06ecd54f46169440a56be07c3081407b7 Mon Sep 17 00:00:00 2001 From: chrislu Date: Sat, 16 Jul 2022 12:07:31 -0700 Subject: [PATCH 15/17] add an empty placeholder for mq.topic.list --- weed/shell/command_mq_topic_list.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 weed/shell/command_mq_topic_list.go diff --git a/weed/shell/command_mq_topic_list.go b/weed/shell/command_mq_topic_list.go new file mode 100644 index 000000000..a069b0614 --- /dev/null +++ b/weed/shell/command_mq_topic_list.go @@ -0,0 +1,28 @@ +package shell + +import ( + "fmt" + "io" +) + +func init() { + Commands = append(Commands, &commandMqTopicList{}) +} + +type commandMqTopicList struct { +} + +func (c *commandMqTopicList) Name() string { + return "mq.topic.list" +} + +func (c *commandMqTopicList) Help() string { + return `print out all topics` +} + +func (c *commandMqTopicList) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + + fmt.Fprintf(writer, "%s\n", commandEnv.option.Directory) + + return nil +} From 7f672b37e166a97fc652a40c7fc41d03f1d6e690 Mon Sep 17 00:00:00 2001 From: chrislu Date: Mon, 18 Jul 2022 00:25:14 -0700 Subject: [PATCH 16/17] add flatbuffer serde for message --- go.mod | 1 + go.sum | 2 + weed/mq/README.md | 66 ++++++++++ weed/mq/segment/message_serde.go | 48 +++++++ weed/mq/segment/message_serde_test.go | 47 +++++++ weed/mq/segment/segment_serde.go | 1 + weed/pb/Makefile | 3 + weed/pb/message.fbs | 15 +++ weed/pb/message_fbs/Message.go | 179 ++++++++++++++++++++++++++ weed/pb/message_fbs/NameValue.go | 63 +++++++++ 10 files changed, 425 insertions(+) create mode 100644 weed/mq/README.md create mode 100644 weed/mq/segment/message_serde.go create mode 100644 weed/mq/segment/message_serde_test.go create mode 100644 weed/mq/segment/segment_serde.go create mode 100644 weed/pb/message.fbs create mode 100644 weed/pb/message_fbs/Message.go create mode 100644 weed/pb/message_fbs/NameValue.go diff --git a/go.mod b/go.mod index fc956e42a..64e051b49 100644 --- a/go.mod +++ b/go.mod @@ -184,6 +184,7 @@ require ( github.com/fatih/color v1.13.0 // indirect github.com/fclairamb/go-log v0.3.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/flatbuffers v2.0.6+incompatible // indirect github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect github.com/googleapis/go-type-adapters v1.0.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect diff --git a/go.sum b/go.sum index 22a9a1ac4..93070fccc 100644 --- a/go.sum +++ b/go.sum @@ -415,6 +415,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v2.0.6+incompatible h1:XHFReMv7nFFusa+CEokzWbzaYocKXI6C7hdU5Kgh9Lw= +github.com/google/flatbuffers v2.0.6+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= diff --git a/weed/mq/README.md b/weed/mq/README.md new file mode 100644 index 000000000..2f1127869 --- /dev/null +++ b/weed/mq/README.md @@ -0,0 +1,66 @@ +# SeaweedMQ Message Queue on SeaweedFS (WIP, not ready) + +## What are the use cases it is designed for? + +Message queues are like water pipes. Messages flow in the pipes to their destinations. + +However, what if a flood comes? Of course, you can increase the number of partitions, add more brokers, restart, +and watch the traffic level closely. + +Sometimes the flood is expected. For example, backfill some old data in batch, and switch to online messages. +You may want to ensure enough brokers to handle the data and reduce them later to cut cost. + +SeaweedMQ is designed for use cases that need to: +* Receive and save large number of messages. +* Handle spike traffic automatically. + +## What is special about SeaweedMQ? + +* Separate computation and storage nodes that scales independently. + * Offline messages can be operated as normal files. + * Unlimited storage space by adding volume servers. + * Unlimited message brokers. +* Scale up and down with auto split and merge message topics. + * Topics can automatically split into segments when traffic increases, and vice verse. + * + +# Design + +# How it works? + +Brokers are just computation nodes without storage. When a broker starts, it reports itself to masters. +Among all the brokers, one of them will be selected as the leader by the masters. + +A topic needs to define its partition key on its messages. + +Messages for a topic are divided into segments. + +During write time, the client will ask the broker leader for a few brokers to process the segment. + +The broker leader will check whether the segment already has assigned the brokers. If not, select a few based +on their loads, save the selection into filer, and tell the client. + +The client will write the messages for this segment to the selected brokers. + +## Failover + +The broker leader does not contain any state. If it fails, the masters will select a different broker. + +For a segment, if any one of the selected brokers is down, the remaining brokers should try to write received messages +to the filer, and close the segment to the clients. + +Then the clients should start a new segment. The masters should other healthy brokers to handle the new segment. + +So any brokers can go down without losing data. + +## Auto Split or Merge + +(The idea is learned from Pravega.) + +The brokers should report its traffic load to the broker leader periodically. + +If any segment has too much load, the broker leader will ask the brokers to tell the client to +close current one and create two new segments. + +If 2 neighboring segments have the combined load below average load per segment, the broker leader will ask +the brokers to tell the client to close this 2 segments and create a new segment. diff --git a/weed/mq/segment/message_serde.go b/weed/mq/segment/message_serde.go new file mode 100644 index 000000000..b69d78cab --- /dev/null +++ b/weed/mq/segment/message_serde.go @@ -0,0 +1,48 @@ +package segment + +import ( + "github.com/chrislusf/seaweedfs/weed/pb/message_fbs" + flatbuffers "github.com/google/flatbuffers/go" +) + +func CreateMessage(b *flatbuffers.Builder, producerId int32, producerSeq int64, segmentId int32, segmentSeq int64, + eventTsNs int64, recvTsNs int64, properties map[string]string, key []byte, value []byte) { + b.Reset() + + var names, values, pairs []flatbuffers.UOffsetT + for k, v := range properties { + names = append(names, b.CreateString(k)) + values = append(values, b.CreateString(v)) + } + + for i, _ := range names { + message_fbs.NameValueStart(b) + message_fbs.NameValueAddName(b, names[i]) + message_fbs.NameValueAddValue(b, values[i]) + pair := message_fbs.NameValueEnd(b) + pairs = append(pairs, pair) + } + message_fbs.MessageStartPropertiesVector(b, len(properties)) + for i := len(pairs) - 1; i >= 0; i-- { + b.PrependUOffsetT(pairs[i]) + } + prop := b.EndVector(len(properties)) + + k := b.CreateByteVector(key) + v := b.CreateByteVector(value) + + message_fbs.MessageStart(b) + message_fbs.MessageAddProducerId(b, producerId) + message_fbs.MessageAddProducerSeq(b, producerSeq) + message_fbs.MessageAddSegmentId(b, segmentId) + message_fbs.MessageAddSegmentSeq(b, segmentSeq) + message_fbs.MessageAddEventTsNs(b, eventTsNs) + message_fbs.MessageAddRecvTsNs(b, recvTsNs) + + message_fbs.MessageAddProperties(b, prop) + message_fbs.MessageAddKey(b, k) + message_fbs.MessageAddData(b, v) + message := message_fbs.MessageEnd(b) + + b.Finish(message) +} diff --git a/weed/mq/segment/message_serde_test.go b/weed/mq/segment/message_serde_test.go new file mode 100644 index 000000000..7ba0febf0 --- /dev/null +++ b/weed/mq/segment/message_serde_test.go @@ -0,0 +1,47 @@ +package segment + +import ( + "github.com/chrislusf/seaweedfs/weed/pb/message_fbs" + flatbuffers "github.com/google/flatbuffers/go" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestMessageSerde(t *testing.T) { + b := flatbuffers.NewBuilder(1024) + + prop := make(map[string]string) + prop["n1"] = "v1" + prop["n2"] = "v2" + + CreateMessage(b, 1, 2, 3, 4, 5, 6, prop, + []byte("the primary key"), []byte("body is here")) + + buf := b.FinishedBytes() + + println("serialized size", len(buf)) + + m := message_fbs.GetRootAsMessage(buf, 0) + + assert.Equal(t, int32(1), m.ProducerId()) + assert.Equal(t, int64(2), m.ProducerSeq()) + assert.Equal(t, int32(3), m.SegmentId()) + assert.Equal(t, int64(4), m.SegmentSeq()) + assert.Equal(t, int64(5), m.EventTsNs()) + assert.Equal(t, int64(6), m.RecvTsNs()) + + assert.Equal(t, 2, m.PropertiesLength()) + nv := &message_fbs.NameValue{} + m.Properties(nv, 0) + assert.Equal(t, "n1", string(nv.Name())) + assert.Equal(t, "v1", string(nv.Value())) + m.Properties(nv, 1) + assert.Equal(t, "n2", string(nv.Name())) + assert.Equal(t, "v2", string(nv.Value())) + assert.Equal(t, []byte("the primary key"), m.Key()) + assert.Equal(t, []byte("body is here"), m.Data()) + + m.MutateSegmentSeq(123) + assert.Equal(t, int64(123), m.SegmentSeq()) + +} diff --git a/weed/mq/segment/segment_serde.go b/weed/mq/segment/segment_serde.go new file mode 100644 index 000000000..e076271d6 --- /dev/null +++ b/weed/mq/segment/segment_serde.go @@ -0,0 +1 @@ +package segment diff --git a/weed/pb/Makefile b/weed/pb/Makefile index 01322ffda..f76ec3814 100644 --- a/weed/pb/Makefile +++ b/weed/pb/Makefile @@ -13,3 +13,6 @@ gen: protoc mq.proto --go_out=./mq_pb --go-grpc_out=./mq_pb --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative # protoc filer.proto --java_out=../../other/java/client/src/main/java cp filer.proto ../../other/java/client/src/main/proto + +fbs: + flatc --go -o . --go-namespace message_fbs message.fbs diff --git a/weed/pb/message.fbs b/weed/pb/message.fbs new file mode 100644 index 000000000..8ee6c5b55 --- /dev/null +++ b/weed/pb/message.fbs @@ -0,0 +1,15 @@ +table NameValue { + name:string (key); + value:string; +} +table Message { + producer_id:int32 (id:0); + producer_seq:int64 (id:2); + segment_id:int32 (id:1); + segment_seq:int64 (id:3); + event_ts_ns:int64 (id:4); + recv_ts_ns:int64 (id:5); + properties:[NameValue] (id:6); + key:string (id:7); // bytes + data:string (id:8); // bytes +} diff --git a/weed/pb/message_fbs/Message.go b/weed/pb/message_fbs/Message.go new file mode 100644 index 000000000..058abfeaa --- /dev/null +++ b/weed/pb/message_fbs/Message.go @@ -0,0 +1,179 @@ +// Code generated by the FlatBuffers compiler. DO NOT EDIT. + +package message_fbs + +import ( + flatbuffers "github.com/google/flatbuffers/go" +) + +type Message struct { + _tab flatbuffers.Table +} + +func GetRootAsMessage(buf []byte, offset flatbuffers.UOffsetT) *Message { + n := flatbuffers.GetUOffsetT(buf[offset:]) + x := &Message{} + x.Init(buf, n+offset) + return x +} + +func GetSizePrefixedRootAsMessage(buf []byte, offset flatbuffers.UOffsetT) *Message { + n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:]) + x := &Message{} + x.Init(buf, n+offset+flatbuffers.SizeUint32) + return x +} + +func (rcv *Message) Init(buf []byte, i flatbuffers.UOffsetT) { + rcv._tab.Bytes = buf + rcv._tab.Pos = i +} + +func (rcv *Message) Table() flatbuffers.Table { + return rcv._tab +} + +func (rcv *Message) ProducerId() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateProducerId(n int32) bool { + return rcv._tab.MutateInt32Slot(4, n) +} + +func (rcv *Message) SegmentId() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateSegmentId(n int32) bool { + return rcv._tab.MutateInt32Slot(6, n) +} + +func (rcv *Message) ProducerSeq() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateProducerSeq(n int64) bool { + return rcv._tab.MutateInt64Slot(8, n) +} + +func (rcv *Message) SegmentSeq() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateSegmentSeq(n int64) bool { + return rcv._tab.MutateInt64Slot(10, n) +} + +func (rcv *Message) EventTsNs() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateEventTsNs(n int64) bool { + return rcv._tab.MutateInt64Slot(12, n) +} + +func (rcv *Message) RecvTsNs() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *Message) MutateRecvTsNs(n int64) bool { + return rcv._tab.MutateInt64Slot(14, n) +} + +func (rcv *Message) Properties(obj *NameValue, j int) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + if o != 0 { + x := rcv._tab.Vector(o) + x += flatbuffers.UOffsetT(j) * 4 + x = rcv._tab.Indirect(x) + obj.Init(rcv._tab.Bytes, x) + return true + } + return false +} + +func (rcv *Message) PropertiesLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + +func (rcv *Message) Key() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(18)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + +func (rcv *Message) Data() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + +func MessageStart(builder *flatbuffers.Builder) { + builder.StartObject(9) +} +func MessageAddProducerId(builder *flatbuffers.Builder, producerId int32) { + builder.PrependInt32Slot(0, producerId, 0) +} +func MessageAddSegmentId(builder *flatbuffers.Builder, segmentId int32) { + builder.PrependInt32Slot(1, segmentId, 0) +} +func MessageAddProducerSeq(builder *flatbuffers.Builder, producerSeq int64) { + builder.PrependInt64Slot(2, producerSeq, 0) +} +func MessageAddSegmentSeq(builder *flatbuffers.Builder, segmentSeq int64) { + builder.PrependInt64Slot(3, segmentSeq, 0) +} +func MessageAddEventTsNs(builder *flatbuffers.Builder, eventTsNs int64) { + builder.PrependInt64Slot(4, eventTsNs, 0) +} +func MessageAddRecvTsNs(builder *flatbuffers.Builder, recvTsNs int64) { + builder.PrependInt64Slot(5, recvTsNs, 0) +} +func MessageAddProperties(builder *flatbuffers.Builder, properties flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(properties), 0) +} +func MessageStartPropertiesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(4, numElems, 4) +} +func MessageAddKey(builder *flatbuffers.Builder, key flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(key), 0) +} +func MessageAddData(builder *flatbuffers.Builder, data flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(data), 0) +} +func MessageEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { + return builder.EndObject() +} diff --git a/weed/pb/message_fbs/NameValue.go b/weed/pb/message_fbs/NameValue.go new file mode 100644 index 000000000..b5dfdad16 --- /dev/null +++ b/weed/pb/message_fbs/NameValue.go @@ -0,0 +1,63 @@ +// Code generated by the FlatBuffers compiler. DO NOT EDIT. + +package message_fbs + +import ( + flatbuffers "github.com/google/flatbuffers/go" +) + +type NameValue struct { + _tab flatbuffers.Table +} + +func GetRootAsNameValue(buf []byte, offset flatbuffers.UOffsetT) *NameValue { + n := flatbuffers.GetUOffsetT(buf[offset:]) + x := &NameValue{} + x.Init(buf, n+offset) + return x +} + +func GetSizePrefixedRootAsNameValue(buf []byte, offset flatbuffers.UOffsetT) *NameValue { + n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:]) + x := &NameValue{} + x.Init(buf, n+offset+flatbuffers.SizeUint32) + return x +} + +func (rcv *NameValue) Init(buf []byte, i flatbuffers.UOffsetT) { + rcv._tab.Bytes = buf + rcv._tab.Pos = i +} + +func (rcv *NameValue) Table() flatbuffers.Table { + return rcv._tab +} + +func (rcv *NameValue) Name() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + +func (rcv *NameValue) Value() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + +func NameValueStart(builder *flatbuffers.Builder) { + builder.StartObject(2) +} +func NameValueAddName(builder *flatbuffers.Builder, name flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(name), 0) +} +func NameValueAddValue(builder *flatbuffers.Builder, value flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(value), 0) +} +func NameValueEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { + return builder.EndObject() +} From f72f6961092c60c0a537d8bba5e242dce1ebb7a2 Mon Sep 17 00:00:00 2001 From: chrislu Date: Fri, 22 Jul 2022 01:12:32 -0700 Subject: [PATCH 17/17] add message batch --- weed/mq/segment/message_serde.go | 113 ++++++++++++---- weed/mq/segment/message_serde_test.go | 41 +++--- weed/pb/message.fbs | 26 ++-- weed/pb/message_fbs/Message.go | 92 +++---------- weed/pb/message_fbs/MessageBatch.go | 187 ++++++++++++++++++++++++++ 5 files changed, 332 insertions(+), 127 deletions(-) create mode 100644 weed/pb/message_fbs/MessageBatch.go diff --git a/weed/mq/segment/message_serde.go b/weed/mq/segment/message_serde.go index b69d78cab..8efa9fe21 100644 --- a/weed/mq/segment/message_serde.go +++ b/weed/mq/segment/message_serde.go @@ -5,44 +5,105 @@ import ( flatbuffers "github.com/google/flatbuffers/go" ) -func CreateMessage(b *flatbuffers.Builder, producerId int32, producerSeq int64, segmentId int32, segmentSeq int64, - eventTsNs int64, recvTsNs int64, properties map[string]string, key []byte, value []byte) { +type MessageBatchBuilder struct { + b *flatbuffers.Builder + producerId int32 + producerEpoch int32 + segmentId int32 + flags int32 + messageOffsets []flatbuffers.UOffsetT + segmentSeqBase int64 + segmentSeqLast int64 + tsMsBase int64 + tsMsLast int64 +} + +func NewMessageBatchBuilder(b *flatbuffers.Builder, + producerId int32, + producerEpoch int32, + segmentId int32, + flags int32) *MessageBatchBuilder { + b.Reset() + return &MessageBatchBuilder{ + b: b, + producerId: producerId, + producerEpoch: producerEpoch, + segmentId: segmentId, + flags: flags, + } +} + +func (builder *MessageBatchBuilder) AddMessage(segmentSeq int64, tsMs int64, properties map[string][]byte, key []byte, value []byte) { + if builder.segmentSeqBase == 0 { + builder.segmentSeqBase = segmentSeq + } + builder.segmentSeqLast = segmentSeq + if builder.tsMsBase == 0 { + builder.tsMsBase = tsMs + } + builder.tsMsLast = tsMs + var names, values, pairs []flatbuffers.UOffsetT for k, v := range properties { - names = append(names, b.CreateString(k)) - values = append(values, b.CreateString(v)) + names = append(names, builder.b.CreateString(k)) + values = append(values, builder.b.CreateByteVector(v)) } - for i, _ := range names { - message_fbs.NameValueStart(b) - message_fbs.NameValueAddName(b, names[i]) - message_fbs.NameValueAddValue(b, values[i]) - pair := message_fbs.NameValueEnd(b) + message_fbs.NameValueStart(builder.b) + message_fbs.NameValueAddName(builder.b, names[i]) + message_fbs.NameValueAddValue(builder.b, values[i]) + pair := message_fbs.NameValueEnd(builder.b) pairs = append(pairs, pair) } - message_fbs.MessageStartPropertiesVector(b, len(properties)) + + message_fbs.MessageStartPropertiesVector(builder.b, len(properties)) for i := len(pairs) - 1; i >= 0; i-- { - b.PrependUOffsetT(pairs[i]) + builder.b.PrependUOffsetT(pairs[i]) } - prop := b.EndVector(len(properties)) + propOffset := builder.b.EndVector(len(properties)) - k := b.CreateByteVector(key) - v := b.CreateByteVector(value) + keyOffset := builder.b.CreateByteVector(key) + valueOffset := builder.b.CreateByteVector(value) - message_fbs.MessageStart(b) - message_fbs.MessageAddProducerId(b, producerId) - message_fbs.MessageAddProducerSeq(b, producerSeq) - message_fbs.MessageAddSegmentId(b, segmentId) - message_fbs.MessageAddSegmentSeq(b, segmentSeq) - message_fbs.MessageAddEventTsNs(b, eventTsNs) - message_fbs.MessageAddRecvTsNs(b, recvTsNs) + message_fbs.MessageStart(builder.b) + message_fbs.MessageAddSeqDelta(builder.b, int32(segmentSeq-builder.segmentSeqBase)) + message_fbs.MessageAddTsMsDelta(builder.b, int32(tsMs-builder.tsMsBase)) - message_fbs.MessageAddProperties(b, prop) - message_fbs.MessageAddKey(b, k) - message_fbs.MessageAddData(b, v) - message := message_fbs.MessageEnd(b) + message_fbs.MessageAddProperties(builder.b, propOffset) + message_fbs.MessageAddKey(builder.b, keyOffset) + message_fbs.MessageAddData(builder.b, valueOffset) + messageOffset := message_fbs.MessageEnd(builder.b) + + builder.messageOffsets = append(builder.messageOffsets, messageOffset) + +} + +func (builder *MessageBatchBuilder) BuildMessageBatch() { + message_fbs.MessageBatchStartMessagesVector(builder.b, len(builder.messageOffsets)) + for i := len(builder.messageOffsets) - 1; i >= 0; i-- { + builder.b.PrependUOffsetT(builder.messageOffsets[i]) + } + messagesOffset := builder.b.EndVector(len(builder.messageOffsets)) + + message_fbs.MessageBatchStart(builder.b) + message_fbs.MessageBatchAddProducerId(builder.b, builder.producerId) + message_fbs.MessageBatchAddProducerEpoch(builder.b, builder.producerEpoch) + message_fbs.MessageBatchAddSegmentId(builder.b, builder.segmentId) + message_fbs.MessageBatchAddFlags(builder.b, builder.flags) + message_fbs.MessageBatchAddSegmentSeqBase(builder.b, builder.segmentSeqBase) + message_fbs.MessageBatchAddSegmentSeqMaxDelta(builder.b, int32(builder.segmentSeqLast-builder.segmentSeqBase)) + message_fbs.MessageBatchAddTsMsBase(builder.b, builder.tsMsBase) + message_fbs.MessageBatchAddTsMsMaxDelta(builder.b, int32(builder.tsMsLast-builder.tsMsBase)) + + message_fbs.MessageBatchAddMessages(builder.b, messagesOffset) + + messageBatch := message_fbs.MessageBatchEnd(builder.b) + + builder.b.Finish(messageBatch) +} - b.Finish(message) +func (builder *MessageBatchBuilder) GetBytes() []byte { + return builder.b.FinishedBytes() } diff --git a/weed/mq/segment/message_serde_test.go b/weed/mq/segment/message_serde_test.go index 7ba0febf0..bf561d2c0 100644 --- a/weed/mq/segment/message_serde_test.go +++ b/weed/mq/segment/message_serde_test.go @@ -10,27 +10,36 @@ import ( func TestMessageSerde(t *testing.T) { b := flatbuffers.NewBuilder(1024) - prop := make(map[string]string) - prop["n1"] = "v1" - prop["n2"] = "v2" + prop := make(map[string][]byte) + prop["n1"] = []byte("v1") + prop["n2"] = []byte("v2") - CreateMessage(b, 1, 2, 3, 4, 5, 6, prop, - []byte("the primary key"), []byte("body is here")) + bb := NewMessageBatchBuilder(b, 1, 2, 3, 4) - buf := b.FinishedBytes() + bb.AddMessage(5, 6, prop, []byte("the primary key"), []byte("body is here")) + + bb.BuildMessageBatch() + + buf := bb.GetBytes() println("serialized size", len(buf)) - m := message_fbs.GetRootAsMessage(buf, 0) + mb := message_fbs.GetRootAsMessageBatch(buf, 0) + + assert.Equal(t, int32(1), mb.ProducerId()) + assert.Equal(t, int32(2), mb.ProducerEpoch()) + assert.Equal(t, int32(3), mb.SegmentId()) + assert.Equal(t, int32(4), mb.Flags()) + assert.Equal(t, int64(5), mb.SegmentSeqBase()) + assert.Equal(t, int32(0), mb.SegmentSeqMaxDelta()) + assert.Equal(t, int64(6), mb.TsMsBase()) + assert.Equal(t, int32(0), mb.TsMsMaxDelta()) + + assert.Equal(t, 1, mb.MessagesLength()) - assert.Equal(t, int32(1), m.ProducerId()) - assert.Equal(t, int64(2), m.ProducerSeq()) - assert.Equal(t, int32(3), m.SegmentId()) - assert.Equal(t, int64(4), m.SegmentSeq()) - assert.Equal(t, int64(5), m.EventTsNs()) - assert.Equal(t, int64(6), m.RecvTsNs()) + m := &message_fbs.Message{} + mb.Messages(m, 0) - assert.Equal(t, 2, m.PropertiesLength()) nv := &message_fbs.NameValue{} m.Properties(nv, 0) assert.Equal(t, "n1", string(nv.Name())) @@ -41,7 +50,7 @@ func TestMessageSerde(t *testing.T) { assert.Equal(t, []byte("the primary key"), m.Key()) assert.Equal(t, []byte("body is here"), m.Data()) - m.MutateSegmentSeq(123) - assert.Equal(t, int64(123), m.SegmentSeq()) + assert.Equal(t, int32(0), m.SeqDelta()) + assert.Equal(t, int32(0), m.TsMsDelta()) } diff --git a/weed/pb/message.fbs b/weed/pb/message.fbs index 8ee6c5b55..170551df7 100644 --- a/weed/pb/message.fbs +++ b/weed/pb/message.fbs @@ -3,13 +3,21 @@ table NameValue { value:string; } table Message { - producer_id:int32 (id:0); - producer_seq:int64 (id:2); - segment_id:int32 (id:1); - segment_seq:int64 (id:3); - event_ts_ns:int64 (id:4); - recv_ts_ns:int64 (id:5); - properties:[NameValue] (id:6); - key:string (id:7); // bytes - data:string (id:8); // bytes + seq_delta:int32 (id:0); + ts_ms_delta:int32 (id:1); + properties:[NameValue] (id:2); + key:string (id:3); // bytes + data:string (id:4); // bytes +} + +table MessageBatch { + producer_id:int32 (id:0); + producer_epoch:int32 (id:1); + segment_id:int32 (id:2); + flags: int32 (id:3); + segment_seq_base:int64 (id:4); + segment_seq_max_delta:int32 (id:5); + ts_ms_base:int64 (id:6); + ts_ms_max_delta:int32 (id:7); + messages: [Message] (id:8); } diff --git a/weed/pb/message_fbs/Message.go b/weed/pb/message_fbs/Message.go index 058abfeaa..e9ef83616 100644 --- a/weed/pb/message_fbs/Message.go +++ b/weed/pb/message_fbs/Message.go @@ -33,7 +33,7 @@ func (rcv *Message) Table() flatbuffers.Table { return rcv._tab } -func (rcv *Message) ProducerId() int32 { +func (rcv *Message) SeqDelta() int32 { o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) if o != 0 { return rcv._tab.GetInt32(o + rcv._tab.Pos) @@ -41,11 +41,11 @@ func (rcv *Message) ProducerId() int32 { return 0 } -func (rcv *Message) MutateProducerId(n int32) bool { +func (rcv *Message) MutateSeqDelta(n int32) bool { return rcv._tab.MutateInt32Slot(4, n) } -func (rcv *Message) SegmentId() int32 { +func (rcv *Message) TsMsDelta() int32 { o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) if o != 0 { return rcv._tab.GetInt32(o + rcv._tab.Pos) @@ -53,60 +53,12 @@ func (rcv *Message) SegmentId() int32 { return 0 } -func (rcv *Message) MutateSegmentId(n int32) bool { +func (rcv *Message) MutateTsMsDelta(n int32) bool { return rcv._tab.MutateInt32Slot(6, n) } -func (rcv *Message) ProducerSeq() int64 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) - if o != 0 { - return rcv._tab.GetInt64(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *Message) MutateProducerSeq(n int64) bool { - return rcv._tab.MutateInt64Slot(8, n) -} - -func (rcv *Message) SegmentSeq() int64 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) - if o != 0 { - return rcv._tab.GetInt64(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *Message) MutateSegmentSeq(n int64) bool { - return rcv._tab.MutateInt64Slot(10, n) -} - -func (rcv *Message) EventTsNs() int64 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) - if o != 0 { - return rcv._tab.GetInt64(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *Message) MutateEventTsNs(n int64) bool { - return rcv._tab.MutateInt64Slot(12, n) -} - -func (rcv *Message) RecvTsNs() int64 { - o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) - if o != 0 { - return rcv._tab.GetInt64(o + rcv._tab.Pos) - } - return 0 -} - -func (rcv *Message) MutateRecvTsNs(n int64) bool { - return rcv._tab.MutateInt64Slot(14, n) -} - func (rcv *Message) Properties(obj *NameValue, j int) bool { - o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) if o != 0 { x := rcv._tab.Vector(o) x += flatbuffers.UOffsetT(j) * 4 @@ -118,7 +70,7 @@ func (rcv *Message) Properties(obj *NameValue, j int) bool { } func (rcv *Message) PropertiesLength() int { - o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) if o != 0 { return rcv._tab.VectorLen(o) } @@ -126,7 +78,7 @@ func (rcv *Message) PropertiesLength() int { } func (rcv *Message) Key() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(18)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) } @@ -134,7 +86,7 @@ func (rcv *Message) Key() []byte { } func (rcv *Message) Data() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) } @@ -142,37 +94,25 @@ func (rcv *Message) Data() []byte { } func MessageStart(builder *flatbuffers.Builder) { - builder.StartObject(9) -} -func MessageAddProducerId(builder *flatbuffers.Builder, producerId int32) { - builder.PrependInt32Slot(0, producerId, 0) -} -func MessageAddSegmentId(builder *flatbuffers.Builder, segmentId int32) { - builder.PrependInt32Slot(1, segmentId, 0) -} -func MessageAddProducerSeq(builder *flatbuffers.Builder, producerSeq int64) { - builder.PrependInt64Slot(2, producerSeq, 0) -} -func MessageAddSegmentSeq(builder *flatbuffers.Builder, segmentSeq int64) { - builder.PrependInt64Slot(3, segmentSeq, 0) + builder.StartObject(5) } -func MessageAddEventTsNs(builder *flatbuffers.Builder, eventTsNs int64) { - builder.PrependInt64Slot(4, eventTsNs, 0) +func MessageAddSeqDelta(builder *flatbuffers.Builder, seqDelta int32) { + builder.PrependInt32Slot(0, seqDelta, 0) } -func MessageAddRecvTsNs(builder *flatbuffers.Builder, recvTsNs int64) { - builder.PrependInt64Slot(5, recvTsNs, 0) +func MessageAddTsMsDelta(builder *flatbuffers.Builder, tsMsDelta int32) { + builder.PrependInt32Slot(1, tsMsDelta, 0) } func MessageAddProperties(builder *flatbuffers.Builder, properties flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(properties), 0) + builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(properties), 0) } func MessageStartPropertiesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { return builder.StartVector(4, numElems, 4) } func MessageAddKey(builder *flatbuffers.Builder, key flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(key), 0) + builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(key), 0) } func MessageAddData(builder *flatbuffers.Builder, data flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(data), 0) + builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(data), 0) } func MessageEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() diff --git a/weed/pb/message_fbs/MessageBatch.go b/weed/pb/message_fbs/MessageBatch.go new file mode 100644 index 000000000..19d6a4816 --- /dev/null +++ b/weed/pb/message_fbs/MessageBatch.go @@ -0,0 +1,187 @@ +// Code generated by the FlatBuffers compiler. DO NOT EDIT. + +package message_fbs + +import ( + flatbuffers "github.com/google/flatbuffers/go" +) + +type MessageBatch struct { + _tab flatbuffers.Table +} + +func GetRootAsMessageBatch(buf []byte, offset flatbuffers.UOffsetT) *MessageBatch { + n := flatbuffers.GetUOffsetT(buf[offset:]) + x := &MessageBatch{} + x.Init(buf, n+offset) + return x +} + +func GetSizePrefixedRootAsMessageBatch(buf []byte, offset flatbuffers.UOffsetT) *MessageBatch { + n := flatbuffers.GetUOffsetT(buf[offset+flatbuffers.SizeUint32:]) + x := &MessageBatch{} + x.Init(buf, n+offset+flatbuffers.SizeUint32) + return x +} + +func (rcv *MessageBatch) Init(buf []byte, i flatbuffers.UOffsetT) { + rcv._tab.Bytes = buf + rcv._tab.Pos = i +} + +func (rcv *MessageBatch) Table() flatbuffers.Table { + return rcv._tab +} + +func (rcv *MessageBatch) ProducerId() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(4)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateProducerId(n int32) bool { + return rcv._tab.MutateInt32Slot(4, n) +} + +func (rcv *MessageBatch) ProducerEpoch() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(6)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateProducerEpoch(n int32) bool { + return rcv._tab.MutateInt32Slot(6, n) +} + +func (rcv *MessageBatch) SegmentId() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(8)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateSegmentId(n int32) bool { + return rcv._tab.MutateInt32Slot(8, n) +} + +func (rcv *MessageBatch) Flags() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateFlags(n int32) bool { + return rcv._tab.MutateInt32Slot(10, n) +} + +func (rcv *MessageBatch) SegmentSeqBase() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateSegmentSeqBase(n int64) bool { + return rcv._tab.MutateInt64Slot(12, n) +} + +func (rcv *MessageBatch) SegmentSeqMaxDelta() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateSegmentSeqMaxDelta(n int32) bool { + return rcv._tab.MutateInt32Slot(14, n) +} + +func (rcv *MessageBatch) TsMsBase() int64 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + if o != 0 { + return rcv._tab.GetInt64(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateTsMsBase(n int64) bool { + return rcv._tab.MutateInt64Slot(16, n) +} + +func (rcv *MessageBatch) TsMsMaxDelta() int32 { + o := flatbuffers.UOffsetT(rcv._tab.Offset(18)) + if o != 0 { + return rcv._tab.GetInt32(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *MessageBatch) MutateTsMsMaxDelta(n int32) bool { + return rcv._tab.MutateInt32Slot(18, n) +} + +func (rcv *MessageBatch) Messages(obj *Message, j int) bool { + o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) + if o != 0 { + x := rcv._tab.Vector(o) + x += flatbuffers.UOffsetT(j) * 4 + x = rcv._tab.Indirect(x) + obj.Init(rcv._tab.Bytes, x) + return true + } + return false +} + +func (rcv *MessageBatch) MessagesLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 +} + +func MessageBatchStart(builder *flatbuffers.Builder) { + builder.StartObject(9) +} +func MessageBatchAddProducerId(builder *flatbuffers.Builder, producerId int32) { + builder.PrependInt32Slot(0, producerId, 0) +} +func MessageBatchAddProducerEpoch(builder *flatbuffers.Builder, producerEpoch int32) { + builder.PrependInt32Slot(1, producerEpoch, 0) +} +func MessageBatchAddSegmentId(builder *flatbuffers.Builder, segmentId int32) { + builder.PrependInt32Slot(2, segmentId, 0) +} +func MessageBatchAddFlags(builder *flatbuffers.Builder, flags int32) { + builder.PrependInt32Slot(3, flags, 0) +} +func MessageBatchAddSegmentSeqBase(builder *flatbuffers.Builder, segmentSeqBase int64) { + builder.PrependInt64Slot(4, segmentSeqBase, 0) +} +func MessageBatchAddSegmentSeqMaxDelta(builder *flatbuffers.Builder, segmentSeqMaxDelta int32) { + builder.PrependInt32Slot(5, segmentSeqMaxDelta, 0) +} +func MessageBatchAddTsMsBase(builder *flatbuffers.Builder, tsMsBase int64) { + builder.PrependInt64Slot(6, tsMsBase, 0) +} +func MessageBatchAddTsMsMaxDelta(builder *flatbuffers.Builder, tsMsMaxDelta int32) { + builder.PrependInt32Slot(7, tsMsMaxDelta, 0) +} +func MessageBatchAddMessages(builder *flatbuffers.Builder, messages flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(messages), 0) +} +func MessageBatchStartMessagesVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(4, numElems, 4) +} +func MessageBatchEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { + return builder.EndObject() +}