diff --git a/cmd/inspector/main.go b/cmd/inspector/main.go index 7f966c391..7feea1a96 100644 --- a/cmd/inspector/main.go +++ b/cmd/inspector/main.go @@ -553,22 +553,25 @@ func getSegments(cmd *cobra.Command, args []string) error { if err != nil { return ErrInspectorDial.Wrap(err) } - - length := irreparableLimit - var offset int32 + var lastSeenSegmentPath = []byte{} // query DB and paginate results - for length >= irreparableLimit { - res, err := i.irrdbclient.ListIrreparableSegments(context.Background(), &pb.ListIrreparableSegmentsRequest{Limit: irreparableLimit, Offset: offset}) + for { + req := &pb.ListIrreparableSegmentsRequest{ + Limit: irreparableLimit, + LastSeenSegmentPath: lastSeenSegmentPath, + } + res, err := i.irrdbclient.ListIrreparableSegments(context.Background(), req) if err != nil { return ErrRequest.Wrap(err) } - objects := sortSegments(res.Segments) - if len(objects) == 0 { + if len(res.Segments) == 0 { break } + lastSeenSegmentPath = res.Segments[len(res.Segments)-1].Path + objects := sortSegments(res.Segments) // format and print segments enc := json.NewEncoder(os.Stdout) enc.SetIndent("", " ") @@ -577,9 +580,7 @@ func getSegments(cmd *cobra.Command, args []string) error { return err } - length = int32(len(res.Segments)) - offset += length - + length := int32(len(res.Segments)) if length >= irreparableLimit { if !prompt.Confirm("\nNext page? (y/n)") { break diff --git a/pkg/datarepair/checker/checker.go b/pkg/datarepair/checker/checker.go index de5e1b91a..64b6cc95c 100644 --- a/pkg/datarepair/checker/checker.go +++ b/pkg/datarepair/checker/checker.go @@ -251,30 +251,32 @@ func (checker *Checker) updateSegmentStatus(ctx context.Context, pointer *pb.Poi return nil } -// IrreparableProcess picks items from irreparabledb and add them to the repair -// worker queue if they, now, can be repaired. +// IrreparableProcess iterates over all items in the irreparabledb. If an item can +// now be repaired then it is added to a worker queue. func (checker *Checker) IrreparableProcess(ctx context.Context) (err error) { defer mon.Task()(&ctx)(&err) - - limit := 1 - var offset int64 + const limit = 1000 + lastSeenSegmentPath := []byte{} for { - seg, err := checker.irrdb.GetLimited(ctx, limit, offset) + segments, err := checker.irrdb.GetLimited(ctx, limit, lastSeenSegmentPath) if err != nil { return Error.New("error reading segment from the queue %s", err) } // zero segments returned with nil err - if len(seg) == 0 { + if len(segments) == 0 { break } - err = checker.updateSegmentStatus(ctx, seg[0].GetSegmentDetail(), string(seg[0].GetPath()), &durabilityStats{}) - if err != nil { - checker.logger.Error("irrepair segment checker failed: ", zap.Error(err)) + lastSeenSegmentPath = segments[len(segments)-1].Path + + for _, segment := range segments { + err = checker.updateSegmentStatus(ctx, segment.GetSegmentDetail(), string(segment.GetPath()), &durabilityStats{}) + if err != nil { + checker.logger.Error("irrepair segment checker failed: ", zap.Error(err)) + } } - offset++ } return nil diff --git a/pkg/datarepair/checker/checker_test.go b/pkg/datarepair/checker/checker_test.go index 211f900b6..e53a3a111 100644 --- a/pkg/datarepair/checker/checker_test.go +++ b/pkg/datarepair/checker/checker_test.go @@ -30,13 +30,13 @@ func TestIdentifyInjuredSegments(t *testing.T) { checker.Loop.Stop() //add noise to metainfo before bad record - for x := 0; x < 1000; x++ { + for x := 0; x < 10; x++ { makePointer(t, planet, fmt.Sprintf("a-%d", x), false) } //create piece that needs repair makePointer(t, planet, fmt.Sprintf("b"), true) //add more noise to metainfo after bad record - for x := 0; x < 1000; x++ { + for x := 0; x < 10; x++ { makePointer(t, planet, fmt.Sprintf("c-%d", x), false) } err := checker.IdentifyInjuredSegments(ctx) diff --git a/pkg/datarepair/irreparable/inspector.go b/pkg/datarepair/irreparable/inspector.go index 2fbd4b22a..37b2b60ee 100644 --- a/pkg/datarepair/irreparable/inspector.go +++ b/pkg/datarepair/irreparable/inspector.go @@ -28,7 +28,11 @@ func NewInspector(irrdb DB) *Inspector { // ListIrreparableSegments returns a number of irreparable segments by limit and offset func (srv *Inspector) ListIrreparableSegments(ctx context.Context, req *pb.ListIrreparableSegmentsRequest) (_ *pb.ListIrreparableSegmentsResponse, err error) { defer mon.Task()(&ctx)(&err) - segments, err := srv.irrdb.GetLimited(ctx, int(req.GetLimit()), int64(req.GetOffset())) + last := req.GetLastSeenSegmentPath() + if len(req.GetLastSeenSegmentPath()) == 0 { + last = []byte{} + } + segments, err := srv.irrdb.GetLimited(ctx, int(req.GetLimit()), last) if err != nil { return nil, err } diff --git a/pkg/datarepair/irreparable/irreparable.go b/pkg/datarepair/irreparable/irreparable.go index 120857378..192913b90 100644 --- a/pkg/datarepair/irreparable/irreparable.go +++ b/pkg/datarepair/irreparable/irreparable.go @@ -15,8 +15,8 @@ type DB interface { IncrementRepairAttempts(ctx context.Context, segmentInfo *pb.IrreparableSegment) error // Get returns irreparable segment info based on segmentPath. Get(ctx context.Context, segmentPath []byte) (*pb.IrreparableSegment, error) - // GetLimited number of segments from offset - GetLimited(ctx context.Context, limit int, offset int64) ([]*pb.IrreparableSegment, error) + // GetLimited returns a list of irreparable segment info starting after the last segment info we retrieved + GetLimited(ctx context.Context, limit int, lastSeenSegmentPath []byte) ([]*pb.IrreparableSegment, error) // Delete removes irreparable segment info based on segmentPath. Delete(ctx context.Context, segmentPath []byte) error } diff --git a/pkg/datarepair/irreparable/irreparable_test.go b/pkg/datarepair/irreparable/irreparable_test.go index 0dfc89d38..26765b351 100644 --- a/pkg/datarepair/irreparable/irreparable_test.go +++ b/pkg/datarepair/irreparable/irreparable_test.go @@ -41,31 +41,35 @@ func TestIrreparable(t *testing.T) { require.NoError(t, err) } - { // GetLimited limit 1, offset 0 - segs, err := irrdb.GetLimited(ctx, 1, 0) + { // GetLimited limit 1, starting from the beginning + lastSeenSegmentPath := []byte{} + segs, err := irrdb.GetLimited(ctx, 1, lastSeenSegmentPath) require.NoError(t, err) require.Equal(t, 1, len(segs)) require.Empty(t, cmp.Diff(segments[0], segs[0], cmp.Comparer(pb.Equal))) } - { // GetLimited limit 1, offset 1 - segs, err := irrdb.GetLimited(ctx, 1, 1) + { // GetLimited limit 1, starting after the first item + lastSeenSegmentPath := []byte(strconv.Itoa(0)) + segs, err := irrdb.GetLimited(ctx, 1, lastSeenSegmentPath) require.NoError(t, err) require.Equal(t, 1, len(segs)) require.Empty(t, cmp.Diff(segments[1], segs[0], cmp.Comparer(pb.Equal))) } - { // GetLimited limit 2, offset 0 - segs, err := irrdb.GetLimited(ctx, 2, 0) + { // GetLimited limit 2, starting from the beginning + lastSeenSegmentPath := []byte{} + segs, err := irrdb.GetLimited(ctx, 2, lastSeenSegmentPath) require.NoError(t, err) require.Equal(t, 2, len(segs)) require.Empty(t, cmp.Diff(segments[0], segs[0], cmp.Comparer(pb.Equal))) require.Empty(t, cmp.Diff(segments[1], segs[1], cmp.Comparer(pb.Equal))) } - { // GetLimited limit 2, offset 1 - segs, err := irrdb.GetLimited(ctx, 2, 1) + { // GetLimited limit 2, starting after the first item + lastSeenSegmentPath := []byte(strconv.Itoa(0)) + segs, err := irrdb.GetLimited(ctx, 2, lastSeenSegmentPath) require.NoError(t, err) require.Equal(t, 2, len(segs)) require.Empty(t, cmp.Diff(segments[1], segs[0], cmp.Comparer(pb.Equal))) @@ -73,8 +77,9 @@ func TestIrreparable(t *testing.T) { } - { // GetLimited limit 3, offset 1 - segs, err := irrdb.GetLimited(ctx, 3, 1) + { // GetLimited limit 3, starting after the first item + lastSeenSegmentPath := []byte(strconv.Itoa(0)) + segs, err := irrdb.GetLimited(ctx, 3, lastSeenSegmentPath) require.NoError(t, err) require.Equal(t, 2, len(segs)) require.Empty(t, cmp.Diff(segments[1], segs[0], cmp.Comparer(pb.Equal))) diff --git a/pkg/pb/inspector.pb.go b/pkg/pb/inspector.pb.go index 2e167a800..9ca2d85a7 100644 --- a/pkg/pb/inspector.pb.go +++ b/pkg/pb/inspector.pb.go @@ -30,7 +30,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package // ListSegments type ListIrreparableSegmentsRequest struct { Limit int32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` - Offset int32 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` + LastSeenSegmentPath []byte `protobuf:"bytes,2,opt,name=last_seen_segment_path,json=lastSeenSegmentPath,proto3" json:"last_seen_segment_path,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -67,11 +67,11 @@ func (m *ListIrreparableSegmentsRequest) GetLimit() int32 { return 0 } -func (m *ListIrreparableSegmentsRequest) GetOffset() int32 { +func (m *ListIrreparableSegmentsRequest) GetLastSeenSegmentPath() []byte { if m != nil { - return m.Offset + return m.LastSeenSegmentPath } - return 0 + return nil } type IrreparableSegment struct { @@ -1514,112 +1514,113 @@ func init() { func init() { proto.RegisterFile("inspector.proto", fileDescriptor_a07d9034b2dd9d26) } var fileDescriptor_a07d9034b2dd9d26 = []byte{ - // 1672 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x39, 0x73, 0x1b, 0x47, - 0x16, 0xe6, 0xe0, 0x22, 0xf0, 0x00, 0xe2, 0x68, 0x52, 0x12, 0x16, 0x92, 0x08, 0xee, 0xec, 0xa1, - 0x83, 0xbb, 0xa0, 0x16, 0xab, 0x0d, 0x54, 0x5b, 0x0e, 0x08, 0x52, 0x07, 0x4a, 0xb2, 0x44, 0x0d, - 0x65, 0x07, 0x2e, 0x95, 0x51, 0x0d, 0x74, 0x03, 0x1c, 0x13, 0x98, 0x1e, 0xcd, 0x34, 0x64, 0xe1, - 0x0f, 0xb8, 0xec, 0xc8, 0x4a, 0x1c, 0x38, 0x76, 0xf9, 0x1f, 0x38, 0x72, 0xea, 0xc4, 0xbf, 0xc1, - 0x81, 0x9c, 0xd9, 0xb9, 0x33, 0x67, 0xae, 0x3e, 0xe6, 0xc2, 0x61, 0xd2, 0x65, 0x3b, 0xc3, 0xbc, - 0xef, 0xeb, 0xd7, 0xef, 0xbd, 0x3e, 0xde, 0xd7, 0x80, 0x8a, 0xed, 0xf8, 0x2e, 0x1d, 0x70, 0xe6, - 0xb5, 0x5c, 0x8f, 0x71, 0x86, 0x0a, 0xa1, 0xa1, 0x01, 0x23, 0x36, 0x62, 0xca, 0xdc, 0x00, 0x87, - 0x11, 0xaa, 0x7f, 0x57, 0x5c, 0x66, 0x3b, 0x9c, 0x7a, 0xa4, 0xaf, 0x0d, 0xdb, 0x23, 0xc6, 0x46, - 0x63, 0xba, 0x27, 0xbf, 0xfa, 0xd3, 0xe1, 0x1e, 0x99, 0x7a, 0x98, 0xdb, 0xcc, 0xd1, 0x78, 0x73, - 0x1e, 0xe7, 0xf6, 0x84, 0xfa, 0x1c, 0x4f, 0x5c, 0x45, 0x30, 0x1f, 0xc3, 0xf6, 0x23, 0xdb, 0xe7, - 0x5d, 0xcf, 0xa3, 0x2e, 0xf6, 0x70, 0x7f, 0x4c, 0x8f, 0xe9, 0x68, 0x42, 0x1d, 0xee, 0x5b, 0xf4, - 0xc5, 0x94, 0xfa, 0x1c, 0x6d, 0x41, 0x76, 0x6c, 0x4f, 0x6c, 0x5e, 0x37, 0x76, 0x8c, 0xeb, 0x59, - 0x4b, 0x7d, 0xa0, 0x8b, 0x90, 0x63, 0xc3, 0xa1, 0x4f, 0x79, 0x3d, 0x25, 0xcd, 0xfa, 0xcb, 0xfc, - 0xc1, 0x00, 0xb4, 0xe8, 0x0c, 0x21, 0xc8, 0xb8, 0x98, 0x9f, 0x48, 0x1f, 0x25, 0x4b, 0xfe, 0x46, - 0x77, 0xa0, 0xec, 0x2b, 0xb8, 0x47, 0x28, 0xc7, 0xf6, 0x58, 0xba, 0x2a, 0xb6, 0x51, 0x2b, 0xca, - 0xf2, 0x48, 0xfd, 0xb2, 0x36, 0x34, 0xf3, 0x50, 0x12, 0x51, 0x13, 0x8a, 0x63, 0xe6, 0xf3, 0x9e, - 0x6b, 0xd3, 0x01, 0xf5, 0xeb, 0x69, 0x19, 0x02, 0x08, 0xd3, 0x91, 0xb4, 0xa0, 0x16, 0x6c, 0x8e, - 0xb1, 0xcf, 0x7b, 0x22, 0x10, 0xdb, 0xeb, 0x61, 0xce, 0xe9, 0xc4, 0xe5, 0xf5, 0xcc, 0x8e, 0x71, - 0x3d, 0x6d, 0xd5, 0x04, 0x64, 0x49, 0x64, 0x5f, 0x01, 0xe8, 0x16, 0x6c, 0x25, 0xa9, 0xbd, 0x01, - 0x9b, 0x3a, 0xbc, 0x9e, 0x95, 0x03, 0x90, 0x17, 0x27, 0x1f, 0x08, 0xc4, 0x7c, 0x0e, 0xcd, 0x95, - 0x85, 0xf3, 0x5d, 0xe6, 0xf8, 0x14, 0xdd, 0x81, 0xbc, 0x0e, 0xdb, 0xaf, 0x1b, 0x3b, 0xe9, 0xeb, - 0xc5, 0xf6, 0xd5, 0x56, 0xb4, 0xe8, 0x8b, 0x23, 0xad, 0x90, 0x6e, 0xde, 0x04, 0x24, 0xa7, 0x79, - 0xcc, 0x08, 0x8d, 0x1c, 0x6e, 0x41, 0x56, 0x85, 0x65, 0xc8, 0xb0, 0xd4, 0x87, 0xb9, 0x09, 0xb5, - 0x38, 0x57, 0xae, 0x9a, 0x79, 0x11, 0xb6, 0xee, 0x53, 0xde, 0x99, 0x0e, 0x4e, 0x29, 0x17, 0x71, - 0x06, 0xf6, 0x9f, 0x0c, 0xb8, 0x30, 0x07, 0x68, 0xe7, 0xfb, 0xb0, 0xde, 0x97, 0xd6, 0x20, 0xd8, - 0x6b, 0xb1, 0x60, 0x97, 0x0e, 0x69, 0x29, 0x93, 0x15, 0x8c, 0x6b, 0x7c, 0x66, 0x40, 0x4e, 0xd9, - 0xd0, 0x2e, 0x14, 0x94, 0xb5, 0x67, 0x13, 0xb5, 0xea, 0x9d, 0xf2, 0xb7, 0x6f, 0x9a, 0x6b, 0xdf, - 0xbd, 0x69, 0xe6, 0x44, 0xa0, 0xdd, 0x43, 0x2b, 0xaf, 0x08, 0x5d, 0x82, 0xf6, 0x60, 0xc3, 0x63, - 0x53, 0x6e, 0x3b, 0xa3, 0x9e, 0xd8, 0xec, 0x7e, 0x3d, 0x25, 0x03, 0x80, 0x96, 0xdc, 0xfa, 0x82, - 0x6e, 0x95, 0x34, 0x41, 0x26, 0x89, 0xfe, 0x0d, 0xa5, 0x01, 0x1e, 0x9c, 0x50, 0xa2, 0xf9, 0xe9, - 0x05, 0x7e, 0x51, 0xe1, 0x92, 0x2e, 0x2a, 0x14, 0x26, 0x10, 0x56, 0xe8, 0x01, 0xa0, 0xb8, 0x31, - 0x2a, 0x31, 0x67, 0x1c, 0x8f, 0x83, 0x12, 0xcb, 0x0f, 0x74, 0x05, 0xd2, 0x36, 0x51, 0x61, 0x95, - 0x3a, 0x10, 0xcb, 0x41, 0x98, 0xcd, 0x36, 0x54, 0x43, 0x4f, 0xc1, 0xa9, 0xd9, 0x86, 0xd4, 0xca, - 0xc4, 0x53, 0x36, 0x31, 0xdf, 0x89, 0x85, 0x14, 0x4e, 0x7e, 0xc6, 0x20, 0xb4, 0x03, 0xd9, 0x55, - 0xf5, 0x51, 0x80, 0xd9, 0x02, 0x88, 0xd6, 0x29, 0xe2, 0x1b, 0xab, 0xf8, 0x0f, 0xa1, 0x72, 0xa4, - 0xab, 0x7a, 0xce, 0xc8, 0x51, 0x1d, 0xd6, 0x31, 0x21, 0x1e, 0xf5, 0x7d, 0x79, 0x5e, 0x0b, 0x56, - 0xf0, 0x69, 0x9a, 0x50, 0x8d, 0x9c, 0xe9, 0x94, 0xca, 0x90, 0x62, 0xa7, 0xd2, 0x5b, 0xde, 0x4a, - 0xb1, 0x53, 0xf3, 0x2d, 0xa8, 0x3d, 0x62, 0xec, 0x74, 0xea, 0xc6, 0xa7, 0x2c, 0x87, 0x53, 0x16, - 0xce, 0x98, 0xe2, 0x39, 0xa0, 0xf8, 0xf0, 0xb0, 0x6e, 0x19, 0x91, 0x8e, 0xf4, 0x90, 0x4c, 0x53, - 0xda, 0xd1, 0x3f, 0x21, 0x33, 0xa1, 0x1c, 0x87, 0xf7, 0x4b, 0x88, 0xbf, 0x4d, 0x39, 0x26, 0x98, - 0x63, 0x4b, 0xe2, 0xe6, 0xfb, 0x50, 0x91, 0x89, 0x3a, 0x43, 0x76, 0xde, 0x6a, 0xec, 0x26, 0x43, - 0x2d, 0xb6, 0x6b, 0x91, 0xf7, 0x7d, 0x05, 0x44, 0xd1, 0x7f, 0x63, 0x40, 0x35, 0x9a, 0x40, 0x07, - 0x6f, 0x42, 0x86, 0xcf, 0x5c, 0x15, 0x7c, 0xb9, 0x5d, 0x8e, 0x86, 0x3f, 0x9b, 0xb9, 0xd4, 0x92, - 0x18, 0x6a, 0x41, 0x9e, 0xb9, 0xd4, 0xc3, 0x9c, 0x79, 0x8b, 0x49, 0x3c, 0xd1, 0x88, 0x15, 0x72, - 0x04, 0x7f, 0x80, 0x5d, 0x3c, 0xb0, 0xf9, 0x4c, 0x5e, 0x8e, 0x09, 0xfe, 0x81, 0x46, 0xac, 0x90, - 0x23, 0xb2, 0x78, 0x49, 0x3d, 0xdf, 0x66, 0x8e, 0xbc, 0x22, 0x13, 0x59, 0xbc, 0xab, 0x00, 0x2b, - 0x60, 0x98, 0x13, 0xa8, 0xdc, 0xb3, 0x1d, 0xf2, 0x98, 0x62, 0xef, 0xbc, 0x55, 0xfa, 0x3b, 0x64, - 0x7d, 0x8e, 0x3d, 0xd5, 0x2c, 0x16, 0x29, 0x0a, 0x8c, 0x3a, 0x4d, 0x5a, 0x9d, 0x3d, 0xf9, 0x61, - 0xde, 0x86, 0x6a, 0x34, 0x9d, 0xae, 0xd9, 0xd9, 0x07, 0x01, 0x41, 0xf5, 0x70, 0x3a, 0x71, 0x13, - 0x77, 0xe2, 0xff, 0xa0, 0x16, 0xb3, 0xcd, 0xbb, 0x5a, 0x79, 0x46, 0xca, 0x50, 0x3a, 0xe6, 0x38, - 0xba, 0x38, 0x7e, 0x36, 0x60, 0x53, 0x18, 0x8e, 0xa7, 0x93, 0x09, 0xf6, 0x66, 0xa1, 0xa7, 0xab, - 0x00, 0x53, 0x9f, 0x92, 0x9e, 0xef, 0xe2, 0x01, 0xd5, 0xf7, 0x47, 0x41, 0x58, 0x8e, 0x85, 0x01, - 0x5d, 0x83, 0x0a, 0x7e, 0x89, 0xed, 0xb1, 0xb8, 0xf0, 0x35, 0x27, 0x25, 0x39, 0xe5, 0xd0, 0xac, - 0x88, 0x7f, 0x85, 0x92, 0xf4, 0x63, 0x3b, 0x23, 0xb9, 0xaf, 0x54, 0x35, 0x8a, 0xc2, 0xd6, 0x55, - 0x26, 0xd1, 0xff, 0x24, 0x85, 0x2a, 0x86, 0x6a, 0x6b, 0x72, 0xf6, 0xbb, 0x8a, 0xf0, 0x0f, 0x28, - 0x4b, 0x42, 0x1f, 0x3b, 0xe4, 0x43, 0x9b, 0xf0, 0x13, 0xdd, 0xc9, 0x36, 0x84, 0xb5, 0x13, 0x18, - 0xd1, 0x1e, 0x6c, 0x46, 0x31, 0x45, 0xdc, 0x9c, 0xea, 0x7a, 0x21, 0x14, 0x0e, 0x90, 0x65, 0xc5, - 0xfe, 0x49, 0x9f, 0x61, 0x8f, 0x04, 0xf5, 0x78, 0x9d, 0x81, 0x5a, 0xcc, 0xa8, 0xab, 0x71, 0x0d, - 0xd6, 0x45, 0xf9, 0x56, 0x5f, 0xff, 0x39, 0x01, 0x77, 0x09, 0xba, 0x01, 0x55, 0x49, 0x1c, 0x30, - 0xc7, 0xa1, 0x03, 0xa1, 0x5d, 0x7c, 0x5d, 0x98, 0x8a, 0xb0, 0x1f, 0x44, 0x66, 0xb4, 0x0b, 0xb5, - 0x3e, 0x63, 0xdc, 0xe7, 0x1e, 0x76, 0x7b, 0xc1, 0xb1, 0x4b, 0xcb, 0x1b, 0xa2, 0x1a, 0x02, 0xfa, - 0xd4, 0x09, 0xbf, 0x52, 0x3b, 0x38, 0x78, 0x1c, 0x72, 0x33, 0x92, 0x5b, 0x09, 0xec, 0x31, 0x2a, - 0x7d, 0x35, 0x47, 0xcd, 0x2a, 0x6a, 0x60, 0x0f, 0xa8, 0xbb, 0x50, 0x23, 0x41, 0xae, 0x21, 0x37, - 0xa7, 0x42, 0x08, 0x81, 0x80, 0x7c, 0x5b, 0x6e, 0x7b, 0xee, 0xd7, 0xd7, 0xe5, 0xa1, 0xda, 0x8e, - 0x35, 0xd4, 0x25, 0x1b, 0xc8, 0x52, 0x64, 0xf4, 0x1f, 0xc8, 0x4d, 0x5d, 0xa1, 0xd3, 0xea, 0x79, - 0x39, 0xec, 0x2f, 0x2d, 0x25, 0xe2, 0x5a, 0x81, 0x88, 0x6b, 0x1d, 0x6a, 0x91, 0x67, 0x69, 0x22, - 0xba, 0x0b, 0x45, 0x29, 0x77, 0x5c, 0xdb, 0x19, 0x51, 0x52, 0x2f, 0xc8, 0x71, 0x8d, 0x85, 0x71, - 0xcf, 0x02, 0xf1, 0xd7, 0xc9, 0x8b, 0xc5, 0x78, 0xfd, 0x7d, 0xd3, 0xb0, 0x40, 0x0c, 0x3c, 0x92, - 0xe3, 0xd0, 0x7d, 0x28, 0x49, 0x37, 0x2f, 0xa6, 0xd4, 0xb3, 0x29, 0xa9, 0xc3, 0x6f, 0xf0, 0x23, - 0x03, 0x78, 0xaa, 0x06, 0x9a, 0x9f, 0x1b, 0xb0, 0xa5, 0x45, 0xcd, 0x03, 0x8a, 0xc7, 0xfc, 0x24, - 0xb8, 0x28, 0x2e, 0x42, 0x4e, 0x75, 0x7d, 0xad, 0x04, 0xf5, 0x97, 0xd8, 0xaf, 0xd4, 0x19, 0x78, - 0x33, 0x97, 0x53, 0xd2, 0x93, 0x4a, 0x51, 0xde, 0x14, 0xd6, 0x46, 0x68, 0x3d, 0x12, 0x92, 0xf1, - 0x6f, 0x10, 0x08, 0xc1, 0x9e, 0xed, 0x10, 0xfa, 0x4a, 0x9f, 0x8d, 0x92, 0x36, 0x76, 0x85, 0x4d, - 0x9c, 0x43, 0xd7, 0x63, 0x1f, 0xd0, 0x81, 0xd4, 0x1e, 0x19, 0xe9, 0xa7, 0xa0, 0x2d, 0x5d, 0x62, - 0x7e, 0x65, 0xc0, 0x46, 0x22, 0x36, 0xb4, 0x0b, 0xc5, 0x13, 0xf9, 0x6b, 0xd6, 0x13, 0x5d, 0xde, - 0x58, 0xe8, 0xf2, 0xa0, 0xe1, 0x2e, 0xf1, 0x85, 0x56, 0x99, 0x3a, 0x71, 0xfa, 0xa2, 0x28, 0x28, - 0x85, 0x04, 0x31, 0x60, 0x17, 0x8a, 0x6c, 0x38, 0x1c, 0xdb, 0x0e, 0x95, 0xf4, 0xf4, 0xa2, 0x77, - 0x0d, 0x0b, 0x72, 0x1d, 0xd6, 0x75, 0x2e, 0x3a, 0xf0, 0xe0, 0xd3, 0xfc, 0xc8, 0x80, 0x0b, 0x73, - 0x25, 0xd5, 0x27, 0xed, 0x16, 0xe4, 0xd4, 0x74, 0xba, 0xff, 0xd5, 0xe3, 0xdb, 0x2c, 0x31, 0x42, - 0xf3, 0xd0, 0xff, 0x01, 0x3c, 0x4a, 0xa6, 0x0e, 0xc1, 0xce, 0x60, 0xa6, 0x1b, 0xca, 0xe5, 0x98, - 0xea, 0xb6, 0x42, 0xf0, 0x78, 0x70, 0x42, 0x27, 0xd4, 0x8a, 0xd1, 0xcd, 0x1f, 0x0d, 0xd8, 0x7c, - 0xd2, 0x17, 0xc5, 0x4c, 0x2e, 0xed, 0xe2, 0x12, 0x1a, 0xcb, 0x96, 0x30, 0xda, 0x01, 0xa9, 0xc4, - 0x0e, 0x48, 0xae, 0x5a, 0x7a, 0x6e, 0xd5, 0x84, 0xa0, 0x97, 0x4d, 0xa2, 0x87, 0x87, 0x9c, 0x7a, - 0xbd, 0x78, 0x91, 0xd2, 0x56, 0x4d, 0x42, 0xfb, 0x02, 0x09, 0x1e, 0x1c, 0xff, 0x02, 0x44, 0x1d, - 0xd2, 0xeb, 0xd3, 0x21, 0xf3, 0x68, 0x48, 0x57, 0x97, 0x60, 0x95, 0x3a, 0xa4, 0x23, 0x81, 0x80, - 0x1d, 0x76, 0x9e, 0x5c, 0xec, 0x8d, 0x63, 0x7e, 0x62, 0xc0, 0x56, 0x32, 0x53, 0x5d, 0xf1, 0xdb, - 0x0b, 0xc2, 0x7e, 0x75, 0xcd, 0x43, 0xe6, 0xef, 0xaa, 0x7a, 0xfb, 0xd3, 0x0c, 0x94, 0x1e, 0x62, - 0xd2, 0x0d, 0x66, 0x41, 0x5d, 0x80, 0x48, 0xf5, 0xa3, 0x2b, 0xb1, 0xf9, 0x17, 0x1e, 0x03, 0x8d, - 0xab, 0x2b, 0x50, 0x9d, 0xce, 0x01, 0xe4, 0x03, 0xdd, 0x86, 0x1a, 0x31, 0xea, 0x9c, 0x32, 0x6c, - 0x5c, 0x5e, 0x8a, 0x69, 0x27, 0x5d, 0x80, 0x48, 0x99, 0x25, 0xe2, 0x59, 0xd0, 0x7b, 0x89, 0x78, - 0x96, 0xc8, 0xb9, 0x03, 0xc8, 0x07, 0x2a, 0x29, 0x11, 0xcf, 0x9c, 0x36, 0x4b, 0xc4, 0xb3, 0x20, - 0xab, 0x0e, 0x20, 0x1f, 0xc8, 0x86, 0x84, 0x93, 0x39, 0xe9, 0x92, 0x70, 0xb2, 0xa0, 0x33, 0xee, - 0x41, 0x21, 0x54, 0x0c, 0x28, 0xce, 0x9c, 0xd7, 0x16, 0x8d, 0x2b, 0xcb, 0x41, 0xed, 0xc7, 0x82, - 0x8d, 0xc4, 0x0b, 0x0a, 0x35, 0x57, 0xbf, 0xad, 0x94, 0xbf, 0x9d, 0xb3, 0x1e, 0x5f, 0xed, 0x2f, - 0x0d, 0xa8, 0x3e, 0x79, 0x49, 0xbd, 0x31, 0x9e, 0xfd, 0x29, 0xbb, 0xe2, 0x0f, 0xca, 0xbd, 0xfd, - 0x85, 0x01, 0x9b, 0xf2, 0x55, 0x7e, 0xcc, 0x99, 0x47, 0xa3, 0x50, 0x3b, 0x90, 0x95, 0xb2, 0x0a, - 0x5d, 0x9a, 0x6b, 0x8b, 0xa1, 0xdf, 0x33, 0xfa, 0xa5, 0xb9, 0x86, 0x1e, 0x40, 0x21, 0x54, 0x1e, - 0xc9, 0x18, 0xe7, 0x44, 0x4a, 0x32, 0xc6, 0x79, 0xb1, 0x62, 0xae, 0xb5, 0x3f, 0x36, 0x60, 0x2b, - 0xf6, 0x22, 0x8f, 0xc2, 0x74, 0xe1, 0xd2, 0x8a, 0x77, 0x3e, 0xba, 0x11, 0xdf, 0xc6, 0xbf, 0xfa, - 0x27, 0x4a, 0xe3, 0xe6, 0x79, 0xa8, 0xba, 0x60, 0x5f, 0x1b, 0x50, 0x51, 0x97, 0x47, 0x14, 0xc5, - 0x53, 0x28, 0xc5, 0x6f, 0x22, 0x14, 0x2f, 0xcd, 0x92, 0xcb, 0xb8, 0xd1, 0x5c, 0x89, 0x87, 0xb5, - 0x7b, 0x36, 0xdf, 0x06, 0x9b, 0x2b, 0xef, 0xb0, 0x25, 0x7b, 0x72, 0x69, 0x2b, 0x32, 0xd7, 0x3a, - 0x99, 0xf7, 0x52, 0x6e, 0xbf, 0x9f, 0x93, 0x52, 0xe1, 0xbf, 0xbf, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x3c, 0xf6, 0x3f, 0xd4, 0xe4, 0x12, 0x00, 0x00, + // 1682 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x49, 0x73, 0x1b, 0xc5, + 0x17, 0xf7, 0x68, 0xb3, 0xf4, 0x24, 0x6b, 0x69, 0x3b, 0x89, 0xfe, 0x4a, 0x62, 0xf9, 0x3f, 0x2c, + 0x71, 0x62, 0x90, 0x83, 0x12, 0x0e, 0x29, 0x8a, 0x83, 0x65, 0x67, 0x51, 0x25, 0x24, 0xce, 0x38, + 0x70, 0xa0, 0x52, 0x4c, 0xb5, 0x34, 0x6d, 0x69, 0xb0, 0x34, 0x3d, 0x99, 0x69, 0x85, 0xe8, 0x0b, + 0x50, 0x70, 0x22, 0x17, 0x0e, 0x9c, 0x29, 0xbe, 0x01, 0x27, 0xae, 0x5c, 0xf8, 0x0c, 0x1c, 0xc2, + 0x0d, 0xee, 0xdc, 0xb8, 0x51, 0xbd, 0xcc, 0xa6, 0x05, 0x9b, 0x02, 0x6e, 0x9a, 0xf7, 0x7e, 0xef, + 0xf5, 0xaf, 0x5f, 0x2f, 0xef, 0xd7, 0x82, 0x8a, 0xed, 0xf8, 0x2e, 0xe9, 0x33, 0xea, 0xb5, 0x5c, + 0x8f, 0x32, 0x8a, 0x0a, 0xa1, 0xa1, 0x01, 0x03, 0x3a, 0xa0, 0xd2, 0xdc, 0x00, 0x87, 0x5a, 0x44, + 0xfd, 0xae, 0xb8, 0xd4, 0x76, 0x18, 0xf1, 0xac, 0x9e, 0x32, 0x6c, 0x0e, 0x28, 0x1d, 0x8c, 0xc8, + 0xae, 0xf8, 0xea, 0x4d, 0x8e, 0x77, 0xad, 0x89, 0x87, 0x99, 0x4d, 0x1d, 0xe5, 0x6f, 0xce, 0xfa, + 0x99, 0x3d, 0x26, 0x3e, 0xc3, 0x63, 0x57, 0x02, 0xf4, 0x13, 0xd8, 0x7c, 0x60, 0xfb, 0xac, 0xeb, + 0x79, 0xc4, 0xc5, 0x1e, 0xee, 0x8d, 0xc8, 0x11, 0x19, 0x8c, 0x89, 0xc3, 0x7c, 0x83, 0x3c, 0x9b, + 0x10, 0x9f, 0xa1, 0x0d, 0xc8, 0x8e, 0xec, 0xb1, 0xcd, 0xea, 0xda, 0x96, 0xb6, 0x9d, 0x35, 0xe4, + 0x07, 0xba, 0x01, 0xe7, 0x47, 0xd8, 0x67, 0xa6, 0x4f, 0x88, 0x63, 0xfa, 0x32, 0xc4, 0x74, 0x31, + 0x1b, 0xd6, 0x53, 0x5b, 0xda, 0x76, 0xc9, 0x58, 0xe7, 0xde, 0x23, 0x42, 0x1c, 0x95, 0xee, 0x10, + 0xb3, 0xa1, 0xfe, 0xab, 0x06, 0x68, 0x7e, 0x24, 0x84, 0x20, 0x23, 0x22, 0x35, 0x11, 0x29, 0x7e, + 0xa3, 0x5b, 0x50, 0x0e, 0xb2, 0x5a, 0x84, 0x61, 0x7b, 0x24, 0xf2, 0x16, 0xdb, 0xa8, 0x15, 0x95, + 0xe0, 0x50, 0xfe, 0x32, 0xd6, 0x14, 0xf2, 0x40, 0x00, 0x51, 0x13, 0x8a, 0x23, 0xea, 0x33, 0xd3, + 0xb5, 0x49, 0x9f, 0xf8, 0xf5, 0xb4, 0xa0, 0x0d, 0xdc, 0x74, 0x28, 0x2c, 0xa8, 0x05, 0x82, 0x9d, + 0xc9, 0x89, 0xd8, 0x9e, 0x89, 0x19, 0x23, 0x63, 0x97, 0xd5, 0x33, 0x5b, 0xda, 0x76, 0xda, 0xa8, + 0x71, 0x97, 0x21, 0x3c, 0x7b, 0xd2, 0x81, 0xae, 0xc3, 0x46, 0x12, 0x6a, 0xf6, 0xe9, 0xc4, 0x61, + 0xf5, 0xac, 0x08, 0x40, 0x5e, 0x1c, 0xbc, 0xcf, 0x3d, 0xfa, 0x53, 0x68, 0x2e, 0xad, 0xaa, 0xef, + 0x52, 0xc7, 0x27, 0xe8, 0x16, 0xe4, 0x15, 0x6d, 0xbf, 0xae, 0x6d, 0xa5, 0xb7, 0x8b, 0xed, 0xcb, + 0xad, 0x68, 0x47, 0xcc, 0x47, 0x1a, 0x21, 0x5c, 0xbf, 0x06, 0x48, 0x0c, 0xf3, 0x90, 0x5a, 0x24, + 0x4a, 0xb8, 0x01, 0x59, 0x49, 0x4b, 0x13, 0xb4, 0xe4, 0x87, 0xbe, 0x0e, 0xb5, 0x38, 0x56, 0x2c, + 0xa9, 0x7e, 0x1e, 0x36, 0xee, 0x12, 0xd6, 0x99, 0xf4, 0x4f, 0x08, 0xe3, 0x3c, 0x03, 0xfb, 0xef, + 0x1a, 0x9c, 0x9b, 0x71, 0xa8, 0xe4, 0x7b, 0xb0, 0xda, 0x13, 0xd6, 0x80, 0xec, 0x95, 0x18, 0xd9, + 0x85, 0x21, 0x2d, 0x69, 0x32, 0x82, 0xb8, 0xc6, 0xd7, 0x1a, 0xe4, 0xa4, 0x0d, 0xed, 0x40, 0x41, + 0x5a, 0x4d, 0xdb, 0x92, 0xab, 0xde, 0x29, 0xff, 0xf4, 0xaa, 0xb9, 0xf2, 0xf3, 0xab, 0x66, 0x8e, + 0x13, 0xed, 0x1e, 0x18, 0x79, 0x09, 0xe8, 0x5a, 0x68, 0x17, 0xd6, 0x3c, 0x3a, 0x61, 0xb6, 0x33, + 0x30, 0xf9, 0x49, 0xf0, 0xeb, 0x29, 0x41, 0x00, 0x5a, 0xe2, 0x5c, 0x70, 0xb8, 0x51, 0x52, 0x00, + 0x31, 0x49, 0xf4, 0x36, 0x94, 0xfa, 0xb8, 0x3f, 0x24, 0x96, 0xc2, 0xa7, 0xe7, 0xf0, 0x45, 0xe9, + 0x17, 0x70, 0x5e, 0xa1, 0x70, 0x02, 0x61, 0x85, 0xee, 0x01, 0x8a, 0x1b, 0xa3, 0x12, 0x33, 0xca, + 0xf0, 0x28, 0x28, 0xb1, 0xf8, 0x40, 0x97, 0x20, 0x6d, 0x5b, 0x92, 0x56, 0xa9, 0x03, 0xb1, 0x39, + 0x70, 0xb3, 0xde, 0x86, 0x6a, 0x98, 0x29, 0x38, 0x52, 0x9b, 0x90, 0x5a, 0x3a, 0xf1, 0x94, 0x6d, + 0xe9, 0x1f, 0xc6, 0x28, 0x85, 0x83, 0x9f, 0x12, 0x84, 0xb6, 0x20, 0xbb, 0xac, 0x3e, 0xd2, 0xa1, + 0xb7, 0x00, 0xa2, 0x75, 0x8a, 0xf0, 0xda, 0x32, 0xfc, 0x7d, 0xa8, 0x1c, 0xaa, 0xaa, 0x9e, 0x91, + 0x39, 0xaa, 0xc3, 0x2a, 0xb6, 0x2c, 0x8f, 0xf8, 0xbe, 0x38, 0xaf, 0x05, 0x23, 0xf8, 0xd4, 0x75, + 0xa8, 0x46, 0xc9, 0xd4, 0x94, 0xca, 0x90, 0xa2, 0x27, 0x22, 0x5b, 0xde, 0x48, 0xd1, 0x13, 0xfd, + 0x7d, 0xa8, 0x3d, 0xa0, 0xf4, 0x64, 0xe2, 0xc6, 0x87, 0x2c, 0x87, 0x43, 0x16, 0x4e, 0x19, 0xe2, + 0x29, 0xa0, 0x78, 0x78, 0x58, 0xb7, 0x0c, 0x9f, 0x8e, 0xc8, 0x90, 0x9c, 0xa6, 0xb0, 0xa3, 0x37, + 0x21, 0x33, 0x26, 0x0c, 0x87, 0xf7, 0x4b, 0xe8, 0xff, 0x80, 0x30, 0x6c, 0x61, 0x86, 0x0d, 0xe1, + 0xd7, 0x3f, 0x81, 0x8a, 0x98, 0xa8, 0x73, 0x4c, 0xcf, 0x5a, 0x8d, 0x9d, 0x24, 0xd5, 0x62, 0xbb, + 0x16, 0x65, 0xdf, 0x93, 0x8e, 0x88, 0xfd, 0x8f, 0x1a, 0x54, 0xa3, 0x01, 0x14, 0x79, 0x1d, 0x32, + 0x6c, 0xea, 0x4a, 0xf2, 0xe5, 0x76, 0x39, 0x0a, 0x7f, 0x32, 0x75, 0x89, 0x21, 0x7c, 0xa8, 0x05, + 0x79, 0xea, 0x12, 0x0f, 0x33, 0xea, 0xcd, 0x4f, 0xe2, 0x91, 0xf2, 0x18, 0x21, 0x86, 0xe3, 0xfb, + 0xd8, 0xc5, 0x7d, 0x9b, 0x4d, 0xc5, 0xe5, 0x98, 0xc0, 0xef, 0x2b, 0x8f, 0x11, 0x62, 0xf8, 0x2c, + 0x9e, 0x13, 0xcf, 0xb7, 0xa9, 0x23, 0xae, 0xc8, 0xc4, 0x2c, 0x3e, 0x92, 0x0e, 0x23, 0x40, 0xe8, + 0x63, 0xa8, 0xdc, 0xb1, 0x1d, 0xeb, 0x21, 0xc1, 0xde, 0x59, 0xab, 0xf4, 0x3a, 0x64, 0x7d, 0x86, + 0x3d, 0x26, 0x3b, 0xc7, 0x1c, 0x44, 0x3a, 0xa3, 0x36, 0x94, 0x96, 0x67, 0x4f, 0x7c, 0xe8, 0x37, + 0xa1, 0x1a, 0x0d, 0xa7, 0x6a, 0x76, 0xfa, 0x41, 0x40, 0x50, 0x3d, 0x98, 0x8c, 0xdd, 0xc4, 0x9d, + 0xf8, 0x2e, 0xd4, 0x62, 0xb6, 0xd9, 0x54, 0x4b, 0xcf, 0x48, 0x19, 0x4a, 0x47, 0x0c, 0x47, 0x17, + 0xc7, 0x1f, 0x1a, 0xac, 0x73, 0xc3, 0xd1, 0x64, 0x3c, 0xc6, 0xde, 0x34, 0xcc, 0x74, 0x19, 0x60, + 0xe2, 0x13, 0xcb, 0xf4, 0x5d, 0xdc, 0x27, 0xea, 0xfe, 0x28, 0x70, 0xcb, 0x11, 0x37, 0xa0, 0x2b, + 0x50, 0xc1, 0xcf, 0xb1, 0x3d, 0xe2, 0x17, 0xbe, 0xc2, 0xa4, 0x04, 0xa6, 0x1c, 0x9a, 0x25, 0xf0, + 0xff, 0x50, 0x12, 0x79, 0x6c, 0x67, 0x20, 0xf6, 0x95, 0xac, 0x46, 0x91, 0xdb, 0xba, 0xd2, 0xc4, + 0xfb, 0x9f, 0x80, 0x10, 0x89, 0x90, 0x6d, 0x4d, 0x8c, 0x7e, 0x5b, 0x02, 0xde, 0x80, 0xb2, 0x00, + 0xf4, 0xb0, 0x63, 0x7d, 0x66, 0x5b, 0x6c, 0xa8, 0x3a, 0xd9, 0x1a, 0xb7, 0x76, 0x02, 0x23, 0xda, + 0x85, 0xf5, 0x88, 0x53, 0x84, 0xcd, 0xc9, 0xae, 0x17, 0xba, 0xc2, 0x00, 0x51, 0x56, 0xec, 0x0f, + 0x7b, 0x14, 0x7b, 0x56, 0x50, 0x8f, 0x97, 0x19, 0xa8, 0xc5, 0x8c, 0xaa, 0x1a, 0x57, 0x60, 0x95, + 0x97, 0x6f, 0xf9, 0xf5, 0x9f, 0xe3, 0xee, 0xae, 0x85, 0xae, 0x42, 0x55, 0x00, 0xfb, 0xd4, 0x71, + 0x48, 0x9f, 0x0b, 0x1b, 0x5f, 0x15, 0xa6, 0xc2, 0xed, 0xfb, 0x91, 0x19, 0xed, 0x40, 0xad, 0x47, + 0x29, 0xf3, 0x99, 0x87, 0x5d, 0x33, 0x38, 0x76, 0x69, 0x71, 0x43, 0x54, 0x43, 0x87, 0x3a, 0x75, + 0x3c, 0xaf, 0xd0, 0x0e, 0x0e, 0x1e, 0x85, 0xd8, 0x8c, 0xc0, 0x56, 0x02, 0x7b, 0x0c, 0x4a, 0x5e, + 0xcc, 0x40, 0xb3, 0x12, 0x1a, 0xd8, 0x03, 0xe8, 0x0e, 0xd4, 0xac, 0x60, 0xae, 0x21, 0x36, 0x27, + 0x29, 0x84, 0x8e, 0x00, 0x7c, 0x53, 0x6c, 0x7b, 0xe6, 0xd7, 0x57, 0xc5, 0xa1, 0xda, 0x8c, 0x35, + 0xd4, 0x05, 0x1b, 0xc8, 0x90, 0x60, 0xf4, 0x0e, 0xe4, 0x26, 0x2e, 0x17, 0x71, 0xf5, 0xbc, 0x08, + 0xfb, 0x5f, 0x4b, 0x2a, 0xbc, 0x56, 0xa0, 0xf0, 0x5a, 0x07, 0x4a, 0x01, 0x1a, 0x0a, 0x88, 0x6e, + 0x43, 0x51, 0xc8, 0x1d, 0xd7, 0x76, 0x06, 0xc4, 0xaa, 0x17, 0x44, 0x5c, 0x63, 0x2e, 0xee, 0x49, + 0xa0, 0x0c, 0x3b, 0x79, 0xbe, 0x18, 0x2f, 0x7f, 0x69, 0x6a, 0x06, 0xf0, 0xc0, 0x43, 0x11, 0x87, + 0xee, 0x42, 0x49, 0xa4, 0x79, 0x36, 0x21, 0x9e, 0x4d, 0xac, 0x3a, 0xfc, 0x8d, 0x3c, 0x82, 0xc0, + 0x63, 0x19, 0xa8, 0x7f, 0xa3, 0xc1, 0x86, 0x12, 0x35, 0xf7, 0x08, 0x1e, 0xb1, 0x61, 0x70, 0x51, + 0x9c, 0x87, 0x9c, 0xec, 0xfa, 0x4a, 0x09, 0xaa, 0x2f, 0xbe, 0x5f, 0x89, 0xd3, 0xf7, 0xa6, 0x2e, + 0x23, 0x56, 0x5c, 0x63, 0xae, 0x85, 0x56, 0xae, 0x2e, 0xd1, 0x6b, 0x10, 0x08, 0x41, 0xd3, 0x76, + 0x2c, 0xf2, 0x42, 0x9d, 0x8d, 0x92, 0x32, 0x76, 0xb9, 0x8d, 0x9f, 0x43, 0xd7, 0xa3, 0x9f, 0x92, + 0xbe, 0xd0, 0x1e, 0x19, 0x91, 0xa7, 0xa0, 0x2c, 0x5d, 0x4b, 0xff, 0x5e, 0x83, 0xb5, 0x04, 0x37, + 0xb4, 0x03, 0xc5, 0xa1, 0xf8, 0x35, 0x35, 0x79, 0x97, 0xd7, 0xe6, 0xba, 0x3c, 0x28, 0x77, 0xd7, + 0xf2, 0xb9, 0x56, 0x99, 0x38, 0x71, 0xf8, 0xbc, 0x28, 0x28, 0x85, 0x00, 0x1e, 0xb0, 0x03, 0x45, + 0x7a, 0x7c, 0x3c, 0xb2, 0x1d, 0x22, 0xe0, 0xe9, 0xf9, 0xec, 0xca, 0xcd, 0xc1, 0x75, 0x58, 0x55, + 0x73, 0x51, 0xc4, 0x83, 0x4f, 0xfd, 0x73, 0x0d, 0xce, 0xcd, 0x94, 0x54, 0x9d, 0xb4, 0xeb, 0x90, + 0x93, 0xc3, 0xa9, 0xfe, 0x57, 0x8f, 0x6f, 0xb3, 0x44, 0x84, 0xc2, 0xa1, 0xf7, 0x00, 0x3c, 0x62, + 0x4d, 0x1c, 0x0b, 0x3b, 0xfd, 0xa9, 0x6a, 0x28, 0x17, 0x63, 0xaa, 0xdb, 0x08, 0x9d, 0x47, 0xfd, + 0x21, 0x19, 0x13, 0x23, 0x06, 0xd7, 0x7f, 0xd3, 0x60, 0xfd, 0x51, 0x8f, 0x17, 0x33, 0xb9, 0xb4, + 0xf3, 0x4b, 0xa8, 0x2d, 0x5a, 0xc2, 0x68, 0x07, 0xa4, 0x12, 0x3b, 0x20, 0xb9, 0x6a, 0xe9, 0x99, + 0x55, 0xe3, 0x82, 0x5e, 0x34, 0x09, 0x13, 0x1f, 0x33, 0xe2, 0x99, 0xf1, 0x22, 0xa5, 0x8d, 0x9a, + 0x70, 0xed, 0x71, 0x4f, 0xf0, 0xe0, 0x78, 0x0b, 0x10, 0x71, 0x2c, 0xb3, 0x47, 0x8e, 0xa9, 0x47, + 0x42, 0xb8, 0xbc, 0x04, 0xab, 0xc4, 0xb1, 0x3a, 0xc2, 0x11, 0xa0, 0xc3, 0xce, 0x93, 0x8b, 0x3d, + 0x80, 0xf4, 0x2f, 0x35, 0xd8, 0x48, 0xce, 0x54, 0x55, 0xfc, 0xe6, 0x9c, 0xb0, 0x5f, 0x5e, 0xf3, + 0x10, 0xf9, 0x8f, 0xaa, 0xde, 0xfe, 0x2a, 0x03, 0xa5, 0xfb, 0xd8, 0xea, 0x06, 0xa3, 0xa0, 0x2e, + 0x40, 0xa4, 0xfa, 0xd1, 0xa5, 0xd8, 0xf8, 0x73, 0x8f, 0x81, 0xc6, 0xe5, 0x25, 0x5e, 0x35, 0x9d, + 0x7d, 0xc8, 0x07, 0xba, 0x0d, 0x35, 0x62, 0xd0, 0x19, 0x65, 0xd8, 0xb8, 0xb8, 0xd0, 0xa7, 0x92, + 0x74, 0x01, 0x22, 0x65, 0x96, 0xe0, 0x33, 0xa7, 0xf7, 0x12, 0x7c, 0x16, 0xc8, 0xb9, 0x7d, 0xc8, + 0x07, 0x2a, 0x29, 0xc1, 0x67, 0x46, 0x9b, 0x25, 0xf8, 0xcc, 0xc9, 0xaa, 0x7d, 0xc8, 0x07, 0xb2, + 0x21, 0x91, 0x64, 0x46, 0xba, 0x24, 0x92, 0xcc, 0xe9, 0x8c, 0x3b, 0x50, 0x08, 0x15, 0x03, 0x8a, + 0x23, 0x67, 0xb5, 0x45, 0xe3, 0xd2, 0x62, 0xa7, 0xca, 0x63, 0xc0, 0x5a, 0xe2, 0x05, 0x85, 0x9a, + 0xcb, 0xdf, 0x56, 0x32, 0xdf, 0xd6, 0x69, 0x8f, 0xaf, 0xf6, 0x77, 0x1a, 0x54, 0x1f, 0x3d, 0x27, + 0xde, 0x08, 0x4f, 0xff, 0x93, 0x5d, 0xf1, 0x2f, 0xcd, 0xbd, 0xfd, 0xad, 0x06, 0xeb, 0xe2, 0x55, + 0x7e, 0xc4, 0xa8, 0x47, 0x22, 0xaa, 0x1d, 0xc8, 0x0a, 0x59, 0x85, 0x2e, 0xcc, 0xb4, 0xc5, 0x30, + 0xef, 0x29, 0xfd, 0x52, 0x5f, 0x41, 0xf7, 0xa0, 0x10, 0x2a, 0x8f, 0x24, 0xc7, 0x19, 0x91, 0x92, + 0xe4, 0x38, 0x2b, 0x56, 0xf4, 0x95, 0xf6, 0x17, 0x1a, 0x6c, 0xc4, 0x5e, 0xe4, 0x11, 0x4d, 0x17, + 0x2e, 0x2c, 0x79, 0xe7, 0xa3, 0xab, 0xf1, 0x6d, 0xfc, 0x97, 0xff, 0xb0, 0x34, 0xae, 0x9d, 0x05, + 0xaa, 0x0a, 0xf6, 0x83, 0x06, 0x15, 0x79, 0x79, 0x44, 0x2c, 0x1e, 0x43, 0x29, 0x7e, 0x13, 0xa1, + 0x78, 0x69, 0x16, 0x5c, 0xc6, 0x8d, 0xe6, 0x52, 0x7f, 0x58, 0xbb, 0x27, 0xb3, 0x6d, 0xb0, 0xb9, + 0xf4, 0x0e, 0x5b, 0xb0, 0x27, 0x17, 0xb6, 0x22, 0x7d, 0xa5, 0x93, 0xf9, 0x38, 0xe5, 0xf6, 0x7a, + 0x39, 0x21, 0x15, 0x6e, 0xfc, 0x19, 0x00, 0x00, 0xff, 0xff, 0xcf, 0xfc, 0x21, 0xfe, 0x01, 0x13, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/pkg/pb/inspector.proto b/pkg/pb/inspector.proto index 9f22a7863..5cb6ef1a4 100644 --- a/pkg/pb/inspector.proto +++ b/pkg/pb/inspector.proto @@ -59,7 +59,7 @@ service HealthInspector { // ListSegments message ListIrreparableSegmentsRequest { int32 limit = 1; - int32 offset = 2; + bytes last_seen_segment_path = 2; } message IrreparableSegment { diff --git a/pkg/transport/insecure.go b/pkg/transport/insecure.go index c63ef3cc8..52df43cd0 100644 --- a/pkg/transport/insecure.go +++ b/pkg/transport/insecure.go @@ -15,7 +15,6 @@ import ( // Otherwise in most cases DialNode should be used for communicating with nodes since it is secure. func DialAddressInsecure(ctx context.Context, address string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) { defer mon.Task()(&ctx)(&err) - options := append([]grpc.DialOption{ grpc.WithInsecure(), grpc.WithBlock(), diff --git a/proto.lock b/proto.lock index f24198a61..78dff31c7 100644 --- a/proto.lock +++ b/proto.lock @@ -772,8 +772,8 @@ }, { "id": 2, - "name": "offset", - "type": "int32" + "name": "last_seen_segment_path", + "type": "bytes" } ] }, diff --git a/satellite/satellitedb/dbx/satellitedb.dbx b/satellite/satellitedb/dbx/satellitedb.dbx index 7264162a8..8b29d911f 100644 --- a/satellite/satellitedb/dbx/satellitedb.dbx +++ b/satellite/satellitedb/dbx/satellitedb.dbx @@ -65,6 +65,7 @@ read one ( read limitoffset ( select irreparabledb + where irreparabledb.segmentpath > ? orderby asc irreparabledb.segmentpath ) diff --git a/satellite/satellitedb/dbx/satellitedb.dbx.go b/satellite/satellitedb/dbx/satellitedb.dbx.go index e1a6a7b43..308af874c 100644 --- a/satellite/satellitedb/dbx/satellitedb.dbx.go +++ b/satellite/satellitedb/dbx/satellitedb.dbx.go @@ -6248,14 +6248,15 @@ func (obj *postgresImpl) Get_Irreparabledb_By_Segmentpath(ctx context.Context, } -func (obj *postgresImpl) Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx context.Context, +func (obj *postgresImpl) Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx context.Context, + irreparabledb_segmentpath_greater Irreparabledb_Segmentpath_Field, limit int, offset int64) ( rows []*Irreparabledb, err error) { - var __embed_stmt = __sqlbundle_Literal("SELECT irreparabledbs.segmentpath, irreparabledbs.segmentdetail, irreparabledbs.pieces_lost_count, irreparabledbs.seg_damaged_unix_sec, irreparabledbs.repair_attempt_count FROM irreparabledbs ORDER BY irreparabledbs.segmentpath LIMIT ? OFFSET ?") + var __embed_stmt = __sqlbundle_Literal("SELECT irreparabledbs.segmentpath, irreparabledbs.segmentdetail, irreparabledbs.pieces_lost_count, irreparabledbs.seg_damaged_unix_sec, irreparabledbs.repair_attempt_count FROM irreparabledbs WHERE irreparabledbs.segmentpath > ? ORDER BY irreparabledbs.segmentpath LIMIT ? OFFSET ?") var __values []interface{} - __values = append(__values) + __values = append(__values, irreparabledb_segmentpath_greater.value()) __values = append(__values, limit, offset) @@ -7716,7 +7717,7 @@ func (obj *postgresImpl) Limited_BucketMetainfo_By_ProjectId_And_Name_Greater_Or limit int, offset int64) ( rows []*BucketMetainfo, err error) { - var __embed_stmt = __sqlbundle_Literal("SELECT bucket_metainfos.id, bucket_metainfos.project_id, bucket_metainfos.name, bucket_metainfos.path_cipher, bucket_metainfos.created_at, bucket_metainfos.default_segment_size, bucket_metainfos.default_encryption_cipher_suite, bucket_metainfos.default_encryption_block_size, bucket_metainfos.default_redundancy_algorithm, bucket_metainfos.default_redundancy_share_size, bucket_metainfos.default_redundancy_required_shares, bucket_metainfos.default_redundancy_repair_shares, bucket_metainfos.default_redundancy_optimal_shares, bucket_metainfos.default_redundancy_total_shares FROM bucket_metainfos WHERE bucket_metainfos.project_id = ? AND bucket_metainfos.name > ? ORDER BY bucket_metainfos.name LIMIT ? OFFSET ?") + var __embed_stmt = __sqlbundle_Literal("SELECT bucket_metainfos.id, bucket_metainfos.project_id, bucket_metainfos.name, bucket_metainfos.partner_id, bucket_metainfos.path_cipher, bucket_metainfos.created_at, bucket_metainfos.default_segment_size, bucket_metainfos.default_encryption_cipher_suite, bucket_metainfos.default_encryption_block_size, bucket_metainfos.default_redundancy_algorithm, bucket_metainfos.default_redundancy_share_size, bucket_metainfos.default_redundancy_required_shares, bucket_metainfos.default_redundancy_repair_shares, bucket_metainfos.default_redundancy_optimal_shares, bucket_metainfos.default_redundancy_total_shares FROM bucket_metainfos WHERE bucket_metainfos.project_id = ? AND bucket_metainfos.name > ? ORDER BY bucket_metainfos.name LIMIT ? OFFSET ?") var __values []interface{} __values = append(__values, bucket_metainfo_project_id.value(), bucket_metainfo_name_greater.value()) @@ -7734,7 +7735,7 @@ func (obj *postgresImpl) Limited_BucketMetainfo_By_ProjectId_And_Name_Greater_Or for __rows.Next() { bucket_metainfo := &BucketMetainfo{} - err = __rows.Scan(&bucket_metainfo.Id, &bucket_metainfo.ProjectId, &bucket_metainfo.Name, &bucket_metainfo.PathCipher, &bucket_metainfo.CreatedAt, &bucket_metainfo.DefaultSegmentSize, &bucket_metainfo.DefaultEncryptionCipherSuite, &bucket_metainfo.DefaultEncryptionBlockSize, &bucket_metainfo.DefaultRedundancyAlgorithm, &bucket_metainfo.DefaultRedundancyShareSize, &bucket_metainfo.DefaultRedundancyRequiredShares, &bucket_metainfo.DefaultRedundancyRepairShares, &bucket_metainfo.DefaultRedundancyOptimalShares, &bucket_metainfo.DefaultRedundancyTotalShares) + err = __rows.Scan(&bucket_metainfo.Id, &bucket_metainfo.ProjectId, &bucket_metainfo.Name, &bucket_metainfo.PartnerId, &bucket_metainfo.PathCipher, &bucket_metainfo.CreatedAt, &bucket_metainfo.DefaultSegmentSize, &bucket_metainfo.DefaultEncryptionCipherSuite, &bucket_metainfo.DefaultEncryptionBlockSize, &bucket_metainfo.DefaultRedundancyAlgorithm, &bucket_metainfo.DefaultRedundancyShareSize, &bucket_metainfo.DefaultRedundancyRequiredShares, &bucket_metainfo.DefaultRedundancyRepairShares, &bucket_metainfo.DefaultRedundancyOptimalShares, &bucket_metainfo.DefaultRedundancyTotalShares) if err != nil { return nil, obj.makeErr(err) } @@ -9988,14 +9989,15 @@ func (obj *sqlite3Impl) Get_Irreparabledb_By_Segmentpath(ctx context.Context, } -func (obj *sqlite3Impl) Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx context.Context, +func (obj *sqlite3Impl) Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx context.Context, + irreparabledb_segmentpath_greater Irreparabledb_Segmentpath_Field, limit int, offset int64) ( rows []*Irreparabledb, err error) { - var __embed_stmt = __sqlbundle_Literal("SELECT irreparabledbs.segmentpath, irreparabledbs.segmentdetail, irreparabledbs.pieces_lost_count, irreparabledbs.seg_damaged_unix_sec, irreparabledbs.repair_attempt_count FROM irreparabledbs ORDER BY irreparabledbs.segmentpath LIMIT ? OFFSET ?") + var __embed_stmt = __sqlbundle_Literal("SELECT irreparabledbs.segmentpath, irreparabledbs.segmentdetail, irreparabledbs.pieces_lost_count, irreparabledbs.seg_damaged_unix_sec, irreparabledbs.repair_attempt_count FROM irreparabledbs WHERE irreparabledbs.segmentpath > ? ORDER BY irreparabledbs.segmentpath LIMIT ? OFFSET ?") var __values []interface{} - __values = append(__values) + __values = append(__values, irreparabledb_segmentpath_greater.value()) __values = append(__values, limit, offset) @@ -11456,7 +11458,7 @@ func (obj *sqlite3Impl) Limited_BucketMetainfo_By_ProjectId_And_Name_Greater_Ord limit int, offset int64) ( rows []*BucketMetainfo, err error) { - var __embed_stmt = __sqlbundle_Literal("SELECT bucket_metainfos.id, bucket_metainfos.project_id, bucket_metainfos.name, bucket_metainfos.path_cipher, bucket_metainfos.created_at, bucket_metainfos.default_segment_size, bucket_metainfos.default_encryption_cipher_suite, bucket_metainfos.default_encryption_block_size, bucket_metainfos.default_redundancy_algorithm, bucket_metainfos.default_redundancy_share_size, bucket_metainfos.default_redundancy_required_shares, bucket_metainfos.default_redundancy_repair_shares, bucket_metainfos.default_redundancy_optimal_shares, bucket_metainfos.default_redundancy_total_shares FROM bucket_metainfos WHERE bucket_metainfos.project_id = ? AND bucket_metainfos.name > ? ORDER BY bucket_metainfos.name LIMIT ? OFFSET ?") + var __embed_stmt = __sqlbundle_Literal("SELECT bucket_metainfos.id, bucket_metainfos.project_id, bucket_metainfos.name, bucket_metainfos.partner_id, bucket_metainfos.path_cipher, bucket_metainfos.created_at, bucket_metainfos.default_segment_size, bucket_metainfos.default_encryption_cipher_suite, bucket_metainfos.default_encryption_block_size, bucket_metainfos.default_redundancy_algorithm, bucket_metainfos.default_redundancy_share_size, bucket_metainfos.default_redundancy_required_shares, bucket_metainfos.default_redundancy_repair_shares, bucket_metainfos.default_redundancy_optimal_shares, bucket_metainfos.default_redundancy_total_shares FROM bucket_metainfos WHERE bucket_metainfos.project_id = ? AND bucket_metainfos.name > ? ORDER BY bucket_metainfos.name LIMIT ? OFFSET ?") var __values []interface{} __values = append(__values, bucket_metainfo_project_id.value(), bucket_metainfo_name_greater.value()) @@ -11474,7 +11476,7 @@ func (obj *sqlite3Impl) Limited_BucketMetainfo_By_ProjectId_And_Name_Greater_Ord for __rows.Next() { bucket_metainfo := &BucketMetainfo{} - err = __rows.Scan(&bucket_metainfo.Id, &bucket_metainfo.ProjectId, &bucket_metainfo.Name, &bucket_metainfo.PathCipher, &bucket_metainfo.CreatedAt, &bucket_metainfo.DefaultSegmentSize, &bucket_metainfo.DefaultEncryptionCipherSuite, &bucket_metainfo.DefaultEncryptionBlockSize, &bucket_metainfo.DefaultRedundancyAlgorithm, &bucket_metainfo.DefaultRedundancyShareSize, &bucket_metainfo.DefaultRedundancyRequiredShares, &bucket_metainfo.DefaultRedundancyRepairShares, &bucket_metainfo.DefaultRedundancyOptimalShares, &bucket_metainfo.DefaultRedundancyTotalShares) + err = __rows.Scan(&bucket_metainfo.Id, &bucket_metainfo.ProjectId, &bucket_metainfo.Name, &bucket_metainfo.PartnerId, &bucket_metainfo.PathCipher, &bucket_metainfo.CreatedAt, &bucket_metainfo.DefaultSegmentSize, &bucket_metainfo.DefaultEncryptionCipherSuite, &bucket_metainfo.DefaultEncryptionBlockSize, &bucket_metainfo.DefaultRedundancyAlgorithm, &bucket_metainfo.DefaultRedundancyShareSize, &bucket_metainfo.DefaultRedundancyRequiredShares, &bucket_metainfo.DefaultRedundancyRepairShares, &bucket_metainfo.DefaultRedundancyOptimalShares, &bucket_metainfo.DefaultRedundancyTotalShares) if err != nil { return nil, obj.makeErr(err) } @@ -14492,14 +14494,15 @@ func (rx *Rx) Limited_BucketUsage_By_BucketId_And_RollupEndTime_Greater_And_Roll return tx.Limited_BucketUsage_By_BucketId_And_RollupEndTime_Greater_And_RollupEndTime_LessOrEqual_OrderBy_Desc_RollupEndTime(ctx, bucket_usage_bucket_id, bucket_usage_rollup_end_time_greater, bucket_usage_rollup_end_time_less_or_equal, limit, offset) } -func (rx *Rx) Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx context.Context, +func (rx *Rx) Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx context.Context, + irreparabledb_segmentpath_greater Irreparabledb_Segmentpath_Field, limit int, offset int64) ( rows []*Irreparabledb, err error) { var tx *Tx if tx, err = rx.getTx(ctx); err != nil { return } - return tx.Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx, limit, offset) + return tx.Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx, irreparabledb_segmentpath_greater, limit, offset) } func (rx *Rx) Limited_Node_By_Id_GreaterOrEqual_OrderBy_Asc_Id(ctx context.Context, @@ -15155,7 +15158,8 @@ type Methods interface { limit int, offset int64) ( rows []*BucketUsage, err error) - Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx context.Context, + Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx context.Context, + irreparabledb_segmentpath_greater Irreparabledb_Segmentpath_Field, limit int, offset int64) ( rows []*Irreparabledb, err error) diff --git a/satellite/satellitedb/irreparabledb.go b/satellite/satellitedb/irreparabledb.go index 1277b0020..52786188c 100644 --- a/satellite/satellitedb/irreparabledb.go +++ b/satellite/satellitedb/irreparabledb.go @@ -87,10 +87,17 @@ func (db *irreparableDB) Get(ctx context.Context, segmentPath []byte) (resp *pb. }, nil } -// Getlimited number of irreparable segments by offset -func (db *irreparableDB) GetLimited(ctx context.Context, limit int, offset int64) (resp []*pb.IrreparableSegment, err error) { +// GetLimited returns a list of irreparable segment info starting after the last segment info we retrieved +func (db *irreparableDB) GetLimited(ctx context.Context, limit int, lastSeenSegmentPath []byte) (resp []*pb.IrreparableSegment, err error) { defer mon.Task()(&ctx)(&err) - rows, err := db.db.Limited_Irreparabledb_OrderBy_Asc_Segmentpath(ctx, limit, offset) + // the offset is hardcoded to 0 since we are using the lastSeenSegmentPath to + // indicate the item we last listed instead. In a perfect world this db query would + // not take an offset as an argument, but currently dbx only supports `limitoffset` + const offset = 0 + rows, err := db.db.Limited_Irreparabledb_By_Segmentpath_Greater_OrderBy_Asc_Segmentpath(ctx, + dbx.Irreparabledb_Segmentpath(lastSeenSegmentPath), + limit, offset, + ) if err != nil { return nil, err } diff --git a/satellite/satellitedb/locked.go b/satellite/satellitedb/locked.go index 70aa7d27b..ae291ab26 100644 --- a/satellite/satellitedb/locked.go +++ b/satellite/satellitedb/locked.go @@ -741,11 +741,11 @@ func (m *lockedIrreparable) Get(ctx context.Context, segmentPath []byte) (*pb.Ir return m.db.Get(ctx, segmentPath) } -// GetLimited number of segments from offset -func (m *lockedIrreparable) GetLimited(ctx context.Context, limit int, offset int64) ([]*pb.IrreparableSegment, error) { +// GetLimited returns a list of irreparable segment info starting after the last segment info we retrieved +func (m *lockedIrreparable) GetLimited(ctx context.Context, limit int, lastSeenSegmentPath []byte) ([]*pb.IrreparableSegment, error) { m.Lock() defer m.Unlock() - return m.db.GetLimited(ctx, limit, offset) + return m.db.GetLimited(ctx, limit, lastSeenSegmentPath) } // IncrementRepairAttempts increments the repair attempts.