Repository: vanus-labs/vanus
Pull request #604 (2023-06-01 07:03:19)

feat(store): describe block
<!--

Thank you for contributing to Vanus!

PR Title Format: 

feat/fix/refactor/docs/...: what's changed

Note: see https://github.com/vanus-labs/vanus/blob/main/CONTRIBUTING.md to know details about title format

-->

### What problem does this PR solve?

<!--

Please create an issue first to describe the problem

There MUST be one line starting with "Issue Number:  ".

-->

Issue Number: close None

### Problem Summary

### What is changed and how does it work?

### Check List

<!-- At least one of them must be included. -->

#### Tests

- [ ] Unit test
- [ ] Integration test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No code


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs) Report
> Merging [#604](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs) (b7420c2) into [main](https://app.codecov.io/gh/vanus-labs/vanus/commit/ee76217182ba60efbcbb62fd374b8e75127d5133?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs) (ee76217) will **decrease** coverage by `2.53%`.
> The diff coverage is `46.82%`.

<details><summary>Additional details and impacted files</summary>


[![Impacted file tree graph](https://app.codecov.io/gh/vanus-labs/vanus/pull/604/graphs/tree.svg?width=650&height=150&src=pr&token=RSXSIMEY4V&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs)](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs)

```diff
@@            Coverage Diff             @@
##             main     #604      +/-   ##
==========================================
- Coverage   57.07%   54.55%   -2.53%     
==========================================
  Files         190      211      +21     
  Lines       15191    17046    +1855     
==========================================
+ Hits         8670     9299     +629     
- Misses       5884     7043    +1159     
- Partials      637      704      +67     
```


| [Impacted Files](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs) | Coverage Δ | |
|---|---|---|
| [internal/controller/trigger/storage/storage.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3N0b3JhZ2Uvc3RvcmFnZS5nbw==) | `0.00% <ø> (ø)` | |
| [...ernal/controller/trigger/validation/subscripton.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3ZhbGlkYXRpb24vc3Vic2NyaXB0b24uZ28=) | `66.12% <ø> (-3.17%)` | :arrow_down: |
| [internal/controller/trigger/worker/manager.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3dvcmtlci9tYW5hZ2VyLmdv) | `85.76% <ø> (+0.83%)` | :arrow_up: |
| [internal/controller/trigger/worker/policy.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3dvcmtlci9wb2xpY3kuZ28=) | `100.00% <ø> (ø)` | |
| [internal/controller/trigger/worker/scheduler.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3dvcmtlci9zY2hlZHVsZXIuZ28=) | `71.01% <ø> (+1.01%)` | :arrow_up: |
| [internal/controller/trigger/worker/worker.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvY29udHJvbGxlci90cmlnZ2VyL3dvcmtlci93b3JrZXIuZ28=) | `78.45% <ø> (-1.55%)` | :arrow_down: |
| [internal/gateway/config.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvZ2F0ZXdheS9jb25maWcuZ28=) | `60.60% <ø> (-0.51%)` | :arrow_down: |
| [internal/gateway/gateway.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvZ2F0ZXdheS9nYXRld2F5Lmdv) | `57.64% <ø> (-10.03%)` | :arrow_down: |
| [internal/gateway/proxy/auth.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvZ2F0ZXdheS9wcm94eS9hdXRoLmdv) | `0.00% <ø> (ø)` | |
| [internal/gateway/proxy/deadletter.go](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs#diff-aW50ZXJuYWwvZ2F0ZXdheS9wcm94eS9kZWFkbGV0dGVyLmdv) | `0.00% <ø> (ø)` | |
| ... and [70 more](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs) | |

... and [61 files with indirect coverage changes](https://app.codecov.io/gh/vanus-labs/vanus/pull/604/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs)

------

[Continue to review full report in Codecov by Sentry](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs). Last update [44bbb30...b7420c2](https://app.codecov.io/gh/vanus-labs/vanus/pull/604?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vanus-labs).

</details>

Patch:
diff --git a/internal/store/segment/api.go b/internal/store/segment/api.go
index 4910cd5..a4b0b20 100644
--- a/internal/store/segment/api.go
+++ b/internal/store/segment/api.go
@@ -78,15 +78,17 @@ func (s *segmentServer) RemoveBlock(ctx context.Context, req *segpb.RemoveBlockR
 	return &emptypb.Empty{}, nil
 }
 
-func (s *segmentServer) GetBlockInfo(
-	_ context.Context, _ *segpb.GetBlockInfoRequest,
-) (*segpb.GetBlockInfoResponse, error) {
-	// TODO(james.yin): implements GetBlockInfo()
-	// if err := s.srv.GetBlockInfo(ctx, 0); err != nil {
-	// 	return nil, err
-	// }
-
-	return &segpb.GetBlockInfoResponse{}, nil
+func (s *segmentServer) DescribeBlock(
+	ctx context.Context, req *segpb.DescribeBlockRequest,
+) (*segpb.DescribeBlockResponse, error) {
+	blockID := vanus.NewIDFromUint64(req.Id)
+
+	info, err := s.srv.DescribeBlock(ctx, blockID)
+	if err != nil {
+		return nil, err
+	}
+
+	return &segpb.DescribeBlockResponse{Info: info}, nil
 }
 
 func (s *segmentServer) ActivateSegment(
diff --git a/internal/store/segment/mock_replica.go b/internal/store/segment/mock_replica.go
index fcda45f..d76a155 100644
--- a/internal/store/segment/mock_replica.go
+++ b/internal/store/segment/mock_replica.go
@@ -95,7 +95,7 @@ func (mr *MockReplicaMockRecorder) Delete(ctx interface{}) *gomock.Call {
 // ID mocks base method.
 func (m *MockReplica) ID() vanus.ID {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "VolumeID")
+	ret := m.ctrl.Call(m, "ID")
 	ret0, _ := ret[0].(vanus.ID)
 	return ret0
 }
@@ -103,7 +103,7 @@ func (m *MockReplica) ID() vanus.ID {
 // ID indicates an expected call of ID.
 func (mr *MockReplicaMockRecorder) ID() *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "VolumeID", reflect.TypeOf((*MockReplica)(nil).ID))
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockReplica)(nil).ID))
 }
 
 // IDStr mocks base method.
diff --git a/internal/store/segment/mock_server.go b/internal/store/segment/mock_server.go
index 99a911c..af853b8 100644
--- a/internal/store/segment/mock_server.go
+++ b/internal/store/segment/mock_server.go
@@ -13,6 +13,7 @@ import (
 	primitive "github.com/vanus-labs/vanus/internal/primitive"
 	vanus "github.com/vanus-labs/vanus/internal/primitive/vanus"
 	cloudevents "github.com/vanus-labs/vanus/proto/pkg/cloudevents"
+	meta "github.com/vanus-labs/vanus/proto/pkg/meta"
 )
 
 // MockServer is a mock of Server interface.
@@ -81,6 +82,21 @@ func (mr *MockServerMockRecorder) CreateBlock(ctx, id, size interface{}) *gomock
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBlock", reflect.TypeOf((*MockServer)(nil).CreateBlock), ctx, id, size)
 }
 
+// DescribeBlock mocks base method.
+func (m *MockServer) DescribeBlock(ctx context.Context, id vanus.ID) (*meta.SegmentHealthInfo, error) {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "DescribeBlock", ctx, id)
+	ret0, _ := ret[0].(*meta.SegmentHealthInfo)
+	ret1, _ := ret[1].(error)
+	return ret0, ret1
+}
+
+// DescribeBlock indicates an expected call of DescribeBlock.
+func (mr *MockServerMockRecorder) DescribeBlock(ctx, id interface{}) *gomock.Call {
+	mr.mock.ctrl.T.Helper()
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeBlock", reflect.TypeOf((*MockServer)(nil).DescribeBlock), ctx, id)
+}
+
 // InactivateSegment mocks base method.
 func (m *MockServer) InactivateSegment(ctx context.Context) error {
 	m.ctrl.T.Helper()
diff --git a/internal/store/segment/server.go b/internal/store/segment/server.go
index 5c86443..e4f0d2a 100644
--- a/internal/store/segment/server.go
+++ b/internal/store/segment/server.go
@@ -81,7 +81,7 @@ type Server interface {
 
 	CreateBlock(ctx context.Context, id vanus.ID, size int64) error
 	RemoveBlock(ctx context.Context, id vanus.ID) error
-	// GetBlockInfo(ctx context.Context, id vanus.ID) error
+	DescribeBlock(ctx context.Context, id vanus.ID) (*metapb.SegmentHealthInfo, error)
 
 	ActivateSegment(ctx context.Context, logID vanus.ID, segID vanus.ID, replicas map[vanus.ID]string) error
 	InactivateSegment(ctx context.Context) error
@@ -446,20 +446,25 @@ func (s *server) RemoveBlock(ctx context.Context, blockID vanus.ID) error {
 	}
 
 	// FIXME(james.yin): more info.
-	log.Info(ctx).
-		Stringer("block_id", b.ID()).
-		Msg("The block has been deleted.")
+	log.Info(ctx).Stringer("block_id", b.ID()).Msg("The block has been deleted.")
 
 	return nil
 }
 
-// TODO(james.yin): implements GetBlockInfo.
-// func (s *server) GetBlockInfo(ctx context.Context, id vanus.ID) error {
-// 	if err := s.checkState(); err != nil {
-// 		return err
-// 	}
-// 	return nil
-// }
+func (s *server) DescribeBlock(_ context.Context, id vanus.ID) (*metapb.SegmentHealthInfo, error) {
+	if err := s.checkState(); err != nil {
+		return nil, err
+	}
+
+	var b Replica
+	if v, ok := s.replicas.Load(id); ok {
+		b, _ = v.(Replica)
+	} else {
+		return nil, errors.ErrResourceNotFound.WithMessage("the block doesn't exist")
+	}
+
+	return b.Status(), nil
+}
 
 // ActivateSegment mark a block ready to using and preparing to initializing a replica group.
 func (s *server) ActivateSegment(
diff --git a/proto/Makefile b/proto/Makefile
index e8ab245..7fb3f2a 100644
--- a/proto/Makefile
+++ b/proto/Makefile
@@ -8,9 +8,11 @@ endif
 generate-pb: check-package-env
 	mkdir -p ${VSPROTO_ROOT}/pkg/${package}
 	protoc -I=${VSPROTO_ROOT}/include \
-           -I=${VSPROTO_ROOT}/proto \
-           --go_out=${VSPROTO_ROOT}/pkg/${package} \
-		   --go_opt=paths=source_relative \
-		   --go-grpc_out=${VSPROTO_ROOT}/pkg/${package} \
-		   --go-grpc_opt=paths=source_relative,require_unimplemented_servers=false \
-			   ${VSPROTO_ROOT}/proto/${package}.proto
+          -I=${VSPROTO_ROOT}/proto \
+          --go_out=${VSPROTO_ROOT}/pkg/${package} \
+	  --go_opt=paths=source_relative \
+	  --go-grpc_out=${VSPROTO_ROOT}/pkg/${package} \
+	  --go-grpc_opt=paths=source_relative,require_unimplemented_servers=false \
+	  --go-grpc-mock_out=${VSPROTO_ROOT}/pkg/${package} \
+	  --go-grpc-mock_opt=paths=source_relative \
+	  ${VSPROTO_ROOT}/proto/${package}.proto
diff --git a/proto/README.md b/proto/README.md
index 4c37ceb..cdeb372 100644
--- a/proto/README.md
+++ b/proto/README.md
@@ -6,7 +6,7 @@ Protobuf files for Vanus
 
 ### Setup IDE
 
-1. install plugin 'Proto Buffer' in marketplace
+1. install plugin 'Protocol Buffer' in marketplace
 2. config path: Performance -> Language&Framework -> Proto Buffers -> Import paths;
    and add `include` and `proto` directory to
 
@@ -17,12 +17,13 @@ Protobuf files for Vanus
 brew install protobuf
 
 # or download https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-osx-x86_64.zip
-unzip protoc-3.19.4-osx-x86_64.zip
-mv bin/protoc $GOPATH/bin/ 
+#unzip protoc-3.19.4-osx-x86_64.zip
+#mv bin/protoc $GOPATH/bin/ 
 
-# 2. Install protoc-gen-go and protoc-gen-go-grpc
+# 2. Install protoc-gen-go, protoc-gen-go-grpc and protoc-gen-go-grpc-mock
 go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
+go install github.com/sorcererxw/protoc-gen-go-grpc-mock@latest
 ```
 
 ### debug
@@ -47,6 +48,12 @@ package=controller make generate-pb
 brew install bufbuild/buf/buf
 ```
 
+### Install `protoc-gen-go-grpc-mock`
+
+```bash
+go install github.com/sorcererxw/protoc-gen-go-grpc-mock@latest
+```
+
 ### Generate code
 
 ```bash
diff --git a/proto/pkg/segment/segment.pb.go b/proto/pkg/segment/segment.pb.go
index c355756..aff67c5 100644
--- a/proto/pkg/segment/segment.pb.go
+++ b/proto/pkg/segment/segment.pb.go
@@ -14,8 +14,8 @@
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.26.0
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.30.0
+// 	protoc        (unknown)
 // source: segment.proto
 
 package segment
@@ -23,6 +23,7 @@ package segment
 import (
 	cloudevents "github.com/vanus-labs/vanus/proto/pkg/cloudevents"
 	config "github.com/vanus-labs/vanus/proto/pkg/config"
+	meta "github.com/vanus-labs/vanus/proto/pkg/meta"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
@@ -300,14 +301,16 @@ func (x *RemoveBlockRequest) GetId() uint64 {
 	return 0
 }
 
-type GetBlockInfoRequest struct {
+type DescribeBlockRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
+
+	Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
 }
 
-func (x *GetBlockInfoRequest) Reset() {
-	*x = GetBlockInfoRequest{}
+func (x *DescribeBlockRequest) Reset() {
+	*x = DescribeBlockRequest{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_segment_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -315,13 +318,13 @@ func (x *GetBlockInfoRequest) Reset() {
 	}
 }
 
-func (x *GetBlockInfoRequest) String() string {
+func (x *DescribeBlockRequest) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetBlockInfoRequest) ProtoMessage() {}
+func (*DescribeBlockRequest) ProtoMessage() {}
 
-func (x *GetBlockInfoRequest) ProtoReflect() protoreflect.Message {
+func (x *DescribeBlockRequest) ProtoReflect() protoreflect.Message {
 	mi := &file_segment_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -333,19 +336,28 @@ func (x *GetBlockInfoRequest) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetBlockInfoRequest.ProtoReflect.Descriptor instead.
-func (*GetBlockInfoRequest) Descriptor() ([]byte, []int) {
+// Deprecated: Use DescribeBlockRequest.ProtoReflect.Descriptor instead.
+func (*DescribeBlockRequest) Descriptor() ([]byte, []int) {
 	return file_segment_proto_rawDescGZIP(), []int{6}
 }
 
-type GetBlockInfoResponse struct {
+func (x *DescribeBlockRequest) GetId() uint64 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+type DescribeBlockResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
+
+	Info *meta.SegmentHealthInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"`
 }
 
-func (x *GetBlockInfoResponse) Reset() {
-	*x = GetBlockInfoResponse{}
+func (x *DescribeBlockResponse) Reset() {
+	*x = DescribeBlockResponse{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_segment_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -353,13 +365,13 @@ func (x *GetBlockInfoResponse) Reset() {
 	}
 }
 
-func (x *GetBlockInfoResponse) String() string {
+func (x *DescribeBlockResponse) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*GetBlockInfoResponse) ProtoMessage() {}
+func (*DescribeBlockResponse) ProtoMessage() {}
 
-func (x *GetBlockInfoResponse) ProtoReflect() protoreflect.Message {
+func (x *DescribeBlockResponse) ProtoReflect() protoreflect.Message {
 	mi := &file_segment_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -371,11 +383,18 @@ func (x *GetBlockInfoResponse) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use GetBlockInfoResponse.ProtoReflect.Descriptor instead.
-func (*GetBlockInfoResponse) Descriptor() ([]byte, []int) {
+// Deprecated: Use DescribeBlockResponse.ProtoReflect.Descriptor instead.
+func (*DescribeBlockResponse) Descriptor() ([]byte, []int) {
 	return file_segment_proto_rawDescGZIP(), []int{7}
 }
 
+func (x *DescribeBlockResponse) GetInfo() *meta.SegmentHealthInfo {
+	if x != nil {
+		return x.Info
+	}
+	return nil
+}
+
 type ActivateSegmentRequest struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -943,156 +962,161 @@ var file_segment_proto_rawDesc = []byte{
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
 	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f,
 	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x22, 0x5a, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
-	0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37,
-	0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f,
-	0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66,
-	0x69, 0x67, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52,
-	0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x1c, 0x0a,
-	0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72,
-	0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x53,
-	0x74, 0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x70, 0x53,
-	0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x38, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c,
-	0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69,
-	0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x24,
-	0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
-	0x52, 0x02, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
-	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x16, 0x0a, 0x14, 0x47,
-	0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0xf6, 0x01, 0x0a, 0x16, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65,
-	0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f,
-	0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12,
-	0x28, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70,
-	0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69,
-	0x63, 0x61, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x54, 0x0a, 0x08, 0x72, 0x65, 0x70,
-	0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x76, 0x61,
-	0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a,
-	0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
-	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b,
-	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17,
-	0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x49, 0x6e, 0x61, 0x63, 0x74,
-	0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74,
-	0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x72, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63,
-	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63,
-	0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63,
-	0x6b, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20,
+	0x6f, 0x1a, 0x0a, 0x6d, 0x65, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5a, 0x0a,
+	0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72,
+	0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x61, 0x6e,
+	0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x74, 0x61,
+	0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x53, 0x74, 0x6f, 0x70, 0x53,
+	0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65,
+	0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x38, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x24, 0x0a, 0x12, 0x52, 0x65,
+	0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64,
+	0x22, 0x26, 0x0a, 0x14, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63,
+	0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x15, 0x44, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x36, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x22, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x74,
+	0x61, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0xf6, 0x01, 0x0a, 0x16, 0x41, 0x63,
+	0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x6c, 0x6f, 0x67,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74,
+	0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52,
+	0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12,
+	0x54, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x38, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73,
+	0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53,
+	0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65,
+	0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x72, 0x65, 0x70,
+	0x6c, 0x69, 0x63, 0x61, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61,
+	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
+	0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65,
+	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x0a,
+	0x18, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65,
+	0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1b, 0x0a, 0x19, 0x49, 0x6e, 0x61,
+	0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72, 0x0a, 0x14, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64,
+	0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
+	0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04,
+	0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x76, 0x65,
+	0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x61, 0x6e, 0x75,
+	0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e,
+	0x74, 0x73, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74,
+	0x63, 0x68, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x41, 0x70,
+	0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01,
+	0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x22, 0x8a, 0x01,
+	0x0a, 0x14, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f,
+	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
+	0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d,
+	0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+	0x72, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d,
+	0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x6c,
+	0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x72, 0x0a, 0x15, 0x52, 0x65,
+	0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20,
 	0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65,
 	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6c, 0x6f,
 	0x75, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x06, 0x65, 0x76,
-	0x65, 0x6e, 0x74, 0x73, 0x22, 0x31, 0x0a, 0x15, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f,
-	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a,
-	0x07, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07,
-	0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x64,
-	0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f,
-	0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66,
-	0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x70,
-	0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04,
-	0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d,
-	0x65, 0x6f, 0x75, 0x74, 0x22, 0x72, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d,
-	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a,
-	0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
-	0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
-	0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x45, 0x76, 0x65, 0x6e,
-	0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18,
-	0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52,
-	0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x4d, 0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b,
-	0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49,
-	0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
-	0x52, 0x05, 0x73, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x1b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75,
-	0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x28,
-	0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xae, 0x08, 0x0a, 0x0d, 0x53, 0x65, 0x67,
-	0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x66, 0x0a, 0x05, 0x53, 0x74,
-	0x61, 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65,
-	0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65,
-	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
-	0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x67,
-	0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x12, 0x63, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x2c, 0x2e, 0x76, 0x61, 0x6e,
-	0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
-	0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65,
-	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73,
+	0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x4d,
+	0x0a, 0x1a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e,
+	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07,
+	0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x69, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x35, 0x0a,
+	0x1b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42,
+	0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06,
+	0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66,
+	0x66, 0x73, 0x65, 0x74, 0x22, 0x28, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xb1,
+	0x08, 0x0a, 0x0d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x12, 0x66, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2d, 0x2e, 0x76, 0x61, 0x6e, 0x75,
+	0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53,
+	0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73,
 	0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74,
-	0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52,
-	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74,
-	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x26, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
-	0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61,
-	0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
-	0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x26, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76,
-	0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x61, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63,
-	0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c,
-	0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28,
+	0x61, 0x72, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70,
+	0x12, 0x2c, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65,
+	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+	0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d,
 	0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d,
-	0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69,
-	0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x76, 0x61,
+	0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53,
+	0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a,
+	0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x26, 0x2e, 0x76,
+	0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+	0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4d, 0x0a, 0x0b,
+	0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x26, 0x2e, 0x76, 0x61,
+	0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
+	0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0d, 0x44,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x76,
+	0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+	0x74, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x62, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+	0x65, 0x12, 0x6a, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67,
+	0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x2b, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65,
+	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65,
+	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a,
+	0x11, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65,
+	0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
+	0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61,
+	0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x64, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65,
+	0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x76, 0x61, 0x6e, 0x75,
+	0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41,
+	0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54,
+	0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64,
+	0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12,
+	0x28, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67,
+	0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f,
+	0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x61, 0x6e, 0x75,
+	0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52,
+	0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66,
+	0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2e, 0x2e, 0x76, 0x61,
 	0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
-	0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e,
-	0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74,
-	0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x11, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61,
-	0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x76, 0x61, 0x6e, 0x75,
-	0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x49,
-	0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12,
-	0x64, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
-	0x12, 0x28, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65,
-	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c,
-	0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x76, 0x61, 0x6e,
-	0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
-	0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f,
-	0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x28, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63,
-	0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x64,
-	0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x29, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65,
-	0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c,
-	0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x4c,
-	0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f,
-	0x63, 0x6b, 0x12, 0x2e, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
-	0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66,
-	0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e,
-	0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66,
-	0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f,
-	0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74,
-	0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2d, 0x6c, 0x61,
-	0x62, 0x73, 0x2f, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70,
-	0x6b, 0x67, 0x2f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x33,
+	0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42,
+	0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x76, 0x61,
+	0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74,
+	0x2e, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x42,
+	0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x06,
+	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22,
+	0x2e, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x67, 0x6d,
+	0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+	0x2f, 0x76, 0x61, 0x6e, 0x75, 0x73, 0x2d, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x76, 0x61, 0x6e, 0x75,
+	0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x73, 0x65, 0x67, 0x6d,
+	0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1115,8 +1139,8 @@ var file_segment_proto_goTypes = []interface{}{
 	(*StopSegmentServerResponse)(nil),   // 3: vanus.core.segment.StopSegmentServerResponse
 	(*CreateBlockRequest)(nil),          // 4: vanus.core.segment.CreateBlockRequest
 	(*RemoveBlockRequest)(nil),          // 5: vanus.core.segment.RemoveBlockRequest
-	(*GetBlockInfoRequest)(nil),         // 6: vanus.core.segment.GetBlockInfoRequest
-	(*GetBlockInfoResponse)(nil),        // 7: vanus.core.segment.GetBlockInfoResponse
+	(*DescribeBlockRequest)(nil),        // 6: vanus.core.segment.DescribeBlockRequest
+	(*DescribeBlockResponse)(nil),       // 7: vanus.core.segment.DescribeBlockResponse
 	(*ActivateSegmentRequest)(nil),      // 8: vanus.core.segment.ActivateSegmentRequest
 	(*ActivateSegmentResponse)(nil),     // 9: vanus.core.segment.ActivateSegmentResponse
 	(*InactivateSegmentRequest)(nil),    // 10: vanus.core.segment.InactivateSegmentRequest
@@ -1130,41 +1154,43 @@ var file_segment_proto_goTypes = []interface{}{
 	(*StatusResponse)(nil),              // 18: vanus.core.segment.StatusResponse
 	nil,                                 // 19: vanus.core.segment.ActivateSegmentRequest.ReplicasEntry
 	(*config.ServerConfig)(nil),         // 20: vanus.core.config.ServerConfig
-	(*cloudevents.CloudEventBatch)(nil), // 21: vanus.core.cloudevents.CloudEventBatch
-	(*emptypb.Empty)(nil),               // 22: google.protobuf.Empty
+	(*meta.SegmentHealthInfo)(nil),      // 21: vanus.core.meta.SegmentHealthInfo
+	(*cloudevents.CloudEventBatch)(nil), // 22: vanus.core.cloudevents.CloudEventBatch
+	(*emptypb.Empty)(nil),               // 23: google.protobuf.Empty
 }
 var file_segment_proto_depIdxs = []int32{
 	20, // 0: vanus.core.segment.StartSegmentServerRequest.config:type_name -> vanus.core.config.ServerConfig
-	19, // 1: vanus.core.segment.ActivateSegmentRequest.replicas:type_name -> vanus.core.segment.ActivateSegmentRequest.ReplicasEntry
-	21, // 2: vanus.core.segment.AppendToBlockRequest.events:type_name -> vanus.core.cloudevents.CloudEventBatch
-	21, // 3: vanus.core.segment.ReadFromBlockResponse.events:type_name -> vanus.core.cloudevents.CloudEventBatch
-	0,  // 4: vanus.core.segment.SegmentServer.Start:input_type -> vanus.core.segment.StartSegmentServerRequest
-	2,  // 5: vanus.core.segment.SegmentServer.Stop:input_type -> vanus.core.segment.StopSegmentServerRequest
-	4,  // 6: vanus.core.segment.SegmentServer.CreateBlock:input_type -> vanus.core.segment.CreateBlockRequest
-	5,  // 7: vanus.core.segment.SegmentServer.RemoveBlock:input_type -> vanus.core.segment.RemoveBlockRequest
-	6,  // 8: vanus.core.segment.SegmentServer.GetBlockInfo:input_type -> vanus.core.segment.GetBlockInfoRequest
-	8,  // 9: vanus.core.segment.SegmentServer.ActivateSegment:input_type -> vanus.core.segment.ActivateSegmentRequest
-	10, // 10: vanus.core.segment.SegmentServer.InactivateSegment:input_type -> vanus.core.segment.InactivateSegmentRequest
-	12, // 11: vanus.core.segment.SegmentServer.AppendToBlock:input_type -> vanus.core.segment.AppendToBlockRequest
-	14, // 12: vanus.core.segment.SegmentServer.ReadFromBlock:input_type -> vanus.core.segment.ReadFromBlockRequest
-	16, // 13: vanus.core.segment.SegmentServer.LookupOffsetInBlock:input_type -> vanus.core.segment.LookupOffsetInBlockRequest
-	22, // 14: vanus.core.segment.SegmentServer.Status:input_type -> google.protobuf.Empty
-	1,  // 15: vanus.core.segment.SegmentServer.Start:output_type -> vanus.core.segment.StartSegmentServerResponse
-	3,  // 16: vanus.core.segment.SegmentServer.Stop:output_type -> vanus.core.segment.StopSegmentServerResponse
-	22, // 17: vanus.core.segment.SegmentServer.CreateBlock:output_type -> google.protobuf.Empty
-	22, // 18: vanus.core.segment.SegmentServer.RemoveBlock:output_type -> google.protobuf.Empty
-	7,  // 19: vanus.core.segment.SegmentServer.GetBlockInfo:output_type -> vanus.core.segment.GetBlockInfoResponse
-	9,  // 20: vanus.core.segment.SegmentServer.ActivateSegment:output_type -> vanus.core.segment.ActivateSegmentResponse
-	22, // 21: vanus.core.segment.SegmentServer.InactivateSegment:output_type -> google.protobuf.Empty
-	13, // 22: vanus.core.segment.SegmentServer.AppendToBlock:output_type -> vanus.core.segment.AppendToBlockResponse
-	15, // 23: vanus.core.segment.SegmentServer.ReadFromBlock:output_type -> vanus.core.segment.ReadFromBlockResponse
-	17, // 24: vanus.core.segment.SegmentServer.LookupOffsetInBlock:output_type -> vanus.core.segment.LookupOffsetInBlockResponse
-	18, // 25: vanus.core.segment.SegmentServer.Status:output_type -> vanus.core.segment.StatusResponse
-	15, // [15:26] is the sub-list for method output_type
-	4,  // [4:15] 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
+	21, // 1: vanus.core.segment.DescribeBlockResponse.info:type_name -> vanus.core.meta.SegmentHealthInfo
+	19, // 2: vanus.core.segment.ActivateSegmentRequest.replicas:type_name -> vanus.core.segment.ActivateSegmentRequest.ReplicasEntry
+	22, // 3: vanus.core.segment.AppendToBlockRequest.events:type_name -> vanus.core.cloudevents.CloudEventBatch
+	22, // 4: vanus.core.segment.ReadFromBlockResponse.events:type_name -> vanus.core.cloudevents.CloudEventBatch
+	0,  // 5: vanus.core.segment.SegmentServer.Start:input_type -> vanus.core.segment.StartSegmentServerRequest
+	2,  // 6: vanus.core.segment.SegmentServer.Stop:input_type -> vanus.core.segment.StopSegmentServerRequest
+	4,  // 7: vanus.core.segment.SegmentServer.CreateBlock:input_type -> vanus.core.segment.CreateBlockRequest
+	5,  // 8: vanus.core.segment.SegmentServer.RemoveBlock:input_type -> vanus.core.segment.RemoveBlockRequest
+	6,  // 9: vanus.core.segment.SegmentServer.DescribeBlock:input_type -> vanus.core.segment.DescribeBlockRequest
+	8,  // 10: vanus.core.segment.SegmentServer.ActivateSegment:input_type -> vanus.core.segment.ActivateSegmentRequest
+	10, // 11: vanus.core.segment.SegmentServer.InactivateSegment:input_type -> vanus.core.segment.InactivateSegmentRequest
+	12, // 12: vanus.core.segment.SegmentServer.AppendToBlock:input_type -> vanus.core.segment.AppendToBlockRequest
+	14, // 13: vanus.core.segment.SegmentServer.ReadFromBlock:input_type -> vanus.core.segment.ReadFromBlockRequest
+	16, // 14: vanus.core.segment.SegmentServer.LookupOffsetInBlock:input_type -> vanus.core.segment.LookupOffsetInBlockRequest
+	23, // 15: vanus.core.segment.SegmentServer.Status:input_type -> google.protobuf.Empty
+	1,  // 16: vanus.core.segment.SegmentServer.Start:output_type -> vanus.core.segment.StartSegmentServerResponse
+	3,  // 17: vanus.core.segment.SegmentServer.Stop:output_type -> vanus.core.segment.StopSegmentServerResponse
+	23, // 18: vanus.core.segment.SegmentServer.CreateBlock:output_type -> google.protobuf.Empty
+	23, // 19: vanus.core.segment.SegmentServer.RemoveBlock:output_type -> google.protobuf.Empty
+	7,  // 20: vanus.core.segment.SegmentServer.DescribeBlock:output_type -> vanus.core.segment.DescribeBlockResponse
+	9,  // 21: vanus.core.segment.SegmentServer.ActivateSegment:output_type -> vanus.core.segment.ActivateSegmentResponse
+	23, // 22: vanus.core.segment.SegmentServer.InactivateSegment:output_type -> google.protobuf.Empty
+	13, // 23: vanus.core.segment.SegmentServer.AppendToBlock:output_type -> vanus.core.segment.AppendToBlockResponse
+	15, // 24: vanus.core.segment.SegmentServer.ReadFromBlock:output_type -> vanus.core.segment.ReadFromBlockResponse
+	17, // 25: vanus.core.segment.SegmentServer.LookupOffsetInBlock:output_type -> vanus.core.segment.LookupOffsetInBlockResponse
+	18, // 26: vanus.core.segment.SegmentServer.Status:output_type -> vanus.core.segment.StatusResponse
+	16, // [16:27] is the sub-list for method output_type
+	5,  // [5:16] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
 }
 
 func init() { file_segment_proto_init() }
@@ -1246,7 +1272,7 @@ func file_segment_proto_init() {
 			}
 		}
 		file_segment_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetBlockInfoRequest); i {
+			switch v := v.(*DescribeBlockRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1258,7 +1284,7 @@ func file_segment_proto_init() {
 			}
 		}
 		file_segment_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetBlockInfoResponse); i {
+			switch v := v.(*DescribeBlockResponse); i {
 			case 0:
 				return &v.state
 			case 1:
diff --git a/proto/pkg/segment/segment_grpc.pb.go b/proto/pkg/segment/segment_grpc.pb.go
index 68d94f2..873d8c8 100644
--- a/proto/pkg/segment/segment_grpc.pb.go
+++ b/proto/pkg/segment/segment_grpc.pb.go
@@ -15,7 +15,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v3.19.4
+// - protoc             (unknown)
 // source: segment.proto
 
 package segment
@@ -38,7 +38,7 @@ const (
 	SegmentServer_Stop_FullMethodName                = "/vanus.core.segment.SegmentServer/Stop"
 	SegmentServer_CreateBlock_FullMethodName         = "/vanus.core.segment.SegmentServer/CreateBlock"
 	SegmentServer_RemoveBlock_FullMethodName         = "/vanus.core.segment.SegmentServer/RemoveBlock"
-	SegmentServer_GetBlockInfo_FullMethodName        = "/vanus.core.segment.SegmentServer/GetBlockInfo"
+	SegmentServer_DescribeBlock_FullMethodName       = "/vanus.core.segment.SegmentServer/DescribeBlock"
 	SegmentServer_ActivateSegment_FullMethodName     = "/vanus.core.segment.SegmentServer/ActivateSegment"
 	SegmentServer_InactivateSegment_FullMethodName   = "/vanus.core.segment.SegmentServer/InactivateSegment"
 	SegmentServer_AppendToBlock_FullMethodName       = "/vanus.core.segment.SegmentServer/AppendToBlock"
@@ -55,7 +55,7 @@ type SegmentServerClient interface {
 	Stop(ctx context.Context, in *StopSegmentServerRequest, opts ...grpc.CallOption) (*StopSegmentServerResponse, error)
 	CreateBlock(ctx context.Context, in *CreateBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	RemoveBlock(ctx context.Context, in *RemoveBlockRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
-	GetBlockInfo(ctx context.Context, in *GetBlockInfoRequest, opts ...grpc.CallOption) (*GetBlockInfoResponse, error)
+	DescribeBlock(ctx context.Context, in *DescribeBlockRequest, opts ...grpc.CallOption) (*DescribeBlockResponse, error)
 	ActivateSegment(ctx context.Context, in *ActivateSegmentRequest, opts ...grpc.CallOption) (*ActivateSegmentResponse, error)
 	InactivateSegment(ctx context.Context, in *InactivateSegmentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
 	AppendToBlock(ctx context.Context, in *AppendToBlockRequest, opts ...grpc.CallOption) (*AppendToBlockResponse, error)
@@ -108,9 +108,9 @@ func (c *segmentServerClient) RemoveBlock(ctx context.Context, in *RemoveBlockRe
 	return out, nil
 }
 
-func (c *segmentServerClient) GetBlockInfo(ctx context.Context, in *GetBlockInfoRequest, opts ...grpc.CallOption) (*GetBlockInfoResponse, error) {
-	out := new(GetBlockInfoResponse)
-	err := c.cc.Invoke(ctx, SegmentServer_GetBlockInfo_FullMethodName, in, out, opts...)
+func (c *segmentServerClient) DescribeBlock(ctx context.Context, in *DescribeBlockRequest, opts ...grpc.CallOption) (*DescribeBlockResponse, error) {
+	out := new(DescribeBlockResponse)
+	err := c.cc.Invoke(ctx, SegmentServer_DescribeBlock_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -179,7 +179,7 @@ type SegmentServerServer interface {
 	Stop(context.Context, *StopSegmentServerRequest) (*StopSegmentServerResponse, error)
 	CreateBlock(context.Context, *CreateBlockRequest) (*emptypb.Empty, error)
 	RemoveBlock(context.Context, *RemoveBlockRequest) (*emptypb.Empty, error)
-	GetBlockInfo(context.Context, *GetBlockInfoRequest) (*GetBlockInfoResponse, error)
+	DescribeBlock(context.Context, *DescribeBlockRequest) (*DescribeBlockResponse, error)
 	ActivateSegment(context.Context, *ActivateSegmentRequest) (*ActivateSegmentResponse, error)
 	InactivateSegment(context.Context, *InactivateSegmentRequest) (*emptypb.Empty, error)
 	AppendToBlock(context.Context, *AppendToBlockRequest) (*AppendToBlockResponse, error)
@@ -204,8 +204,8 @@ func (UnimplementedSegmentServerServer) CreateBlock(context.Context, *CreateBloc
 func (UnimplementedSegmentServerServer) RemoveBlock(context.Context, *RemoveBlockRequest) (*emptypb.Empty, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method RemoveBlock not implemented")
 }
-func (UnimplementedSegmentServerServer) GetBlockInfo(context.Context, *GetBlockInfoRequest) (*GetBlockInfoResponse, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method GetBlockInfo not implemented")
+func (UnimplementedSegmentServerServer) DescribeBlock(context.Context, *DescribeBlockRequest) (*DescribeBlockResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DescribeBlock not implemented")
 }
 func (UnimplementedSegmentServerServer) ActivateSegment(context.Context, *ActivateSegmentRequest) (*ActivateSegmentResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method ActivateSegment not implemented")
@@ -309,20 +309,20 @@ func _SegmentServer_RemoveBlock_Handler(srv interface{}, ctx context.Context, de
 	return interceptor(ctx, in, info, handler)
 }
 
-func _SegmentServer_GetBlockInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetBlockInfoRequest)
+func _SegmentServer_DescribeBlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DescribeBlockRequest)
 	if err := dec(in); err != nil {
 		return nil, err
 	}
 	if interceptor == nil {
-		return srv.(SegmentServerServer).GetBlockInfo(ctx, in)
+		return srv.(SegmentServerServer).DescribeBlock(ctx, in)
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: SegmentServer_GetBlockInfo_FullMethodName,
+		FullMethod: SegmentServer_DescribeBlock_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(SegmentServerServer).GetBlockInfo(ctx, req.(*GetBlockInfoRequest))
+		return srv.(SegmentServerServer).DescribeBlock(ctx, req.(*DescribeBlockRequest))
 	}
 	return interceptor(ctx, in, info, handler)
 }
@@ -459,8 +459,8 @@ var SegmentServer_ServiceDesc = grpc.ServiceDesc{
 			Handler:    _SegmentServer_RemoveBlock_Handler,
 		},
 		{
-			MethodName: "GetBlockInfo",
-			Handler:    _SegmentServer_GetBlockInfo_Handler,
+			MethodName: "DescribeBlock",
+			Handler:    _SegmentServer_DescribeBlock_Handler,
 		},
 		{
 			MethodName: "ActivateSegment",
diff --git a/proto/pkg/segment/mock_segment.go b/proto/pkg/segment/segment_grpc_mock.pb.go
similarity index 70%
rename from proto/pkg/segment/mock_segment.go
rename to proto/pkg/segment/segment_grpc_mock.pb.go
index 0aadc4b..617237c 100644
--- a/proto/pkg/segment/mock_segment.go
+++ b/proto/pkg/segment/segment_grpc_mock.pb.go
@@ -1,7 +1,6 @@
-// Code generated by MockGen. DO NOT EDIT.
-// Source: segment_grpc.pb.go
+// Code generated by protoc-gen-go-grpc-mock. DO NOT EDIT.
+// source: segment.proto
 
-// Package segment is a generated GoMock package.
 package segment
 
 import (
@@ -96,24 +95,24 @@ func (mr *MockSegmentServerClientMockRecorder) CreateBlock(ctx, in interface{},
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBlock", reflect.TypeOf((*MockSegmentServerClient)(nil).CreateBlock), varargs...)
 }
 
-// GetBlockInfo mocks base method.
-func (m *MockSegmentServerClient) GetBlockInfo(ctx context.Context, in *GetBlockInfoRequest, opts ...grpc.CallOption) (*GetBlockInfoResponse, error) {
+// DescribeBlock mocks base method.
+func (m *MockSegmentServerClient) DescribeBlock(ctx context.Context, in *DescribeBlockRequest, opts ...grpc.CallOption) (*DescribeBlockResponse, error) {
 	m.ctrl.T.Helper()
 	varargs := []interface{}{ctx, in}
 	for _, a := range opts {
 		varargs = append(varargs, a)
 	}
-	ret := m.ctrl.Call(m, "GetBlockInfo", varargs...)
-	ret0, _ := ret[0].(*GetBlockInfoResponse)
+	ret := m.ctrl.Call(m, "DescribeBlock", varargs...)
+	ret0, _ := ret[0].(*DescribeBlockResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
-// GetBlockInfo indicates an expected call of GetBlockInfo.
-func (mr *MockSegmentServerClientMockRecorder) GetBlockInfo(ctx, in interface{}, opts ...interface{}) *gomock.Call {
+// DescribeBlock indicates an expected call of DescribeBlock.
+func (mr *MockSegmentServerClientMockRecorder) DescribeBlock(ctx, in interface{}, opts ...interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
 	varargs := append([]interface{}{ctx, in}, opts...)
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockInfo", reflect.TypeOf((*MockSegmentServerClient)(nil).GetBlockInfo), varargs...)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeBlock", reflect.TypeOf((*MockSegmentServerClient)(nil).DescribeBlock), varargs...)
 }
 
 // InactivateSegment mocks base method.
@@ -280,201 +279,166 @@ func (m *MockSegmentServerServer) EXPECT() *MockSegmentServerServerMockRecorder
 }
 
 // ActivateSegment mocks base method.
-func (m *MockSegmentServerServer) ActivateSegment(arg0 context.Context, arg1 *ActivateSegmentRequest) (*ActivateSegmentResponse, error) {
+func (m *MockSegmentServerServer) ActivateSegment(ctx context.Context, in *ActivateSegmentRequest) (*ActivateSegmentResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ActivateSegment", arg0, arg1)
+	ret := m.ctrl.Call(m, "ActivateSegment", ctx, in)
 	ret0, _ := ret[0].(*ActivateSegmentResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // ActivateSegment indicates an expected call of ActivateSegment.
-func (mr *MockSegmentServerServerMockRecorder) ActivateSegment(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) ActivateSegment(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActivateSegment", reflect.TypeOf((*MockSegmentServerServer)(nil).ActivateSegment), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActivateSegment", reflect.TypeOf((*MockSegmentServerServer)(nil).ActivateSegment), ctx, in)
 }
 
 // AppendToBlock mocks base method.
-func (m *MockSegmentServerServer) AppendToBlock(arg0 context.Context, arg1 *AppendToBlockRequest) (*AppendToBlockResponse, error) {
+func (m *MockSegmentServerServer) AppendToBlock(ctx context.Context, in *AppendToBlockRequest) (*AppendToBlockResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "AppendToBlock", arg0, arg1)
+	ret := m.ctrl.Call(m, "AppendToBlock", ctx, in)
 	ret0, _ := ret[0].(*AppendToBlockResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // AppendToBlock indicates an expected call of AppendToBlock.
-func (mr *MockSegmentServerServerMockRecorder) AppendToBlock(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) AppendToBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendToBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).AppendToBlock), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendToBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).AppendToBlock), ctx, in)
 }
 
 // CreateBlock mocks base method.
-func (m *MockSegmentServerServer) CreateBlock(arg0 context.Context, arg1 *CreateBlockRequest) (*emptypb.Empty, error) {
+func (m *MockSegmentServerServer) CreateBlock(ctx context.Context, in *CreateBlockRequest) (*emptypb.Empty, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "CreateBlock", arg0, arg1)
+	ret := m.ctrl.Call(m, "CreateBlock", ctx, in)
 	ret0, _ := ret[0].(*emptypb.Empty)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // CreateBlock indicates an expected call of CreateBlock.
-func (mr *MockSegmentServerServerMockRecorder) CreateBlock(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) CreateBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).CreateBlock), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).CreateBlock), ctx, in)
 }
 
-// GetBlockInfo mocks base method.
-func (m *MockSegmentServerServer) GetBlockInfo(arg0 context.Context, arg1 *GetBlockInfoRequest) (*GetBlockInfoResponse, error) {
+// DescribeBlock mocks base method.
+func (m *MockSegmentServerServer) DescribeBlock(ctx context.Context, in *DescribeBlockRequest) (*DescribeBlockResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "GetBlockInfo", arg0, arg1)
-	ret0, _ := ret[0].(*GetBlockInfoResponse)
+	ret := m.ctrl.Call(m, "DescribeBlock", ctx, in)
+	ret0, _ := ret[0].(*DescribeBlockResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
-// GetBlockInfo indicates an expected call of GetBlockInfo.
-func (mr *MockSegmentServerServerMockRecorder) GetBlockInfo(arg0, arg1 interface{}) *gomock.Call {
+// DescribeBlock indicates an expected call of DescribeBlock.
+func (mr *MockSegmentServerServerMockRecorder) DescribeBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockInfo", reflect.TypeOf((*MockSegmentServerServer)(nil).GetBlockInfo), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DescribeBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).DescribeBlock), ctx, in)
 }
 
 // InactivateSegment mocks base method.
-func (m *MockSegmentServerServer) InactivateSegment(arg0 context.Context, arg1 *InactivateSegmentRequest) (*emptypb.Empty, error) {
+func (m *MockSegmentServerServer) InactivateSegment(ctx context.Context, in *InactivateSegmentRequest) (*emptypb.Empty, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "InactivateSegment", arg0, arg1)
+	ret := m.ctrl.Call(m, "InactivateSegment", ctx, in)
 	ret0, _ := ret[0].(*emptypb.Empty)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // InactivateSegment indicates an expected call of InactivateSegment.
-func (mr *MockSegmentServerServerMockRecorder) InactivateSegment(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) InactivateSegment(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InactivateSegment", reflect.TypeOf((*MockSegmentServerServer)(nil).InactivateSegment), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InactivateSegment", reflect.TypeOf((*MockSegmentServerServer)(nil).InactivateSegment), ctx, in)
 }
 
 // LookupOffsetInBlock mocks base method.
-func (m *MockSegmentServerServer) LookupOffsetInBlock(arg0 context.Context, arg1 *LookupOffsetInBlockRequest) (*LookupOffsetInBlockResponse, error) {
+func (m *MockSegmentServerServer) LookupOffsetInBlock(ctx context.Context, in *LookupOffsetInBlockRequest) (*LookupOffsetInBlockResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "LookupOffsetInBlock", arg0, arg1)
+	ret := m.ctrl.Call(m, "LookupOffsetInBlock", ctx, in)
 	ret0, _ := ret[0].(*LookupOffsetInBlockResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // LookupOffsetInBlock indicates an expected call of LookupOffsetInBlock.
-func (mr *MockSegmentServerServerMockRecorder) LookupOffsetInBlock(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) LookupOffsetInBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LookupOffsetInBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).LookupOffsetInBlock), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LookupOffsetInBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).LookupOffsetInBlock), ctx, in)
 }
 
 // ReadFromBlock mocks base method.
-func (m *MockSegmentServerServer) ReadFromBlock(arg0 context.Context, arg1 *ReadFromBlockRequest) (*ReadFromBlockResponse, error) {
+func (m *MockSegmentServerServer) ReadFromBlock(ctx context.Context, in *ReadFromBlockRequest) (*ReadFromBlockResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "ReadFromBlock", arg0, arg1)
+	ret := m.ctrl.Call(m, "ReadFromBlock", ctx, in)
 	ret0, _ := ret[0].(*ReadFromBlockResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // ReadFromBlock indicates an expected call of ReadFromBlock.
-func (mr *MockSegmentServerServerMockRecorder) ReadFromBlock(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) ReadFromBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadFromBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).ReadFromBlock), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadFromBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).ReadFromBlock), ctx, in)
 }
 
 // RemoveBlock mocks base method.
-func (m *MockSegmentServerServer) RemoveBlock(arg0 context.Context, arg1 *RemoveBlockRequest) (*emptypb.Empty, error) {
+func (m *MockSegmentServerServer) RemoveBlock(ctx context.Context, in *RemoveBlockRequest) (*emptypb.Empty, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "RemoveBlock", arg0, arg1)
+	ret := m.ctrl.Call(m, "RemoveBlock", ctx, in)
 	ret0, _ := ret[0].(*emptypb.Empty)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // RemoveBlock indicates an expected call of RemoveBlock.
-func (mr *MockSegmentServerServerMockRecorder) RemoveBlock(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) RemoveBlock(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).RemoveBlock), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveBlock", reflect.TypeOf((*MockSegmentServerServer)(nil).RemoveBlock), ctx, in)
 }
 
 // Start mocks base method.
-func (m *MockSegmentServerServer) Start(arg0 context.Context, arg1 *StartSegmentServerRequest) (*StartSegmentServerResponse, error) {
+func (m *MockSegmentServerServer) Start(ctx context.Context, in *StartSegmentServerRequest) (*StartSegmentServerResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Start", arg0, arg1)
+	ret := m.ctrl.Call(m, "Start", ctx, in)
 	ret0, _ := ret[0].(*StartSegmentServerResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // Start indicates an expected call of Start.
-func (mr *MockSegmentServerServerMockRecorder) Start(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) Start(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockSegmentServerServer)(nil).Start), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockSegmentServerServer)(nil).Start), ctx, in)
 }
 
 // Status mocks base method.
-func (m *MockSegmentServerServer) Status(arg0 context.Context, arg1 *emptypb.Empty) (*StatusResponse, error) {
+func (m *MockSegmentServerServer) Status(ctx context.Context, in *emptypb.Empty) (*StatusResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Status", arg0, arg1)
+	ret := m.ctrl.Call(m, "Status", ctx, in)
 	ret0, _ := ret[0].(*StatusResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // Status indicates an expected call of Status.
-func (mr *MockSegmentServerServerMockRecorder) Status(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) Status(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Status", reflect.TypeOf((*MockSegmentServerServer)(nil).Status), arg0, arg1)
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Status", reflect.TypeOf((*MockSegmentServerServer)(nil).Status), ctx, in)
 }
 
 // Stop mocks base method.
-func (m *MockSegmentServerServer) Stop(arg0 context.Context, arg1 *StopSegmentServerRequest) (*StopSegmentServerResponse, error) {
+func (m *MockSegmentServerServer) Stop(ctx context.Context, in *StopSegmentServerRequest) (*StopSegmentServerResponse, error) {
 	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "Stop", arg0, arg1)
+	ret := m.ctrl.Call(m, "Stop", ctx, in)
 	ret0, _ := ret[0].(*StopSegmentServerResponse)
 	ret1, _ := ret[1].(error)
 	return ret0, ret1
 }
 
 // Stop indicates an expected call of Stop.
-func (mr *MockSegmentServerServerMockRecorder) Stop(arg0, arg1 interface{}) *gomock.Call {
+func (mr *MockSegmentServerServerMockRecorder) Stop(ctx, in interface{}) *gomock.Call {
 	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockSegmentServerServer)(nil).Stop), arg0, arg1)
-}
-
-// MockUnsafeSegmentServerServer is a mock of UnsafeSegmentServerServer interface.
-type MockUnsafeSegmentServerServer struct {
-	ctrl     *gomock.Controller
-	recorder *MockUnsafeSegmentServerServerMockRecorder
-}
-
-// MockUnsafeSegmentServerServerMockRecorder is the mock recorder for MockUnsafeSegmentServerServer.
-type MockUnsafeSegmentServerServerMockRecorder struct {
-	mock *MockUnsafeSegmentServerServer
-}
-
-// NewMockUnsafeSegmentServerServer creates a new mock instance.
-func NewMockUnsafeSegmentServerServer(ctrl *gomock.Controller) *MockUnsafeSegmentServerServer {
-	mock := &MockUnsafeSegmentServerServer{ctrl: ctrl}
-	mock.recorder = &MockUnsafeSegmentServerServerMockRecorder{mock}
-	return mock
-}
-
-// EXPECT returns an object that allows the caller to indicate expected use.
-func (m *MockUnsafeSegmentServerServer) EXPECT() *MockUnsafeSegmentServerServerMockRecorder {
-	return m.recorder
-}
-
-// mustEmbedUnimplementedSegmentServerServer mocks base method.
-func (m *MockUnsafeSegmentServerServer) mustEmbedUnimplementedSegmentServerServer() {
-	m.ctrl.T.Helper()
-	m.ctrl.Call(m, "mustEmbedUnimplementedSegmentServerServer")
-}
-
-// mustEmbedUnimplementedSegmentServerServer indicates an expected call of mustEmbedUnimplementedSegmentServerServer.
-func (mr *MockUnsafeSegmentServerServerMockRecorder) mustEmbedUnimplementedSegmentServerServer() *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedSegmentServerServer", reflect.TypeOf((*MockUnsafeSegmentServerServer)(nil).mustEmbedUnimplementedSegmentServerServer))
+	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockSegmentServerServer)(nil).Stop), ctx, in)
 }
diff --git a/proto/proto/buf.gen.yaml b/proto/proto/buf.gen.yaml
index 0fb0b3b..25c27dd 100644
--- a/proto/proto/buf.gen.yaml
+++ b/proto/proto/buf.gen.yaml
@@ -10,6 +10,10 @@ plugins:
     opt:
       - module=github.com/vanus-labs/vanus/proto/pkg
       - require_unimplemented_servers=false
+  - name: go-grpc-mock
+    out: ../pkg
+    opt:
+      - module=github.com/vanus-labs/vanus/proto/pkg
   # - name: grpc-gateway
   #   out: pkg
   #   opt:
diff --git a/proto/proto/segment.proto b/proto/proto/segment.proto
index 4b4ca07..73d054b 100644
--- a/proto/proto/segment.proto
+++ b/proto/proto/segment.proto
@@ -19,6 +19,7 @@ package vanus.core.segment;
 import "cloudevents.proto";
 import "config.proto";
 import "google/protobuf/empty.proto";
+import "meta.proto";
 
 option go_package = "github.com/vanus-labs/vanus/proto/pkg/segment";
 
@@ -28,7 +29,7 @@ service SegmentServer {
 
   rpc CreateBlock(CreateBlockRequest) returns (google.protobuf.Empty);
   rpc RemoveBlock(RemoveBlockRequest) returns (google.protobuf.Empty);
-  rpc GetBlockInfo(GetBlockInfoRequest) returns (GetBlockInfoResponse);
+  rpc DescribeBlock(DescribeBlockRequest) returns (DescribeBlockResponse);
 
   rpc ActivateSegment(ActivateSegmentRequest) returns (ActivateSegmentResponse);
   rpc InactivateSegment(InactivateSegmentRequest) returns (google.protobuf.Empty);
@@ -60,9 +61,13 @@ message RemoveBlockRequest {
   uint64 id = 1;
 }
 
-message GetBlockInfoRequest {}
+message DescribeBlockRequest {
+  uint64 id = 1;
+}
 
-message GetBlockInfoResponse {}
+message DescribeBlockResponse {
+  meta.SegmentHealthInfo info = 1;
+}
 
 message ActivateSegmentRequest {
   uint64 eventlog_id = 1;


Test patch:
diff --git a/internal/store/segment/api_test.go b/internal/store/segment/api_test.go
index 0950577..1e5b0a9 100644
--- a/internal/store/segment/api_test.go
+++ b/internal/store/segment/api_test.go
@@ -27,6 +27,7 @@ import (
 	// first-party libraries.
 	"github.com/vanus-labs/vanus/pkg/errors"
 	cepb "github.com/vanus-labs/vanus/proto/pkg/cloudevents"
+	metapb "github.com/vanus-labs/vanus/proto/pkg/meta"
 	segpb "github.com/vanus-labs/vanus/proto/pkg/segment"
 
 	// this project.
@@ -117,12 +118,24 @@ func TestSegmentServer(t *testing.T) {
 			So(err, ShouldEqual, errors.ErrInvalidRequest)
 		})
 
-		Convey("GetBlockInfo()", func() {
-			// FIXME: not implement.
-			req := &segpb.GetBlockInfoRequest{}
-			resp, err := ss.GetBlockInfo(context.Background(), req)
+		Convey("DescribeBlock()", func() {
+			srv.EXPECT().DescribeBlock(Any(), Not(vanus.EmptyID())).DoAndReturn(func(
+				_ context.Context, id vanus.ID,
+			) (*metapb.SegmentHealthInfo, error) {
+				return &metapb.SegmentHealthInfo{Id: id.Uint64()}, nil
+			})
+			srv.EXPECT().DescribeBlock(Any(), Eq(vanus.EmptyID())).Return(nil, errors.ErrInvalidRequest)
+
+			req := &segpb.DescribeBlockRequest{
+				Id: vanus.NewTestID().Uint64(),
+			}
+			resp, err := ss.DescribeBlock(context.Background(), req)
 			So(err, ShouldBeNil)
-			So(resp, ShouldNotBeNil)
+			So(resp.Info.Id, ShouldEqual, req.Id)
+
+			req = &segpb.DescribeBlockRequest{}
+			_, err = ss.DescribeBlock(context.Background(), req)
+			So(err, ShouldEqual, errors.ErrInvalidRequest)
 		})
 
 		Convey("ActivateSegment()", func() {