satellite/overlay: remove Inspector

Currently overlay.Inspector had two rpc methods and both of them were
unimplemented.

Change-Id: I1a2ecc7b7113898fa234a1c1fe451c8cc9e2ee81
This commit is contained in:
Egon Elbre 2021-03-29 12:04:31 +03:00
parent 86e698f572
commit d57873fd45
8 changed files with 65 additions and 401 deletions

View File

@ -85,11 +85,10 @@ var (
// Inspector gives access to overlay. // Inspector gives access to overlay.
type Inspector struct { type Inspector struct {
conn *rpc.Conn conn *rpc.Conn
identity *identity.FullIdentity identity *identity.FullIdentity
overlayclient internalpb.DRPCOverlayInspectorClient irrdbclient internalpb.DRPCIrreparableInspectorClient
irrdbclient internalpb.DRPCIrreparableInspectorClient healthclient internalpb.DRPCHealthInspectorClient
healthclient internalpb.DRPCHealthInspectorClient
} }
// NewInspector creates a new inspector client for access to overlay. // NewInspector creates a new inspector client for access to overlay.
@ -108,11 +107,10 @@ func NewInspector(ctx context.Context, address, path string) (*Inspector, error)
} }
return &Inspector{ return &Inspector{
conn: conn, conn: conn,
identity: id, identity: id,
overlayclient: internalpb.NewDRPCOverlayInspectorClient(conn), irrdbclient: internalpb.NewDRPCIrreparableInspectorClient(conn),
irrdbclient: internalpb.NewDRPCIrreparableInspectorClient(conn), healthclient: internalpb.NewDRPCHealthInspectorClient(conn),
healthclient: internalpb.NewDRPCHealthInspectorClient(conn),
}, nil }, nil
} }

View File

