Merge master -> bh/push-pull-revert

This commit is contained in:
Brian Hendriks
2019-09-30 10:48:34 -07:00
13 changed files with 342 additions and 210 deletions

View File

@@ -38,6 +38,9 @@ Valid commands for dolt are
```
## Installation
These installation instructions assume that you have Go installed, and that `go` is in your path.
### From Latest Release
Obtain the appropriate archive for your operating system under [releases](https://github.com/liquidata-inc/dolt/releases):
System|Archive
@@ -54,7 +57,27 @@ For Unix systems extract the archive to a directory on in your path, for example
$ tar -xf /your/download/location/dolt-darwin-amd64.tar.gz -C /usr/local/bin
$ ln -s /usr/local/lib/dolt /usr/local/lib/dolt/bin/dolt
```
Verify that your installation has succeeded as follows:
### From Source
Alternatively clone this repository and then, assuming you cloned the repository into your home directory:
```
$ cd ~/dolt/go
$ go install ./cmd/dolt
[...]
$ go install ./cmd/git-dolt
[...]
$ go install ./cmd/git-dolt-smudge
[...]
```
This will install the requisite binaries at `$GOROOT/bin`, which defaults to `$HOME/go`, thus you should see something like (unless you set `$GOROOT` to something else):
```
$ ls -ltr $HOME/go/bin/
dolt git-dolt git-dolt-smudge
```
Ensure that `$GOROOT/bin` is on your path, and then proceed.
### Verify
Whichever method you used, verify that your installation has succeeded as follows:
```
$ dolt
Valid commands for dolt are

View File

@@ -22,20 +22,21 @@ import (
"path/filepath"
"sync"
"github.com/liquidata-inc/dolt/go/libraries/utils/strhelp"
"github.com/liquidata-inc/dolt/go/store/datas"
"github.com/liquidata-inc/dolt/go/cmd/dolt/cli"
"github.com/liquidata-inc/dolt/go/cmd/dolt/errhand"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/dbfactory"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env/actions"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/ref"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/remotestorage"
"github.com/liquidata-inc/dolt/go/libraries/events"
"github.com/liquidata-inc/dolt/go/libraries/utils/argparser"
"github.com/liquidata-inc/dolt/go/libraries/utils/earl"
"github.com/liquidata-inc/dolt/go/libraries/utils/filesys"
"github.com/liquidata-inc/dolt/go/libraries/utils/strhelp"
"github.com/liquidata-inc/dolt/go/store/datas"
"github.com/liquidata-inc/dolt/go/store/types"
)
@@ -94,6 +95,11 @@ func Clone(ctx context.Context, commandStr string, args []string, dEnv *env.Dolt
if verr == nil {
verr = cloneRemote(ctx, srcDB, remoteName, branch, dEnv)
if verr == nil {
evt := events.GetEventFromContext(ctx)
evt.SetAttribute(eventsapi.AttributeID_ACTIVE_REMOTE_URL, remoteUrl)
}
// Make best effort to delete the directory we created.
if verr != nil {
_ = os.Chdir("../")

View File

@@ -19,10 +19,12 @@ import (
"github.com/liquidata-inc/dolt/go/cmd/dolt/cli"
"github.com/liquidata-inc/dolt/go/cmd/dolt/errhand"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env/actions"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/ref"
"github.com/liquidata-inc/dolt/go/libraries/events"
"github.com/liquidata-inc/dolt/go/libraries/utils/argparser"
)
@@ -157,6 +159,9 @@ func fetchRefSpecs(ctx context.Context, dEnv *env.DoltEnv, rem env.Remote, refSp
}
func fetchRemoteBranch(ctx context.Context, dEnv *env.DoltEnv, rem env.Remote, srcDB, destDB *doltdb.DoltDB, srcRef, destRef ref.DoltRef) errhand.VerboseError {
evt := events.GetEventFromContext(ctx)
evt.SetAttribute(eventsapi.AttributeID_ACTIVE_REMOTE_URL, rem.Url)
cs, _ := doltdb.NewCommitSpec("HEAD", srcRef.String())
cm, err := srcDB.Resolve(ctx, cs)

View File

@@ -24,11 +24,13 @@ import (
"github.com/liquidata-inc/dolt/go/cmd/dolt/cli"
"github.com/liquidata-inc/dolt/go/cmd/dolt/errhand"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env/actions"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/ref"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/remotestorage"
"github.com/liquidata-inc/dolt/go/libraries/events"
"github.com/liquidata-inc/dolt/go/libraries/utils/argparser"
"github.com/liquidata-inc/dolt/go/libraries/utils/earl"
"github.com/liquidata-inc/dolt/go/store/datas"
@@ -231,6 +233,9 @@ func deleteRemoteBranch(ctx context.Context, toDelete, remoteRef ref.DoltRef, lo
}
func pushToRemoteBranch(ctx context.Context, dEnv *env.DoltEnv, srcRef, destRef, remoteRef ref.DoltRef, localDB, remoteDB *doltdb.DoltDB, remote env.Remote) errhand.VerboseError {
evt := events.GetEventFromContext(ctx)
evt.SetAttribute(eventsapi.AttributeID_ACTIVE_REMOTE_URL, remote.Url)
cs, _ := doltdb.NewCommitSpec("HEAD", srcRef.GetPath())
cm, err := localDB.Resolve(ctx, cs)

View File

@@ -16,6 +16,9 @@ package commands
import (
"context"
"fmt"
"log"
"strconv"
"time"
"github.com/fatih/color"
@@ -42,7 +45,9 @@ func SendMetrics(ctx context.Context, commandStr string, args []string, dEnv *en
help, _ := cli.HelpAndUsagePrinters(commandStr, sendMetricsShortDec, "", []string{}, ap)
apr := cli.ParseArgs(ap, args, help)
disabled, err := events.AreMetricsDisabled(dEnv)
metricsDisabled := dEnv.Config.GetStringOrDefault(env.MetricsDisabled, "false")
disabled, err := strconv.ParseBool(*metricsDisabled)
if err != nil {
// log.Print(err)
return 1
@@ -68,9 +73,11 @@ func SendMetrics(ctx context.Context, commandStr string, args []string, dEnv *en
var flusher events.Flusher
if apr.Contains(outputFlag) {
flusher = events.NewIOFlusher(dEnv.FS, root, dolt, dEnv)
flusher = events.NewIOFlusher(dEnv.FS, root, dolt)
} else {
flusher = events.NewGrpcEventFlusher(dEnv.FS, root, dolt, dEnv)
grpcEmitter := getGRPCEmitter(dEnv)
flusher = events.NewGrpcEventFlusher(dEnv.FS, root, dolt, grpcEmitter)
}
err = flusher.Flush(ctx)
@@ -88,3 +95,28 @@ func SendMetrics(ctx context.Context, commandStr string, args []string, dEnv *en
return 1
}
// getGRPCEmitter gets the connection to the events grpc service
func getGRPCEmitter(dEnv *env.DoltEnv) *events.GrpcEmitter {
host := dEnv.Config.GetStringOrDefault(env.MetricsHost, env.DefaultMetricsHost)
portStr := dEnv.Config.GetStringOrDefault(env.MetricsPort, env.DefaultMetricsPort)
insecureStr := dEnv.Config.GetStringOrDefault(env.MetricsInsecure, "false")
port, err := strconv.ParseUint(*portStr, 10, 16)
if err != nil {
log.Println(color.YellowString("The config value of '%s' is '%s' which is not a valid port.", env.MetricsPort, *portStr))
return nil
}
insecure, err := strconv.ParseBool(*insecureStr)
if err != nil {
log.Println(color.YellowString("The config value of '%s' is '%s' which is not a valid true/false value", env.MetricsInsecure, *insecureStr))
}
hostAndPort := fmt.Sprintf("%s:%d", *host, port)
conn, _ := dEnv.GrpcConnWithCreds(hostAndPort, insecure, nil)
return events.NewGrpcEmitter(conn)
}

View File

@@ -19,6 +19,7 @@ import (
"fmt"
"os"
"os/exec"
"strconv"
"github.com/fatih/color"
"github.com/pkg/profile"
@@ -30,6 +31,7 @@ import (
"github.com/liquidata-inc/dolt/go/cmd/dolt/commands/sqlserver"
"github.com/liquidata-inc/dolt/go/cmd/dolt/commands/tblcmds"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/dbfactory"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/events"
@@ -131,13 +133,21 @@ func runMain() int {
dEnv := env.Load(context.TODO(), env.GetCurrentUserHomeDir, filesys.LocalFS, doltdb.LocalDirDoltDB)
emitter := events.NewFileEmitter()
root, err := env.GetCurrentUserHomeDir()
if err != nil {
return 1
}
emitter := events.NewFileEmitter(root, dbfactory.DoltDir)
defer func() {
ces := events.GlobalCollector.Close()
// events.WriterEmitter{cli.CliOut}.LogEvents(Version, ces)
disabled, err := events.AreMetricsDisabled(dEnv)
metricsDisabled := dEnv.Config.GetStringOrDefault(env.MetricsDisabled, "false")
disabled, err := strconv.ParseBool(*metricsDisabled)
if err != nil {
// log.Print(err)
return

View File

@@ -61,43 +61,51 @@ func (Platform) EnumDescriptor() ([]byte, []int) {
type ClientEventType int32
const (
ClientEventType_TYPE_UNSPECIFIED ClientEventType = 0
ClientEventType_INIT ClientEventType = 1
ClientEventType_STATUS ClientEventType = 2
ClientEventType_ADD ClientEventType = 3
ClientEventType_RESET ClientEventType = 4
ClientEventType_COMMIT ClientEventType = 5
ClientEventType_SQL ClientEventType = 6
ClientEventType_SQL_SERVER ClientEventType = 7
ClientEventType_LOG ClientEventType = 8
ClientEventType_DIFF ClientEventType = 9
ClientEventType_MERGE ClientEventType = 10
ClientEventType_BRANCH ClientEventType = 11
ClientEventType_CHECKOUT ClientEventType = 12
ClientEventType_REMOTE ClientEventType = 13
ClientEventType_PUSH ClientEventType = 14
ClientEventType_PULL ClientEventType = 15
ClientEventType_FETCH ClientEventType = 16
ClientEventType_CLONE ClientEventType = 17
ClientEventType_LOGIN ClientEventType = 18
ClientEventType_VERSION ClientEventType = 19
ClientEventType_CONFIG ClientEventType = 20
ClientEventType_LS ClientEventType = 21
ClientEventType_SCHEMA ClientEventType = 22
ClientEventType_TABLE_IMPORT ClientEventType = 23
ClientEventType_TABLE_EXPORT ClientEventType = 24
ClientEventType_TABLE_CREATE ClientEventType = 25
ClientEventType_TABLE_RM ClientEventType = 26
ClientEventType_TABLE_MV ClientEventType = 27
ClientEventType_TABLE_CP ClientEventType = 28
ClientEventType_TABLE_SELECT ClientEventType = 29
ClientEventType_TABLE_PUT_ROW ClientEventType = 30
ClientEventType_TABLE_RM_ROW ClientEventType = 31
ClientEventType_CREDS_NEW ClientEventType = 32
ClientEventType_CREDS_RM ClientEventType = 33
ClientEventType_CREDS_LS ClientEventType = 34
ClientEventType_CONF_CAT ClientEventType = 35
ClientEventType_CONF_RESOLVE ClientEventType = 36
ClientEventType_TYPE_UNSPECIFIED ClientEventType = 0
ClientEventType_INIT ClientEventType = 1
ClientEventType_STATUS ClientEventType = 2
ClientEventType_ADD ClientEventType = 3
ClientEventType_RESET ClientEventType = 4
ClientEventType_COMMIT ClientEventType = 5
ClientEventType_SQL ClientEventType = 6
ClientEventType_SQL_SERVER ClientEventType = 7
ClientEventType_LOG ClientEventType = 8
ClientEventType_DIFF ClientEventType = 9
ClientEventType_MERGE ClientEventType = 10
ClientEventType_BRANCH ClientEventType = 11
ClientEventType_CHECKOUT ClientEventType = 12
ClientEventType_REMOTE ClientEventType = 13
ClientEventType_PUSH ClientEventType = 14
ClientEventType_PULL ClientEventType = 15
ClientEventType_FETCH ClientEventType = 16
ClientEventType_CLONE ClientEventType = 17
ClientEventType_LOGIN ClientEventType = 18
ClientEventType_VERSION ClientEventType = 19
ClientEventType_CONFIG ClientEventType = 20
ClientEventType_LS ClientEventType = 21
ClientEventType_SCHEMA ClientEventType = 22
ClientEventType_TABLE_IMPORT ClientEventType = 23
ClientEventType_TABLE_EXPORT ClientEventType = 24
ClientEventType_TABLE_CREATE ClientEventType = 25
ClientEventType_TABLE_RM ClientEventType = 26
ClientEventType_TABLE_MV ClientEventType = 27
ClientEventType_TABLE_CP ClientEventType = 28
ClientEventType_TABLE_SELECT ClientEventType = 29
ClientEventType_TABLE_PUT_ROW ClientEventType = 30
ClientEventType_TABLE_RM_ROW ClientEventType = 31
ClientEventType_CREDS_NEW ClientEventType = 32
ClientEventType_CREDS_RM ClientEventType = 33
ClientEventType_CREDS_LS ClientEventType = 34
ClientEventType_CONF_CAT ClientEventType = 35
ClientEventType_CONF_RESOLVE ClientEventType = 36
ClientEventType_REMOTEAPI_GET_REPO_METADATA ClientEventType = 37
ClientEventType_REMOTEAPI_HAS_CHUNKS ClientEventType = 38
ClientEventType_REMOTEAPI_GET_DOWNLOAD_LOCATIONS ClientEventType = 39
ClientEventType_REMOTEAPI_GET_UPLOAD_LOCATIONS ClientEventType = 40
ClientEventType_REMOTEAPI_REBASE ClientEventType = 41
ClientEventType_REMOTEAPI_ROOT ClientEventType = 42
ClientEventType_REMOTEAPI_COMMIT ClientEventType = 43
ClientEventType_REMOTEAPI_LIST_TABLE_FILES ClientEventType = 44
)
var ClientEventType_name = map[int32]string{
@@ -138,46 +146,62 @@ var ClientEventType_name = map[int32]string{
34: "CREDS_LS",
35: "CONF_CAT",
36: "CONF_RESOLVE",
37: "REMOTEAPI_GET_REPO_METADATA",
38: "REMOTEAPI_HAS_CHUNKS",
39: "REMOTEAPI_GET_DOWNLOAD_LOCATIONS",
40: "REMOTEAPI_GET_UPLOAD_LOCATIONS",
41: "REMOTEAPI_REBASE",
42: "REMOTEAPI_ROOT",
43: "REMOTEAPI_COMMIT",
44: "REMOTEAPI_LIST_TABLE_FILES",
}
var ClientEventType_value = map[string]int32{
"TYPE_UNSPECIFIED": 0,
"INIT": 1,
"STATUS": 2,
"ADD": 3,
"RESET": 4,
"COMMIT": 5,
"SQL": 6,
"SQL_SERVER": 7,
"LOG": 8,
"DIFF": 9,
"MERGE": 10,
"BRANCH": 11,
"CHECKOUT": 12,
"REMOTE": 13,
"PUSH": 14,
"PULL": 15,
"FETCH": 16,
"CLONE": 17,
"LOGIN": 18,
"VERSION": 19,
"CONFIG": 20,
"LS": 21,
"SCHEMA": 22,
"TABLE_IMPORT": 23,
"TABLE_EXPORT": 24,
"TABLE_CREATE": 25,
"TABLE_RM": 26,
"TABLE_MV": 27,
"TABLE_CP": 28,
"TABLE_SELECT": 29,
"TABLE_PUT_ROW": 30,
"TABLE_RM_ROW": 31,
"CREDS_NEW": 32,
"CREDS_RM": 33,
"CREDS_LS": 34,
"CONF_CAT": 35,
"CONF_RESOLVE": 36,
"TYPE_UNSPECIFIED": 0,
"INIT": 1,
"STATUS": 2,
"ADD": 3,
"RESET": 4,
"COMMIT": 5,
"SQL": 6,
"SQL_SERVER": 7,
"LOG": 8,
"DIFF": 9,
"MERGE": 10,
"BRANCH": 11,
"CHECKOUT": 12,
"REMOTE": 13,
"PUSH": 14,
"PULL": 15,
"FETCH": 16,
"CLONE": 17,
"LOGIN": 18,
"VERSION": 19,
"CONFIG": 20,
"LS": 21,
"SCHEMA": 22,
"TABLE_IMPORT": 23,
"TABLE_EXPORT": 24,
"TABLE_CREATE": 25,
"TABLE_RM": 26,
"TABLE_MV": 27,
"TABLE_CP": 28,
"TABLE_SELECT": 29,
"TABLE_PUT_ROW": 30,
"TABLE_RM_ROW": 31,
"CREDS_NEW": 32,
"CREDS_RM": 33,
"CREDS_LS": 34,
"CONF_CAT": 35,
"CONF_RESOLVE": 36,
"REMOTEAPI_GET_REPO_METADATA": 37,
"REMOTEAPI_HAS_CHUNKS": 38,
"REMOTEAPI_GET_DOWNLOAD_LOCATIONS": 39,
"REMOTEAPI_GET_UPLOAD_LOCATIONS": 40,
"REMOTEAPI_REBASE": 41,
"REMOTEAPI_ROOT": 42,
"REMOTEAPI_COMMIT": 43,
"REMOTEAPI_LIST_TABLE_FILES": 44,
}
func (x ClientEventType) String() string {
@@ -194,18 +218,21 @@ const (
MetricID_METRIC_UNSPECIFIED MetricID = 0
MetricID_BYTES_DOWNLOADED MetricID = 1
MetricID_DOWNLOAD_MS_ELAPSED MetricID = 2
MetricID_REMOTEAPI_RPC_ERROR MetricID = 3
)
var MetricID_name = map[int32]string{
0: "METRIC_UNSPECIFIED",
1: "BYTES_DOWNLOADED",
2: "DOWNLOAD_MS_ELAPSED",
3: "REMOTEAPI_RPC_ERROR",
}
var MetricID_value = map[string]int32{
"METRIC_UNSPECIFIED": 0,
"BYTES_DOWNLOADED": 1,
"DOWNLOAD_MS_ELAPSED": 2,
"REMOTEAPI_RPC_ERROR": 3,
}
func (x MetricID) String() string {
@@ -220,17 +247,17 @@ type AttributeID int32
const (
AttributeID_ATTRIBUTE_UNSPECIFIED AttributeID = 0
AttributeID_LOCAL_REMOTE_URLS AttributeID = 1
AttributeID_ACTIVE_REMOTE_URL AttributeID = 1
)
var AttributeID_name = map[int32]string{
0: "ATTRIBUTE_UNSPECIFIED",
1: "LOCAL_REMOTE_URLS",
1: "ACTIVE_REMOTE_URL",
}
var AttributeID_value = map[string]int32{
"ATTRIBUTE_UNSPECIFIED": 0,
"LOCAL_REMOTE_URLS": 1,
"ACTIVE_REMOTE_URL": 1,
}
func (x AttributeID) String() string {
@@ -574,70 +601,78 @@ func init() {
}
var fileDescriptor_2059ca7f76f8dca6 = []byte{
// 1006 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0xdd, 0x6e, 0xe2, 0x46,
0x14, 0x5e, 0x20, 0xfc, 0x1d, 0xb2, 0xd9, 0x93, 0x09, 0x9b, 0x25, 0x69, 0x77, 0x37, 0xa5, 0xbd,
0x88, 0x22, 0x05, 0x14, 0xa2, 0xb6, 0xaa, 0xaa, 0xaa, 0x32, 0xf6, 0x10, 0xac, 0xfa, 0x87, 0x8c,
0x87, 0xb0, 0xdb, 0x1b, 0xcb, 0x01, 0x87, 0x58, 0x05, 0x9b, 0xc5, 0x26, 0xea, 0x3e, 0x43, 0x9f,
0xa9, 0xef, 0xd4, 0x17, 0x68, 0x55, 0x79, 0x8c, 0x01, 0xd1, 0x0b, 0x9a, 0x3b, 0x7f, 0xe7, 0x9c,
0xef, 0x9b, 0xf3, 0x37, 0x1e, 0xb8, 0x1e, 0x05, 0x93, 0xa8, 0x19, 0xba, 0xf3, 0x27, 0x6f, 0xe8,
0x86, 0x4d, 0xf7, 0xc9, 0xf5, 0xa3, 0xd0, 0x99, 0x79, 0xcd, 0xa7, 0x2b, 0x67, 0x32, 0x7b, 0x74,
0xae, 0x9a, 0xc3, 0x89, 0xe7, 0xfa, 0x91, 0x2d, 0x3c, 0x8d, 0xd9, 0x3c, 0x88, 0x02, 0x72, 0x16,
0x93, 0x1a, 0x29, 0xa9, 0xb1, 0x22, 0x35, 0x52, 0xd2, 0xe9, 0xbb, 0x71, 0x10, 0x8c, 0x27, 0x6e,
0x53, 0xc4, 0xdf, 0x2f, 0x1e, 0x9a, 0xa3, 0xc5, 0xdc, 0x89, 0xbc, 0xc0, 0x4f, 0x14, 0x4e, 0xdf,
0x6f, 0xfb, 0x23, 0x6f, 0xea, 0x86, 0x91, 0x33, 0x9d, 0x25, 0x01, 0xf5, 0xdf, 0xa0, 0x2a, 0x8b,
0x83, 0x69, 0x2c, 0x2e, 0x45, 0xd1, 0xdc, 0xbb, 0x5f, 0x44, 0x2e, 0xf9, 0x09, 0xb2, 0xde, 0xa8,
0x96, 0x39, 0xcb, 0x9c, 0x1f, 0xb4, 0x2e, 0x1b, 0xbb, 0xf2, 0x68, 0xac, 0x88, 0xaa, 0xc2, 0xb2,
0xde, 0x88, 0x54, 0x21, 0xff, 0xe4, 0x4c, 0x16, 0x6e, 0x2d, 0x7b, 0x96, 0x39, 0x2f, 0xb3, 0x04,
0xd4, 0xff, 0xcc, 0xc0, 0xe1, 0xc6, 0x69, 0xba, 0x1b, 0xcd, 0xbd, 0x21, 0xf9, 0x1e, 0x4a, 0x69,
0xd6, 0xe2, 0xc0, 0x4a, 0xeb, 0xa4, 0x91, 0xa4, 0xdd, 0x48, 0xd3, 0x6e, 0x28, 0xcb, 0x80, 0xee,
0x0b, 0xb6, 0x0a, 0x26, 0xc7, 0x90, 0x1f, 0x06, 0x0b, 0x3f, 0x12, 0x87, 0xe4, 0xbb, 0x2f, 0x58,
0x02, 0xc9, 0x0d, 0x94, 0xa7, 0x42, 0xda, 0xf6, 0x46, 0xb5, 0x91, 0x28, 0xe1, 0x62, 0x77, 0x09,
0x49, 0x36, 0xaa, 0xc2, 0x4a, 0x09, 0x59, 0x1d, 0xb5, 0x0f, 0x60, 0x7f, 0x29, 0x14, 0xf8, 0x6e,
0xf0, 0x50, 0xff, 0x3b, 0x0b, 0x95, 0x8d, 0xfc, 0xc9, 0xc1, 0xaa, 0x49, 0x65, 0x51, 0xf5, 0x0f,
0x00, 0x61, 0xe4, 0xcc, 0x23, 0x3b, 0xee, 0xb2, 0xc8, 0xaa, 0xd2, 0x3a, 0xfd, 0x4f, 0x2d, 0x3c,
0x1d, 0x01, 0x2b, 0x8b, 0xe8, 0x18, 0x93, 0x6f, 0xa1, 0xe4, 0xfa, 0xa3, 0x84, 0x98, 0xdb, 0x49,
0x2c, 0xba, 0xfe, 0x48, 0xd0, 0x28, 0xec, 0x45, 0x9f, 0x67, 0x6e, 0x6d, 0x4f, 0x54, 0x79, 0xb5,
0xbb, 0xca, 0x8d, 0xf4, 0xf9, 0xe7, 0x99, 0xcb, 0x04, 0x9d, 0xdc, 0x01, 0x38, 0xe9, 0x04, 0xc3,
0x5a, 0xfe, 0x2c, 0x77, 0x5e, 0x69, 0x7d, 0xf7, 0x2c, 0xb1, 0xd5, 0x02, 0xb0, 0x0d, 0x25, 0xa2,
0x43, 0x31, 0x69, 0x60, 0x58, 0x2b, 0x08, 0xd1, 0xeb, 0x67, 0x89, 0x26, 0x23, 0x61, 0xa9, 0x46,
0xfd, 0xaf, 0x0c, 0xa0, 0x16, 0x8c, 0x85, 0x2f, 0x64, 0xee, 0xa7, 0x85, 0x1b, 0x46, 0xe4, 0x2d,
0xc0, 0xd4, 0x19, 0x3e, 0x7a, 0xbe, 0x6b, 0xaf, 0x86, 0x51, 0x5e, 0x5a, 0x54, 0xb1, 0x89, 0xee,
0xef, 0xd1, 0xdc, 0x49, 0x37, 0x51, 0x00, 0x52, 0x83, 0xe2, 0x93, 0x3b, 0x0f, 0xe3, 0x95, 0xcb,
0x09, 0x7b, 0x0a, 0x49, 0x07, 0x4a, 0xb3, 0x89, 0x13, 0x3d, 0x04, 0xf3, 0xe9, 0xb2, 0xab, 0xff,
0x63, 0x77, 0x7a, 0x4b, 0x06, 0x5b, 0x71, 0x09, 0x85, 0x42, 0x12, 0xb8, 0x6c, 0xe7, 0xe5, 0xb3,
0x2a, 0x67, 0x4b, 0x72, 0xfd, 0x08, 0x0e, 0x37, 0x2a, 0x0e, 0x67, 0x81, 0x1f, 0xba, 0x17, 0x5d,
0x28, 0xa5, 0x27, 0x92, 0x1a, 0x54, 0x7b, 0x9a, 0xc4, 0x3b, 0x26, 0xd3, 0xed, 0xbe, 0x61, 0xf5,
0xa8, 0xac, 0x76, 0x54, 0xaa, 0xe0, 0x0b, 0x52, 0x86, 0xbc, 0xa6, 0x1a, 0xfd, 0x0f, 0x98, 0x21,
0x15, 0x28, 0x0e, 0x54, 0x43, 0x31, 0x07, 0x16, 0x66, 0x09, 0x40, 0x41, 0x91, 0xd8, 0x40, 0x35,
0x30, 0x77, 0xf1, 0x4f, 0x0e, 0x5e, 0x6d, 0xad, 0x04, 0xa9, 0x02, 0xf2, 0x8f, 0x3d, 0xba, 0xa5,
0x56, 0x82, 0x3d, 0xd5, 0x50, 0x39, 0x66, 0x62, 0xbe, 0xc5, 0x25, 0xde, 0x8f, 0xb5, 0x8a, 0x90,
0x93, 0x14, 0x05, 0x73, 0xf1, 0x61, 0x8c, 0x5a, 0x94, 0xe3, 0x5e, 0xec, 0x97, 0x4d, 0x5d, 0x57,
0x39, 0xe6, 0x63, 0xbf, 0x75, 0xab, 0x61, 0x81, 0x1c, 0x00, 0x58, 0xb7, 0x9a, 0x6d, 0x51, 0x76,
0x47, 0x19, 0x16, 0x63, 0x87, 0x66, 0xde, 0x60, 0x29, 0xd6, 0x55, 0xd4, 0x4e, 0x07, 0xcb, 0xb1,
0x84, 0x4e, 0xd9, 0x0d, 0x45, 0x88, 0x25, 0xda, 0x4c, 0x32, 0xe4, 0x2e, 0x56, 0xc8, 0x3e, 0x94,
0xe4, 0x2e, 0x95, 0x7f, 0x31, 0xfb, 0x1c, 0xf7, 0x63, 0x0f, 0xa3, 0xba, 0xc9, 0x29, 0xbe, 0x8c,
0xa9, 0xbd, 0xbe, 0xd5, 0xc5, 0x83, 0xe4, 0x4b, 0xd3, 0xf0, 0x55, 0x2c, 0xd2, 0xa1, 0x5c, 0xee,
0x22, 0xc6, 0x9f, 0xb2, 0x66, 0x1a, 0x14, 0x0f, 0x45, 0x2b, 0xcc, 0x1b, 0xd5, 0x40, 0x12, 0xb7,
0xe2, 0x8e, 0x32, 0x4b, 0x35, 0x0d, 0x3c, 0x4a, 0x52, 0x35, 0x3a, 0xea, 0x0d, 0x56, 0x49, 0x01,
0xb2, 0x9a, 0x85, 0xaf, 0x45, 0x79, 0x72, 0x97, 0xea, 0x12, 0x1e, 0x13, 0x84, 0x7d, 0x2e, 0xb5,
0x35, 0x6a, 0xab, 0x7a, 0xcf, 0x64, 0x1c, 0xdf, 0xac, 0x2d, 0xf4, 0x83, 0xb0, 0xd4, 0xd6, 0x16,
0x99, 0x51, 0x89, 0x53, 0x3c, 0x89, 0x33, 0x4e, 0x2c, 0x4c, 0xc7, 0xd3, 0x35, 0xd2, 0xef, 0xf0,
0x8b, 0x35, 0x92, 0x7b, 0xf8, 0xe5, 0x9a, 0x6b, 0x51, 0x8d, 0xca, 0x1c, 0xdf, 0x92, 0x43, 0x78,
0x99, 0x58, 0x7a, 0x7d, 0x6e, 0x33, 0x73, 0x80, 0xef, 0xd6, 0x41, 0x4c, 0x17, 0x96, 0xf7, 0xe4,
0x25, 0x94, 0x65, 0x46, 0x15, 0xcb, 0x36, 0xe8, 0x00, 0xcf, 0x44, 0x87, 0x04, 0x64, 0x3a, 0x7e,
0xb5, 0x46, 0x9a, 0x85, 0x75, 0x81, 0x4c, 0xa3, 0x63, 0xcb, 0x12, 0xc7, 0xaf, 0x63, 0x29, 0x81,
0x18, 0xb5, 0x4c, 0xed, 0x8e, 0xe2, 0x37, 0x17, 0xb7, 0x50, 0x4a, 0x7f, 0x7c, 0xe4, 0x18, 0x88,
0x4e, 0x39, 0x53, 0xe5, 0xad, 0xd1, 0x57, 0x01, 0xdb, 0x1f, 0x39, 0xb5, 0x6c, 0xc5, 0x1c, 0x18,
0x9a, 0x29, 0x29, 0x54, 0xc1, 0x0c, 0x79, 0x03, 0x47, 0x29, 0xb6, 0x75, 0xcb, 0xa6, 0x9a, 0xd4,
0xb3, 0xa8, 0x82, 0xd9, 0x8b, 0x9f, 0xa1, 0xb2, 0xf1, 0x1c, 0x90, 0x13, 0x78, 0x2d, 0x71, 0xce,
0xd4, 0x76, 0x9f, 0x6f, 0xef, 0xd4, 0x6b, 0x38, 0xd4, 0x4c, 0x59, 0xd2, 0xec, 0x64, 0xa4, 0x76,
0x9f, 0x69, 0x16, 0x66, 0x5a, 0x7f, 0x64, 0xe0, 0x68, 0x63, 0x29, 0x43, 0x2b, 0xb9, 0x33, 0x24,
0x82, 0xf2, 0xea, 0x2e, 0x90, 0xd6, 0xee, 0xfb, 0xb4, 0xfd, 0xab, 0x38, 0xbd, 0x7e, 0x16, 0x27,
0xb9, 0x6c, 0xed, 0xc1, 0xaf, 0xfd, 0xb1, 0x17, 0x3d, 0x2e, 0xee, 0x1b, 0xc3, 0x60, 0xda, 0x9c,
0x78, 0x9f, 0x16, 0xde, 0xc8, 0x89, 0x9c, 0x4b, 0xcf, 0x1f, 0x36, 0xc5, 0xa3, 0x3e, 0x0e, 0x9a,
0x63, 0xd7, 0x4f, 0x9e, 0xd8, 0xe6, 0xae, 0x67, 0xfe, 0xc7, 0x95, 0xe9, 0xbe, 0x20, 0x18, 0xd7,
0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xef, 0xb5, 0x5b, 0x1b, 0x08, 0x00, 0x00,
// 1127 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xef, 0x72, 0xdb, 0x44,
0x10, 0xaf, 0xed, 0x38, 0xb1, 0xd7, 0x69, 0xba, 0xb9, 0xa4, 0xad, 0x9b, 0xd2, 0x34, 0x98, 0x02,
0x21, 0x50, 0x7b, 0x9a, 0x0c, 0x30, 0x0c, 0xc3, 0x30, 0xb2, 0x74, 0x8e, 0x35, 0xd5, 0xbf, 0xde,
0x9d, 0xe3, 0x96, 0x2f, 0x1a, 0xc5, 0x56, 0x53, 0x81, 0x63, 0xb9, 0x96, 0x9c, 0xa1, 0xcf, 0xc0,
0x33, 0xf1, 0x34, 0xbc, 0x00, 0x2f, 0xc0, 0x0c, 0x73, 0x27, 0xff, 0xab, 0xf9, 0x60, 0xf2, 0xcd,
0xbb, 0xfb, 0xfb, 0xfd, 0x6e, 0x77, 0x6f, 0xb5, 0x3e, 0x38, 0xeb, 0xc7, 0x83, 0xb4, 0x91, 0x84,
0xe3, 0x9b, 0xa8, 0x17, 0x26, 0x8d, 0xf0, 0x26, 0x1c, 0xa6, 0x49, 0x30, 0x8a, 0x1a, 0x37, 0x2f,
0x82, 0xc1, 0xe8, 0x5d, 0xf0, 0xa2, 0xd1, 0x1b, 0x44, 0xe1, 0x30, 0xf5, 0x55, 0xa4, 0x3e, 0x1a,
0xc7, 0x69, 0x4c, 0x8e, 0x24, 0xa9, 0x3e, 0x23, 0xd5, 0xe7, 0xa4, 0xfa, 0x8c, 0x74, 0x70, 0x78,
0x15, 0xc7, 0x57, 0x83, 0xb0, 0xa1, 0xf0, 0x97, 0x93, 0xb7, 0x8d, 0xfe, 0x64, 0x1c, 0xa4, 0x51,
0x3c, 0xcc, 0x14, 0x0e, 0x9e, 0xae, 0xc6, 0xd3, 0xe8, 0x3a, 0x4c, 0xd2, 0xe0, 0x7a, 0x94, 0x01,
0x6a, 0xbf, 0xc1, 0xbe, 0xae, 0x0e, 0xa6, 0x52, 0x5c, 0x4b, 0xd3, 0x71, 0x74, 0x39, 0x49, 0x43,
0xf2, 0x13, 0xe4, 0xa3, 0x7e, 0x35, 0x77, 0x94, 0x3b, 0xde, 0x39, 0x7d, 0x5e, 0x5f, 0x97, 0x47,
0x7d, 0x4e, 0x34, 0x0d, 0x96, 0x8f, 0xfa, 0x64, 0x1f, 0x8a, 0x37, 0xc1, 0x60, 0x12, 0x56, 0xf3,
0x47, 0xb9, 0xe3, 0x32, 0xcb, 0x8c, 0xda, 0x9f, 0x39, 0xd8, 0x5d, 0x3a, 0xcd, 0x0e, 0xd3, 0x71,
0xd4, 0x23, 0xdf, 0x43, 0x69, 0x96, 0xb5, 0x3a, 0xb0, 0x72, 0xfa, 0xa8, 0x9e, 0xa5, 0x5d, 0x9f,
0xa5, 0x5d, 0x37, 0xa6, 0x80, 0xf6, 0x1d, 0x36, 0x07, 0x93, 0x07, 0x50, 0xec, 0xc5, 0x93, 0x61,
0xaa, 0x0e, 0x29, 0xb6, 0xef, 0xb0, 0xcc, 0x24, 0xe7, 0x50, 0xbe, 0x56, 0xd2, 0x7e, 0xd4, 0xaf,
0xf6, 0x55, 0x09, 0x27, 0xeb, 0x4b, 0xc8, 0xb2, 0x31, 0x0d, 0x56, 0xca, 0xc8, 0x66, 0xbf, 0xb9,
0x03, 0xdb, 0x53, 0xa1, 0x78, 0x18, 0xc6, 0x6f, 0x6b, 0xff, 0xe4, 0xa1, 0xb2, 0x94, 0x3f, 0xd9,
0x99, 0x37, 0xa9, 0xac, 0xaa, 0xfe, 0x01, 0x20, 0x49, 0x83, 0x71, 0xea, 0xcb, 0x2e, 0xab, 0xac,
0x2a, 0xa7, 0x07, 0xff, 0xa9, 0x45, 0xcc, 0xae, 0x80, 0x95, 0x15, 0x5a, 0xda, 0xe4, 0x5b, 0x28,
0x85, 0xc3, 0x7e, 0x46, 0x2c, 0xac, 0x25, 0x6e, 0x85, 0xc3, 0xbe, 0xa2, 0x51, 0xd8, 0x48, 0x3f,
0x8c, 0xc2, 0xea, 0x86, 0xaa, 0xf2, 0xc5, 0xfa, 0x2a, 0x97, 0xd2, 0x17, 0x1f, 0x46, 0x21, 0x53,
0x74, 0x72, 0x01, 0x10, 0xcc, 0x6e, 0x30, 0xa9, 0x16, 0x8f, 0x0a, 0xc7, 0x95, 0xd3, 0xef, 0x6e,
0x25, 0x36, 0x1f, 0x00, 0xb6, 0xa4, 0x44, 0x6c, 0xd8, 0xca, 0x1a, 0x98, 0x54, 0x37, 0x95, 0xe8,
0xd9, 0xad, 0x44, 0xb3, 0x2b, 0x61, 0x33, 0x8d, 0xda, 0xdf, 0x39, 0x40, 0x2b, 0xbe, 0x52, 0xb1,
0x84, 0x85, 0xef, 0x27, 0x61, 0x92, 0x92, 0x27, 0x00, 0xd7, 0x41, 0xef, 0x5d, 0x34, 0x0c, 0xfd,
0xf9, 0x65, 0x94, 0xa7, 0x1e, 0x53, 0x4d, 0x62, 0xf8, 0x7b, 0x3a, 0x0e, 0x66, 0x93, 0xa8, 0x0c,
0x52, 0x85, 0xad, 0x9b, 0x70, 0x9c, 0xc8, 0x91, 0x2b, 0x28, 0xff, 0xcc, 0x24, 0x2d, 0x28, 0x8d,
0x06, 0x41, 0xfa, 0x36, 0x1e, 0x5f, 0x4f, 0xbb, 0xfa, 0x3f, 0x66, 0xc7, 0x9b, 0x32, 0xd8, 0x9c,
0x4b, 0x28, 0x6c, 0x66, 0xc0, 0x69, 0x3b, 0x9f, 0xdf, 0xaa, 0x72, 0x36, 0x25, 0xd7, 0xf6, 0x60,
0x77, 0xa9, 0xe2, 0x64, 0x14, 0x0f, 0x93, 0xf0, 0xa4, 0x0d, 0xa5, 0xd9, 0x89, 0xa4, 0x0a, 0xfb,
0x9e, 0xa5, 0x89, 0x96, 0xcb, 0x6c, 0xbf, 0xe3, 0x70, 0x8f, 0xea, 0x66, 0xcb, 0xa4, 0x06, 0xde,
0x21, 0x65, 0x28, 0x5a, 0xa6, 0xd3, 0x79, 0x8d, 0x39, 0x52, 0x81, 0xad, 0xae, 0xe9, 0x18, 0x6e,
0x97, 0x63, 0x9e, 0x00, 0x6c, 0x1a, 0x1a, 0xeb, 0x9a, 0x0e, 0x16, 0x4e, 0xfe, 0x2a, 0xc2, 0xbd,
0x95, 0x91, 0x20, 0xfb, 0x80, 0xe2, 0x8d, 0x47, 0x57, 0xd4, 0x4a, 0xb0, 0x61, 0x3a, 0xa6, 0xc0,
0x9c, 0xe4, 0x73, 0xa1, 0x89, 0x8e, 0xd4, 0xda, 0x82, 0x82, 0x66, 0x18, 0x58, 0x90, 0x87, 0x31,
0xca, 0xa9, 0xc0, 0x0d, 0x19, 0xd7, 0x5d, 0xdb, 0x36, 0x05, 0x16, 0x65, 0x9c, 0xbf, 0xb2, 0x70,
0x93, 0xec, 0x00, 0xf0, 0x57, 0x96, 0xcf, 0x29, 0xbb, 0xa0, 0x0c, 0xb7, 0x64, 0xc0, 0x72, 0xcf,
0xb1, 0x24, 0x75, 0x0d, 0xb3, 0xd5, 0xc2, 0xb2, 0x94, 0xb0, 0x29, 0x3b, 0xa7, 0x08, 0x52, 0xa2,
0xc9, 0x34, 0x47, 0x6f, 0x63, 0x85, 0x6c, 0x43, 0x49, 0x6f, 0x53, 0xfd, 0xa5, 0xdb, 0x11, 0xb8,
0x2d, 0x23, 0x8c, 0xda, 0xae, 0xa0, 0x78, 0x57, 0x52, 0xbd, 0x0e, 0x6f, 0xe3, 0x4e, 0xf6, 0xcb,
0xb2, 0xf0, 0x9e, 0x14, 0x69, 0x51, 0xa1, 0xb7, 0x11, 0xe5, 0x4f, 0xdd, 0x72, 0x1d, 0x8a, 0xbb,
0xaa, 0x15, 0xee, 0xb9, 0xe9, 0x20, 0x91, 0xad, 0xb8, 0xa0, 0x8c, 0x9b, 0xae, 0x83, 0x7b, 0x59,
0xaa, 0x4e, 0xcb, 0x3c, 0xc7, 0x7d, 0xb2, 0x09, 0x79, 0x8b, 0xe3, 0x7d, 0x55, 0x9e, 0xde, 0xa6,
0xb6, 0x86, 0x0f, 0x08, 0xc2, 0xb6, 0xd0, 0x9a, 0x16, 0xf5, 0x4d, 0xdb, 0x73, 0x99, 0xc0, 0x87,
0x0b, 0x0f, 0x7d, 0xad, 0x3c, 0xd5, 0x85, 0x47, 0x67, 0x54, 0x13, 0x14, 0x1f, 0xc9, 0x8c, 0x33,
0x0f, 0xb3, 0xf1, 0x60, 0x61, 0xd9, 0x17, 0xf8, 0x78, 0x61, 0xe9, 0x1e, 0x7e, 0xb2, 0xe0, 0x72,
0x6a, 0x51, 0x5d, 0xe0, 0x13, 0xb2, 0x0b, 0x77, 0x33, 0x8f, 0xd7, 0x11, 0x3e, 0x73, 0xbb, 0x78,
0xb8, 0x00, 0x31, 0x5b, 0x79, 0x9e, 0x92, 0xbb, 0x50, 0xd6, 0x19, 0x35, 0xb8, 0xef, 0xd0, 0x2e,
0x1e, 0xa9, 0x0e, 0x29, 0x93, 0xd9, 0xf8, 0xe9, 0xc2, 0xb2, 0x38, 0xd6, 0x94, 0xe5, 0x3a, 0x2d,
0x5f, 0xd7, 0x04, 0x7e, 0x26, 0xa5, 0x94, 0xc5, 0x28, 0x77, 0xad, 0x0b, 0x8a, 0xcf, 0xc8, 0x53,
0x78, 0x9c, 0xf5, 0x53, 0xf3, 0x4c, 0xff, 0x9c, 0x0a, 0x9f, 0x51, 0xcf, 0xf5, 0x6d, 0x2a, 0x34,
0x43, 0x13, 0x1a, 0x7e, 0x2e, 0xe7, 0x6b, 0x01, 0x68, 0x6b, 0xdc, 0xd7, 0xdb, 0x1d, 0xe7, 0x25,
0xc7, 0x2f, 0xc8, 0x33, 0x38, 0xfa, 0x98, 0x6a, 0xb8, 0x5d, 0xc7, 0x72, 0x35, 0xc3, 0xb7, 0x5c,
0x5d, 0x13, 0xa6, 0xeb, 0x70, 0xfc, 0x92, 0xd4, 0xe0, 0xf0, 0x63, 0x54, 0xc7, 0x5b, 0xc1, 0x1c,
0xcb, 0x89, 0x5b, 0x60, 0x18, 0x6d, 0x6a, 0x9c, 0xe2, 0x57, 0x84, 0xc0, 0xce, 0x92, 0xd7, 0x75,
0x05, 0x9e, 0x7c, 0x8c, 0x9c, 0x4e, 0xd9, 0xd7, 0xe4, 0x10, 0x0e, 0x16, 0x5e, 0xcb, 0xe4, 0xc2,
0xcf, 0x1a, 0xd6, 0x32, 0x2d, 0xca, 0xf1, 0x9b, 0x93, 0x5f, 0xa1, 0x34, 0xdb, 0xee, 0xe4, 0x01,
0x10, 0x9b, 0x0a, 0x66, 0xea, 0x2b, 0xf3, 0xbd, 0x0f, 0xd8, 0x7c, 0x23, 0x28, 0x9f, 0x57, 0x41,
0x0d, 0xcc, 0x91, 0x87, 0xb0, 0x37, 0xaf, 0xca, 0xe6, 0x3e, 0xb5, 0x34, 0x8f, 0x53, 0x03, 0xf3,
0x32, 0xb0, 0x94, 0x9c, 0xa7, 0xfb, 0x94, 0x31, 0x97, 0x61, 0xe1, 0xe4, 0x67, 0xa8, 0x2c, 0xfd,
0x19, 0x92, 0x47, 0x70, 0x5f, 0x13, 0x82, 0x99, 0xcd, 0x8e, 0x58, 0xfd, 0xa2, 0xee, 0xc3, 0xae,
0xa6, 0x0b, 0xf3, 0x82, 0xfa, 0x99, 0x92, 0xdf, 0x61, 0x16, 0xe6, 0x4e, 0xff, 0xc8, 0xc1, 0xde,
0xd2, 0x27, 0x99, 0xf0, 0x6c, 0x63, 0x90, 0x14, 0xca, 0xf3, 0x4d, 0x40, 0x4e, 0xd7, 0x6f, 0x93,
0xd5, 0x45, 0x79, 0x70, 0x76, 0x2b, 0x4e, 0xb6, 0x6a, 0x9a, 0xdd, 0x5f, 0x3a, 0x57, 0x51, 0xfa,
0x6e, 0x72, 0x59, 0xef, 0xc5, 0xd7, 0x8d, 0x41, 0xf4, 0x7e, 0x12, 0xf5, 0x83, 0x34, 0x78, 0x1e,
0x0d, 0x7b, 0x0d, 0xf5, 0xa4, 0xb9, 0x8a, 0x1b, 0x57, 0xe1, 0x30, 0x7b, 0x60, 0x34, 0xd6, 0x3d,
0x72, 0x7e, 0x9c, 0xbb, 0x2e, 0x37, 0x15, 0xe3, 0xec, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6,
0xa6, 0xa7, 0x7b, 0x19, 0x09, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -29,7 +29,9 @@ import (
"github.com/cenkalti/backoff"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
remotesapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/remotesapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/events"
"github.com/liquidata-inc/dolt/go/libraries/utils/iohelp"
"github.com/liquidata-inc/dolt/go/store/atomicerr"
"github.com/liquidata-inc/dolt/go/store/chunks"
@@ -101,6 +103,11 @@ func NewDoltChunkStore(ctx context.Context, nbf *types.NomsBinFormat, org, repoN
csClient = RetryingChunkStoreServiceClient{csClient}
}
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_GET_REPO_METADATA)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
metadata, err := csClient.GetRepoMetadata(ctx, &remotesapi.GetRepoMetadataRequest{
RepoId: &remotesapi.RepoId{
Org: org,
@@ -113,6 +120,7 @@ func NewDoltChunkStore(ctx context.Context, nbf *types.NomsBinFormat, org, repoN
})
if err != nil {
counter.Inc()
return nil, err
}
@@ -273,10 +281,16 @@ func (dcs *DoltChunkStore) getDLLocs(ctx context.Context, hashes []hash.Hash) (m
batchItr(len(hashesBytes), getLocsBatchSize, func(st, end int) (stop bool) {
batch := hashesBytes[st:end]
f := func() error {
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_GET_DOWNLOAD_LOCATIONS)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
req := remotesapi.GetDownloadLocsRequest{RepoId: dcs.getRepoId(), ChunkHashes: batch}
resp, err := dcs.csClient.GetDownloadLocations(ctx, &req)
if err != nil {
counter.Inc()
return NewRpcError(err, "GetDownloadLocations", dcs.host, req)
}
@@ -391,12 +405,19 @@ func (dcs *DoltChunkStore) HasMany(ctx context.Context, hashes hash.HashSet) (ha
currHashSl := hashSl[st:end]
currByteSl := byteSl[st:end]
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_HAS_CHUNKS)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
// send a request to the remote api to determine which chunks the remote api already has
req := remotesapi.HasChunksRequest{RepoId: dcs.getRepoId(), Hashes: currByteSl}
resp, err := dcs.csClient.HasChunks(ctx, &req)
if err != nil {
err = NewRpcError(err, "HasMany", dcs.host, req)
counter.Inc()
return true
}
@@ -459,10 +480,16 @@ func (dcs *DoltChunkStore) Version() string {
// Rebase brings this ChunkStore into sync with the persistent storage's
// current root.
func (dcs *DoltChunkStore) Rebase(ctx context.Context) error {
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_REBASE)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
req := &remotesapi.RebaseRequest{RepoId: dcs.getRepoId()}
_, err := dcs.csClient.Rebase(ctx, req)
if err != nil {
counter.Inc()
return NewRpcError(err, "Rebase", dcs.host, req)
}
@@ -472,10 +499,16 @@ func (dcs *DoltChunkStore) Rebase(ctx context.Context) error {
// Root returns the root of the database as of the time the ChunkStore
// was opened or the most recent call to Rebase.
func (dcs *DoltChunkStore) Root(ctx context.Context) (hash.Hash, error) {
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_ROOT)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
req := &remotesapi.RootRequest{RepoId: dcs.getRepoId()}
resp, err := dcs.csClient.Root(ctx, req)
if err != nil {
counter.Inc()
return hash.Hash{}, NewRpcError(err, "Root", dcs.host, req)
}
@@ -486,9 +519,15 @@ func (dcs *DoltChunkStore) Root(ctx context.Context) (hash.Hash, error) {
// persisted root hash from last to current (or keeps it the same).
// If last doesn't match the root in persistent storage, returns false.
func (dcs *DoltChunkStore) Commit(ctx context.Context, current, last hash.Hash) (bool, error) {
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_COMMIT)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
hashToChunkCount, err := dcs.uploadChunks(ctx)
if err != nil {
counter.Inc()
return false, err
}
@@ -510,6 +549,7 @@ func (dcs *DoltChunkStore) Commit(ctx context.Context, current, last hash.Hash)
resp, err := dcs.csClient.Commit(ctx, req)
if err != nil {
counter.Inc()
return false, NewRpcError(err, "Commit", dcs.host, req)
}
@@ -579,10 +619,16 @@ func (dcs *DoltChunkStore) uploadChunks(ctx context.Context) (map[hash.Hash]int,
hashBytes = append(hashBytes, tmp[:])
}
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_GET_UPLOAD_LOCATIONS)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
req := &remotesapi.GetUploadLocsRequest{RepoId: dcs.getRepoId(), TableFileHashes: hashBytes}
resp, err := dcs.csClient.GetUploadLocations(ctx, req)
if err != nil {
counter.Inc()
return map[hash.Hash]int{}, err
}
@@ -598,6 +644,7 @@ func (dcs *DoltChunkStore) uploadChunks(ctx context.Context) (map[hash.Hash]int,
}
if err != nil {
counter.Inc()
return map[hash.Hash]int{}, err
}
}
@@ -899,10 +946,16 @@ func (dcs *DoltChunkStore) WriteTableFile(ctx context.Context, fileId string, nu
// Sources retrieves the current root hash, and a list of all the table files
func (dcs *DoltChunkStore) Sources(ctx context.Context) (hash.Hash, []nbs.TableFile, error) {
evt := events.NewEvent(eventsapi.ClientEventType_REMOTEAPI_LIST_TABLE_FILES)
defer events.GlobalCollector.CloseEventAndAdd(evt)
counter := events.NewCounter(eventsapi.MetricID_REMOTEAPI_RPC_ERROR)
req := &remotesapi.ListTableFilesRequest{RepoId: dcs.getRepoId()}
resp, err := dcs.csClient.ListTableFiles(ctx, req)
if err != nil {
counter.Inc()
return hash.Hash{}, nil, err
}

View File

@@ -19,7 +19,6 @@ import (
"fmt"
"io"
"runtime"
"strconv"
"strings"
"time"
@@ -27,8 +26,6 @@ import (
"google.golang.org/grpc"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/dbfactory"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/utils/filesys"
"github.com/liquidata-inc/dolt/go/libraries/utils/iohelp"
)
@@ -84,6 +81,7 @@ type GrpcEmitter struct {
client eventsapi.ClientEventsServiceClient
}
// NewGrpcEmitter creates a new GrpcEmitter
func NewGrpcEmitter(conn *grpc.ClientConn) *GrpcEmitter {
client := eventsapi.NewClientEventsServiceClient(conn)
return &GrpcEmitter{client}
@@ -130,17 +128,10 @@ type FileEmitter struct {
}
// NewFileEmitter creates a new file emitter
func NewFileEmitter() *FileEmitter {
func NewFileEmitter(userHomeDir string, doltDir string) *FileEmitter {
fs := filesys.LocalFS
root, err := env.GetCurrentUserHomeDir()
if err != nil {
panic(err)
}
dolt := dbfactory.DoltDir
return &FileEmitter{fbp: NewFileBackedProc(fs, root, dolt, MD5FileNamer, CheckFilenameMD5)}
return &FileEmitter{fbp: NewFileBackedProc(fs, userHomeDir, doltDir, MD5FileNamer, CheckFilenameMD5)}
}
// LogEvents implements the Emitter interface and writes events requests to files
@@ -151,11 +142,3 @@ func (fe *FileEmitter) LogEvents(version string, evts []*eventsapi.ClientEvent)
return nil
}
// AreMetricsDisabled returns true if the dolt config has the metrics.disabled property
// set to true, otherwise returns false
func AreMetricsDisabled(dEnv *env.DoltEnv) (bool, error) {
metricsDisabled := dEnv.Config.GetStringOrDefault(env.MetricsDisabled, "false")
return strconv.ParseBool(*metricsDisabled)
}

View File

@@ -18,15 +18,12 @@ import (
"context"
"errors"
"fmt"
"log"
"strconv"
"github.com/fatih/color"
"github.com/golang/protobuf/proto"
"github.com/juju/fslock"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/env"
"github.com/liquidata-inc/dolt/go/libraries/utils/filesys"
)
@@ -50,31 +47,6 @@ type Flusher interface {
Flush(ctx context.Context) error
}
// getGRPCEmitter gets the connection to the events grpc service
func getGRPCEmitter(dEnv *env.DoltEnv) *GrpcEmitter {
host := dEnv.Config.GetStringOrDefault(env.MetricsHost, env.DefaultMetricsHost)
portStr := dEnv.Config.GetStringOrDefault(env.MetricsPort, env.DefaultMetricsPort)
insecureStr := dEnv.Config.GetStringOrDefault(env.MetricsInsecure, "false")
port, err := strconv.ParseUint(*portStr, 10, 16)
if err != nil {
log.Println(color.YellowString("The config value of '%s' is '%s' which is not a valid port.", env.MetricsPort, *portStr))
return nil
}
insecure, err := strconv.ParseBool(*insecureStr)
if err != nil {
log.Println(color.YellowString("The config value of '%s' is '%s' which is not a valid true/false value", env.MetricsInsecure, *insecureStr))
}
hostAndPort := fmt.Sprintf("%s:%d", *host, port)
conn, _ := dEnv.GrpcConnWithCreds(hostAndPort, insecure, nil)
return NewGrpcEmitter(conn)
}
// lockAndFlush locks the given lockPath and passes the flushCB to the filesys' Iter method
func lockAndFlush(ctx context.Context, fs filesys.Filesys, dirPath string, lockPath string, fcb flushCB) error {
fsLock := filesys.CreateFilesysLock(fs, lockPath)
@@ -122,15 +94,14 @@ type GrpcEventFlusher struct {
}
// NewGrpcEventFlusher creates a new GrpcEventFlusher
func NewGrpcEventFlusher(fs filesys.Filesys, userHomeDir string, doltDir string, dEnv *env.DoltEnv) *GrpcEventFlusher {
func NewGrpcEventFlusher(fs filesys.Filesys, userHomeDir string, doltDir string, grpcEmitter *GrpcEmitter) *GrpcEventFlusher {
fbp := NewFileBackedProc(fs, userHomeDir, doltDir, MD5FileNamer, CheckFilenameMD5)
if exists := fbp.EventsDirExists(); !exists {
panic(ErrEventsDataDir)
}
// return &GrpcEventFlusher{em: getGRPCEmitter(dEnv), fbp: fbp, LockPath: fbp.GetEventsDirPath()}
return &GrpcEventFlusher{em: getGRPCEmitter(dEnv), fbp: fbp}
return &GrpcEventFlusher{em: grpcEmitter, fbp: fbp}
}
// flush has the function signature of the flushCb type
@@ -186,7 +157,7 @@ type IOFlusher struct {
}
// NewIOFlusher creates a new IOFlusher
func NewIOFlusher(fs filesys.Filesys, userHomeDir string, doltDir string, dEnv *env.DoltEnv) *IOFlusher {
func NewIOFlusher(fs filesys.Filesys, userHomeDir string, doltDir string) *IOFlusher {
fbp := NewFileBackedProc(fs, userHomeDir, doltDir, MD5FileNamer, CheckFilenameMD5)
if exists := fbp.EventsDirExists(); !exists {
@@ -212,6 +183,7 @@ func (iof *IOFlusher) flush(ctx context.Context, path string) error {
return err
}
// needed for bats test
fmt.Fprintf(color.Output, "%+v\n", req)
if err := fs.DeleteFile(path); err != nil {

View File

@@ -23,7 +23,6 @@ import (
"google.golang.org/grpc"
eventsapi "github.com/liquidata-inc/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/liquidata-inc/dolt/go/libraries/doltcore/dbfactory"
"github.com/liquidata-inc/dolt/go/libraries/utils/filesys"
testLib "github.com/liquidata-inc/dolt/go/libraries/utils/test"
)
@@ -31,10 +30,10 @@ import (
var (
testVersion = "1.0.0"
homeDir = "/home/"
dPath = dbfactory.DoltDir
dPath = ".dolt"
evtPath = eventsDir
doltDir = filepath.Join(homeDir, dPath)
tempEvtsDir = filepath.Join(doltDir, evtPath)
doltTestDir = filepath.Join(homeDir, dPath)
tempEvtsDir = filepath.Join(doltTestDir, evtPath)
)
type TestClient struct {
@@ -102,7 +101,7 @@ func TestEventFlushing(t *testing.T) {
if fsName == "inMemFS" {
fs := filesys.NewInMemFS([]string{tempEvtsDir}, nil, tempEvtsDir)
ft = createFlushTester(fs, homeDir, doltDir)
ft = createFlushTester(fs, homeDir, doltTestDir)
} else {
fs := filesys.LocalFS

View File

@@ -28,7 +28,7 @@ func TestEvents(t *testing.T) {
collector := NewCollector()
testEvent := NewEvent(eventsapi.ClientEventType_CLONE)
testEvent.SetAttribute(eventsapi.AttributeID_LOCAL_REMOTE_URLS, remoteUrl)
testEvent.SetAttribute(eventsapi.AttributeID_ACTIVE_REMOTE_URL, remoteUrl)
counter := NewCounter(eventsapi.MetricID_METRIC_UNSPECIFIED)
counter.Inc()
@@ -52,7 +52,7 @@ func TestEvents(t *testing.T) {
assert.NotNil(t, clientEvents[0].StartTime)
assert.NotNil(t, clientEvents[0].EndTime)
assert.Equal(t, eventsapi.AttributeID_LOCAL_REMOTE_URLS, clientEvents[0].Attributes[0].Id)
assert.Equal(t, eventsapi.AttributeID_ACTIVE_REMOTE_URL, clientEvents[0].Attributes[0].Id)
assert.Equal(t, remoteUrl, clientEvents[0].Attributes[0].Value)
_, isCounter := clientEvents[0].Metrics[0].MetricOneof.(*eventsapi.ClientEventMetric_Count)
assert.True(t, isCounter)

View File

@@ -70,17 +70,26 @@ enum ClientEventType {
CREDS_LS = 34;
CONF_CAT = 35;
CONF_RESOLVE = 36;
REMOTEAPI_GET_REPO_METADATA = 37;
REMOTEAPI_HAS_CHUNKS = 38;
REMOTEAPI_GET_DOWNLOAD_LOCATIONS = 39;
REMOTEAPI_GET_UPLOAD_LOCATIONS = 40;
REMOTEAPI_REBASE = 41;
REMOTEAPI_ROOT = 42;
REMOTEAPI_COMMIT = 43;
REMOTEAPI_LIST_TABLE_FILES = 44;
}
enum MetricID {
METRIC_UNSPECIFIED = 0;
BYTES_DOWNLOADED = 1;
DOWNLOAD_MS_ELAPSED = 2;
REMOTEAPI_RPC_ERROR = 3;
}
enum AttributeID {
ATTRIBUTE_UNSPECIFIED = 0;
LOCAL_REMOTE_URLS = 1;
ACTIVE_REMOTE_URL = 1;
}
message ClientEventAttribute {