API endpoint checking object and segment health from the satellite (#1546)

* Generate protobuf for checking object and segment health

* Initial cmd client for health check

* Register the health inspector on the satellite peer
This commit is contained in:
Alexander Leitner 2019-04-02 10:55:58 -04:00 committed by GitHub
parent 7f5e4ba658
commit 59b3eb190e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 994 additions and 139 deletions

View File

@ -62,6 +62,10 @@ var (
Use: "statdb",
Short: "commands for statdb",
}
healthCmd = &cobra.Command{
Use: "health",
Short: "commands for querying health of a stored data",
}
irreparableCmd = &cobra.Command{
Use: "irreparable",
Short: "list segments in irreparable database",
@ -121,6 +125,18 @@ var (
Args: cobra.MinimumNArgs(1),
RunE: CreateCSVStats,
}
objectHealthCmd = &cobra.Command{
Use: "object <project-id> <bucket> <encrypted-path>",
Short: "Get stats about an object's health",
Args: cobra.MinimumNArgs(3),
RunE: ObjectHealth,
}
segmentHealthCmd = &cobra.Command{
Use: "segment <project-id> <segment-index> <bucket> <encrypted-path>",
Short: "Get stats about a segment's health",
Args: cobra.MinimumNArgs(4),
RunE: SegmentHealth,
}
)
// Inspector gives access to kademlia, overlay cache
@ -129,6 +145,7 @@ type Inspector struct {
kadclient pb.KadInspectorClient
overlayclient pb.OverlayInspectorClient
irrdbclient pb.IrreparableInspectorClient
healthclient pb.HealthInspectorClient
}
// NewInspector creates a new gRPC inspector client for access to kad,
@ -154,6 +171,7 @@ func NewInspector(address, path string) (*Inspector, error) {
kadclient: pb.NewKadInspectorClient(conn),
overlayclient: pb.NewOverlayInspectorClient(conn),
irrdbclient: pb.NewIrreparableInspectorClient(conn),
healthclient: pb.NewHealthInspectorClient(conn),
}, nil
}
@ -445,6 +463,61 @@ func CreateCSVStats(cmd *cobra.Command, args []string) (err error) {
return nil
}
// ObjectHealth gets information about the health of an object on the network
func ObjectHealth(cmd *cobra.Command, args []string) (err error) {
ctx := context.Background()
i, err := NewInspector(*Addr, *IdentityPath)
if err != nil {
return ErrArgs.Wrap(err)
}
req := &pb.ObjectHealthRequest{
ProjectId: []byte(args[0]),
Bucket: []byte(args[1]),
EncryptedPath: []byte(args[2]),
StartAfterSegment: 0, // start from first segment
EndBeforeSegment: 0, // No end, so we stop when we've hit limit or arrived at the last segment
Limit: 0, // No limit, so we stop when we've arrived at the last segment
}
_, err = i.healthclient.ObjectHealth(ctx, req)
if err != nil {
return ErrRequest.Wrap(err)
}
return nil
}
// SegmentHealth gets information about the health of a segment on the network
func SegmentHealth(cmd *cobra.Command, args []string) (err error) {
ctx := context.Background()
i, err := NewInspector(*Addr, *IdentityPath)
if err != nil {
return ErrArgs.Wrap(err)
}
segmentIndex, err := strconv.ParseInt(args[1], 10, 64)
if err != nil {
return ErrRequest.Wrap(err)
}
req := &pb.SegmentHealthRequest{
ProjectId: []byte(args[0]),
SegmentIndex: segmentIndex,
Bucket: []byte(args[2]),
EncryptedPath: []byte(args[3]),
}
_, err = i.healthclient.SegmentHealth(ctx, req)
if err != nil {
return ErrRequest.Wrap(err)
}
return nil
}
func getSegments(cmd *cobra.Command, args []string) error {
if irreparableLimit <= int32(0) {
return ErrArgs.New("limit must be greater than 0")
@ -508,6 +581,7 @@ func init() {
rootCmd.AddCommand(kadCmd)
rootCmd.AddCommand(statsCmd)
rootCmd.AddCommand(irreparableCmd)
rootCmd.AddCommand(healthCmd)
kadCmd.AddCommand(countNodeCmd)
kadCmd.AddCommand(pingNodeCmd)
@ -520,6 +594,9 @@ func init() {
statsCmd.AddCommand(createStatsCmd)
statsCmd.AddCommand(createCSVStatsCmd)
healthCmd.AddCommand(objectHealthCmd)
healthCmd.AddCommand(segmentHealthCmd)
irreparableCmd.Flags().Int32Var(&irreparableLimit, "limit", 50, "max number of results per page")
flag.Parse()

15
go.mod
View File

@ -4,7 +4,6 @@ module storj.io/storj
require (
github.com/btcsuite/btcutil v0.0.0-20180706230648-ab6388e0c60a
github.com/garyburd/redigo v1.0.1-0.20170216214944-0d253a66e6e1 // indirect
github.com/go-ole/go-ole v1.2.1 // indirect
github.com/graphql-go/graphql v0.7.6
github.com/hanwen/go-fuse v0.0.0-20181027161220-c029b69a13a7
github.com/inconshreveable/mousetrap v1.0.0 // indirect
@ -20,7 +19,6 @@ exclude gopkg.in/olivere/elastic.v5 v5.0.72 // buggy import, see https://github.
require (
github.com/Shopify/go-lua v0.0.0-20181106184032-48449c60c0a9
github.com/Shopify/toxiproxy v2.1.4+incompatible // indirect
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f // indirect
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 // indirect
github.com/alicebob/miniredis v0.0.0-20180911162847-3657542c8629
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect
@ -73,7 +71,6 @@ require (
github.com/minio/sha256-simd v0.0.0-20171213220625-ad98a36ba0da // indirect
github.com/minio/sio v0.0.0-20180327104954-6a41828a60f0 // indirect
github.com/mitchellh/go-homedir v0.0.0-20180801233206-58046073cbff // indirect
github.com/mr-tron/base58 v0.0.0-20180922112544-9ad991d48a42
github.com/nats-io/gnatsd v1.3.0 // indirect
github.com/nats-io/go-nats v1.6.0 // indirect
github.com/nats-io/go-nats-streaming v0.4.0 // indirect
@ -90,7 +87,6 @@ require (
github.com/pkg/profile v1.2.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a // indirect
github.com/rs/cors v1.5.0 // indirect
github.com/shirou/gopsutil v2.17.12+incompatible
github.com/sirupsen/logrus v1.3.0 // indirect
github.com/skyrings/skyring-common v0.0.0-20160929130248-d1c0bb1cbd5e
github.com/spacemonkeygo/errors v0.0.0-20171212215202-9064522e9fd1 // indirect
@ -110,13 +106,14 @@ require (
go.uber.org/atomic v1.3.2 // indirect
go.uber.org/multierr v1.1.0 // indirect
go.uber.org/zap v1.9.1
golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b
golang.org/x/net v0.0.0-20190225153610-fe579d43d832
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 // indirect
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c // indirect
golang.org/x/tools v0.0.0-20190225234524-2dc4ef2775b8
golang.org/x/tools v0.0.0-20190321154406-ae772f11d294
google.golang.org/appengine v1.4.0 // indirect
google.golang.org/genproto v0.0.0-20190219182410-082222b4a5c5 // indirect
google.golang.org/grpc v1.19.0
gopkg.in/Shopify/sarama.v1 v1.18.0 // indirect
@ -125,4 +122,6 @@ require (
gopkg.in/spacemonkeygo/monkit.v2 v2.0.0-20180827161543-6ebf5a752f9b
gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
labix.org/v2/mgo v0.0.0-20140701140051-000000000287 // indirect
launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect
)

33
go.sum
View File

@ -13,8 +13,6 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWso
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/Sirupsen/logrus v1.0.6 h1:HCAGQRk48dRVPA5Y+Yh0qdCSTzPOyU1tBJ7Q9YzotII=
github.com/Sirupsen/logrus v1.0.6/go.mod h1:rmk17hk6i8ZSAJkSDa7nOxamrG+SP4P0mm+DAvExv4U=
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY=
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6 h1:45bxf7AZMwWcqkLzDAQugVEwedisr5nRJ1r+7LYnv0U=
github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
github.com/alicebob/miniredis v0.0.0-20180911162847-3657542c8629 h1:gLoh8jzwIxdisBnHiWRIuReqtH9cpslSE2564UWXun0=
@ -90,8 +88,6 @@ github.com/garyburd/redigo v1.0.1-0.20170216214944-0d253a66e6e1/go.mod h1:NR3MbY
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-ini/ini v1.38.2 h1:6Hl/z3p3iFkA0dlDfzYxuFuUGD+kaweypF6btsR2/Q4=
github.com/go-ini/ini v1.38.2/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-redis/redis v6.14.1+incompatible h1:kSJohAREGMr344uMa8PzuIg5OU6ylCbyDkWkkNOfEik=
github.com/go-redis/redis v6.14.1+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
@ -233,8 +229,6 @@ github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KH
github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.1 h1:0fcGQkeJPHl7DauilpdNG27ZxXHDSg+rbbTpfpniZd8=
github.com/mitchellh/mapstructure v1.1.1/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mr-tron/base58 v0.0.0-20180922112544-9ad991d48a42 h1:/H+QBVxPZWp7WG8dBXXP/qCWP8QU0YczIvvKes/bNpk=
github.com/mr-tron/base58 v0.0.0-20180922112544-9ad991d48a42/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8=
github.com/nats-io/gnatsd v1.3.0 h1:+5d80klu3QaJgNbdavVBjWJP7cHd11U2CLnRTFM9ICI=
github.com/nats-io/gnatsd v1.3.0/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ=
github.com/nats-io/go-nats v1.6.0 h1:FznPwMfrVwGnSCh7JTXyJDRW0TIkD4Tr+M1LPJt9T70=
@ -290,8 +284,6 @@ github.com/rs/cors v1.5.0 h1:dgSHE6+ia18arGOTIYQKKGWLvEbGvmbNE6NfxhoNHUY=
github.com/rs/cors v1.5.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
github.com/segmentio/go-prompt v1.2.1-0.20161017233205-f0d19b6901ad h1:EqOdoSJGI7CsBQczPcIgmpm3hJE7X8Hj3jrgI002whs=
github.com/segmentio/go-prompt v1.2.1-0.20161017233205-f0d19b6901ad/go.mod h1:B3ehdD1xPoWDKgrQgUaGk+m8H1xb1J5TyYDfKpKNeEE=
github.com/shirou/gopsutil v2.17.12+incompatible h1:FNbznluSK3DQggqiVw3wK/tFKJrKlLPBuQ+V8XkkCOc=
github.com/shirou/gopsutil v2.17.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/sirupsen/logrus v1.0.6 h1:hcP1GmhGigz/O7h1WVUM5KklBp1JoNS9FggWKdj/j3s=
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME=
@ -358,8 +350,9 @@ go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M=
golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576 h1:aUX/1G2gFSs4AsJJg2cL3HuoRhCSCz733FE5GUSuaT4=
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -370,14 +363,13 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181106065722-10aee1819953 h1:LuZIitY8waaxUfNIdtajyE/YzA/zyf0YxXG27VpLrkg=
golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190225153610-fe579d43d832 h1:2IdId8zoI92l1bUzjAOygcAOkmCe13HY1j0rqPPPzB8=
golang.org/x/net v0.0.0-20190225153610-fe579d43d832/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 h1:kcXqo9vE6fsZY5X5Rd7R1l7fTgnWaDCVmln65REefiE=
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180821140842-3b58ed4ad339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -387,8 +379,9 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 h1:Zw7eRv6INHGfu15LVRN1vrrwusJbnfJjAZn3D1VkQIE=
golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54 h1:xe1/2UUJRmA9iDglQSlkx8c5n3twv58+K0mPpC2zmhA=
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To=
@ -401,8 +394,8 @@ golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1 h1:dzEuQYa6+a3gROnSlgly5ERUm4SZKJt+dh+4iSbO+bI=
golang.org/x/tools v0.0.0-20180911133044-677d2ff680c1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190225234524-2dc4ef2775b8 h1:/cqPBp9ki3f154KKPOsnC8IaiCB9VKiDexY9bGI0jhI=
golang.org/x/tools v0.0.0-20190225234524-2dc4ef2775b8/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190321154406-ae772f11d294 h1:gMPF/7U3xs3RNmp7bh9BoJnRg81e5uKSYpyaGoAmadw=
golang.org/x/tools v0.0.0-20190321154406-ae772f11d294/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
google.golang.org/api v0.0.0-20180818000503-e21acd801f91/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20180826000528-7954115fcf34/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
@ -453,3 +446,7 @@ gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
labix.org/v2/mgo v0.0.0-20140701140051-000000000287 h1:L0cnkNl4TfAXzvdrqsYEmxOHOCv2p5I3taaReO8BWFs=
labix.org/v2/mgo v0.0.0-20140701140051-000000000287/go.mod h1:Lg7AYkt1uXJoR9oeSZ3W/8IXLdvOfIITgZnommstyz4=
launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54=
launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM=

View File

@ -1296,6 +1296,316 @@ func (m *DashboardResponse) GetLastQueried() *timestamp.Timestamp {
return nil
}
type SegmentHealthRequest struct {
Bucket []byte `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
EncryptedPath []byte `protobuf:"bytes,2,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
SegmentIndex int64 `protobuf:"varint,3,opt,name=segment_index,json=segmentIndex,proto3" json:"segment_index,omitempty"`
ProjectId []byte `protobuf:"bytes,4,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SegmentHealthRequest) Reset() { *m = SegmentHealthRequest{} }
func (m *SegmentHealthRequest) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthRequest) ProtoMessage() {}
func (*SegmentHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{29}
}
func (m *SegmentHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthRequest.Unmarshal(m, b)
}
func (m *SegmentHealthRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SegmentHealthRequest.Marshal(b, m, deterministic)
}
func (m *SegmentHealthRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_SegmentHealthRequest.Merge(m, src)
}
func (m *SegmentHealthRequest) XXX_Size() int {
return xxx_messageInfo_SegmentHealthRequest.Size(m)
}
func (m *SegmentHealthRequest) XXX_DiscardUnknown() {
xxx_messageInfo_SegmentHealthRequest.DiscardUnknown(m)
}
var xxx_messageInfo_SegmentHealthRequest proto.InternalMessageInfo
func (m *SegmentHealthRequest) GetBucket() []byte {
if m != nil {
return m.Bucket
}
return nil
}
func (m *SegmentHealthRequest) GetEncryptedPath() []byte {
if m != nil {
return m.EncryptedPath
}
return nil
}
func (m *SegmentHealthRequest) GetSegmentIndex() int64 {
if m != nil {
return m.SegmentIndex
}
return 0
}
func (m *SegmentHealthRequest) GetProjectId() []byte {
if m != nil {
return m.ProjectId
}
return nil
}
type SegmentHealth struct {
MinimumRequired int32 `protobuf:"varint,1,opt,name=minimum_required,json=minimumRequired,proto3" json:"minimum_required,omitempty"`
Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
RepairThreshold int32 `protobuf:"varint,3,opt,name=repair_threshold,json=repairThreshold,proto3" json:"repair_threshold,omitempty"`
SuccessThreshold int32 `protobuf:"varint,4,opt,name=success_threshold,json=successThreshold,proto3" json:"success_threshold,omitempty"`
OnlineNodes int32 `protobuf:"varint,5,opt,name=online_nodes,json=onlineNodes,proto3" json:"online_nodes,omitempty"`
Segment []byte `protobuf:"bytes,6,opt,name=segment,proto3" json:"segment,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SegmentHealth) Reset() { *m = SegmentHealth{} }
func (m *SegmentHealth) String() string { return proto.CompactTextString(m) }
func (*SegmentHealth) ProtoMessage() {}
func (*SegmentHealth) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{30}
}
func (m *SegmentHealth) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealth.Unmarshal(m, b)
}
func (m *SegmentHealth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SegmentHealth.Marshal(b, m, deterministic)
}
func (m *SegmentHealth) XXX_Merge(src proto.Message) {
xxx_messageInfo_SegmentHealth.Merge(m, src)
}
func (m *SegmentHealth) XXX_Size() int {
return xxx_messageInfo_SegmentHealth.Size(m)
}
func (m *SegmentHealth) XXX_DiscardUnknown() {
xxx_messageInfo_SegmentHealth.DiscardUnknown(m)
}
var xxx_messageInfo_SegmentHealth proto.InternalMessageInfo
func (m *SegmentHealth) GetMinimumRequired() int32 {
if m != nil {
return m.MinimumRequired
}
return 0
}
func (m *SegmentHealth) GetTotal() int32 {
if m != nil {
return m.Total
}
return 0
}
func (m *SegmentHealth) GetRepairThreshold() int32 {
if m != nil {
return m.RepairThreshold
}
return 0
}
func (m *SegmentHealth) GetSuccessThreshold() int32 {
if m != nil {
return m.SuccessThreshold
}
return 0
}
func (m *SegmentHealth) GetOnlineNodes() int32 {
if m != nil {
return m.OnlineNodes
}
return 0
}
func (m *SegmentHealth) GetSegment() []byte {
if m != nil {
return m.Segment
}
return nil
}
type SegmentHealthResponse struct {
Health *SegmentHealth `protobuf:"bytes,1,opt,name=health,proto3" json:"health,omitempty"`
Redundancy *RedundancyScheme `protobuf:"bytes,2,opt,name=redundancy,proto3" json:"redundancy,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SegmentHealthResponse) Reset() { *m = SegmentHealthResponse{} }
func (m *SegmentHealthResponse) String() string { return proto.CompactTextString(m) }
func (*SegmentHealthResponse) ProtoMessage() {}
func (*SegmentHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{31}
}
func (m *SegmentHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SegmentHealthResponse.Unmarshal(m, b)
}
func (m *SegmentHealthResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SegmentHealthResponse.Marshal(b, m, deterministic)
}
func (m *SegmentHealthResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_SegmentHealthResponse.Merge(m, src)
}
func (m *SegmentHealthResponse) XXX_Size() int {
return xxx_messageInfo_SegmentHealthResponse.Size(m)
}
func (m *SegmentHealthResponse) XXX_DiscardUnknown() {
xxx_messageInfo_SegmentHealthResponse.DiscardUnknown(m)
}
var xxx_messageInfo_SegmentHealthResponse proto.InternalMessageInfo
func (m *SegmentHealthResponse) GetHealth() *SegmentHealth {
if m != nil {
return m.Health
}
return nil
}
func (m *SegmentHealthResponse) GetRedundancy() *RedundancyScheme {
if m != nil {
return m.Redundancy
}
return nil
}
type ObjectHealthRequest struct {
EncryptedPath []byte `protobuf:"bytes,1,opt,name=encrypted_path,json=encryptedPath,proto3" json:"encrypted_path,omitempty"`
Bucket []byte `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"`
ProjectId []byte `protobuf:"bytes,3,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"`
StartAfterSegment int64 `protobuf:"varint,4,opt,name=start_after_segment,json=startAfterSegment,proto3" json:"start_after_segment,omitempty"`
EndBeforeSegment int64 `protobuf:"varint,5,opt,name=end_before_segment,json=endBeforeSegment,proto3" json:"end_before_segment,omitempty"`
Limit int32 `protobuf:"varint,6,opt,name=limit,proto3" json:"limit,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ObjectHealthRequest) Reset() { *m = ObjectHealthRequest{} }
func (m *ObjectHealthRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthRequest) ProtoMessage() {}
func (*ObjectHealthRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{32}
}
func (m *ObjectHealthRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthRequest.Unmarshal(m, b)
}
func (m *ObjectHealthRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ObjectHealthRequest.Marshal(b, m, deterministic)
}
func (m *ObjectHealthRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ObjectHealthRequest.Merge(m, src)
}
func (m *ObjectHealthRequest) XXX_Size() int {
return xxx_messageInfo_ObjectHealthRequest.Size(m)
}
func (m *ObjectHealthRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ObjectHealthRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ObjectHealthRequest proto.InternalMessageInfo
func (m *ObjectHealthRequest) GetEncryptedPath() []byte {
if m != nil {
return m.EncryptedPath
}
return nil
}
func (m *ObjectHealthRequest) GetBucket() []byte {
if m != nil {
return m.Bucket
}
return nil
}
func (m *ObjectHealthRequest) GetProjectId() []byte {
if m != nil {
return m.ProjectId
}
return nil
}
func (m *ObjectHealthRequest) GetStartAfterSegment() int64 {
if m != nil {
return m.StartAfterSegment
}
return 0
}
func (m *ObjectHealthRequest) GetEndBeforeSegment() int64 {
if m != nil {
return m.EndBeforeSegment
}
return 0
}
func (m *ObjectHealthRequest) GetLimit() int32 {
if m != nil {
return m.Limit
}
return 0
}
type ObjectHealthResponse struct {
Segments []*SegmentHealth `protobuf:"bytes,1,rep,name=segments,proto3" json:"segments,omitempty"`
Redundancy *RedundancyScheme `protobuf:"bytes,2,opt,name=redundancy,proto3" json:"redundancy,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ObjectHealthResponse) Reset() { *m = ObjectHealthResponse{} }
func (m *ObjectHealthResponse) String() string { return proto.CompactTextString(m) }
func (*ObjectHealthResponse) ProtoMessage() {}
func (*ObjectHealthResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_a07d9034b2dd9d26, []int{33}
}
func (m *ObjectHealthResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ObjectHealthResponse.Unmarshal(m, b)
}
func (m *ObjectHealthResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ObjectHealthResponse.Marshal(b, m, deterministic)
}
func (m *ObjectHealthResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ObjectHealthResponse.Merge(m, src)
}
func (m *ObjectHealthResponse) XXX_Size() int {
return xxx_messageInfo_ObjectHealthResponse.Size(m)
}
func (m *ObjectHealthResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ObjectHealthResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ObjectHealthResponse proto.InternalMessageInfo
func (m *ObjectHealthResponse) GetSegments() []*SegmentHealth {
if m != nil {
return m.Segments
}
return nil
}
func (m *ObjectHealthResponse) GetRedundancy() *RedundancyScheme {
if m != nil {
return m.Redundancy
}
return nil
}
func init() {
proto.RegisterType((*ListIrreparableSegmentsRequest)(nil), "inspector.ListIrreparableSegmentsRequest")
proto.RegisterType((*IrreparableSegment)(nil), "inspector.IrreparableSegment")
@ -1326,98 +1636,126 @@ func init() {
proto.RegisterType((*StatSummaryResponse)(nil), "inspector.StatSummaryResponse")
proto.RegisterType((*DashboardRequest)(nil), "inspector.DashboardRequest")
proto.RegisterType((*DashboardResponse)(nil), "inspector.DashboardResponse")
proto.RegisterType((*SegmentHealthRequest)(nil), "inspector.SegmentHealthRequest")
proto.RegisterType((*SegmentHealth)(nil), "inspector.SegmentHealth")
proto.RegisterType((*SegmentHealthResponse)(nil), "inspector.SegmentHealthResponse")
proto.RegisterType((*ObjectHealthRequest)(nil), "inspector.ObjectHealthRequest")
proto.RegisterType((*ObjectHealthResponse)(nil), "inspector.ObjectHealthResponse")
}
func init() { proto.RegisterFile("inspector.proto", fileDescriptor_a07d9034b2dd9d26) }
var fileDescriptor_a07d9034b2dd9d26 = []byte{
// 1370 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x57, 0xcb, 0x72, 0x1b, 0x45,
0x14, 0xcd, 0xe8, 0x15, 0xe9, 0xca, 0xd1, 0xa3, 0x65, 0x88, 0x10, 0x89, 0x6d, 0xa6, 0x80, 0x38,
0x49, 0x95, 0x12, 0x44, 0x58, 0x04, 0x2a, 0x8b, 0x58, 0x26, 0x89, 0x2a, 0x21, 0x31, 0xe3, 0xb0,
0xa1, 0x52, 0xa8, 0x5a, 0x9a, 0xb6, 0x32, 0x65, 0x69, 0x7a, 0x32, 0xdd, 0x0a, 0xf8, 0x0f, 0xf8,
0x02, 0x16, 0x6c, 0xf9, 0x09, 0xaa, 0xf8, 0x01, 0x76, 0xec, 0x59, 0x64, 0x43, 0x15, 0xff, 0xc0,
0x8e, 0xea, 0xdb, 0x3d, 0x2f, 0x8d, 0x85, 0x5d, 0x14, 0xec, 0x34, 0xe7, 0x9e, 0x3e, 0x7d, 0xef,
0xed, 0xee, 0xd3, 0x2d, 0x68, 0x7a, 0xbe, 0x08, 0xd8, 0x54, 0xf2, 0xb0, 0x1f, 0x84, 0x5c, 0x72,
0x52, 0x8b, 0x81, 0x1e, 0xcc, 0xf8, 0x8c, 0x6b, 0xb8, 0x07, 0x3e, 0x77, 0x99, 0xf9, 0xdd, 0x0c,
0xb8, 0xe7, 0x4b, 0x16, 0xba, 0x13, 0x03, 0x6c, 0xcd, 0x38, 0x9f, 0xcd, 0xd9, 0x2d, 0xfc, 0x9a,
0x2c, 0x8f, 0x6e, 0xb9, 0xcb, 0x90, 0x4a, 0x8f, 0xfb, 0x26, 0xbe, 0xbd, 0x1a, 0x97, 0xde, 0x82,
0x09, 0x49, 0x17, 0x81, 0x26, 0xd8, 0x4f, 0x61, 0xeb, 0x89, 0x27, 0xe4, 0x28, 0x0c, 0x59, 0x40,
0x43, 0x3a, 0x99, 0xb3, 0x43, 0x36, 0x5b, 0x30, 0x5f, 0x0a, 0x87, 0xbd, 0x5a, 0x32, 0x21, 0xc9,
0x26, 0x94, 0xe7, 0xde, 0xc2, 0x93, 0x5d, 0x6b, 0xc7, 0xda, 0x2d, 0x3b, 0xfa, 0x83, 0xbc, 0x0d,
0x15, 0x7e, 0x74, 0x24, 0x98, 0xec, 0x16, 0x10, 0x36, 0x5f, 0xf6, 0x9f, 0x16, 0x90, 0xbc, 0x18,
0x21, 0x50, 0x0a, 0xa8, 0x7c, 0x89, 0x1a, 0x1b, 0x0e, 0xfe, 0x26, 0x77, 0xa1, 0x21, 0x74, 0x78,
0xec, 0x32, 0x49, 0xbd, 0x39, 0x4a, 0xd5, 0x07, 0xa4, 0x9f, 0x54, 0x79, 0xa0, 0x7f, 0x39, 0x97,
0x0c, 0x73, 0x1f, 0x89, 0x64, 0x1b, 0xea, 0x73, 0x2e, 0xe4, 0x38, 0xf0, 0xd8, 0x94, 0x89, 0x6e,
0x11, 0x53, 0x00, 0x05, 0x1d, 0x20, 0x42, 0xfa, 0xd0, 0x99, 0x53, 0x21, 0xc7, 0x2a, 0x11, 0x2f,
0x1c, 0x53, 0x29, 0xd9, 0x22, 0x90, 0xdd, 0xd2, 0x8e, 0xb5, 0x5b, 0x74, 0xda, 0x2a, 0xe4, 0x60,
0xe4, 0xbe, 0x0e, 0x90, 0xdb, 0xb0, 0x99, 0xa5, 0x8e, 0xa7, 0x7c, 0xe9, 0xcb, 0x6e, 0x19, 0x07,
0x90, 0x30, 0x4d, 0x1e, 0xaa, 0x88, 0xfd, 0x02, 0xb6, 0xd7, 0x36, 0x4e, 0x04, 0xdc, 0x17, 0x8c,
0xdc, 0x85, 0xaa, 0x49, 0x5b, 0x74, 0xad, 0x9d, 0xe2, 0x6e, 0x7d, 0x70, 0xb5, 0x9f, 0x2c, 0x7a,
0x7e, 0xa4, 0x13, 0xd3, 0xed, 0x4f, 0xa1, 0xf9, 0x90, 0xc9, 0x43, 0x49, 0x93, 0x75, 0xb8, 0x06,
0x17, 0xd5, 0x4e, 0x18, 0x7b, 0xae, 0xee, 0xe2, 0x5e, 0xe3, 0xd7, 0x37, 0xdb, 0x17, 0x7e, 0x7f,
0xb3, 0x5d, 0x79, 0xca, 0x5d, 0x36, 0xda, 0x77, 0x2a, 0x2a, 0x3c, 0x72, 0xed, 0x1f, 0x2d, 0x68,
0x25, 0x83, 0x4d, 0x2e, 0xdb, 0x50, 0xa7, 0x4b, 0xd7, 0x8b, 0xea, 0xb2, 0xb0, 0x2e, 0x40, 0x08,
0xeb, 0x49, 0x08, 0xb8, 0x7f, 0x70, 0x29, 0x2c, 0x43, 0x70, 0x14, 0x42, 0xde, 0x83, 0x8d, 0x65,
0xa0, 0xb6, 0x8f, 0x91, 0x28, 0xa2, 0x44, 0x5d, 0x63, 0x5a, 0x23, 0xa1, 0x68, 0x91, 0x12, 0x8a,
0x18, 0x0a, 0xaa, 0xd8, 0x7f, 0x58, 0x40, 0x86, 0x21, 0xa3, 0x92, 0xfd, 0xab, 0xe2, 0x56, 0xeb,
0x28, 0xe4, 0xea, 0xe8, 0x43, 0x47, 0x13, 0xc4, 0x72, 0x3a, 0x65, 0x42, 0x64, 0xb2, 0x6d, 0x63,
0xe8, 0x50, 0x47, 0x56, 0x73, 0xd6, 0xc4, 0x52, 0xbe, 0xac, 0xdb, 0xb0, 0x69, 0x28, 0x59, 0x4d,
0xb3, 0x39, 0x74, 0x2c, 0x2d, 0x6a, 0xbf, 0x05, 0x9d, 0x4c, 0x91, 0x7a, 0x11, 0xec, 0x1b, 0x40,
0x30, 0xae, 0x6a, 0x4a, 0x96, 0x66, 0x13, 0xca, 0xe9, 0x45, 0xd1, 0x1f, 0x76, 0x07, 0xda, 0x69,
0x2e, 0xb6, 0x49, 0x81, 0x0f, 0x99, 0xdc, 0x5b, 0x4e, 0x8f, 0x59, 0xdc, 0x3b, 0xfb, 0x11, 0x90,
0x34, 0x98, 0xa8, 0x4a, 0x2e, 0xe9, 0x3c, 0x52, 0xc5, 0x0f, 0x72, 0x05, 0x8a, 0x9e, 0x2b, 0xba,
0x85, 0x9d, 0xe2, 0xee, 0xc6, 0x1e, 0xa4, 0xfa, 0xab, 0x60, 0x7b, 0x80, 0x1b, 0x47, 0x2b, 0x45,
0x2b, 0xb3, 0x05, 0x85, 0xb5, 0x8b, 0x52, 0xf0, 0x5c, 0xfb, 0xab, 0x54, 0x4a, 0xf1, 0xe4, 0x67,
0x0c, 0x22, 0x3b, 0x50, 0x56, 0xeb, 0xa9, 0x13, 0xa9, 0x0f, 0xa0, 0x8f, 0x1e, 0xa7, 0x08, 0x8e,
0x0e, 0xd8, 0x37, 0xa0, 0xa2, 0x35, 0xcf, 0xc1, 0xed, 0x03, 0x68, 0xae, 0x3a, 0x90, 0x09, 0xdf,
0x5a, 0xc7, 0x7f, 0x0c, 0xcd, 0x03, 0xcf, 0x9f, 0x21, 0x74, 0xbe, 0x2a, 0x49, 0x17, 0x2e, 0x52,
0xd7, 0x0d, 0x99, 0x10, 0xb8, 0xe5, 0x6a, 0x4e, 0xf4, 0x69, 0xdb, 0xd0, 0x4a, 0xc4, 0x4c, 0xf9,
0x0d, 0x28, 0xf0, 0x63, 0x54, 0xab, 0x3a, 0x05, 0x7e, 0x6c, 0xdf, 0x83, 0xf6, 0x13, 0xce, 0x8f,
0x97, 0x41, 0x7a, 0xca, 0x46, 0x3c, 0x65, 0xed, 0x8c, 0x29, 0x5e, 0x00, 0x49, 0x0f, 0x8f, 0x7b,
0x5c, 0x52, 0xe5, 0xa0, 0x42, 0xb6, 0x4c, 0xc4, 0xc9, 0x87, 0x50, 0x5a, 0x30, 0x49, 0x63, 0x53,
0x8d, 0xe3, 0x5f, 0x30, 0x49, 0x5d, 0x2a, 0xa9, 0x83, 0x71, 0xfb, 0x1b, 0x68, 0x62, 0xa1, 0xfe,
0x11, 0x3f, 0x6f, 0x37, 0x6e, 0x66, 0x53, 0xad, 0x0f, 0xda, 0x89, 0xfa, 0x7d, 0x1d, 0x48, 0xb2,
0xff, 0xc1, 0x82, 0x56, 0x32, 0x81, 0x49, 0xde, 0x86, 0x92, 0x3c, 0x09, 0x74, 0xf2, 0x8d, 0x41,
0x23, 0x19, 0xfe, 0xfc, 0x24, 0x60, 0x0e, 0xc6, 0x48, 0x1f, 0xaa, 0x3c, 0x60, 0x21, 0x95, 0x3c,
0xcc, 0x17, 0xf1, 0xcc, 0x44, 0x9c, 0x98, 0xa3, 0xf8, 0x53, 0x1a, 0xd0, 0xa9, 0x27, 0x4f, 0xf0,
0xb8, 0x67, 0xf8, 0x43, 0x13, 0x71, 0x62, 0x8e, 0xbd, 0x80, 0xe6, 0x03, 0xcf, 0x77, 0x9f, 0x32,
0x1a, 0x9e, 0xb7, 0xf0, 0xf7, 0xa1, 0x2c, 0x24, 0x0d, 0xb5, 0xef, 0xe4, 0x29, 0x3a, 0x98, 0xdc,
0x98, 0xda, 0x74, 0xf4, 0x87, 0x7d, 0x07, 0x5a, 0xc9, 0x74, 0xa6, 0x0d, 0x67, 0xef, 0x6d, 0x02,
0xad, 0xfd, 0xe5, 0x22, 0xc8, 0xb8, 0xc0, 0x27, 0xd0, 0x4e, 0x61, 0xab, 0x52, 0x6b, 0xb7, 0x7d,
0x03, 0x36, 0xd2, 0x9e, 0x6b, 0xff, 0x65, 0x41, 0x47, 0x01, 0x87, 0xcb, 0xc5, 0x82, 0x86, 0x27,
0xb1, 0xd2, 0x55, 0x80, 0xa5, 0x60, 0xee, 0x58, 0x04, 0x74, 0xca, 0x8c, 0x7d, 0xd4, 0x14, 0x72,
0xa8, 0x00, 0x72, 0x0d, 0x9a, 0xf4, 0x35, 0xf5, 0xe6, 0xea, 0xe2, 0x32, 0x1c, 0xed, 0xc2, 0x8d,
0x18, 0xd6, 0x44, 0xe5, 0xac, 0x4a, 0xc7, 0xf3, 0x67, 0xb8, 0x55, 0xa2, 0x0b, 0x43, 0x30, 0x77,
0xa4, 0x21, 0xe5, 0xe6, 0x48, 0x61, 0x9a, 0xa1, 0xbd, 0x17, 0x67, 0xff, 0x5c, 0x13, 0x3e, 0x80,
0x06, 0x12, 0x26, 0xd4, 0x77, 0xbf, 0xf5, 0x5c, 0xf9, 0xd2, 0x98, 0xee, 0x25, 0x85, 0xee, 0x45,
0x20, 0xb9, 0x05, 0x9d, 0x24, 0xa7, 0x84, 0x5b, 0xd1, 0x06, 0x1d, 0x87, 0xe2, 0x01, 0xd8, 0x56,
0x2a, 0x5e, 0x4e, 0x38, 0x0d, 0xdd, 0xa8, 0x1f, 0xbf, 0x15, 0xa1, 0x9d, 0x02, 0x4d, 0x37, 0xce,
0x7d, 0x33, 0x5d, 0x87, 0x16, 0x12, 0xa7, 0xdc, 0xf7, 0xd9, 0x54, 0xbd, 0xc1, 0x84, 0x69, 0x4c,
0x53, 0xe1, 0xc3, 0x04, 0x26, 0x37, 0xa1, 0x3d, 0xe1, 0x5c, 0x0a, 0x19, 0xd2, 0x60, 0x1c, 0x9d,
0xa4, 0x22, 0x1e, 0xfa, 0x56, 0x1c, 0x30, 0x07, 0x49, 0xe9, 0xe2, 0x1b, 0xc8, 0xa7, 0xf3, 0x98,
0x5b, 0x42, 0x6e, 0x33, 0xc2, 0x53, 0x54, 0xf6, 0xdd, 0x0a, 0xb5, 0xac, 0xa9, 0x11, 0x1e, 0x51,
0xef, 0xe0, 0x4e, 0x96, 0x02, 0x7b, 0x54, 0x1f, 0x6c, 0xa5, 0x1e, 0x26, 0xa7, 0xec, 0x09, 0x47,
0x93, 0xc9, 0x47, 0x50, 0xd1, 0xb7, 0x5d, 0xf7, 0x22, 0x0e, 0x7b, 0xa7, 0xaf, 0xdf, 0x97, 0xfd,
0xe8, 0x7d, 0xd9, 0xdf, 0x37, 0xef, 0x4f, 0xc7, 0x10, 0xc9, 0x67, 0x50, 0xc7, 0x97, 0x58, 0xe0,
0xf9, 0x33, 0xe6, 0x76, 0xab, 0x38, 0xae, 0x97, 0x1b, 0xf7, 0x3c, 0x7a, 0x97, 0x3a, 0xa0, 0xe8,
0x07, 0xc8, 0x26, 0xf7, 0x60, 0x03, 0x07, 0xbf, 0x5a, 0xb2, 0xd0, 0x63, 0x6e, 0xb7, 0x76, 0xe6,
0x68, 0x9c, 0xec, 0x4b, 0x4d, 0x1f, 0xfc, 0x52, 0x84, 0x8d, 0xc7, 0xd4, 0x1d, 0x45, 0xa5, 0x91,
0x11, 0x40, 0x72, 0xa9, 0x92, 0x2b, 0xa9, 0xa2, 0x73, 0x77, 0x6d, 0xef, 0xea, 0x9a, 0xa8, 0xd9,
0x17, 0x43, 0xa8, 0x46, 0xbe, 0x4f, 0x7a, 0x29, 0xea, 0xca, 0xcd, 0xd2, 0x7b, 0xf7, 0xd4, 0x98,
0x11, 0x19, 0x01, 0x24, 0xce, 0x9e, 0xc9, 0x27, 0x77, 0x5f, 0x64, 0xf2, 0x39, 0xe5, 0x3a, 0x18,
0x42, 0x35, 0x72, 0xd9, 0x4c, 0x3e, 0x2b, 0xde, 0x9e, 0xc9, 0x27, 0x67, 0xcb, 0x43, 0xa8, 0x46,
0x1e, 0x95, 0x11, 0x59, 0xf1, 0xc9, 0x8c, 0x48, 0xce, 0xd4, 0x1e, 0x40, 0x2d, 0xb6, 0x27, 0x92,
0x66, 0xae, 0x1a, 0x59, 0xef, 0xca, 0xe9, 0x41, 0xad, 0x33, 0xf8, 0xb9, 0x00, 0xad, 0x67, 0xaf,
0x59, 0x38, 0xa7, 0x27, 0xff, 0xcb, 0x0a, 0xfe, 0x47, 0x79, 0xaa, 0xa6, 0x45, 0xcf, 0xed, 0x4c,
0xd3, 0x56, 0x1e, 0xf0, 0x99, 0xa6, 0xe5, 0xde, 0xe7, 0x4f, 0xa0, 0x9e, 0x7a, 0x31, 0x92, 0x4c,
0xea, 0xb9, 0xe7, 0x72, 0x6f, 0x6b, 0x5d, 0xd8, 0xb4, 0xee, 0x27, 0x0b, 0x3a, 0xf8, 0x4f, 0xe8,
0x50, 0xf2, 0x90, 0x25, 0xdd, 0xdb, 0x83, 0xb2, 0xd6, 0xbf, 0xbc, 0x72, 0xde, 0x4f, 0x55, 0x3e,
0xc5, 0x08, 0xec, 0x0b, 0xe4, 0x11, 0xd4, 0x62, 0x97, 0xcc, 0xb6, 0x6d, 0xc5, 0x50, 0xb3, 0x6d,
0x5b, 0x35, 0x56, 0xfb, 0xc2, 0xe0, 0x7b, 0x0b, 0x36, 0x53, 0xff, 0x82, 0x92, 0x34, 0x03, 0xb8,
0xbc, 0xe6, 0xbf, 0x15, 0xb9, 0x9e, 0x3e, 0x05, 0xff, 0xf8, 0xc7, 0xb5, 0x77, 0xe3, 0x3c, 0x54,
0x9d, 0xcc, 0x5e, 0xe9, 0xeb, 0x42, 0x30, 0x99, 0x54, 0xd0, 0x50, 0x3e, 0xfe, 0x3b, 0x00, 0x00,
0xff, 0xff, 0xe0, 0xc7, 0x2f, 0x50, 0x9b, 0x0f, 0x00, 0x00,
// 1735 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x4d, 0x73, 0x1b, 0x4d,
0x11, 0xce, 0xea, 0x2b, 0x56, 0x4b, 0xd6, 0xc7, 0xc8, 0xef, 0xfb, 0x0a, 0x25, 0xb1, 0x9c, 0xe5,
0x23, 0x4e, 0x42, 0x29, 0x41, 0x84, 0x43, 0x48, 0xe5, 0x10, 0xdb, 0x24, 0x51, 0x25, 0x24, 0xce,
0xda, 0x5c, 0xa8, 0x14, 0xaa, 0x91, 0x76, 0x2c, 0x2d, 0x96, 0x76, 0x36, 0xbb, 0xb3, 0x21, 0xfe,
0x03, 0x14, 0xfc, 0x01, 0xaa, 0xe0, 0xca, 0x9f, 0xa0, 0xe0, 0x0f, 0x70, 0xe3, 0xce, 0x21, 0x17,
0x0a, 0xf8, 0x0d, 0xdc, 0xa8, 0xe9, 0x99, 0xfd, 0x94, 0x84, 0x5d, 0xc0, 0x7b, 0xd3, 0x3e, 0xfd,
0x4c, 0x6f, 0x77, 0x4f, 0x6f, 0xcf, 0x33, 0x82, 0xa6, 0xe3, 0x06, 0x1e, 0x9b, 0x0a, 0xee, 0x0f,
0x3c, 0x9f, 0x0b, 0x4e, 0xaa, 0x31, 0xd0, 0x83, 0x19, 0x9f, 0x71, 0x05, 0xf7, 0xc0, 0xe5, 0x36,
0xd3, 0xbf, 0x9b, 0x1e, 0x77, 0x5c, 0xc1, 0x7c, 0x7b, 0xa2, 0x81, 0xdd, 0x19, 0xe7, 0xb3, 0x05,
0x7b, 0x80, 0x4f, 0x93, 0xf0, 0xec, 0x81, 0x1d, 0xfa, 0x54, 0x38, 0xdc, 0xd5, 0xf6, 0x7e, 0xde,
0x2e, 0x9c, 0x25, 0x0b, 0x04, 0x5d, 0x7a, 0x8a, 0x60, 0xbe, 0x81, 0xdd, 0xd7, 0x4e, 0x20, 0x46,
0xbe, 0xcf, 0x3c, 0xea, 0xd3, 0xc9, 0x82, 0x9d, 0xb0, 0xd9, 0x92, 0xb9, 0x22, 0xb0, 0xd8, 0x87,
0x90, 0x05, 0x82, 0xec, 0x40, 0x79, 0xe1, 0x2c, 0x1d, 0xd1, 0x35, 0xf6, 0x8c, 0xfd, 0xb2, 0xa5,
0x1e, 0xc8, 0x97, 0x50, 0xe1, 0x67, 0x67, 0x01, 0x13, 0xdd, 0x02, 0xc2, 0xfa, 0xc9, 0xfc, 0x87,
0x01, 0x64, 0xd5, 0x19, 0x21, 0x50, 0xf2, 0xa8, 0x98, 0xa3, 0x8f, 0xba, 0x85, 0xbf, 0xc9, 0x63,
0x68, 0x04, 0xca, 0x3c, 0xb6, 0x99, 0xa0, 0xce, 0x02, 0x5d, 0xd5, 0x86, 0x64, 0x90, 0x64, 0x79,
0xac, 0x7e, 0x59, 0xdb, 0x9a, 0x79, 0x84, 0x44, 0xd2, 0x87, 0xda, 0x82, 0x07, 0x62, 0xec, 0x39,
0x6c, 0xca, 0x82, 0x6e, 0x11, 0x43, 0x00, 0x09, 0x1d, 0x23, 0x42, 0x06, 0xd0, 0x59, 0xd0, 0x40,
0x8c, 0x65, 0x20, 0x8e, 0x3f, 0xa6, 0x42, 0xb0, 0xa5, 0x27, 0xba, 0xa5, 0x3d, 0x63, 0xbf, 0x68,
0xb5, 0xa5, 0xc9, 0x42, 0xcb, 0x33, 0x65, 0x20, 0x0f, 0x61, 0x27, 0x4b, 0x1d, 0x4f, 0x79, 0xe8,
0x8a, 0x6e, 0x19, 0x17, 0x10, 0x3f, 0x4d, 0x3e, 0x94, 0x16, 0xf3, 0x3d, 0xf4, 0x37, 0x16, 0x2e,
0xf0, 0xb8, 0x1b, 0x30, 0xf2, 0x18, 0xb6, 0x74, 0xd8, 0x41, 0xd7, 0xd8, 0x2b, 0xee, 0xd7, 0x86,
0xb7, 0x06, 0xc9, 0xa6, 0xaf, 0xae, 0xb4, 0x62, 0xba, 0xf9, 0x43, 0x68, 0xbe, 0x60, 0xe2, 0x44,
0xd0, 0x64, 0x1f, 0xee, 0xc0, 0x75, 0xd9, 0x09, 0x63, 0xc7, 0x56, 0x55, 0x3c, 0x68, 0xfc, 0xf9,
0x73, 0xff, 0xda, 0x5f, 0x3f, 0xf7, 0x2b, 0x6f, 0xb8, 0xcd, 0x46, 0x47, 0x56, 0x45, 0x9a, 0x47,
0xb6, 0xf9, 0x3b, 0x03, 0x5a, 0xc9, 0x62, 0x1d, 0x4b, 0x1f, 0x6a, 0x34, 0xb4, 0x9d, 0x28, 0x2f,
0x03, 0xf3, 0x02, 0x84, 0x30, 0x9f, 0x84, 0x80, 0xfd, 0x83, 0x5b, 0x61, 0x68, 0x82, 0x25, 0x11,
0x72, 0x1b, 0xea, 0xa1, 0x27, 0xdb, 0x47, 0xbb, 0x28, 0xa2, 0x8b, 0x9a, 0xc2, 0x94, 0x8f, 0x84,
0xa2, 0x9c, 0x94, 0xd0, 0x89, 0xa6, 0xa0, 0x17, 0xf3, 0x6f, 0x06, 0x90, 0x43, 0x9f, 0x51, 0xc1,
0xfe, 0xab, 0xe4, 0xf2, 0x79, 0x14, 0x56, 0xf2, 0x18, 0x40, 0x47, 0x11, 0x82, 0x70, 0x3a, 0x65,
0x41, 0x90, 0x89, 0xb6, 0x8d, 0xa6, 0x13, 0x65, 0xc9, 0xc7, 0xac, 0x88, 0xa5, 0xd5, 0xb4, 0x1e,
0xc2, 0x8e, 0xa6, 0x64, 0x7d, 0xea, 0xe6, 0x50, 0xb6, 0xb4, 0x53, 0xf3, 0x0b, 0xe8, 0x64, 0x92,
0x54, 0x9b, 0x60, 0xde, 0x03, 0x82, 0x76, 0x99, 0x53, 0xb2, 0x35, 0x3b, 0x50, 0x4e, 0x6f, 0x8a,
0x7a, 0x30, 0x3b, 0xd0, 0x4e, 0x73, 0xb1, 0x4c, 0x12, 0x7c, 0xc1, 0xc4, 0x41, 0x38, 0x3d, 0x67,
0x71, 0xed, 0xcc, 0x97, 0x40, 0xd2, 0x60, 0xe2, 0x55, 0x70, 0x41, 0x17, 0x91, 0x57, 0x7c, 0x20,
0x37, 0xa1, 0xe8, 0xd8, 0x41, 0xb7, 0xb0, 0x57, 0xdc, 0xaf, 0x1f, 0x40, 0xaa, 0xbe, 0x12, 0x36,
0x87, 0xd8, 0x38, 0xca, 0x53, 0xb4, 0x33, 0xbb, 0x50, 0xd8, 0xb8, 0x29, 0x05, 0xc7, 0x36, 0x7f,
0x92, 0x0a, 0x29, 0x7e, 0xf9, 0x25, 0x8b, 0xc8, 0x1e, 0x94, 0xe5, 0x7e, 0xaa, 0x40, 0x6a, 0x43,
0x18, 0xe0, 0x8c, 0x93, 0x04, 0x4b, 0x19, 0xcc, 0x7b, 0x50, 0x51, 0x3e, 0xaf, 0xc0, 0x1d, 0x00,
0x28, 0xae, 0xfc, 0x20, 0x13, 0xbe, 0xb1, 0x89, 0xff, 0x0a, 0x9a, 0xc7, 0x8e, 0x3b, 0x43, 0xe8,
0x6a, 0x59, 0x92, 0x2e, 0x5c, 0xa7, 0xb6, 0xed, 0xb3, 0x20, 0xc0, 0x96, 0xab, 0x5a, 0xd1, 0xa3,
0x69, 0x42, 0x2b, 0x71, 0xa6, 0xd3, 0x6f, 0x40, 0x81, 0x9f, 0xa3, 0xb7, 0x2d, 0xab, 0xc0, 0xcf,
0xcd, 0xa7, 0xd0, 0x7e, 0xcd, 0xf9, 0x79, 0xe8, 0xa5, 0x5f, 0xd9, 0x88, 0x5f, 0x59, 0xbd, 0xe4,
0x15, 0xef, 0x81, 0xa4, 0x97, 0xc7, 0x35, 0x2e, 0xc9, 0x74, 0xd0, 0x43, 0x36, 0x4d, 0xc4, 0xc9,
0x77, 0xa0, 0xb4, 0x64, 0x82, 0xc6, 0x43, 0x35, 0xb6, 0xff, 0x98, 0x09, 0x6a, 0x53, 0x41, 0x2d,
0xb4, 0x9b, 0x3f, 0x83, 0x26, 0x26, 0xea, 0x9e, 0xf1, 0xab, 0x56, 0xe3, 0x7e, 0x36, 0xd4, 0xda,
0xb0, 0x9d, 0x78, 0x7f, 0xa6, 0x0c, 0x49, 0xf4, 0xbf, 0x31, 0xa0, 0x95, 0xbc, 0x40, 0x07, 0x6f,
0x42, 0x49, 0x5c, 0x78, 0x2a, 0xf8, 0xc6, 0xb0, 0x91, 0x2c, 0x3f, 0xbd, 0xf0, 0x98, 0x85, 0x36,
0x32, 0x80, 0x2d, 0xee, 0x31, 0x9f, 0x0a, 0xee, 0xaf, 0x26, 0xf1, 0x56, 0x5b, 0xac, 0x98, 0x23,
0xf9, 0x53, 0xea, 0xd1, 0xa9, 0x23, 0x2e, 0xf0, 0x73, 0xcf, 0xf0, 0x0f, 0xb5, 0xc5, 0x8a, 0x39,
0xe6, 0x12, 0x9a, 0xcf, 0x1d, 0xd7, 0x7e, 0xc3, 0xa8, 0x7f, 0xd5, 0xc4, 0xbf, 0x05, 0xe5, 0x40,
0x50, 0x5f, 0xcd, 0x9d, 0x55, 0x8a, 0x32, 0x26, 0x27, 0xa6, 0x1a, 0x3a, 0xea, 0xc1, 0x7c, 0x04,
0xad, 0xe4, 0x75, 0xba, 0x0c, 0x97, 0xf7, 0x36, 0x81, 0xd6, 0x51, 0xb8, 0xf4, 0x32, 0x53, 0xe0,
0x07, 0xd0, 0x4e, 0x61, 0x79, 0x57, 0x1b, 0xdb, 0xbe, 0x01, 0xf5, 0xf4, 0xcc, 0x35, 0xff, 0x65,
0x40, 0x47, 0x02, 0x27, 0xe1, 0x72, 0x49, 0xfd, 0x8b, 0xd8, 0xd3, 0x2d, 0x80, 0x30, 0x60, 0xf6,
0x38, 0xf0, 0xe8, 0x94, 0xe9, 0xf1, 0x51, 0x95, 0xc8, 0x89, 0x04, 0xc8, 0x1d, 0x68, 0xd2, 0x8f,
0xd4, 0x59, 0xc8, 0x83, 0x4b, 0x73, 0xd4, 0x14, 0x6e, 0xc4, 0xb0, 0x22, 0xca, 0xc9, 0x2a, 0xfd,
0x38, 0xee, 0x0c, 0x5b, 0x25, 0x3a, 0x30, 0x02, 0x66, 0x8f, 0x14, 0x24, 0xa7, 0x39, 0x52, 0x98,
0x62, 0xa8, 0xd9, 0x8b, 0x6f, 0xff, 0x91, 0x22, 0x7c, 0x1b, 0x1a, 0x48, 0x98, 0x50, 0xd7, 0xfe,
0x85, 0x63, 0x8b, 0xb9, 0x1e, 0xba, 0xdb, 0x12, 0x3d, 0x88, 0x40, 0xf2, 0x00, 0x3a, 0x49, 0x4c,
0x09, 0xb7, 0xa2, 0x06, 0x74, 0x6c, 0x8a, 0x17, 0x60, 0x59, 0x69, 0x30, 0x9f, 0x70, 0xea, 0xdb,
0x51, 0x3d, 0xfe, 0x52, 0x84, 0x76, 0x0a, 0xd4, 0xd5, 0xb8, 0xf2, 0xc9, 0x74, 0x17, 0x5a, 0x48,
0x9c, 0x72, 0xd7, 0x65, 0x53, 0xa9, 0xc1, 0x02, 0x5d, 0x98, 0xa6, 0xc4, 0x0f, 0x13, 0x98, 0xdc,
0x87, 0xf6, 0x84, 0x73, 0x11, 0x08, 0x9f, 0x7a, 0xe3, 0xe8, 0x4b, 0x2a, 0xe2, 0x47, 0xdf, 0x8a,
0x0d, 0xfa, 0x43, 0x92, 0x7e, 0x51, 0x03, 0xb9, 0x74, 0x11, 0x73, 0x4b, 0xc8, 0x6d, 0x46, 0x78,
0x8a, 0xca, 0x3e, 0xe5, 0xa8, 0x65, 0x45, 0x8d, 0xf0, 0x88, 0xfa, 0x08, 0x3b, 0x59, 0x04, 0x58,
0xa3, 0xda, 0x70, 0x37, 0x25, 0x4c, 0xd6, 0xf4, 0x84, 0xa5, 0xc8, 0xe4, 0x7b, 0x50, 0x51, 0xa7,
0x5d, 0xf7, 0x3a, 0x2e, 0xfb, 0xc6, 0x40, 0xe9, 0xcb, 0x41, 0xa4, 0x2f, 0x07, 0x47, 0x5a, 0x7f,
0x5a, 0x9a, 0x48, 0x9e, 0x40, 0x0d, 0x95, 0x98, 0xe7, 0xb8, 0x33, 0x66, 0x77, 0xb7, 0x70, 0x5d,
0x6f, 0x65, 0xdd, 0x69, 0xa4, 0x4b, 0x2d, 0x90, 0xf4, 0x63, 0x64, 0x93, 0xa7, 0x50, 0xc7, 0xc5,
0x1f, 0x42, 0xe6, 0x3b, 0xcc, 0xee, 0x56, 0x2f, 0x5d, 0x8d, 0x2f, 0x7b, 0xa7, 0xe8, 0xe6, 0x6f,
0x0d, 0xd8, 0xd1, 0xda, 0xea, 0x25, 0xa3, 0x0b, 0x31, 0x8f, 0xbe, 0xf3, 0x2f, 0xa1, 0x32, 0xc1,
0x13, 0x43, 0x0b, 0x52, 0xfd, 0x24, 0xdb, 0x8d, 0xb9, 0x53, 0xff, 0xc2, 0x13, 0xcc, 0x1e, 0xa3,
0x60, 0xc5, 0x0f, 0xdd, 0xda, 0x8e, 0xd1, 0x63, 0xa9, 0x5c, 0xbf, 0x09, 0x91, 0x1e, 0x1d, 0x3b,
0xae, 0xcd, 0x3e, 0xe9, 0xd6, 0xae, 0x6b, 0x70, 0x24, 0x31, 0xf9, 0x19, 0x79, 0x3e, 0xff, 0x39,
0x9b, 0x0a, 0xd9, 0x3b, 0x25, 0xf4, 0x53, 0xd5, 0xc8, 0xc8, 0x36, 0xff, 0x6e, 0xc0, 0x76, 0x26,
0x36, 0xb9, 0x7b, 0x4b, 0xc7, 0x75, 0x96, 0xe1, 0x72, 0xec, 0xb3, 0x0f, 0xa1, 0xe3, 0x33, 0x5b,
0x6b, 0xee, 0xa6, 0xc6, 0x2d, 0x0d, 0x27, 0x87, 0xbb, 0x12, 0xdf, 0xfa, 0x70, 0xbf, 0x0b, 0x2d,
0x2d, 0x62, 0xc5, 0xdc, 0x67, 0xc1, 0x9c, 0x2f, 0x6c, 0x2d, 0x8d, 0x9b, 0x0a, 0x3f, 0x8d, 0x60,
0xd9, 0x81, 0x91, 0x96, 0x49, 0xb8, 0x25, 0xe4, 0xb6, 0xb4, 0x21, 0x21, 0xdf, 0x86, 0x3a, 0x77,
0x17, 0x8e, 0xcb, 0xc6, 0x6a, 0xc2, 0x94, 0x91, 0x57, 0x53, 0x18, 0x4e, 0x21, 0x79, 0x78, 0xe9,
0xe4, 0xb1, 0xa1, 0xea, 0x56, 0xf4, 0x68, 0xfe, 0xd2, 0x80, 0x2f, 0x72, 0x7b, 0xa0, 0xbf, 0xac,
0x87, 0x50, 0x99, 0x23, 0xa2, 0x8f, 0xb0, 0x6e, 0xba, 0x07, 0x33, 0x2b, 0x34, 0x8f, 0x3c, 0x01,
0xf0, 0x99, 0x1d, 0xba, 0x36, 0x75, 0xa7, 0x17, 0xfa, 0x4c, 0xb8, 0x91, 0xba, 0x2d, 0x58, 0xb1,
0xf1, 0x64, 0x3a, 0x67, 0x4b, 0x66, 0xa5, 0xe8, 0xe6, 0x3f, 0x0d, 0xe8, 0xbc, 0x9d, 0xc8, 0xea,
0x67, 0x7b, 0x61, 0x75, 0xcf, 0x8d, 0x75, 0x7b, 0x9e, 0xb4, 0x4c, 0x21, 0xd3, 0x32, 0xd9, 0x6d,
0x2e, 0xe6, 0xb6, 0x59, 0xca, 0x51, 0x3c, 0x14, 0xc6, 0xf4, 0x4c, 0x30, 0x7f, 0x1c, 0x15, 0x49,
0x5f, 0x44, 0xd0, 0xf4, 0x4c, 0x5a, 0xa2, 0x8b, 0xd2, 0x77, 0x81, 0x30, 0xd7, 0x1e, 0x4f, 0xd8,
0x19, 0xf7, 0x59, 0x4c, 0x57, 0x43, 0xaf, 0xc5, 0x5c, 0xfb, 0x00, 0x0d, 0x11, 0x3b, 0x3e, 0x69,
0x2a, 0xa9, 0xbb, 0x99, 0xf9, 0x6b, 0x03, 0x76, 0xb2, 0x99, 0xea, 0x8a, 0x3f, 0x5a, 0xb9, 0x90,
0x6c, 0xae, 0x79, 0xcc, 0xfc, 0x9f, 0xaa, 0x3e, 0xfc, 0x53, 0x11, 0xea, 0xaf, 0xa8, 0x3d, 0x8a,
0xde, 0x42, 0x46, 0x00, 0x89, 0xae, 0x25, 0x37, 0x53, 0xef, 0x5f, 0x91, 0xbb, 0xbd, 0x5b, 0x1b,
0xac, 0x3a, 0x9d, 0x43, 0xd8, 0x8a, 0xa4, 0x17, 0xe9, 0xa5, 0xa8, 0x39, 0x71, 0xd7, 0xbb, 0xb1,
0xd6, 0xa6, 0x9d, 0x8c, 0x00, 0x12, 0x71, 0x95, 0x89, 0x67, 0x45, 0xb2, 0x65, 0xe2, 0x59, 0xa3,
0xc8, 0x0e, 0x61, 0x2b, 0x12, 0x3a, 0x99, 0x78, 0x72, 0xf2, 0x2a, 0x13, 0xcf, 0x8a, 0x32, 0x3a,
0x84, 0xad, 0x48, 0x26, 0x64, 0x9c, 0xe4, 0xa4, 0x4a, 0xc6, 0xc9, 0x8a, 0xae, 0x78, 0x0e, 0xd5,
0x58, 0x21, 0x90, 0x34, 0x33, 0xaf, 0x25, 0x7a, 0x37, 0xd7, 0x1b, 0x95, 0x9f, 0xe1, 0x1f, 0x0a,
0xd0, 0x7a, 0xfb, 0x91, 0xf9, 0x0b, 0x7a, 0xf1, 0xb5, 0xec, 0xe0, 0xff, 0x29, 0x4e, 0x59, 0xb4,
0xe8, 0xc6, 0x9b, 0x29, 0x5a, 0xee, 0x0e, 0x9d, 0x29, 0xda, 0xca, 0x15, 0xf9, 0x35, 0xd4, 0x52,
0x97, 0x36, 0x92, 0x09, 0x7d, 0xe5, 0xc6, 0xda, 0xdb, 0xdd, 0x64, 0xd6, 0xa5, 0xfb, 0xbd, 0x01,
0x1d, 0xfc, 0x33, 0xe2, 0x44, 0x70, 0x9f, 0x25, 0xd5, 0x3b, 0x80, 0xb2, 0xf2, 0xff, 0x55, 0xee,
0xc8, 0x5d, 0xeb, 0x79, 0xcd, 0x59, 0x6c, 0x5e, 0x23, 0x2f, 0xa1, 0x1a, 0x0b, 0x95, 0x6c, 0xd9,
0x72, 0x9a, 0x26, 0x5b, 0xb6, 0xbc, 0xb6, 0x31, 0xaf, 0x0d, 0x7f, 0x65, 0xc0, 0x4e, 0xea, 0x8f,
0x88, 0x24, 0x4c, 0x0f, 0xbe, 0xda, 0xf0, 0xf7, 0x06, 0xb9, 0x9b, 0xfe, 0x0a, 0xfe, 0xe3, 0x7f,
0x47, 0xbd, 0x7b, 0x57, 0xa1, 0xea, 0x82, 0xfd, 0xd1, 0x80, 0xa6, 0x9a, 0x3d, 0x49, 0x14, 0xef,
0xa0, 0x9e, 0x1e, 0x64, 0x24, 0x5d, 0x9a, 0x35, 0xb3, 0xbc, 0xd7, 0xdf, 0x68, 0x8f, 0x6b, 0x77,
0x9a, 0x3f, 0x76, 0xfb, 0x1b, 0x47, 0xa0, 0x76, 0xba, 0xb7, 0x99, 0x10, 0x79, 0x3d, 0x28, 0xfd,
0xb4, 0xe0, 0x4d, 0x26, 0x15, 0x14, 0x24, 0xdf, 0xff, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d,
0x67, 0x84, 0xd4, 0xdb, 0x13, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -2006,3 +2344,104 @@ var _IrreparableInspector_serviceDesc = grpc.ServiceDesc{
Streams: []grpc.StreamDesc{},
Metadata: "inspector.proto",
}
// HealthInspectorClient is the client API for HealthInspector service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type HealthInspectorClient interface {
// ObjectHealth will returns stats about the health of an object
ObjectHealth(ctx context.Context, in *ObjectHealthRequest, opts ...grpc.CallOption) (*ObjectHealthResponse, error)
// SegmentHealth will returns stats about the health of a segment
SegmentHealth(ctx context.Context, in *SegmentHealthRequest, opts ...grpc.CallOption) (*SegmentHealthResponse, error)
}
type healthInspectorClient struct {
cc *grpc.ClientConn
}
func NewHealthInspectorClient(cc *grpc.ClientConn) HealthInspectorClient {
return &healthInspectorClient{cc}
}
func (c *healthInspectorClient) ObjectHealth(ctx context.Context, in *ObjectHealthRequest, opts ...grpc.CallOption) (*ObjectHealthResponse, error) {
out := new(ObjectHealthResponse)
err := c.cc.Invoke(ctx, "/inspector.HealthInspector/ObjectHealth", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *healthInspectorClient) SegmentHealth(ctx context.Context, in *SegmentHealthRequest, opts ...grpc.CallOption) (*SegmentHealthResponse, error) {
out := new(SegmentHealthResponse)
err := c.cc.Invoke(ctx, "/inspector.HealthInspector/SegmentHealth", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// HealthInspectorServer is the server API for HealthInspector service.
type HealthInspectorServer interface {
// ObjectHealth will returns stats about the health of an object
ObjectHealth(context.Context, *ObjectHealthRequest) (*ObjectHealthResponse, error)
// SegmentHealth will returns stats about the health of a segment
SegmentHealth(context.Context, *SegmentHealthRequest) (*SegmentHealthResponse, error)
}
func RegisterHealthInspectorServer(s *grpc.Server, srv HealthInspectorServer) {
s.RegisterService(&_HealthInspector_serviceDesc, srv)
}
func _HealthInspector_ObjectHealth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ObjectHealthRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(HealthInspectorServer).ObjectHealth(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/inspector.HealthInspector/ObjectHealth",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(HealthInspectorServer).ObjectHealth(ctx, req.(*ObjectHealthRequest))
}
return interceptor(ctx, in, info, handler)
}
func _HealthInspector_SegmentHealth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SegmentHealthRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(HealthInspectorServer).SegmentHealth(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/inspector.HealthInspector/SegmentHealth",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(HealthInspectorServer).SegmentHealth(ctx, req.(*SegmentHealthRequest))
}
return interceptor(ctx, in, info, handler)
}
var _HealthInspector_serviceDesc = grpc.ServiceDesc{
ServiceName: "inspector.HealthInspector",
HandlerType: (*HealthInspectorServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "ObjectHealth",
Handler: _HealthInspector_ObjectHealth_Handler,
},
{
MethodName: "SegmentHealth",
Handler: _HealthInspector_SegmentHealth_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "inspector.proto",
}

View File

@ -50,6 +50,14 @@ service IrreparableInspector {
rpc ListIrreparableSegments(ListIrreparableSegmentsRequest) returns (ListIrreparableSegmentsResponse);
}
service HealthInspector {
// ObjectHealth will return stats about the health of an object
rpc ObjectHealth(ObjectHealthRequest) returns (ObjectHealthResponse) {}
// SegmentHealth will return stats about the health of a segment
rpc SegmentHealth(SegmentHealthRequest) returns (SegmentHealthResponse) {}
}
// ListSegments
message ListIrreparableSegmentsRequest {
int32 limit = 1;
@ -198,3 +206,38 @@ message DashboardResponse {
google.protobuf.Timestamp last_pinged = 8;
google.protobuf.Timestamp last_queried = 9;
}
message SegmentHealthRequest {
bytes bucket = 1; // segment bucket name
bytes encrypted_path = 2; // segment encrypted path
int64 segment_index = 3; // segment index
bytes project_id = 4; // segment project id
}
message SegmentHealth {
int32 minimum_required = 1; // minimum required stripes for reconstruction (k)
int32 total = 2; // total amount of pieces we generated (n)
int32 repair_threshold = 3; // amount of pieces we need to drop to before triggering repair (m)
int32 success_threshold = 4; // amount of pieces we need to store to call it a success (o)
int32 online_nodes = 5; // amount of pieces with nodes that are online
bytes segment = 6; // path formatted segment index
}
message SegmentHealthResponse {
SegmentHealth health = 1; // Information about a segment's health
pointerdb.RedundancyScheme redundancy = 2; // expected segment info
}
message ObjectHealthRequest {
bytes encrypted_path = 1; // object encrypted path
bytes bucket = 2; // object bucket name
bytes project_id = 3; // object project id
int64 start_after_segment = 4; // Get all segments after specified segment index
int64 end_before_segment = 5; // Stop at segment before specified segment index
int32 limit = 6; // Max number of segments that are checked
}
message ObjectHealthResponse {
repeated SegmentHealth segments = 1; // actual segment info
pointerdb.RedundancyScheme redundancy = 2; // expected segment info
}

View File

@ -0,0 +1,178 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package inspector
import (
"context"
"strconv"
"github.com/skyrings/skyring-common/tools/uuid"
"github.com/zeebo/errs"
"go.uber.org/zap"
monkit "gopkg.in/spacemonkeygo/monkit.v2"
"storj.io/storj/pkg/eestream"
"storj.io/storj/pkg/overlay"
"storj.io/storj/pkg/pb"
"storj.io/storj/pkg/pointerdb"
"storj.io/storj/pkg/storj"
"storj.io/storj/satellite/metainfo"
)
var (
mon = monkit.Package()
// Error wraps errors returned from Server struct methods
Error = errs.Class("Endpoint error")
)
const lastSegmentIndex = int64(-1)
// Endpoint for checking object and segment health
type Endpoint struct {
log *zap.Logger
cache *overlay.Cache
pointerdb *pointerdb.Service
}
// NewEndpoint will initialize an Endpoint struct
func NewEndpoint(log *zap.Logger, cache *overlay.Cache, pdb *pointerdb.Service) *Endpoint {
return &Endpoint{
log: log,
cache: cache,
pointerdb: pdb,
}
}
// ObjectHealth will check the health of an object
func (endpoint *Endpoint) ObjectHealth(ctx context.Context, in *pb.ObjectHealthRequest) (resp *pb.ObjectHealthResponse, err error) {
defer mon.Task()(&ctx)(&err)
var segmentHealthResponses []*pb.SegmentHealth
var redundancy *pb.RedundancyScheme
limit := int64(100)
if in.GetLimit() > 0 {
limit = int64(in.GetLimit())
}
var start int64
if in.GetStartAfterSegment() > 0 {
start = in.GetStartAfterSegment() + 1
}
end := limit + start
if in.GetEndBeforeSegment() > 0 {
end = in.GetEndBeforeSegment()
}
bucket := in.GetBucket()
encryptedPath := in.GetEncryptedPath()
projectID := in.GetProjectId()
segmentIndex := start
for segmentIndex < end {
if segmentIndex-start >= limit {
break
}
segment := &pb.SegmentHealthRequest{
Bucket: bucket,
EncryptedPath: encryptedPath,
SegmentIndex: segmentIndex,
ProjectId: projectID,
}
segmentHealth, err := endpoint.SegmentHealth(ctx, segment)
if err != nil {
if segmentIndex == lastSegmentIndex {
return nil, Error.Wrap(err)
}
segmentIndex = lastSegmentIndex
continue
}
segmentHealthResponses = append(segmentHealthResponses, segmentHealth.GetHealth())
redundancy = segmentHealth.GetRedundancy()
if segmentIndex == lastSegmentIndex {
break
}
segmentIndex++
}
return &pb.ObjectHealthResponse{
Segments: segmentHealthResponses,
Redundancy: redundancy,
}, nil
}
// SegmentHealth will check the health of a segment
func (endpoint *Endpoint) SegmentHealth(ctx context.Context, in *pb.SegmentHealthRequest) (resp *pb.SegmentHealthResponse, err error) {
defer mon.Task()(&ctx)(&err)
health := &pb.SegmentHealth{}
projectID, err := uuid.Parse(string(in.GetProjectId()))
if err != nil {
return nil, Error.Wrap(err)
}
path, err := metainfo.CreatePath(*projectID, in.GetSegmentIndex(), in.GetBucket(), in.GetEncryptedPath())
if err != nil {
return nil, Error.Wrap(err)
}
pointer, err := endpoint.pointerdb.Get(path)
if err != nil {
return nil, Error.Wrap(err)
}
if pointer.GetType() != pb.Pointer_REMOTE {
return nil, Error.New("cannot check health of inline segment")
}
redundancy, err := eestream.NewRedundancyStrategyFromProto(pointer.GetRemote().GetRedundancy())
if err != nil {
return nil, Error.Wrap(err)
}
var nodeIDs storj.NodeIDList
for _, piece := range pointer.GetRemote().GetRemotePieces() {
nodeIDs = append(nodeIDs, piece.NodeId)
}
nodes, err := endpoint.cache.GetAll(ctx, nodeIDs)
if err != nil {
return nil, Error.Wrap(err)
}
neededForRepair := health.GetOnlineNodes() - int32(redundancy.RepairThreshold())
if neededForRepair < 0 {
neededForRepair = int32(0)
}
neededForSuccess := health.GetOnlineNodes() - int32(redundancy.OptimalThreshold())
if neededForSuccess < 0 {
neededForSuccess = int32(0)
}
health.MinimumRequired = int32(redundancy.RequiredCount())
health.Total = int32(redundancy.TotalCount())
health.RepairThreshold = neededForRepair
health.SuccessThreshold = neededForSuccess
health.OnlineNodes = int32(len(nodes))
if in.GetSegmentIndex() > -1 {
health.Segment = []byte("s" + strconv.FormatInt(in.GetSegmentIndex(), 10))
} else {
health.Segment = []byte("l")
}
return &pb.SegmentHealthResponse{
Health: health,
Redundancy: pointer.GetRemote().GetRedundancy(),
}, nil
}

View File

@ -0,0 +1,104 @@
// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package inspector_test
import (
"bytes"
"crypto/rand"
"fmt"
"strings"
"testing"
"github.com/stretchr/testify/require"
"storj.io/storj/internal/memory"
"storj.io/storj/internal/testcontext"
"storj.io/storj/internal/testplanet"
"storj.io/storj/pkg/pb"
"storj.io/storj/pkg/storj"
"storj.io/storj/storage"
)
func TestInspectorStats(t *testing.T) {
ctx := testcontext.New(t)
defer ctx.Cleanup()
planet, err := testplanet.New(t, 1, 6, 1)
require.NoError(t, err)
defer ctx.Check(planet.Shutdown)
planet.Start(ctx)
uplink := planet.Uplinks[0]
testData := make([]byte, 1*memory.MiB)
_, err = rand.Read(testData)
require.NoError(t, err)
bucket := "testbucket"
err = uplink.Upload(ctx, planet.Satellites[0], bucket, "test/path", testData)
require.NoError(t, err)
healthEndpoint := planet.Satellites[0].Inspector.Endpoint
// Get path of random segment we just uploaded and check the health
_ = planet.Satellites[0].Metainfo.Database.Iterate(storage.IterateOptions{Recurse: true},
func(it storage.Iterator) error {
var item storage.ListItem
for it.Next(&item) {
if bytes.Contains(item.Key, []byte(fmt.Sprintf("%s/", bucket))) {
break
}
}
fullPath := storj.SplitPath(item.Key.String())
require.Falsef(t, len(fullPath) < 4, "Could not retrieve a full path from pointerdb")
projectID := fullPath[0]
bucket := fullPath[2]
encryptedPath := strings.Join(fullPath[3:], "/")
{ // Test Segment Health Request
req := &pb.SegmentHealthRequest{
ProjectId: []byte(projectID),
EncryptedPath: []byte(encryptedPath),
Bucket: []byte(bucket),
SegmentIndex: -1,
}
resp, err := healthEndpoint.SegmentHealth(ctx, req)
require.NoError(t, err)
require.Equal(t, int32(0), resp.GetHealth().GetSuccessThreshold())
require.Equal(t, int32(1), resp.GetHealth().GetMinimumRequired())
require.Equal(t, int32(4), resp.GetHealth().GetTotal())
require.Equal(t, int32(0), resp.GetHealth().GetRepairThreshold())
}
{ // Test Object Health Request
objectHealthReq := &pb.ObjectHealthRequest{
ProjectId: []byte(projectID),
EncryptedPath: []byte(encryptedPath),
Bucket: []byte(bucket),
StartAfterSegment: 0,
EndBeforeSegment: 0,
Limit: 0,
}
resp, err := healthEndpoint.ObjectHealth(ctx, objectHealthReq)
require.Len(t, resp.GetSegments(), 1)
segments := resp.GetSegments()
require.Equal(t, int32(0), segments[0].GetSuccessThreshold())
require.Equal(t, int32(1), segments[0].GetMinimumRequired())
require.Equal(t, int32(4), segments[0].GetTotal())
require.Equal(t, int32(0), segments[0].GetRepairThreshold())
require.NoError(t, err)
}
return nil
},
)
}

View File

@ -6,6 +6,7 @@ package metainfo
import (
"bytes"
"context"
"errors"
"strconv"
"github.com/skyrings/skyring-common/tools/uuid"
@ -98,7 +99,7 @@ func (endpoint *Endpoint) SegmentInfo(ctx context.Context, req *pb.SegmentInfoRe
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
path, err := endpoint.createPath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
path, err := CreatePath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
@ -184,7 +185,7 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm
return nil, status.Errorf(codes.Internal, err.Error())
}
path, err := endpoint.createPath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
path, err := CreatePath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
@ -216,7 +217,7 @@ func (endpoint *Endpoint) DownloadSegment(ctx context.Context, req *pb.SegmentDo
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
path, err := endpoint.createPath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
path, err := CreatePath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
@ -264,7 +265,7 @@ func (endpoint *Endpoint) DeleteSegment(ctx context.Context, req *pb.SegmentDele
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
path, err := endpoint.createPath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
path, err := CreatePath(keyInfo.ProjectID, req.Segment, req.Bucket, req.Path)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
@ -310,7 +311,7 @@ func (endpoint *Endpoint) ListSegments(ctx context.Context, req *pb.ListSegments
return nil, status.Errorf(codes.Unauthenticated, err.Error())
}
prefix, err := endpoint.createPath(keyInfo.ProjectID, -1, req.Bucket, req.Prefix)
prefix, err := CreatePath(keyInfo.ProjectID, -1, req.Bucket, req.Prefix)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, err.Error())
}
@ -339,27 +340,6 @@ func createBucketID(projectID uuid.UUID, bucket []byte) []byte {
return []byte(storj.JoinPaths(entries...))
}
func (endpoint *Endpoint) createPath(projectID uuid.UUID, segmentIndex int64, bucket, path []byte) (storj.Path, error) {
if segmentIndex < -1 {
return "", Error.New("invalid segment index")
}
segment := "l"
if segmentIndex > -1 {
segment = "s" + strconv.FormatInt(segmentIndex, 10)
}
entries := make([]string, 0)
entries = append(entries, projectID.String())
entries = append(entries, segment)
if len(bucket) != 0 {
entries = append(entries, string(bucket))
}
if len(path) != 0 {
entries = append(entries, string(path))
}
return storj.JoinPaths(entries...), nil
}
func (endpoint *Endpoint) filterValidPieces(pointer *pb.Pointer) error {
if pointer.Type == pb.Pointer_REMOTE {
var remotePieces []*pb.RemotePiece
@ -457,3 +437,25 @@ func (endpoint *Endpoint) validatePointer(pointer *pb.Pointer) error {
}
return nil
}
// CreatePath will create a Segment path
func CreatePath(projectID uuid.UUID, segmentIndex int64, bucket, path []byte) (storj.Path, error) {
if segmentIndex < -1 {
return "", errors.New("invalid segment index")
}
segment := "l"
if segmentIndex > -1 {
segment = "s" + strconv.FormatInt(segmentIndex, 10)
}
entries := make([]string, 0)
entries = append(entries, projectID.String())
entries = append(entries, segment)
if len(bucket) != 0 {
entries = append(entries, string(bucket))
}
if len(path) != 0 {
entries = append(entries, string(path))
}
return storj.JoinPaths(entries...), nil
}

View File

@ -46,6 +46,7 @@ import (
"storj.io/storj/satellite/console"
"storj.io/storj/satellite/console/consoleauth"
"storj.io/storj/satellite/console/consoleweb"
"storj.io/storj/satellite/inspector"
"storj.io/storj/satellite/mailservice"
"storj.io/storj/satellite/mailservice/simulate"
"storj.io/storj/satellite/metainfo"
@ -146,6 +147,10 @@ type Peer struct {
Endpoint2 *metainfo.Endpoint
}
Inspector struct {
Endpoint *inspector.Endpoint
}
Agreements struct {
Endpoint *bwagreement.Server
}
@ -383,6 +388,17 @@ func New(log *zap.Logger, full *identity.FullIdentity, db DB, config *Config) (*
peer.Accounting.Rollup = rollup.New(peer.Log.Named("rollup"), peer.DB.Accounting(), config.Rollup.Interval)
}
{ // setup inspector
log.Debug("Setting up inspector")
peer.Inspector.Endpoint = inspector.NewEndpoint(
peer.Log.Named("inspector"),
peer.Overlay.Service,
peer.Metainfo.Service,
)
pb.RegisterHealthInspectorServer(peer.Server.PrivateGRPC(), peer.Inspector.Endpoint)
}
{ // setup mailservice
log.Debug("Setting up mail service")
// TODO(yar): test multiple satellites using same OAUTH credentials