@ -94,7 +94,6 @@ type Satellite struct {
Overlay struct { Overlay struct {
DB overlay.DB DB overlay.DB
Service *overlay.Service Service *overlay.Service
Inspector *overlay.Inspector
DQStrayNodes *straynodes.Chore DQStrayNodes *straynodes.Chore
} }
@ -707,7 +706,6 @@ func createNewSystem(name string, log *zap.Logger, config satellite.Config, peer
system.Overlay.DB = api.Overlay.DB system.Overlay.DB = api.Overlay.DB
system.Overlay.Service = api.Overlay.Service system.Overlay.Service = api.Overlay.Service
system.Overlay.Inspector = api.Overlay.Inspector
system.Overlay.DQStrayNodes = peer.Overlay.DQStrayNodes system.Overlay.DQStrayNodes = peer.Overlay.DQStrayNodes
system.Metainfo.Database = api.Metainfo.Database system.Metainfo.Database = api.Metainfo.Database

View File

@ -84,9 +84,8 @@ type API struct {
} }
Overlay struct { Overlay struct {
DB overlay.DB DB overlay.DB
Service *overlay.Service Service *overlay.Service
Inspector *overlay.Inspector
} }
Orders struct { Orders struct {
@ -262,11 +261,6 @@ func NewAPI(log *zap.Logger, full *identity.FullIdentity, db DB,
Name: "overlay", Name: "overlay",
Close: peer.Overlay.Service.Close, Close: peer.Overlay.Service.Close,
}) })
peer.Overlay.Inspector = overlay.NewInspector(peer.Overlay.Service)
if err := internalpb.DRPCRegisterOverlayInspector(peer.Server.PrivateDRPC(), peer.Overlay.Inspector); err != nil {
return nil, errs.Combine(err, peer.Close())
}
} }
{ // setup contact service { // setup contact service

View File

@ -23,142 +23,6 @@ var _ = math.Inf
// proto package needs to be updated. // proto package needs to be updated.
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
type CountNodesRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CountNodesRequest) Reset() { *m = CountNodesRequest{} }
func (m *CountNodesRequest) String() string { return proto.CompactTextString(m) }
func (*CountNodesRequest) ProtoMessage() {}
func (*CountNodesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{0}
}
func (m *CountNodesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CountNodesRequest.Unmarshal(m, b)
}
func (m *CountNodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CountNodesRequest.Marshal(b, m, deterministic)
}
func (m *CountNodesRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_CountNodesRequest.Merge(m, src)
}
func (m *CountNodesRequest) XXX_Size() int {
return xxx_messageInfo_CountNodesRequest.Size(m)
}
func (m *CountNodesRequest) XXX_DiscardUnknown() {
xxx_messageInfo_CountNodesRequest.DiscardUnknown(m)
}
var xxx_messageInfo_CountNodesRequest proto.InternalMessageInfo
type CountNodesResponse struct {
Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CountNodesResponse) Reset() { *m = CountNodesResponse{} }
func (m *CountNodesResponse) String() string { return proto.CompactTextString(m) }
func (*CountNodesResponse) ProtoMessage() {}
func (*CountNodesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{1}
}
func (m *CountNodesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CountNodesResponse.Unmarshal(m, b)
}
func (m *CountNodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CountNodesResponse.Marshal(b, m, deterministic)
}
func (m *CountNodesResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_CountNodesResponse.Merge(m, src)
}
func (m *CountNodesResponse) XXX_Size() int {
return xxx_messageInfo_CountNodesResponse.Size(m)
}
func (m *CountNodesResponse) XXX_DiscardUnknown() {
xxx_messageInfo_CountNodesResponse.DiscardUnknown(m)
}
var xxx_messageInfo_CountNodesResponse proto.InternalMessageInfo
func (m *CountNodesResponse) GetCount() int64 {
if m != nil {
return m.Count
}
return 0
}
type DumpNodesRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *DumpNodesRequest) Reset() { *m = DumpNodesRequest{} }
func (m *DumpNodesRequest) String() string { return proto.CompactTextString(m) }
func (*DumpNodesRequest) ProtoMessage() {}
func (*DumpNodesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{2}
}
func (m *DumpNodesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DumpNodesRequest.Unmarshal(m, b)
}
func (m *DumpNodesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DumpNodesRequest.Marshal(b, m, deterministic)
}
func (m *DumpNodesRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_DumpNodesRequest.Merge(m, src)
}
func (m *DumpNodesRequest) XXX_Size() int {
return xxx_messageInfo_DumpNodesRequest.Size(m)
}
func (m *DumpNodesRequest) XXX_DiscardUnknown() {
xxx_messageInfo_DumpNodesRequest.DiscardUnknown(m)
}
var xxx_messageInfo_DumpNodesRequest proto.InternalMessageInfo
type DumpNodesResponse struct {
Nodes []*pb.Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *DumpNodesResponse) Reset() { *m = DumpNodesResponse{} }
func (m *DumpNodesResponse) String() string { return proto.CompactTextString(m) }
func (*DumpNodesResponse) ProtoMessage() {}
func (*DumpNodesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{3}
}
func (m *DumpNodesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DumpNodesResponse.Unmarshal(m, b)
}
func (m *DumpNodesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DumpNodesResponse.Marshal(b, m, deterministic)
}
func (m *DumpNodesResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_DumpNodesResponse.Merge(m, src)
}
func (m *DumpNodesResponse) XXX_Size() int {
return xxx_messageInfo_DumpNodesResponse.Size(m)
}
func (m *DumpNodesResponse) XXX_DiscardUnknown() {
xxx_messageInfo_DumpNodesResponse.DiscardUnknown(m)
}
var xxx_messageInfo_DumpNodesResponse proto.InternalMessageInfo
func (m *DumpNodesResponse) GetNodes() []*pb.Node {
if m != nil {
return m.Nodes
}
return nil
}
type ListIrreparableSegmentsRequest struct { type ListIrreparableSegmentsRequest struct {
Limit int32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` Limit int32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"`
LastSeenSegmentPath []byte `protobuf:"bytes,2,opt,name=last_seen_segment_path,json=lastSeenSegmentPath,proto3" json:"last_seen_segment_path,omitempty"` LastSeenSegmentPath []byte `protobuf:"bytes,2,opt,name=last_seen_segment_path,json=lastSeenSegmentPath,proto3" json:"last_seen_segment_path,omitempty"`
@ -171,7 +35,7 @@ func (m *ListIrreparableSegmentsRequest) Reset() { *m = ListIrreparableS
func (m *ListIrreparableSegmentsRequest) String() string { return proto.CompactTextString(m) } func (m *ListIrreparableSegmentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListIrreparableSegmentsRequest) ProtoMessage() {} func (*ListIrreparableSegmentsRequest) ProtoMessage() {}
func (*ListIrreparableSegmentsRequest) Descriptor() ([]byte, []int) { func (*ListIrreparableSegmentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{4} return fileDescriptor_a07d9034b2dd9d26, []int{0}
} }
func (m *ListIrreparableSegmentsRequest) XXX_Unmarshal(b []byte) error { func (m *ListIrreparableSegmentsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListIrreparableSegmentsRequest.Unmarshal(m, b) return xxx_messageInfo_ListIrreparableSegmentsRequest.Unmarshal(m, b)
@ -216,7 +80,7 @@ func (m *ListIrreparableSegmentsResponse) Reset() { *m = ListIrreparable
func (m *ListIrreparableSegmentsResponse) String() string { return proto.CompactTextString(m) } func (m *ListIrreparableSegmentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListIrreparableSegmentsResponse) ProtoMessage() {} func (*ListIrreparableSegmentsResponse) ProtoMessage() {}
func (*ListIrreparableSegmentsResponse) Descriptor() ([]byte, []int) { func (*ListIrreparableSegmentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{5} return fileDescriptor_a07d9034b2dd9d26, []int{1}
} }
func (m *ListIrreparableSegmentsResponse) XXX_Unmarshal(b []byte) error { func (m *ListIrreparableSegmentsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListIrreparableSegmentsResponse.Unmarshal(m, b) return xxx_messageInfo_ListIrreparableSegmentsResponse.Unmarshal(m, b)
@ -258,7 +122,7 @@ func (m *IrreparableSegment) Reset() { *m = IrreparableSegment{} }
func (m *IrreparableSegment) String() string { return proto.CompactTextString(m) } func (m *IrreparableSegment) String() string { return proto.CompactTextString(m) }
func (*IrreparableSegment) ProtoMessage() {} func (*IrreparableSegment) ProtoMessage() {}
func (*IrreparableSegment) Descriptor() ([]byte, []int) { func (*IrreparableSegment) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{6} return fileDescriptor_a07d9034b2dd9d26, []int{2}
} }
func (m *IrreparableSegment) XXX_Unmarshal(b []byte) error { func (m *IrreparableSegment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_IrreparableSegment.Unmarshal(m, b) return xxx_messageInfo_IrreparableSegment.Unmarshal(m, b)
@ -329,7 +193,7 @@ func (m *ObjectHealthRequest) Reset() { *m = ObjectHealthRequest{} }
func (m *ObjectHealthRequest) String() string { return proto.CompactTextString(m) } func (m *ObjectHealthRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthRequest) ProtoMessage() {} func (*ObjectHealthRequest) ProtoMessage() {}
func (*ObjectHealthRequest) Descriptor() ([]byte, []int) { func (*ObjectHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{7} return fileDescriptor_a07d9034b2dd9d26, []int{3}
} }
func (m *ObjectHealthRequest) XXX_Unmarshal(b []byte) error { func (m *ObjectHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthRequest.Unmarshal(m, b) return xxx_messageInfo_ObjectHealthRequest.Unmarshal(m, b)
@ -403,7 +267,7 @@ func (m *ObjectHealthResponse) Reset() { *m = ObjectHealthResponse{} }
func (m *ObjectHealthResponse) String() string { return proto.CompactTextString(m) } func (m *ObjectHealthResponse) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthResponse) ProtoMessage() {} func (*ObjectHealthResponse) ProtoMessage() {}
func (*ObjectHealthResponse) Descriptor() ([]byte, []int) { func (*ObjectHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{8} return fileDescriptor_a07d9034b2dd9d26, []int{4}
} }
func (m *ObjectHealthResponse) XXX_Unmarshal(b []byte) error { func (m *ObjectHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthResponse.Unmarshal(m, b) return xxx_messageInfo_ObjectHealthResponse.Unmarshal(m, b)
@ -451,7 +315,7 @@ func (m *SegmentHealthRequest) Reset() { *m = SegmentHealthRequest{} }
func (m *SegmentHealthRequest) String() string { return proto.CompactTextString(m) } func (m *SegmentHealthRequest) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthRequest) ProtoMessage() {} func (*SegmentHealthRequest) ProtoMessage() {}
func (*SegmentHealthRequest) Descriptor() ([]byte, []int) { func (*SegmentHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{9} return fileDescriptor_a07d9034b2dd9d26, []int{5}
} }
func (m *SegmentHealthRequest) XXX_Unmarshal(b []byte) error { func (m *SegmentHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthRequest.Unmarshal(m, b) return xxx_messageInfo_SegmentHealthRequest.Unmarshal(m, b)
@ -511,7 +375,7 @@ func (m *SegmentHealthResponse) Reset() { *m = SegmentHealthResponse{} }
func (m *SegmentHealthResponse) String() string { return proto.CompactTextString(m) } func (m *SegmentHealthResponse) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthResponse) ProtoMessage() {} func (*SegmentHealthResponse) ProtoMessage() {}
func (*SegmentHealthResponse) Descriptor() ([]byte, []int) { func (*SegmentHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{10} return fileDescriptor_a07d9034b2dd9d26, []int{6}
} }
func (m *SegmentHealthResponse) XXX_Unmarshal(b []byte) error { func (m *SegmentHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthResponse.Unmarshal(m, b) return xxx_messageInfo_SegmentHealthResponse.Unmarshal(m, b)
@ -559,7 +423,7 @@ func (m *SegmentHealth) Reset() { *m = SegmentHealth{} }
func (m *SegmentHealth) String() string { return proto.CompactTextString(m) } func (m *SegmentHealth) String() string { return proto.CompactTextString(m) }
func (*SegmentHealth) ProtoMessage() {} func (*SegmentHealth) ProtoMessage() {}
func (*SegmentHealth) Descriptor() ([]byte, []int) { func (*SegmentHealth) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{11} return fileDescriptor_a07d9034b2dd9d26, []int{7}
} }
func (m *SegmentHealth) XXX_Unmarshal(b []byte) error { func (m *SegmentHealth) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealth.Unmarshal(m, b) return xxx_messageInfo_SegmentHealth.Unmarshal(m, b)
@ -587,10 +451,6 @@ func (m *SegmentHealth) GetSegment() []byte {
} }
func init() { func init() {
proto.RegisterType((*CountNodesRequest)(nil), "satellite.inspector.CountNodesRequest")
proto.RegisterType((*CountNodesResponse)(nil), "satellite.inspector.CountNodesResponse")
proto.RegisterType((*DumpNodesRequest)(nil), "satellite.inspector.DumpNodesRequest")
proto.RegisterType((*DumpNodesResponse)(nil), "satellite.inspector.DumpNodesResponse")
proto.RegisterType((*ListIrreparableSegmentsRequest)(nil), "satellite.inspector.ListIrreparableSegmentsRequest") proto.RegisterType((*ListIrreparableSegmentsRequest)(nil), "satellite.inspector.ListIrreparableSegmentsRequest")
proto.RegisterType((*ListIrreparableSegmentsResponse)(nil), "satellite.inspector.ListIrreparableSegmentsResponse") proto.RegisterType((*ListIrreparableSegmentsResponse)(nil), "satellite.inspector.ListIrreparableSegmentsResponse")
proto.RegisterType((*IrreparableSegment)(nil), "satellite.inspector.IrreparableSegment") proto.RegisterType((*IrreparableSegment)(nil), "satellite.inspector.IrreparableSegment")
@ -604,58 +464,51 @@ func init() {
func init() { proto.RegisterFile("inspector.proto", fileDescriptor_a07d9034b2dd9d26) } func init() { proto.RegisterFile("inspector.proto", fileDescriptor_a07d9034b2dd9d26) }
var fileDescriptor_a07d9034b2dd9d26 = []byte{ var fileDescriptor_a07d9034b2dd9d26 = []byte{
// 833 bytes of a gzipped FileDescriptorProto // 726 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcd, 0x6e, 0x23, 0x45, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x6e, 0xd3, 0x40,
0x10, 0xa6, 0xe3, 0xc4, 0xb0, 0x65, 0x67, 0x93, 0x74, 0xcc, 0x62, 0x19, 0x41, 0xa2, 0x59, 0x65, 0x10, 0x66, 0x9b, 0x36, 0xc0, 0x24, 0x69, 0x61, 0x1b, 0x4a, 0x14, 0x04, 0x8d, 0x5c, 0x55, 0xa4,
0xd7, 0xbb, 0x8b, 0xc6, 0xc8, 0x81, 0x03, 0x20, 0x21, 0x6d, 0x36, 0x07, 0x2c, 0x21, 0x36, 0x9a, 0x14, 0x25, 0x28, 0xe5, 0x02, 0x48, 0x48, 0xfd, 0x39, 0x10, 0x09, 0x41, 0xe5, 0xde, 0xb8, 0x58,
0xdc, 0x56, 0x42, 0xa3, 0xf1, 0x4c, 0x39, 0x9e, 0xdd, 0x71, 0xf7, 0xd0, 0xdd, 0x46, 0xf8, 0xce, 0xfe, 0x99, 0x34, 0x6e, 0x9d, 0x5d, 0xb3, 0xbb, 0x91, 0xe8, 0x9d, 0x07, 0x40, 0xe2, 0xc4, 0x81,
0x03, 0x20, 0x71, 0xe2, 0xc0, 0x5b, 0xf0, 0x1a, 0xbc, 0x00, 0x07, 0x0e, 0x1c, 0xe0, 0x35, 0x50, 0xb7, 0xe0, 0x69, 0x38, 0x70, 0xe0, 0x00, 0xaf, 0x81, 0xbc, 0x5e, 0xbb, 0xce, 0x4f, 0x51, 0x10,
0xff, 0xcc, 0x78, 0x6c, 0xcf, 0x12, 0xa3, 0xbd, 0x75, 0x57, 0x7d, 0x55, 0xfd, 0x55, 0x7d, 0x35, 0xb7, 0xf5, 0x7c, 0xdf, 0xcc, 0xce, 0x7c, 0xdf, 0x64, 0x03, 0x6b, 0x21, 0x93, 0x31, 0xfa, 0x8a,
0x65, 0xc3, 0x41, 0xca, 0x64, 0x8e, 0xb1, 0xe2, 0xc2, 0xcf, 0x05, 0x57, 0x9c, 0x1e, 0xcb, 0x48, 0x8b, 0x4e, 0x2c, 0xb8, 0xe2, 0x74, 0x5d, 0xba, 0x0a, 0xa3, 0x28, 0x54, 0xd8, 0xc9, 0xa1, 0x26,
0x61, 0x96, 0xa5, 0x0a, 0xfd, 0xd2, 0xd5, 0x83, 0x1b, 0x7e, 0xc3, 0x2d, 0xa0, 0x07, 0x8c, 0x27, 0x9c, 0xf2, 0x53, 0x9e, 0x12, 0x9a, 0xc0, 0x78, 0x80, 0xe6, 0xbc, 0x16, 0xf3, 0x90, 0x29, 0x14,
0xe8, 0xce, 0x07, 0x39, 0x4f, 0x99, 0x42, 0x91, 0x8c, 0xad, 0xc1, 0x3b, 0x86, 0xa3, 0x67, 0x7c, 0x81, 0x97, 0x06, 0xac, 0x73, 0x78, 0xf0, 0x3a, 0x94, 0xaa, 0x2f, 0x04, 0xc6, 0xae, 0x70, 0xbd,
0xce, 0xd4, 0x37, 0x3c, 0x41, 0x19, 0xe0, 0x77, 0x73, 0x94, 0xca, 0x7b, 0x0c, 0xb4, 0x6a, 0x94, 0x08, 0x4f, 0xf0, 0x74, 0x84, 0x4c, 0x49, 0x1b, 0xdf, 0x8f, 0x51, 0x2a, 0x5a, 0x87, 0x95, 0x28,
0x39, 0x67, 0x12, 0x69, 0x07, 0xf6, 0x62, 0x6d, 0xed, 0x92, 0x53, 0xd2, 0x6f, 0x04, 0xf6, 0xe2, 0x1c, 0x85, 0xaa, 0x41, 0x5a, 0xa4, 0xbd, 0x62, 0xa7, 0x1f, 0x74, 0x0f, 0x36, 0x22, 0x57, 0x2a,
0x51, 0x38, 0xbc, 0x9c, 0xcf, 0xf2, 0x95, 0xf8, 0x4f, 0xe1, 0xa8, 0x62, 0x73, 0xe1, 0xa7, 0xb0, 0x47, 0x22, 0x32, 0x47, 0xa6, 0x29, 0x4e, 0xec, 0xaa, 0x61, 0x63, 0xa9, 0x45, 0xda, 0x55, 0x7b,
0xa7, 0x89, 0xc8, 0x2e, 0x39, 0x6d, 0xf4, 0x5b, 0x43, 0xf0, 0x0d, 0x2d, 0x8d, 0x09, 0xac, 0xc3, 0x3d, 0x41, 0x4f, 0x10, 0x99, 0x29, 0x77, 0xec, 0xaa, 0xa1, 0x35, 0x80, 0xcd, 0x2b, 0x2f, 0x93,
0x7b, 0x05, 0x1f, 0x7e, 0x9d, 0x4a, 0x35, 0x12, 0x02, 0xf3, 0x48, 0x44, 0xe3, 0x0c, 0xaf, 0xf1, 0x31, 0x67, 0x12, 0xe9, 0x21, 0xdc, 0x30, 0xd5, 0x64, 0x83, 0xb4, 0x4a, 0xed, 0x4a, 0xef, 0x61,
0x66, 0x86, 0x4c, 0x15, 0x89, 0x35, 0x85, 0x2c, 0x9d, 0xa5, 0x96, 0xc2, 0x5e, 0x60, 0x2f, 0xf4, 0x67, 0xce, 0x80, 0x9d, 0xd9, 0x1a, 0x76, 0x9e, 0x68, 0xfd, 0x22, 0x40, 0x67, 0x09, 0x94, 0xc2,
0x1c, 0xee, 0x65, 0x91, 0x54, 0xa1, 0x44, 0x64, 0xa1, 0xb4, 0x21, 0x61, 0x1e, 0xa9, 0x69, 0x77, 0xb2, 0xee, 0x90, 0xe8, 0x0e, 0xf5, 0x99, 0x3e, 0x83, 0xd5, 0xac, 0xfb, 0x00, 0x95, 0x1b, 0x46,
0xe7, 0x94, 0xf4, 0xdb, 0xc1, 0xb1, 0xf6, 0x5e, 0x23, 0x32, 0x97, 0xee, 0x2a, 0x52, 0x53, 0x6f, 0xba, 0xff, 0x4a, 0x8f, 0x76, 0x2e, 0x95, 0x3a, 0x4e, 0x4f, 0x76, 0xcd, 0x30, 0x8f, 0x34, 0x91,
0x02, 0x27, 0xaf, 0x7d, 0xcc, 0x31, 0x7e, 0x06, 0xef, 0xb8, 0x6c, 0x05, 0xe9, 0x87, 0x7e, 0x4d, 0x6e, 0x42, 0x25, 0xe2, 0x52, 0x39, 0x71, 0x88, 0x3e, 0xca, 0x46, 0x49, 0xcb, 0x03, 0x49, 0xe8,
0xb3, 0xfd, 0xcd, 0x1c, 0x41, 0x19, 0xe8, 0xfd, 0x4d, 0x80, 0x6e, 0x02, 0x28, 0x85, 0x5d, 0xc3, 0x58, 0x47, 0x68, 0x07, 0xb4, 0x0a, 0x4e, 0xd2, 0x48, 0x28, 0x1c, 0x57, 0x29, 0x1c, 0xc5, 0xaa,
0x90, 0x18, 0x86, 0xe6, 0x4c, 0x3f, 0x83, 0xbb, 0x05, 0xfb, 0x04, 0x55, 0x94, 0x66, 0x86, 0x7f, 0xb1, 0xdc, 0x22, 0xed, 0x92, 0x7d, 0x3b, 0x81, 0x6c, 0x8d, 0xec, 0xa7, 0x00, 0x7d, 0x02, 0xf5,
0x6b, 0x48, 0xfd, 0xa5, 0x6a, 0x57, 0xf6, 0x14, 0xec, 0x3b, 0xe4, 0xa5, 0x01, 0xd2, 0x13, 0x68, 0x49, 0xaa, 0xe3, 0xf3, 0x31, 0x53, 0x8d, 0x15, 0x9d, 0x40, 0x45, 0x91, 0x7c, 0x98, 0x20, 0xd6,
0x65, 0x5c, 0xaa, 0x30, 0x4f, 0x31, 0x46, 0xd9, 0x6d, 0x98, 0xf6, 0x80, 0x36, 0x5d, 0x19, 0x0b, 0x6f, 0x02, 0xeb, 0x6f, 0xbd, 0x33, 0xf4, 0xd5, 0x2b, 0x74, 0x23, 0x35, 0xcc, 0x3c, 0xdb, 0x86,
0xf5, 0xc1, 0x74, 0x21, 0xd4, 0x44, 0x52, 0x11, 0x46, 0x4a, 0xe1, 0x2c, 0x57, 0xdd, 0x5d, 0x23, 0x55, 0x64, 0xbe, 0xb8, 0x88, 0x15, 0x06, 0x4e, 0x61, 0xe6, 0x5a, 0x1e, 0x4d, 0xfc, 0xa0, 0x1b,
0xe5, 0x91, 0x76, 0x05, 0xc6, 0xf3, 0xd4, 0x3a, 0xe8, 0xc7, 0xd0, 0x59, 0x85, 0x86, 0x56, 0xfb, 0x50, 0xf6, 0xc6, 0xfe, 0x39, 0x2a, 0x63, 0x9a, 0xf9, 0xa2, 0xf7, 0x01, 0x62, 0xc1, 0x93, 0xb2,
0x3d, 0x13, 0x40, 0x45, 0x15, 0x6c, 0x66, 0xc5, 0xfb, 0x87, 0xc0, 0xf1, 0xf3, 0xf1, 0x4b, 0x8c, 0x4e, 0x18, 0xe8, 0xc1, 0xaa, 0xf6, 0x4d, 0x13, 0xe9, 0x07, 0xc9, 0x5c, 0x52, 0xb9, 0x42, 0x39,
0xd5, 0x57, 0x18, 0x65, 0x6a, 0x5a, 0x68, 0x76, 0x06, 0x77, 0x91, 0xc5, 0x62, 0x91, 0x2b, 0x4c, 0xee, 0x40, 0xa1, 0xc8, 0xdc, 0xcf, 0xe6, 0xd2, 0xd0, 0x7e, 0x82, 0x64, 0xba, 0x3f, 0x06, 0x8a,
0xc2, 0x4a, 0xcd, 0xfb, 0xa5, 0x55, 0xeb, 0x41, 0xef, 0x41, 0x73, 0x3c, 0x8f, 0x5f, 0xa1, 0x72, 0x2c, 0x70, 0x3c, 0x1c, 0x70, 0x81, 0x39, 0x3d, 0x9d, 0xea, 0x16, 0xb2, 0xe0, 0x40, 0x03, 0x19,
0xa2, 0xb9, 0x1b, 0xfd, 0x00, 0x20, 0x17, 0x5c, 0xa7, 0x0d, 0xd3, 0xc4, 0x14, 0xd6, 0x0e, 0xee, 0x3b, 0xdf, 0xb7, 0x72, 0x61, 0xdf, 0xac, 0xcf, 0x04, 0xea, 0x93, 0x93, 0x9a, 0x85, 0x79, 0x39,
0x38, 0xcb, 0x28, 0xd1, 0x75, 0x49, 0x15, 0x09, 0x15, 0x46, 0x13, 0x85, 0xa2, 0x50, 0xbf, 0xa8, 0xb3, 0x30, 0xd6, 0xdc, 0x85, 0x31, 0xe5, 0x4d, 0x76, 0x9e, 0x43, 0x5f, 0x00, 0x08, 0x0c, 0xc6,
0xcb, 0xb8, 0x9e, 0x6a, 0x4f, 0xd1, 0xf7, 0x8f, 0x80, 0x22, 0x4b, 0xc2, 0x31, 0x4e, 0xb8, 0xc0, 0x2c, 0x70, 0x99, 0x7f, 0x61, 0xcc, 0xbf, 0x57, 0x30, 0xdf, 0xce, 0xc1, 0x13, 0x7f, 0x88, 0x23,
0x12, 0x6e, 0xab, 0x3a, 0x44, 0x96, 0x5c, 0x18, 0x47, 0x81, 0x2e, 0xe7, 0xad, 0x59, 0x99, 0x37, 0xb4, 0x0b, 0x74, 0xeb, 0x0b, 0x81, 0xfa, 0x64, 0x61, 0x63, 0xc0, 0xa5, 0xb2, 0x64, 0x42, 0xd9,
0xef, 0x67, 0x02, 0x9d, 0xd5, 0x4a, 0xdd, 0xc0, 0x7c, 0xb9, 0x31, 0x30, 0x5e, 0xed, 0xc0, 0xb8, 0x59, 0x63, 0x96, 0xe6, 0x19, 0xb3, 0x05, 0xd9, 0xae, 0x39, 0x21, 0x0b, 0xf0, 0x83, 0xf6, 0xa0,
0xf4, 0x2e, 0xba, 0x8c, 0xa1, 0x5f, 0x00, 0x08, 0x4c, 0xe6, 0x2c, 0x89, 0x58, 0xbc, 0x70, 0xe2, 0x64, 0x57, 0x4d, 0xb0, 0x9f, 0xc4, 0xa6, 0x5c, 0x5a, 0x9e, 0x72, 0xc9, 0xfa, 0x44, 0xe0, 0xce,
0xbf, 0x5f, 0x11, 0x3f, 0x28, 0x9d, 0xd7, 0xf1, 0x14, 0x67, 0x18, 0x54, 0xe0, 0xde, 0x2f, 0x04, 0x54, 0x6f, 0x46, 0xb2, 0xe7, 0x50, 0x1e, 0xea, 0x88, 0x6e, 0x6e, 0x31, 0xc1, 0x4c, 0xc6, 0xff,
0x3a, 0xab, 0x89, 0x9d, 0x00, 0xcb, 0xce, 0x92, 0x95, 0xce, 0x6e, 0x0a, 0xb3, 0x53, 0x27, 0xcc, 0xc9, 0xf5, 0x8d, 0x40, 0x6d, 0xa2, 0x2c, 0xdd, 0x85, 0x4a, 0x5a, 0xf8, 0xc2, 0x09, 0x83, 0xd4,
0x7d, 0x28, 0x66, 0x2d, 0x4c, 0x59, 0x82, 0x3f, 0x18, 0x0d, 0x1a, 0x41, 0xdb, 0x19, 0x47, 0xda, 0xc0, 0xea, 0x01, 0x7c, 0xff, 0xb1, 0x59, 0x7e, 0xc3, 0x03, 0xec, 0x1f, 0xd9, 0x60, 0xe0, 0x7e,
0xb6, 0xa6, 0xd2, 0xee, 0x9a, 0x4a, 0xde, 0x4f, 0x04, 0xde, 0x5d, 0xe3, 0xe6, 0x5a, 0xf6, 0x39, 0x20, 0x69, 0x17, 0x6a, 0x63, 0x56, 0xa4, 0x2f, 0xcd, 0xd0, 0xab, 0x39, 0x21, 0x49, 0xd8, 0x85,
0x34, 0xa7, 0xc6, 0x62, 0xc8, 0x6d, 0xd7, 0x30, 0x17, 0xf1, 0x66, 0xed, 0xfa, 0x8d, 0xc0, 0xfe, 0x0a, 0x1f, 0x0c, 0xa2, 0x90, 0xa1, 0xa6, 0x97, 0x66, 0xab, 0x1b, 0x38, 0x21, 0x37, 0xe0, 0x7a,
0x4a, 0x5a, 0xfa, 0x04, 0x5a, 0x36, 0xf1, 0x22, 0x4c, 0x13, 0x2b, 0x60, 0xfb, 0x02, 0xfe, 0xf8, 0x71, 0x93, 0xab, 0x76, 0xf6, 0xd9, 0xfb, 0x4a, 0xa0, 0x5e, 0x78, 0x4e, 0xfa, 0x99, 0x44, 0xf4,
0xf3, 0xa4, 0xa9, 0x97, 0xd4, 0xe8, 0x32, 0x00, 0xe7, 0x1e, 0x25, 0x92, 0x0e, 0x60, 0x7f, 0xce, 0x23, 0x81, 0xbb, 0x57, 0x3c, 0x68, 0x74, 0x6f, 0xae, 0xa8, 0x7f, 0x7f, 0x6b, 0x9b, 0x4f, 0xff,
0xaa, 0xf0, 0x9d, 0x0d, 0x78, 0xbb, 0x04, 0xe8, 0x80, 0x27, 0xd0, 0xe2, 0x93, 0x49, 0x96, 0x32, 0x2d, 0x29, 0xf5, 0xb3, 0xf7, 0x93, 0xc0, 0x5a, 0xaa, 0xe7, 0x65, 0x6b, 0x08, 0xd5, 0xe2, 0xcf,
0x34, 0xf0, 0xc6, 0x66, 0x76, 0xe7, 0xd6, 0xe0, 0x2e, 0xbc, 0x5d, 0x9d, 0xe4, 0x76, 0x50, 0x5c, 0x85, 0xb6, 0xe7, 0x56, 0x9e, 0xf3, 0x76, 0x34, 0x77, 0x16, 0x60, 0xa6, 0x17, 0x5b, 0xd7, 0xe8,
0x87, 0xbf, 0x13, 0x38, 0x7c, 0xfe, 0x3d, 0x8a, 0x2c, 0x5a, 0x8c, 0x8a, 0xf6, 0xd0, 0x6f, 0x01, 0x70, 0xda, 0xd0, 0x9d, 0x05, 0x76, 0xc9, 0x5c, 0xf4, 0x68, 0x11, 0x6a, 0x76, 0xd3, 0xc1, 0xf6,
0x96, 0xfb, 0x9a, 0x3e, 0xa8, 0x6d, 0xe1, 0xc6, 0x96, 0xef, 0x3d, 0xbc, 0x15, 0xe7, 0x34, 0x7a, 0xbb, 0x2d, 0xa9, 0xb8, 0x38, 0xeb, 0x84, 0xbc, 0xab, 0x0f, 0xdd, 0x3c, 0xbb, 0xab, 0x97, 0x8f,
0x01, 0x77, 0xca, 0x75, 0x4e, 0xcf, 0x6a, 0xa3, 0xd6, 0x7f, 0x02, 0x7a, 0x0f, 0x6e, 0x83, 0xd9, 0xb9, 0x51, 0xec, 0x79, 0x65, 0xfd, 0xb7, 0xb6, 0xf7, 0x27, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x69,
0xdc, 0xc3, 0x5f, 0x09, 0x74, 0x2a, 0xeb, 0x71, 0x59, 0xd3, 0x8f, 0x04, 0xde, 0x7b, 0xcd, 0x82, 0x35, 0x2a, 0x27, 0x07, 0x00, 0x00,
0xa6, 0xe7, 0xb5, 0xc9, 0xff, 0xfb, 0xb7, 0xa3, 0xf7, 0xc9, 0xff, 0x0b, 0x72, 0xfc, 0xfe, 0x22,
0x70, 0x60, 0xe7, 0x63, 0x49, 0x0d, 0xa1, 0x5d, 0xfd, 0xfc, 0x69, 0xbf, 0x36, 0x73, 0xcd, 0x2e,
0xec, 0x3d, 0xda, 0x02, 0x69, 0x1f, 0xf6, 0xde, 0xa2, 0xd3, 0xf5, 0x01, 0x7d, 0xb4, 0xc5, 0xb7,
0xe1, 0x1e, 0x7a, 0xbc, 0x0d, 0xb4, 0x78, 0xe9, 0xe2, 0xec, 0xc5, 0x7d, 0xa9, 0xb8, 0x78, 0xe9,
0xa7, 0x7c, 0x60, 0x0e, 0x83, 0x32, 0x7a, 0x60, 0x3e, 0x26, 0x16, 0x65, 0xf9, 0x78, 0xdc, 0x34,
0x7f, 0x19, 0xce, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xe6, 0x11, 0x41, 0x83, 0x08, 0x00,
0x00,
} }

View File

@ -10,26 +10,6 @@ import "pointerdb.proto";
package satellite.inspector; package satellite.inspector;
service OverlayInspector {
// CountNodes returns the number of nodes in the cache
rpc CountNodes(CountNodesRequest) returns (CountNodesResponse);
// DumpNodes returns all the nodes in the cache
rpc DumpNodes(DumpNodesRequest) returns (DumpNodesResponse);
}
message CountNodesRequest {
}
message CountNodesResponse {
int64 count = 1;
}
message DumpNodesRequest {}
message DumpNodesResponse {
repeated node.Node nodes = 1;
}
service IrreparableInspector { service IrreparableInspector {
// ListIrreparableSegments returns damaged segments // ListIrreparableSegments returns damaged segments
rpc ListIrreparableSegments(ListIrreparableSegmentsRequest) returns (ListIrreparableSegmentsResponse); rpc ListIrreparableSegments(ListIrreparableSegmentsRequest) returns (ListIrreparableSegmentsResponse);

View File

@ -39,121 +39,6 @@ func (drpcEncoding_File_inspector_proto) JSONUnmarshal(buf []byte, msg drpc.Mess
return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message)) return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message))
} }
type DRPCOverlayInspectorClient interface {
DRPCConn() drpc.Conn
CountNodes(ctx context.Context, in *CountNodesRequest) (*CountNodesResponse, error)
DumpNodes(ctx context.Context, in *DumpNodesRequest) (*DumpNodesResponse, error)
}
type drpcOverlayInspectorClient struct {
cc drpc.Conn
}
func NewDRPCOverlayInspectorClient(cc drpc.Conn) DRPCOverlayInspectorClient {
return &drpcOverlayInspectorClient{cc}
}
func (c *drpcOverlayInspectorClient) DRPCConn() drpc.Conn { return c.cc }
func (c *drpcOverlayInspectorClient) CountNodes(ctx context.Context, in *CountNodesRequest) (*CountNodesResponse, error) {
out := new(CountNodesResponse)
err := c.cc.Invoke(ctx, "/satellite.inspector.OverlayInspector/CountNodes", drpcEncoding_File_inspector_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcOverlayInspectorClient) DumpNodes(ctx context.Context, in *DumpNodesRequest) (*DumpNodesResponse, error) {
out := new(DumpNodesResponse)
err := c.cc.Invoke(ctx, "/satellite.inspector.OverlayInspector/DumpNodes", drpcEncoding_File_inspector_proto{}, in, out)
if err != nil {
return nil, err
}
return out, nil
}
type DRPCOverlayInspectorServer interface {
CountNodes(context.Context, *CountNodesRequest) (*CountNodesResponse, error)
DumpNodes(context.Context, *DumpNodesRequest) (*DumpNodesResponse, error)
}
type DRPCOverlayInspectorUnimplementedServer struct{}
func (s *DRPCOverlayInspectorUnimplementedServer) CountNodes(context.Context, *CountNodesRequest) (*CountNodesResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), 12)
}
func (s *DRPCOverlayInspectorUnimplementedServer) DumpNodes(context.Context, *DumpNodesRequest) (*DumpNodesResponse, error) {
return nil, drpcerr.WithCode(errors.New("Unimplemented"), 12)
}
type DRPCOverlayInspectorDescription struct{}
func (DRPCOverlayInspectorDescription) NumMethods() int { return 2 }
func (DRPCOverlayInspectorDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) {
switch n {
case 0:
return "/satellite.inspector.OverlayInspector/CountNodes", drpcEncoding_File_inspector_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCOverlayInspectorServer).
CountNodes(
ctx,
in1.(*CountNodesRequest),
)
}, DRPCOverlayInspectorServer.CountNodes, true
case 1:
return "/satellite.inspector.OverlayInspector/DumpNodes", drpcEncoding_File_inspector_proto{},
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCOverlayInspectorServer).
DumpNodes(
ctx,
in1.(*DumpNodesRequest),
)
}, DRPCOverlayInspectorServer.DumpNodes, true
default:
return "", nil, nil, nil, false
}
}
func DRPCRegisterOverlayInspector(mux drpc.Mux, impl DRPCOverlayInspectorServer) error {
return mux.Register(impl, DRPCOverlayInspectorDescription{})
}
type DRPCOverlayInspector_CountNodesStream interface {
drpc.Stream
SendAndClose(*CountNodesResponse) error
}
type drpcOverlayInspector_CountNodesStream struct {
drpc.Stream
}
func (x *drpcOverlayInspector_CountNodesStream) SendAndClose(m *CountNodesResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_inspector_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCOverlayInspector_DumpNodesStream interface {
drpc.Stream
SendAndClose(*DumpNodesResponse) error
}
type drpcOverlayInspector_DumpNodesStream struct {
drpc.Stream
}
func (x *drpcOverlayInspector_DumpNodesStream) SendAndClose(m *DumpNodesResponse) error {
if err := x.MsgSend(m, drpcEncoding_File_inspector_proto{}); err != nil {
return err
}
return x.CloseSend()
}
type DRPCIrreparableInspectorClient interface { type DRPCIrreparableInspectorClient interface {
DRPCConn() drpc.Conn DRPCConn() drpc.Conn

View File

@ -1,36 +0,0 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package overlay
import (
"context"
"storj.io/storj/satellite/internalpb"
)
// Inspector is a RPC service for inspecting overlay internals.
//
// architecture: Endpoint
type Inspector struct {
internalpb.DRPCOverlayInspectorUnimplementedServer
service *Service
}
// NewInspector creates an Inspector.
func NewInspector(service *Service) *Inspector {
return &Inspector{service: service}
}
// CountNodes returns the number of nodes in the overlay.
func (srv *Inspector) CountNodes(ctx context.Context, req *internalpb.CountNodesRequest) (_ *internalpb.CountNodesResponse, err error) {
defer mon.Task()(&ctx)(&err)
overlayKeys, err := srv.service.Inspect(ctx)
if err != nil {
return nil, err
}
return &internalpb.CountNodesResponse{
Count: int64(len(overlayKeys)),
}, nil
}

View File

@ -15,7 +15,6 @@ import (
"storj.io/common/pb" "storj.io/common/pb"
"storj.io/common/storj" "storj.io/common/storj"
"storj.io/storj/satellite/metainfo/metabase" "storj.io/storj/satellite/metainfo/metabase"
"storj.io/storj/storage"
) )
// ErrEmptyNode is returned when the nodeID is empty. // ErrEmptyNode is returned when the nodeID is empty.
@ -302,13 +301,6 @@ func NewService(log *zap.Logger, db DB, config Config) (*Service, error) {
// Close closes resources. // Close closes resources.
func (service *Service) Close() error { return nil } func (service *Service) Close() error { return nil }
// Inspect lists limited number of items in the cache.
func (service *Service) Inspect(ctx context.Context) (_ storage.Keys, err error) {
defer mon.Task()(&ctx)(&err)
// TODO: implement inspection tools
return nil, errors.New("not implemented")
}
// Get looks up the provided nodeID from the overlay. // Get looks up the provided nodeID from the overlay.
func (service *Service) Get(ctx context.Context, nodeID storj.NodeID) (_ *NodeDossier, err error) { func (service *Service) Get(ctx context.Context, nodeID storj.NodeID) (_ *NodeDossier, err error) {
defer mon.Task()(&ctx)(&err) defer mon.Task()(&ctx)(&err)