feat(shardnode): support TransferShardLeader api, use suid index as ShardStats leaderIndex

with #22357426

Signed-off-by: xiejian <xiejian3@oppo.com>
This commit is contained in:
xiejian 2024-08-22 17:45:22 +08:00 committed by slasher
parent d7e049fb2e
commit 5811746f43
8 changed files with 595 additions and 122 deletions

View File

@ -16,22 +16,22 @@ package shardnode
import "context"
func (c *Client) CreateBlob(ctx context.Context, args CreateBlobArgs) (CreateBlobRet, error) {
func (c *Client) CreateBlob(ctx context.Context, host string, args CreateBlobArgs) (CreateBlobRet, error) {
return CreateBlobRet{}, nil
}
func (c *Client) DeleteBlob(ctx context.Context, args DeleteBlobArgs) error {
func (c *Client) DeleteBlob(ctx context.Context, host string, args DeleteBlobArgs) error {
return nil
}
func (c *Client) GetBlob(ctx context.Context, args GetBlobArgs) (GetBlobRet, error) {
func (c *Client) GetBlob(ctx context.Context, host string, args GetBlobArgs) (GetBlobRet, error) {
return GetBlobRet{}, nil
}
func (c *Client) SealBlob(ctx context.Context, args SealBlobArgs) error {
func (c *Client) SealBlob(ctx context.Context, host string, args SealBlobArgs) error {
return nil
}
func (c *Client) ListBlob(ctx context.Context, args ListBlobArgs) (ListBlobRet, error) {
func (c *Client) ListBlob(ctx context.Context, host string, args ListBlobArgs) (ListBlobRet, error) {
return ListBlobRet{}, nil
}

View File

@ -16,23 +16,23 @@ package shardnode
import "context"
func (c *Client) AddItem(ctx context.Context, args InsertItemArgs) error {
func (c *Client) AddItem(ctx context.Context, host string, args InsertItemArgs) error {
return nil
}
func (c *Client) UpdateItem(ctx context.Context, args UpdateItemArgs) error {
func (c *Client) UpdateItem(ctx context.Context, host string, args UpdateItemArgs) error {
return nil
}
func (c *Client) DeleteItem(ctx context.Context, args DeleteItemArgs) error {
func (c *Client) DeleteItem(ctx context.Context, host string, args DeleteItemArgs) error {
return nil
}
func (c *Client) GetItem(ctx context.Context, args GetItemArgs) (Item, error) {
func (c *Client) GetItem(ctx context.Context, host string, args GetItemArgs) (Item, error) {
return Item{}, nil
}
func (c *Client) ListItem(ctx context.Context, args ListItemArgs) (ListItemRet, error) {
func (c *Client) ListItem(ctx context.Context, host string, args ListItemArgs) (ListItemRet, error) {
return ListItemRet{}, nil
}

View File

@ -18,7 +18,6 @@ import (
"context"
"github.com/cubefs/cubefs/blobstore/api/clustermgr"
"github.com/cubefs/cubefs/blobstore/common/proto"
)
func (c *Client) AddShard(ctx context.Context, host string, args AddShardArgs) error {
@ -29,10 +28,14 @@ func (c *Client) UpdateShard(ctx context.Context, host string, args UpdateShardA
return nil
}
func (c *Client) TransferShardLeader(ctx context.Context, host string, args TransferShardLeaderArgs) error {
return nil
}
func (c *Client) GetShardUintInfo(ctx context.Context, host string, args GetShardArgs) (ret clustermgr.ShardUnitInfo, err error) {
return clustermgr.ShardUnitInfo{}, nil
}
func (c *Client) GetShardStats(ctx context.Context, host string, diskID proto.DiskID, suid proto.Suid) (ret ShardStats, err error) {
func (c *Client) GetShardStats(ctx context.Context, host string, args GetShardArgs) (ret ShardStats, err error) {
return ShardStats{}, nil
}

View File

@ -964,6 +964,108 @@ func (m *UpdateShardRet) XXX_DiscardUnknown() {
var xxx_messageInfo_UpdateShardRet proto.InternalMessageInfo
type TransferShardLeaderArgs struct {
DiskID github_com_cubefs_cubefs_blobstore_common_proto.DiskID `protobuf:"varint,1,opt,name=disk_id,json=diskId,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.DiskID" json:"disk_id,omitempty"`
Suid github_com_cubefs_cubefs_blobstore_common_proto.Suid `protobuf:"varint,2,opt,name=suid,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.Suid" json:"suid,omitempty"`
DestDiskID github_com_cubefs_cubefs_blobstore_common_proto.DiskID `protobuf:"varint,3,opt,name=dest_disk_id,json=destDiskId,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.DiskID" json:"dest_disk_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TransferShardLeaderArgs) Reset() { *m = TransferShardLeaderArgs{} }
func (m *TransferShardLeaderArgs) String() string { return proto.CompactTextString(m) }
func (*TransferShardLeaderArgs) ProtoMessage() {}
func (*TransferShardLeaderArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{17}
}
func (m *TransferShardLeaderArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *TransferShardLeaderArgs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_TransferShardLeaderArgs.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *TransferShardLeaderArgs) XXX_Merge(src proto.Message) {
xxx_messageInfo_TransferShardLeaderArgs.Merge(m, src)
}
func (m *TransferShardLeaderArgs) XXX_Size() int {
return m.Size()
}
func (m *TransferShardLeaderArgs) XXX_DiscardUnknown() {
xxx_messageInfo_TransferShardLeaderArgs.DiscardUnknown(m)
}
var xxx_messageInfo_TransferShardLeaderArgs proto.InternalMessageInfo
func (m *TransferShardLeaderArgs) GetDiskID() github_com_cubefs_cubefs_blobstore_common_proto.DiskID {
if m != nil {
return m.DiskID
}
return 0
}
func (m *TransferShardLeaderArgs) GetSuid() github_com_cubefs_cubefs_blobstore_common_proto.Suid {
if m != nil {
return m.Suid
}
return 0
}
func (m *TransferShardLeaderArgs) GetDestDiskID() github_com_cubefs_cubefs_blobstore_common_proto.DiskID {
if m != nil {
return m.DestDiskID
}
return 0
}
type TransferShardLeaderRet struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TransferShardLeaderRet) Reset() { *m = TransferShardLeaderRet{} }
func (m *TransferShardLeaderRet) String() string { return proto.CompactTextString(m) }
func (*TransferShardLeaderRet) ProtoMessage() {}
func (*TransferShardLeaderRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{18}
}
func (m *TransferShardLeaderRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *TransferShardLeaderRet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_TransferShardLeaderRet.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
if err != nil {
return nil, err
}
return b[:n], nil
}
}
func (m *TransferShardLeaderRet) XXX_Merge(src proto.Message) {
xxx_messageInfo_TransferShardLeaderRet.Merge(m, src)
}
func (m *TransferShardLeaderRet) XXX_Size() int {
return m.Size()
}
func (m *TransferShardLeaderRet) XXX_DiscardUnknown() {
xxx_messageInfo_TransferShardLeaderRet.DiscardUnknown(m)
}
var xxx_messageInfo_TransferShardLeaderRet proto.InternalMessageInfo
type GetShardArgs struct {
DiskID github_com_cubefs_cubefs_blobstore_common_proto.DiskID `protobuf:"varint,1,opt,name=disk_id,json=diskId,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.DiskID" json:"disk_id,omitempty"`
Suid github_com_cubefs_cubefs_blobstore_common_proto.Suid `protobuf:"varint,2,opt,name=suid,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.Suid" json:"suid,omitempty"`
@ -976,7 +1078,7 @@ func (m *GetShardArgs) Reset() { *m = GetShardArgs{} }
func (m *GetShardArgs) String() string { return proto.CompactTextString(m) }
func (*GetShardArgs) ProtoMessage() {}
func (*GetShardArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{17}
return fileDescriptor_9d3815ca0e5f30f0, []int{19}
}
func (m *GetShardArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1030,7 +1132,7 @@ func (m *GetShardRet) Reset() { *m = GetShardRet{} }
func (m *GetShardRet) String() string { return proto.CompactTextString(m) }
func (*GetShardRet) ProtoMessage() {}
func (*GetShardRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{18}
return fileDescriptor_9d3815ca0e5f30f0, []int{20}
}
func (m *GetShardRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1081,7 +1183,7 @@ func (m *CreateBlobArgs) Reset() { *m = CreateBlobArgs{} }
func (m *CreateBlobArgs) String() string { return proto.CompactTextString(m) }
func (*CreateBlobArgs) ProtoMessage() {}
func (*CreateBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{19}
return fileDescriptor_9d3815ca0e5f30f0, []int{21}
}
func (m *CreateBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1156,7 +1258,7 @@ func (m *CreateBlobRet) Reset() { *m = CreateBlobRet{} }
func (m *CreateBlobRet) String() string { return proto.CompactTextString(m) }
func (*CreateBlobRet) ProtoMessage() {}
func (*CreateBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{20}
return fileDescriptor_9d3815ca0e5f30f0, []int{22}
}
func (m *CreateBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1204,7 +1306,7 @@ func (m *GetBlobArgs) Reset() { *m = GetBlobArgs{} }
func (m *GetBlobArgs) String() string { return proto.CompactTextString(m) }
func (*GetBlobArgs) ProtoMessage() {}
func (*GetBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{21}
return fileDescriptor_9d3815ca0e5f30f0, []int{23}
}
func (m *GetBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1258,7 +1360,7 @@ func (m *GetBlobRet) Reset() { *m = GetBlobRet{} }
func (m *GetBlobRet) String() string { return proto.CompactTextString(m) }
func (*GetBlobRet) ProtoMessage() {}
func (*GetBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{22}
return fileDescriptor_9d3815ca0e5f30f0, []int{24}
}
func (m *GetBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1308,7 +1410,7 @@ func (m *ListBlobArgs) Reset() { *m = ListBlobArgs{} }
func (m *ListBlobArgs) String() string { return proto.CompactTextString(m) }
func (*ListBlobArgs) ProtoMessage() {}
func (*ListBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{23}
return fileDescriptor_9d3815ca0e5f30f0, []int{25}
}
func (m *ListBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1377,7 +1479,7 @@ func (m *ListBlobRet) Reset() { *m = ListBlobRet{} }
func (m *ListBlobRet) String() string { return proto.CompactTextString(m) }
func (*ListBlobRet) ProtoMessage() {}
func (*ListBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{24}
return fileDescriptor_9d3815ca0e5f30f0, []int{26}
}
func (m *ListBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1432,7 +1534,7 @@ func (m *DeleteBlobArgs) Reset() { *m = DeleteBlobArgs{} }
func (m *DeleteBlobArgs) String() string { return proto.CompactTextString(m) }
func (*DeleteBlobArgs) ProtoMessage() {}
func (*DeleteBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{25}
return fileDescriptor_9d3815ca0e5f30f0, []int{27}
}
func (m *DeleteBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1485,7 +1587,7 @@ func (m *DeleteBlobRet) Reset() { *m = DeleteBlobRet{} }
func (m *DeleteBlobRet) String() string { return proto.CompactTextString(m) }
func (*DeleteBlobRet) ProtoMessage() {}
func (*DeleteBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{26}
return fileDescriptor_9d3815ca0e5f30f0, []int{28}
}
func (m *DeleteBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1527,7 +1629,7 @@ func (m *RetainBlobArgs) Reset() { *m = RetainBlobArgs{} }
func (m *RetainBlobArgs) String() string { return proto.CompactTextString(m) }
func (*RetainBlobArgs) ProtoMessage() {}
func (*RetainBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{27}
return fileDescriptor_9d3815ca0e5f30f0, []int{29}
}
func (m *RetainBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1587,7 +1689,7 @@ func (m *RetainBlobRet) Reset() { *m = RetainBlobRet{} }
func (m *RetainBlobRet) String() string { return proto.CompactTextString(m) }
func (*RetainBlobRet) ProtoMessage() {}
func (*RetainBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{28}
return fileDescriptor_9d3815ca0e5f30f0, []int{30}
}
func (m *RetainBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1629,7 +1731,7 @@ func (m *SealBlobArgs) Reset() { *m = SealBlobArgs{} }
func (m *SealBlobArgs) String() string { return proto.CompactTextString(m) }
func (*SealBlobArgs) ProtoMessage() {}
func (*SealBlobArgs) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{29}
return fileDescriptor_9d3815ca0e5f30f0, []int{31}
}
func (m *SealBlobArgs) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1689,7 +1791,7 @@ func (m *SealBlobRet) Reset() { *m = SealBlobRet{} }
func (m *SealBlobRet) String() string { return proto.CompactTextString(m) }
func (*SealBlobRet) ProtoMessage() {}
func (*SealBlobRet) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{30}
return fileDescriptor_9d3815ca0e5f30f0, []int{32}
}
func (m *SealBlobRet) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1722,11 +1824,12 @@ type ShardStats struct {
Suid github_com_cubefs_cubefs_blobstore_common_proto.Suid `protobuf:"varint,1,opt,name=suid,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.Suid" json:"suid,omitempty"`
AppliedIndex uint64 `protobuf:"varint,2,opt,name=applied_index,json=appliedIndex,proto3" json:"applied_index,omitempty"`
LeaderIdx uint32 `protobuf:"varint,3,opt,name=leader_idx,json=leaderIdx,proto3" json:"leader_idx,omitempty"`
RouteVersion github_com_cubefs_cubefs_blobstore_common_proto.RouteVersion `protobuf:"varint,4,opt,name=route_version,json=routeVersion,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.RouteVersion" json:"route_version,omitempty"`
Range sharding.Range `protobuf:"bytes,5,opt,name=range,proto3" json:"range"`
Units []clustermgr.ShardUnit `protobuf:"bytes,6,rep,name=units,proto3" json:"units"`
Learner bool `protobuf:"varint,7,opt,name=learner,proto3" json:"learner,omitempty"`
RaftStat raft.Stat `protobuf:"bytes,8,opt,name=raftStat,proto3" json:"raftStat"`
LeaderHost string `protobuf:"bytes,4,opt,name=leader_host,json=leaderHost,proto3" json:"leader_host,omitempty"`
RouteVersion github_com_cubefs_cubefs_blobstore_common_proto.RouteVersion `protobuf:"varint,5,opt,name=route_version,json=routeVersion,proto3,casttype=github.com/cubefs/cubefs/blobstore/common/proto.RouteVersion" json:"route_version,omitempty"`
Range sharding.Range `protobuf:"bytes,6,opt,name=range,proto3" json:"range"`
Units []clustermgr.ShardUnit `protobuf:"bytes,7,rep,name=units,proto3" json:"units"`
Learner bool `protobuf:"varint,8,opt,name=learner,proto3" json:"learner,omitempty"`
RaftStat raft.Stat `protobuf:"bytes,9,opt,name=raftStat,proto3" json:"raftStat"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1736,7 +1839,7 @@ func (m *ShardStats) Reset() { *m = ShardStats{} }
func (m *ShardStats) String() string { return proto.CompactTextString(m) }
func (*ShardStats) ProtoMessage() {}
func (*ShardStats) Descriptor() ([]byte, []int) {
return fileDescriptor_9d3815ca0e5f30f0, []int{31}
return fileDescriptor_9d3815ca0e5f30f0, []int{33}
}
func (m *ShardStats) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@ -1786,6 +1889,13 @@ func (m *ShardStats) GetLeaderIdx() uint32 {
return 0
}
func (m *ShardStats) GetLeaderHost() string {
if m != nil {
return m.LeaderHost
}
return ""
}
func (m *ShardStats) GetRouteVersion() github_com_cubefs_cubefs_blobstore_common_proto.RouteVersion {
if m != nil {
return m.RouteVersion
@ -1839,6 +1949,8 @@ func init() {
proto.RegisterType((*AddShardRet)(nil), "cubefs.blobstore.api.shardnode.AddShardRet")
proto.RegisterType((*UpdateShardArgs)(nil), "cubefs.blobstore.api.shardnode.UpdateShardArgs")
proto.RegisterType((*UpdateShardRet)(nil), "cubefs.blobstore.api.shardnode.UpdateShardRet")
proto.RegisterType((*TransferShardLeaderArgs)(nil), "cubefs.blobstore.api.shardnode.TransferShardLeaderArgs")
proto.RegisterType((*TransferShardLeaderRet)(nil), "cubefs.blobstore.api.shardnode.TransferShardLeaderRet")
proto.RegisterType((*GetShardArgs)(nil), "cubefs.blobstore.api.shardnode.GetShardArgs")
proto.RegisterType((*GetShardRet)(nil), "cubefs.blobstore.api.shardnode.GetShardRet")
proto.RegisterType((*CreateBlobArgs)(nil), "cubefs.blobstore.api.shardnode.CreateBlobArgs")
@ -1859,81 +1971,85 @@ func init() {
func init() { proto.RegisterFile("shardnode.proto", fileDescriptor_9d3815ca0e5f30f0) }
var fileDescriptor_9d3815ca0e5f30f0 = []byte{
// 1178 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0xdd, 0x6e, 0x1b, 0x45,
0x14, 0x66, 0xed, 0xb5, 0xe3, 0x1e, 0xdb, 0x09, 0x5a, 0x45, 0xc8, 0x8a, 0x44, 0x36, 0xda, 0x82,
0x1a, 0xf1, 0xb3, 0x96, 0x02, 0x82, 0x8b, 0x02, 0x4d, 0x1c, 0x2b, 0xc5, 0xa4, 0x05, 0xb1, 0x6e,
0x2b, 0x81, 0x84, 0xac, 0xb5, 0x67, 0xec, 0x8c, 0xb2, 0xde, 0x5d, 0x76, 0x67, 0xab, 0xa4, 0x57,
0x48, 0x5c, 0x70, 0x85, 0x78, 0x02, 0x2e, 0x78, 0x0a, 0x1e, 0x80, 0x9b, 0x5e, 0xc2, 0x0b, 0xac,
0x90, 0x1f, 0x23, 0x57, 0x68, 0xce, 0xcc, 0xae, 0xf3, 0x43, 0x9a, 0x3a, 0xd8, 0x11, 0xbd, 0xa9,
0x76, 0x8e, 0xcf, 0xcf, 0x77, 0x7e, 0xe6, 0x3b, 0xd3, 0xc0, 0x4a, 0x7c, 0xe0, 0x46, 0xc4, 0x0f,
0x08, 0xb5, 0xc3, 0x28, 0xe0, 0x81, 0xb1, 0x3e, 0x48, 0xfa, 0x74, 0x18, 0xdb, 0x7d, 0x2f, 0xe8,
0xc7, 0x3c, 0x88, 0xa8, 0xed, 0x86, 0xcc, 0xce, 0xb5, 0xd6, 0x56, 0x47, 0xc1, 0x28, 0x40, 0xd5,
0xa6, 0xf8, 0x92, 0x56, 0x6b, 0xef, 0x49, 0xab, 0x66, 0x6e, 0xd5, 0x1c, 0x04, 0xe3, 0x71, 0xe0,
0x37, 0xd1, 0x90, 0xf9, 0xa3, 0x66, 0xe4, 0xfa, 0x23, 0x15, 0x63, 0xed, 0xdd, 0x0b, 0xda, 0x6e,
0xc8, 0x9a, 0x03, 0x2f, 0x89, 0x39, 0x8d, 0xc6, 0xa3, 0x48, 0x5a, 0x29, 0xe5, 0xcd, 0xcb, 0x5c,
0x4b, 0x10, 0x42, 0xac, 0x34, 0xef, 0x5c, 0xa6, 0x19, 0xb9, 0x43, 0x8e, 0xff, 0x48, 0x45, 0x6b,
0x00, 0x7a, 0x87, 0xd3, 0xb1, 0xf1, 0x06, 0x14, 0x18, 0x69, 0x68, 0x1b, 0xda, 0x66, 0xad, 0x55,
0x9e, 0xa4, 0x66, 0xa1, 0xd3, 0x76, 0x0a, 0x8c, 0x18, 0xbb, 0x50, 0x1e, 0x32, 0xea, 0x91, 0xb8,
0x51, 0xd8, 0x28, 0x6e, 0x56, 0xb7, 0xde, 0xb6, 0x5f, 0x5c, 0x14, 0x7b, 0x4f, 0x68, 0xb7, 0xf4,
0xe7, 0xa9, 0xf9, 0x9a, 0xa3, 0x4c, 0xad, 0x10, 0x4a, 0x28, 0x36, 0xbe, 0xce, 0xa3, 0xd4, 0x5b,
0x3b, 0x32, 0xca, 0x49, 0x6a, 0x7e, 0x3c, 0x62, 0xfc, 0x20, 0xe9, 0xdb, 0x83, 0x60, 0xdc, 0x54,
0xb8, 0x5f, 0x98, 0xa8, 0x8c, 0xa1, 0x00, 0xae, 0x42, 0xe9, 0xa9, 0xeb, 0x25, 0xb4, 0x51, 0x10,
0xd8, 0x1d, 0x79, 0xb0, 0xfe, 0x2a, 0x42, 0xbd, 0x2b, 0x30, 0x7d, 0x15, 0x7e, 0x4e, 0x5d, 0x42,
0x23, 0xc3, 0x85, 0x4a, 0x1c, 0xba, 0x03, 0xda, 0x53, 0x00, 0xf4, 0xd6, 0xde, 0x24, 0x35, 0x97,
0xba, 0x42, 0x76, 0x3d, 0x14, 0xca, 0xd4, 0x59, 0x42, 0xbf, 0x1d, 0x62, 0x7c, 0x07, 0x4b, 0x84,
0xc5, 0x87, 0x22, 0x42, 0x01, 0x53, 0x6c, 0x4f, 0x52, 0xb3, 0xdc, 0x66, 0xf1, 0x21, 0x06, 0xf8,
0x68, 0xd6, 0x00, 0xd2, 0xd2, 0x29, 0x0b, 0xa7, 0x1d, 0x62, 0x3c, 0x02, 0x3d, 0x4e, 0x18, 0x69,
0x14, 0xd1, 0xf7, 0xf6, 0x24, 0x35, 0xf5, 0x6e, 0xc2, 0xc8, 0x49, 0x6a, 0x7e, 0x38, 0x33, 0xf4,
0x84, 0x11, 0x07, 0xbd, 0x19, 0x16, 0xd4, 0x10, 0xff, 0x13, 0x1a, 0xc5, 0x2c, 0xf0, 0x1b, 0xba,
0xa8, 0x8d, 0x73, 0x46, 0x66, 0x50, 0xa8, 0x47, 0x41, 0xc2, 0x69, 0xef, 0xa9, 0x52, 0x2a, 0x61,
0x01, 0xb7, 0x4f, 0x52, 0xf3, 0x93, 0x59, 0x43, 0x3b, 0xc2, 0x91, 0x72, 0xec, 0xd4, 0xa2, 0x53,
0x27, 0xe3, 0x4d, 0x00, 0x9c, 0xa3, 0xde, 0x21, 0x3d, 0x8e, 0x1b, 0xe5, 0x8d, 0xe2, 0x66, 0xcd,
0xb9, 0x85, 0x92, 0x7d, 0x7a, 0x1c, 0x5b, 0xbf, 0x6a, 0xb0, 0xdc, 0xf1, 0x63, 0x1a, 0x71, 0x31,
0xb1, 0x3b, 0xd1, 0x28, 0x36, 0xf6, 0xa1, 0x7c, 0x80, 0xed, 0xc5, 0x96, 0x56, 0xb7, 0xde, 0xbf,
0x6a, 0x3a, 0xcf, 0xcc, 0x44, 0x36, 0xa5, 0xd2, 0x85, 0xf1, 0x19, 0xe8, 0x8c, 0xd3, 0x31, 0xf6,
0xae, 0xba, 0xf5, 0xd6, 0x55, 0xae, 0x04, 0x08, 0xe5, 0x01, 0xed, 0xac, 0x15, 0xa8, 0x4f, 0xe1,
0x39, 0x94, 0x23, 0xe0, 0xc7, 0x21, 0x71, 0x39, 0xfd, 0xdf, 0x02, 0x9e, 0xc2, 0x13, 0x80, 0x13,
0x58, 0x6e, 0x53, 0x8f, 0x2e, 0x0a, 0xaf, 0xe4, 0x98, 0xc2, 0x79, 0x8e, 0x11, 0x38, 0xa6, 0x61,
0x05, 0x8e, 0x08, 0xaa, 0xf7, 0x29, 0xbf, 0x59, 0x10, 0x0f, 0x00, 0x54, 0x4c, 0x87, 0xf2, 0xbc,
0xb4, 0xda, 0x35, 0x4b, 0xfb, 0x9b, 0x06, 0xb5, 0x07, 0x2c, 0x5e, 0x58, 0x0e, 0xe5, 0x30, 0xa2,
0x43, 0x76, 0xa4, 0x48, 0x4f, 0x9d, 0x84, 0x7c, 0xec, 0x46, 0x87, 0x34, 0x42, 0x8e, 0xa8, 0x39,
0xea, 0x24, 0x38, 0x72, 0x10, 0x24, 0x3e, 0x57, 0x97, 0x5b, 0x1e, 0xac, 0x00, 0xaa, 0x19, 0x44,
0x91, 0xf2, 0x36, 0x94, 0x04, 0xf4, 0xb8, 0xa1, 0x21, 0xd1, 0xcf, 0x92, 0xb3, 0x34, 0x34, 0xd6,
0x01, 0x7c, 0x7a, 0xc4, 0x1f, 0x4a, 0x08, 0x12, 0xda, 0x29, 0x89, 0xf5, 0x7b, 0x11, 0x6a, 0x3b,
0x84, 0x60, 0x66, 0x58, 0x94, 0x53, 0x84, 0xa9, 0x2d, 0x90, 0x30, 0x0b, 0x92, 0xad, 0xe6, 0x44,
0x98, 0xbb, 0x50, 0xc2, 0x05, 0x8e, 0x35, 0xae, 0x6e, 0xdd, 0xb9, 0x58, 0x27, 0x69, 0x69, 0x67,
0xfb, 0xde, 0x76, 0x84, 0x7a, 0x56, 0x2a, 0xb4, 0x35, 0xf6, 0xa0, 0x94, 0xf8, 0x8c, 0xc7, 0x0d,
0x1d, 0x8b, 0xfd, 0xce, 0xbf, 0x17, 0x7b, 0xfa, 0x0c, 0x90, 0xe3, 0xf0, 0xd8, 0x67, 0x3c, 0xf3,
0x83, 0xe6, 0x37, 0xc4, 0xcc, 0x56, 0x1d, 0xaa, 0x59, 0xe3, 0xc4, 0xfd, 0xfc, 0xa5, 0x08, 0x2b,
0x92, 0x39, 0x5e, 0xf1, 0x5e, 0xfe, 0xa0, 0xc1, 0x8a, 0xac, 0x2c, 0x66, 0xf3, 0xe8, 0x38, 0xa4,
0x6a, 0xbd, 0x3e, 0x99, 0xa4, 0xe6, 0xf9, 0x9f, 0x4e, 0x52, 0xf3, 0xde, 0xcc, 0xc1, 0xce, 0xba,
0x70, 0xce, 0xfb, 0x34, 0xda, 0xa0, 0x8b, 0x56, 0xe2, 0xd5, 0xbc, 0xce, 0x20, 0xa0, 0xb5, 0xf5,
0x7a, 0xb6, 0x69, 0xf2, 0x1e, 0xfd, 0xa1, 0x41, 0xed, 0x3e, 0xe5, 0xaf, 0x76, 0x83, 0xac, 0x6f,
0x70, 0x13, 0x64, 0x49, 0x19, 0x5f, 0x40, 0x09, 0x6f, 0x95, 0x22, 0x51, 0xfb, 0xe5, 0xab, 0xd5,
0xf1, 0x87, 0x41, 0x76, 0x75, 0xd0, 0x85, 0xf5, 0x73, 0x01, 0x96, 0x77, 0x23, 0xea, 0x72, 0xda,
0xf2, 0x82, 0xfe, 0xfc, 0x49, 0xda, 0x00, 0xdd, 0x77, 0xc7, 0xd9, 0xbb, 0x14, 0xbf, 0x8d, 0x11,
0x54, 0x06, 0x01, 0xa1, 0xe3, 0x80, 0x64, 0x73, 0xb6, 0x3f, 0x49, 0xcd, 0xca, 0x6e, 0x40, 0xe8,
0xc3, 0x80, 0x88, 0x01, 0xbb, 0xfb, 0xf2, 0xc5, 0xca, 0x3c, 0xd9, 0x99, 0xb9, 0x93, 0x3b, 0x17,
0xc1, 0x63, 0xf6, 0x8c, 0x2a, 0xc2, 0xc7, 0x6f, 0x7c, 0x5e, 0x79, 0x6c, 0x40, 0x7b, 0xf8, 0x8b,
0x20, 0x8a, 0xba, 0x73, 0x0b, 0x25, 0x5d, 0xf6, 0x8c, 0x5a, 0x5f, 0x42, 0x7d, 0x5a, 0x0e, 0x51,
0xec, 0x4f, 0x41, 0x17, 0x31, 0x55, 0x2d, 0x6e, 0x5f, 0xca, 0x73, 0xb2, 0x69, 0xc2, 0x2a, 0x1b,
0x49, 0xa1, 0x62, 0xf9, 0xd8, 0xba, 0x1b, 0xab, 0xad, 0xb5, 0x8f, 0x0b, 0x7c, 0x4e, 0xe0, 0xb3,
0xfd, 0xbd, 0x18, 0xf8, 0xf3, 0xd9, 0xdf, 0xbe, 0xdc, 0xdf, 0x59, 0xc6, 0xf7, 0xa0, 0x84, 0x58,
0xd4, 0xfe, 0x9e, 0x21, 0x65, 0x69, 0x77, 0xe5, 0xfa, 0xfe, 0x3e, 0x7b, 0x1d, 0xde, 0x5c, 0x4f,
0xf3, 0x97, 0xa1, 0x4a, 0xd2, 0xfa, 0x49, 0x83, 0x65, 0x87, 0x72, 0x97, 0xf9, 0x37, 0x77, 0x69,
0x57, 0xa1, 0xe4, 0x51, 0x37, 0x96, 0x37, 0x56, 0x77, 0xe4, 0x41, 0x40, 0x9b, 0x02, 0x11, 0xd0,
0x7e, 0xd4, 0xa0, 0xd6, 0xa5, 0xae, 0xb7, 0x30, 0x60, 0x78, 0x6d, 0x0b, 0xa7, 0x2e, 0x74, 0x06,
0xb6, 0x78, 0xaa, 0x62, 0x75, 0xa8, 0x66, 0x20, 0x04, 0xa8, 0x93, 0x22, 0x00, 0xba, 0xed, 0x72,
0x97, 0xc7, 0x39, 0x49, 0x6b, 0x73, 0xdd, 0xa2, 0xb7, 0xa1, 0xee, 0x86, 0xa1, 0xc7, 0x28, 0xe9,
0x31, 0x9f, 0xd0, 0x23, 0x05, 0xb2, 0xa6, 0x84, 0x1d, 0x21, 0x13, 0xec, 0xe3, 0x61, 0x2a, 0x3d,
0x46, 0x8e, 0x24, 0xf9, 0x39, 0xb7, 0xa4, 0xa4, 0x43, 0x8e, 0x2e, 0x3e, 0x64, 0xf4, 0x85, 0xfc,
0x17, 0x33, 0x7f, 0xbc, 0x95, 0xe6, 0xf1, 0x78, 0x2b, 0xff, 0xb7, 0xc7, 0x5b, 0x03, 0x96, 0x3c,
0xea, 0x46, 0x3e, 0x8d, 0x1a, 0x4b, 0x1b, 0xda, 0x66, 0xc5, 0xc9, 0x8e, 0x46, 0x1b, 0x2a, 0x91,
0x3b, 0xe4, 0xa2, 0x69, 0x8d, 0x0a, 0x22, 0xb5, 0x2e, 0x45, 0x8a, 0x7f, 0xcc, 0x11, 0x9a, 0xca,
0x79, 0x6e, 0xd9, 0x5a, 0x7b, 0x3e, 0x59, 0xd7, 0xfe, 0x9c, 0xac, 0x6b, 0x7f, 0x4f, 0xd6, 0xb5,
0x6f, 0x6b, 0x76, 0xf3, 0x6e, 0x3e, 0x6b, 0xfd, 0x32, 0x96, 0xea, 0x83, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0x02, 0xaf, 0x38, 0x34, 0xf5, 0x12, 0x00, 0x00,
// 1244 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4f, 0x6f, 0x1b, 0x45,
0x14, 0x67, 0xed, 0xb5, 0xe3, 0x3c, 0xaf, 0x13, 0xb4, 0xaa, 0xca, 0x2a, 0x12, 0xd9, 0x68, 0x0b,
0x6a, 0xc4, 0x9f, 0xb5, 0x14, 0x10, 0x1c, 0x0a, 0xb4, 0x75, 0xac, 0xb6, 0x26, 0x2d, 0x88, 0x75,
0x5b, 0x09, 0x24, 0x64, 0xad, 0x3d, 0x63, 0x67, 0xc8, 0x7a, 0xd7, 0xec, 0x8c, 0xab, 0xb4, 0x27,
0x24, 0x0e, 0x9c, 0x10, 0x1f, 0x00, 0x71, 0xe0, 0x53, 0x20, 0x71, 0xe5, 0xd2, 0x23, 0x7c, 0x81,
0x15, 0xf2, 0xc7, 0xc8, 0x09, 0xcd, 0x9b, 0x59, 0x3b, 0xfd, 0x93, 0xb6, 0x6e, 0x1d, 0x8b, 0x5c,
0x2a, 0xcf, 0xdb, 0xf7, 0xe7, 0xf7, 0x7e, 0xef, 0xcd, 0x9b, 0xd7, 0xc0, 0x3a, 0xdf, 0x0f, 0x53,
0x12, 0x27, 0x84, 0xfa, 0xa3, 0x34, 0x11, 0x89, 0xbd, 0xd9, 0x1b, 0x77, 0x69, 0x9f, 0xfb, 0xdd,
0x28, 0xe9, 0x72, 0x91, 0xa4, 0xd4, 0x0f, 0x47, 0xcc, 0x9f, 0x6a, 0x6d, 0x9c, 0x1b, 0x24, 0x83,
0x04, 0x55, 0xeb, 0xf2, 0x97, 0xb2, 0xda, 0x78, 0x4f, 0x59, 0xd5, 0xa7, 0x56, 0xf5, 0x5e, 0x32,
0x1c, 0x26, 0x71, 0x1d, 0x0d, 0x59, 0x3c, 0xa8, 0xa7, 0x61, 0x3c, 0xd0, 0x31, 0x36, 0xde, 0x7d,
0x42, 0x3b, 0x1c, 0xb1, 0x7a, 0x2f, 0x1a, 0x73, 0x41, 0xd3, 0xe1, 0x20, 0x55, 0x56, 0x5a, 0x79,
0xfb, 0x24, 0xd7, 0x0a, 0x84, 0x14, 0x6b, 0xcd, 0x8b, 0x27, 0x69, 0xa6, 0x61, 0x5f, 0xe0, 0x3f,
0x4a, 0xd1, 0xeb, 0x81, 0xd9, 0x12, 0x74, 0x68, 0x9f, 0x87, 0x02, 0x23, 0x8e, 0xb1, 0x65, 0x6c,
0x5b, 0x8d, 0xf2, 0x24, 0x73, 0x0b, 0xad, 0x66, 0x50, 0x60, 0xc4, 0xde, 0x85, 0x72, 0x9f, 0xd1,
0x88, 0x70, 0xa7, 0xb0, 0x55, 0xdc, 0xae, 0xee, 0xbc, 0xed, 0x3f, 0x9b, 0x14, 0xff, 0x9a, 0xd4,
0x6e, 0x98, 0x0f, 0x33, 0xf7, 0xb5, 0x40, 0x9b, 0x7a, 0x23, 0x28, 0xa1, 0xd8, 0xfe, 0x6a, 0x1a,
0xa5, 0xd6, 0xb8, 0xaa, 0xa2, 0x1c, 0x65, 0xee, 0xc7, 0x03, 0x26, 0xf6, 0xc7, 0x5d, 0xbf, 0x97,
0x0c, 0xeb, 0x1a, 0xf7, 0x33, 0x13, 0x55, 0x31, 0x34, 0xc0, 0x73, 0x50, 0xba, 0x17, 0x46, 0x63,
0xea, 0x14, 0x24, 0xf6, 0x40, 0x1d, 0xbc, 0x7f, 0x8a, 0x50, 0x6b, 0x4b, 0x4c, 0x5f, 0x8e, 0x6e,
0xd0, 0x90, 0xd0, 0xd4, 0x0e, 0xa1, 0xc2, 0x47, 0x61, 0x8f, 0x76, 0x34, 0x00, 0xb3, 0x71, 0x6d,
0x92, 0xb9, 0x2b, 0x6d, 0x29, 0x7b, 0x39, 0x14, 0xda, 0x34, 0x58, 0x41, 0xbf, 0x2d, 0x62, 0x7f,
0x0b, 0x2b, 0x84, 0xf1, 0x03, 0x19, 0xa1, 0x80, 0x29, 0x36, 0x27, 0x99, 0x5b, 0x6e, 0x32, 0x7e,
0x80, 0x01, 0x3e, 0x9a, 0x37, 0x80, 0xb2, 0x0c, 0xca, 0xd2, 0x69, 0x8b, 0xd8, 0xb7, 0xc1, 0xe4,
0x63, 0x46, 0x9c, 0x22, 0xfa, 0xbe, 0x32, 0xc9, 0x5c, 0xb3, 0x3d, 0x66, 0xe4, 0x28, 0x73, 0x3f,
0x9c, 0x1b, 0xfa, 0x98, 0x91, 0x00, 0xbd, 0xd9, 0x1e, 0x58, 0x88, 0xff, 0x2e, 0x4d, 0x39, 0x4b,
0x62, 0xc7, 0x94, 0xdc, 0x04, 0x8f, 0xc8, 0x6c, 0x0a, 0xb5, 0x34, 0x19, 0x0b, 0xda, 0xb9, 0xa7,
0x95, 0x4a, 0x48, 0xe0, 0x95, 0xa3, 0xcc, 0xfd, 0x64, 0xde, 0xd0, 0x81, 0x74, 0xa4, 0x1d, 0x07,
0x56, 0x7a, 0xec, 0x64, 0xbf, 0x09, 0x80, 0x7d, 0xd4, 0x39, 0xa0, 0xf7, 0xb9, 0x53, 0xde, 0x2a,
0x6e, 0x5b, 0xc1, 0x2a, 0x4a, 0xf6, 0xe8, 0x7d, 0xee, 0xfd, 0x66, 0xc0, 0x5a, 0x2b, 0xe6, 0x34,
0x15, 0xb2, 0x63, 0xaf, 0xa6, 0x03, 0x6e, 0xef, 0x41, 0x79, 0x1f, 0xcb, 0x8b, 0x25, 0xad, 0xee,
0xbc, 0xff, 0xbc, 0xee, 0x7c, 0xa4, 0x27, 0xf2, 0x2e, 0x55, 0x2e, 0xec, 0xcf, 0xc0, 0x64, 0x82,
0x0e, 0xb1, 0x76, 0xd5, 0x9d, 0xb7, 0x9e, 0xe7, 0x4a, 0x82, 0xd0, 0x1e, 0xd0, 0xce, 0x5b, 0x87,
0xda, 0x0c, 0x5e, 0x40, 0x05, 0x02, 0xbe, 0x33, 0x22, 0xa1, 0xa0, 0xff, 0x5b, 0xc0, 0x33, 0x78,
0x12, 0xf0, 0x18, 0xd6, 0x9a, 0x34, 0xa2, 0xa7, 0x85, 0x57, 0xcd, 0x98, 0xc2, 0xe3, 0x33, 0x46,
0xe2, 0x98, 0x85, 0x95, 0x38, 0x52, 0xa8, 0x5e, 0xa7, 0x62, 0xb9, 0x20, 0x6e, 0x02, 0xe8, 0x98,
0x01, 0x15, 0x53, 0x6a, 0x8d, 0x97, 0xa4, 0xf6, 0x77, 0x03, 0xac, 0x9b, 0x8c, 0x9f, 0x5a, 0x0e,
0xe5, 0x51, 0x4a, 0xfb, 0xec, 0x50, 0x0f, 0x3d, 0x7d, 0x92, 0xf2, 0x61, 0x98, 0x1e, 0xd0, 0x14,
0x67, 0x84, 0x15, 0xe8, 0x93, 0x9c, 0x91, 0xbd, 0x64, 0x1c, 0x0b, 0x7d, 0xb9, 0xd5, 0xc1, 0x4b,
0xa0, 0x9a, 0x43, 0x94, 0x29, 0x5f, 0x81, 0x92, 0x84, 0xce, 0x1d, 0x03, 0x07, 0xfd, 0x3c, 0x39,
0x2b, 0x43, 0x7b, 0x13, 0x20, 0xa6, 0x87, 0xe2, 0x96, 0x82, 0xa0, 0xa0, 0x1d, 0x93, 0x78, 0x7f,
0x14, 0xc1, 0xba, 0x4a, 0x08, 0x66, 0x86, 0xa4, 0x1c, 0x1b, 0x98, 0xc6, 0x29, 0x0e, 0xcc, 0x82,
0x9a, 0x56, 0x0b, 0x1a, 0x98, 0xbb, 0x50, 0xc2, 0x07, 0x1c, 0x39, 0xae, 0xee, 0x5c, 0x7c, 0x92,
0x27, 0x65, 0xe9, 0xe7, 0xef, 0xbd, 0x1f, 0x48, 0xf5, 0x9c, 0x2a, 0xb4, 0xb5, 0xaf, 0x41, 0x69,
0x1c, 0x33, 0xc1, 0x1d, 0x13, 0xc9, 0x7e, 0xe7, 0xe9, 0x64, 0xcf, 0xd6, 0x00, 0xd5, 0x0e, 0x77,
0x62, 0x26, 0x72, 0x3f, 0x68, 0xbe, 0xa4, 0xc9, 0xec, 0xd5, 0xa0, 0x9a, 0x17, 0x4e, 0xde, 0xcf,
0x5f, 0x8a, 0xb0, 0xae, 0x26, 0xc7, 0x19, 0xaf, 0xe5, 0x0f, 0x06, 0xac, 0x2b, 0x66, 0x31, 0x9b,
0xdb, 0xf7, 0x47, 0x54, 0x3f, 0xaf, 0x77, 0x27, 0x99, 0xfb, 0xf8, 0xa7, 0xa3, 0xcc, 0xbd, 0x3c,
0x77, 0xb0, 0x47, 0x5d, 0x04, 0x8f, 0xfb, 0xb4, 0x9b, 0x60, 0xca, 0x52, 0xe2, 0xd5, 0x7c, 0x99,
0x46, 0x40, 0x6b, 0xef, 0xf5, 0xfc, 0xa5, 0x99, 0xd6, 0xe8, 0xcf, 0x02, 0xbc, 0x71, 0x3b, 0x0d,
0x63, 0xde, 0xa7, 0x29, 0x0a, 0x6f, 0xe2, 0xec, 0x38, 0xbb, 0xb5, 0xfa, 0x0e, 0x2c, 0x42, 0xb9,
0xe8, 0xe4, 0xc8, 0x55, 0x9d, 0x6e, 0x4c, 0x32, 0x17, 0x9a, 0x94, 0x8b, 0x57, 0x46, 0x0f, 0x24,
0xf7, 0x42, 0x3c, 0x07, 0xce, 0x3f, 0x85, 0x3b, 0x49, 0xeb, 0x5f, 0x06, 0x58, 0xd7, 0xa9, 0x38,
0xdb, 0x7d, 0xef, 0x7d, 0x8d, 0x0f, 0x6c, 0xde, 0x2b, 0xf6, 0xe7, 0x50, 0xc2, 0x61, 0xa5, 0xdf,
0x26, 0xff, 0xc5, 0x9b, 0xb0, 0x15, 0xf7, 0x93, 0x7c, 0x22, 0xa1, 0x0b, 0xef, 0xe7, 0x02, 0xac,
0xed, 0xa6, 0x34, 0x14, 0xb4, 0x11, 0x25, 0xdd, 0xc5, 0xbf, 0x7d, 0x36, 0x98, 0x71, 0x38, 0xcc,
0xd7, 0x7d, 0xfc, 0x6d, 0x0f, 0xa0, 0xd2, 0x4b, 0x08, 0x1d, 0x26, 0x24, 0xbf, 0xbe, 0x7b, 0x93,
0xcc, 0xad, 0xec, 0x26, 0x84, 0xde, 0x4a, 0x88, 0xbc, 0xb7, 0x97, 0x5e, 0x9c, 0xac, 0xdc, 0x93,
0x9f, 0x9b, 0x07, 0x53, 0xe7, 0x32, 0x38, 0x67, 0x0f, 0xa8, 0x7e, 0x47, 0xf1, 0x37, 0x6e, 0xad,
0x11, 0xeb, 0xd1, 0x0e, 0x7e, 0x91, 0xf3, 0xb7, 0x16, 0xac, 0xa2, 0xa4, 0xcd, 0x1e, 0x50, 0xef,
0x0b, 0xa8, 0xcd, 0xe8, 0x90, 0x64, 0x7f, 0x0a, 0xa6, 0x8c, 0xa9, 0xb9, 0xb8, 0x70, 0xe2, 0xf3,
0xa1, 0x8a, 0x26, 0xad, 0xf2, 0x9b, 0x2e, 0x55, 0xbc, 0x18, 0x4b, 0xb7, 0x34, 0x6e, 0xbd, 0x3d,
0xdc, 0x8b, 0x16, 0x04, 0x3e, 0x5f, 0x8b, 0x4e, 0x07, 0xfe, 0x62, 0xd6, 0xa2, 0x58, 0xad, 0x45,
0x79, 0xc6, 0x97, 0xa1, 0x84, 0x58, 0xf4, 0x5a, 0x34, 0x47, 0xca, 0xca, 0xee, 0xb9, 0x5b, 0xd1,
0xf7, 0xf9, 0xd2, 0xbd, 0xbc, 0x9a, 0x4e, 0x17, 0x6e, 0x9d, 0xa4, 0xf7, 0x93, 0x01, 0x6b, 0x01,
0x15, 0x21, 0x8b, 0x97, 0x77, 0x69, 0xcf, 0x41, 0x29, 0xa2, 0x21, 0x57, 0x37, 0xd6, 0x0c, 0xd4,
0x41, 0x42, 0x9b, 0x01, 0x91, 0xd0, 0x7e, 0x34, 0xc0, 0x6a, 0xd3, 0x30, 0x3a, 0x35, 0x60, 0x78,
0x6d, 0x0b, 0xc7, 0x2e, 0x74, 0x0e, 0xb6, 0x78, 0x8c, 0xb1, 0x1a, 0x54, 0x73, 0x10, 0x12, 0xd4,
0xaf, 0x26, 0x00, 0xba, 0x6d, 0x8b, 0x50, 0xf0, 0xe9, 0x90, 0x36, 0x16, 0xfa, 0xe0, 0x5d, 0x80,
0x5a, 0x38, 0x1a, 0x45, 0x8c, 0x92, 0x0e, 0x8b, 0x09, 0x3d, 0xd4, 0x20, 0x2d, 0x2d, 0x6c, 0x49,
0x99, 0x9c, 0x3e, 0x11, 0xa6, 0xd2, 0x61, 0xe4, 0x50, 0x0d, 0xbf, 0x60, 0x55, 0x49, 0x5a, 0xe4,
0xd0, 0x76, 0xa1, 0xaa, 0x3f, 0xef, 0x27, 0x5c, 0x35, 0xfa, 0x6a, 0xa0, 0x2d, 0x6e, 0x24, 0x5c,
0x2c, 0xeb, 0xbf, 0xf6, 0xd3, 0xa5, 0xb9, 0xbc, 0x88, 0xa5, 0x79, 0xe5, 0xd5, 0x96, 0x66, 0x07,
0x56, 0x22, 0x1a, 0xa6, 0x31, 0x4d, 0x9d, 0xca, 0x96, 0xb1, 0x5d, 0x09, 0xf2, 0xa3, 0xdd, 0x84,
0x4a, 0x1a, 0xf6, 0x85, 0xac, 0xaa, 0xb3, 0x8a, 0x48, 0xbd, 0x13, 0x91, 0xe2, 0x1f, 0xd1, 0xa4,
0xa6, 0x76, 0x3e, 0xb5, 0x6c, 0x6c, 0x3c, 0x9c, 0x6c, 0x1a, 0x7f, 0x4f, 0x36, 0x8d, 0x7f, 0x27,
0x9b, 0xc6, 0x37, 0x96, 0x5f, 0xbf, 0x34, 0x6d, 0xc6, 0x6e, 0x19, 0xa9, 0xfa, 0xe0, 0xbf, 0x00,
0x00, 0x00, 0xff, 0xff, 0xd8, 0x16, 0x77, 0x61, 0x6d, 0x14, 0x00, 0x00,
}
func (m *Item) Marshal() (dAtA []byte, err error) {
@ -2660,6 +2776,75 @@ func (m *UpdateShardRet) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *TransferShardLeaderArgs) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *TransferShardLeaderArgs) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *TransferShardLeaderArgs) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.XXX_unrecognized != nil {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
if m.DestDiskID != 0 {
i = encodeVarintShardnode(dAtA, i, uint64(m.DestDiskID))
i--
dAtA[i] = 0x18
}
if m.Suid != 0 {
i = encodeVarintShardnode(dAtA, i, uint64(m.Suid))
i--
dAtA[i] = 0x10
}
if m.DiskID != 0 {
i = encodeVarintShardnode(dAtA, i, uint64(m.DiskID))
i--
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
}
func (m *TransferShardLeaderRet) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *TransferShardLeaderRet) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *TransferShardLeaderRet) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.XXX_unrecognized != nil {
i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized)
}
return len(dAtA) - i, nil
}
func (m *GetShardArgs) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@ -3271,7 +3456,7 @@ func (m *ShardStats) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintShardnode(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x42
dAtA[i] = 0x4a
if m.Learner {
i--
if m.Learner {
@ -3280,7 +3465,7 @@ func (m *ShardStats) MarshalToSizedBuffer(dAtA []byte) (int, error) {
dAtA[i] = 0
}
i--
dAtA[i] = 0x38
dAtA[i] = 0x40
}
if len(m.Units) > 0 {
for iNdEx := len(m.Units) - 1; iNdEx >= 0; iNdEx-- {
@ -3293,7 +3478,7 @@ func (m *ShardStats) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintShardnode(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x32
dAtA[i] = 0x3a
}
}
{
@ -3305,11 +3490,18 @@ func (m *ShardStats) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintShardnode(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x2a
dAtA[i] = 0x32
if m.RouteVersion != 0 {
i = encodeVarintShardnode(dAtA, i, uint64(m.RouteVersion))
i--
dAtA[i] = 0x20
dAtA[i] = 0x28
}
if len(m.LeaderHost) > 0 {
i -= len(m.LeaderHost)
copy(dAtA[i:], m.LeaderHost)
i = encodeVarintShardnode(dAtA, i, uint64(len(m.LeaderHost)))
i--
dAtA[i] = 0x22
}
if m.LeaderIdx != 0 {
i = encodeVarintShardnode(dAtA, i, uint64(m.LeaderIdx))
@ -3655,6 +3847,39 @@ func (m *UpdateShardRet) Size() (n int) {
return n
}
func (m *TransferShardLeaderArgs) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.DiskID != 0 {
n += 1 + sovShardnode(uint64(m.DiskID))
}
if m.Suid != 0 {
n += 1 + sovShardnode(uint64(m.Suid))
}
if m.DestDiskID != 0 {
n += 1 + sovShardnode(uint64(m.DestDiskID))
}
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *TransferShardLeaderRet) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized)
}
return n
}
func (m *GetShardArgs) Size() (n int) {
if m == nil {
return 0
@ -3918,6 +4143,10 @@ func (m *ShardStats) Size() (n int) {
if m.LeaderIdx != 0 {
n += 1 + sovShardnode(uint64(m.LeaderIdx))
}
l = len(m.LeaderHost)
if l > 0 {
n += 1 + l + sovShardnode(uint64(l))
}
if m.RouteVersion != 0 {
n += 1 + sovShardnode(uint64(m.RouteVersion))
}
@ -5762,6 +5991,165 @@ func (m *UpdateShardRet) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *TransferShardLeaderArgs) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: TransferShardLeaderArgs: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: TransferShardLeaderArgs: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field DiskID", wireType)
}
m.DiskID = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.DiskID |= github_com_cubefs_cubefs_blobstore_common_proto.DiskID(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Suid", wireType)
}
m.Suid = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Suid |= github_com_cubefs_cubefs_blobstore_common_proto.Suid(b&0x7F) << shift
if b < 0x80 {
break
}
}
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field DestDiskID", wireType)
}
m.DestDiskID = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.DestDiskID |= github_com_cubefs_cubefs_blobstore_common_proto.DiskID(b&0x7F) << shift
if b < 0x80 {
break
}
}
default:
iNdEx = preIndex
skippy, err := skipShardnode(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthShardnode
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *TransferShardLeaderRet) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: TransferShardLeaderRet: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: TransferShardLeaderRet: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipShardnode(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthShardnode
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *GetShardArgs) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@ -7318,6 +7706,38 @@ func (m *ShardStats) Unmarshal(dAtA []byte) error {
}
}
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field LeaderHost", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowShardnode
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthShardnode
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthShardnode
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.LeaderHost = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 5:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field RouteVersion", wireType)
}
@ -7336,7 +7756,7 @@ func (m *ShardStats) Unmarshal(dAtA []byte) error {
break
}
}
case 5:
case 6:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Range", wireType)
}
@ -7369,7 +7789,7 @@ func (m *ShardStats) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 6:
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Units", wireType)
}
@ -7403,7 +7823,7 @@ func (m *ShardStats) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 7:
case 8:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Learner", wireType)
}
@ -7423,7 +7843,7 @@ func (m *ShardStats) Unmarshal(dAtA []byte) error {
}
}
m.Learner = bool(v != 0)
case 8:
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field RaftStat", wireType)
}

View File

@ -108,6 +108,14 @@ message UpdateShardArgs {
message UpdateShardRet {
}
message TransferShardLeaderArgs {
uint32 disk_id = 1 [(gogoproto.customname) = "DiskID", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.DiskID"];
uint64 suid = 2 [(gogoproto.customname) = "Suid", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.Suid"];
uint32 dest_disk_id = 3 [(gogoproto.customname) = "DestDiskID", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.DiskID"];
}
message TransferShardLeaderRet {}
message GetShardArgs {
uint32 disk_id = 1 [(gogoproto.customname) = "DiskID", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.DiskID"];
uint64 suid = 2 [(gogoproto.customname) = "Suid", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.Suid"];
@ -177,9 +185,10 @@ message ShardStats {
uint64 suid = 1 [(gogoproto.customname) = "Suid", (gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.Suid"];
uint64 applied_index = 2;
uint32 leader_idx = 3;
uint64 route_version = 4 [(gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.RouteVersion"];
cubefs.blobstore.common.sharding.Range range = 5 [(gogoproto.nullable) = false];
repeated cubefs.blobstore.api.clustermgr.ShardUnit units = 6 [(gogoproto.nullable) = false];
bool learner = 7;
cubefs.blobstore.common.raft.Stat raftStat = 8 [(gogoproto.nullable) = false];
string leader_host = 4;
uint64 route_version = 5 [(gogoproto.casttype) = "github.com/cubefs/cubefs/blobstore/common/proto.RouteVersion"];
cubefs.blobstore.common.sharding.Range range = 6 [(gogoproto.nullable) = false];
repeated cubefs.blobstore.api.clustermgr.ShardUnit units = 7 [(gogoproto.nullable) = false];
bool learner = 8;
cubefs.blobstore.common.raft.Stat raftStat = 9 [(gogoproto.nullable) = false];
}

View File

@ -47,6 +47,16 @@ func (s *service) UpdateShard(ctx context.Context, req *shardnode.UpdateShardArg
return disk.UpdateShard(ctx, req.Suid, req.ShardUpdateType, req.Unit)
}
// TransferShardLeader transfer shard leader
func (s *service) TransferShardLeader(ctx context.Context, req *shardnode.TransferShardLeaderArgs) error {
shard, err := s.GetShard(req.DiskID, req.Suid)
if err != nil {
return err
}
return shard.TransferLeader(ctx, req.GetDestDiskID())
}
func (s *service) GetShardUintInfo(ctx context.Context, diskID proto.DiskID, suid proto.Suid) (ret clustermgr.ShardUnitInfo, err error) {
shard, err := s.GetShard(diskID, suid)
if err != nil {

View File

@ -409,6 +409,20 @@ func (mr *MockSpaceShardHandlerMockRecorder) Stats() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stats", reflect.TypeOf((*MockSpaceShardHandler)(nil).Stats))
}
// TransferLeader mocks base method.
func (m *MockSpaceShardHandler) TransferLeader(ctx context.Context, diskID proto.DiskID) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "TransferLeader", ctx, diskID)
ret0, _ := ret[0].(error)
return ret0
}
// TransferLeader indicates an expected call of TransferLeader.
func (mr *MockSpaceShardHandlerMockRecorder) TransferLeader(ctx, diskID interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransferLeader", reflect.TypeOf((*MockSpaceShardHandler)(nil).TransferLeader), ctx, diskID)
}
// Update mocks base method.
func (m *MockSpaceShardHandler) Update(ctx context.Context, h OpHeader, kv *KV) error {
m.ctrl.T.Helper()

View File

@ -63,6 +63,7 @@ type (
ShardKVHandler
ShardItemHandler
GetRouteVersion() proto.RouteVersion
TransferLeader(ctx context.Context, diskID proto.DiskID) error
Checkpoint(ctx context.Context) error
Stats() (shardnode.ShardStats, error)
}
@ -430,7 +431,7 @@ func (s *shard) Stats() (shardnode.ShardStats, error) {
rg := s.shardInfoMu.Range
for i := range units {
if units[i].DiskID == s.shardInfoMu.leader {
leaderIdx = uint32(i)
leaderIdx = uint32(units[i].Suid.Index())
}
}
learner := !(s.shardInfoMu.leader == s.diskID)
@ -440,11 +441,19 @@ func (s *shard) Stats() (shardnode.ShardStats, error) {
if err != nil {
return shardnode.ShardStats{}, err
}
var leaderHost string
for _, pr := range raftStat.Peers {
if pr.IsLearner {
leaderHost = pr.Host
break
}
}
return shardnode.ShardStats{
Suid: s.suid,
AppliedIndex: appliedIndex,
LeaderIdx: leaderIdx,
LeaderHost: leaderHost,
RouteVersion: routeVersion,
Range: rg,
Units: units,
@ -508,6 +517,14 @@ func (s *shard) UpdateShard(ctx context.Context, op proto.ShardUpdateType, node
}
}
func (s *shard) TransferLeader(ctx context.Context, diskID proto.DiskID) error {
if err := s.shardState.prepRWCheck(); err != nil {
return err
}
defer s.shardState.prepRWCheckDone()
return s.raftGroup.LeaderTransfer(ctx, uint64(diskID))
}
func (s *shard) SaveShardInfo(ctx context.Context, withLock bool, flush bool) error {
if err := s.shardState.prepRWCheck(); err != nil {
return err