From 2f7df9198ae6974564d6cfadd522af127dc195d6 Mon Sep 17 00:00:00 2001 From: JK Zhang Date: Thu, 27 Jul 2023 09:21:17 +0800 Subject: [PATCH] add mixgraph Signed-off-by: JK Zhang --- .gitignore | 2 - Dockerfile | 2 +- Makefile | 24 +- README.md | 102 +-- cmd/go-ycsb/client.go | 7 +- cmd/go-ycsb/fdb.go | 20 + cmd/go-ycsb/main.go | 20 +- cmd/go-ycsb/rocksdb.go | 20 + cmd/go-ycsb/shell.go | 48 +- db/aerospike/db.go | 1 + db/badger/db.go | 16 +- db/boltdb/db.go | 16 +- db/cassandra/db.go | 20 +- db/foundationdb/db.go | 10 +- db/mongodb/db.go | 91 +-- db/mysql/db.go | 198 +----- db/pg/db.go | 12 +- db/redis/db.go | 219 ++---- db/rocksdb/db.go | 17 +- db/sqlite/db.go | 191 +---- db/tikv/db.go | 20 +- db/tikv/raw.go | 39 +- db/tikv/txn.go | 83 +-- go.mod | 164 ++--- go.sum | 1057 +++++----------------------- pkg/client/client.go | 279 +++++++- pkg/client/dbwrapper.go | 4 +- pkg/generator/pareto.go | 83 +++ pkg/generator/scrambled_zipfian.go | 2 + pkg/generator/twotermexpkeys.go | 244 +++++++ pkg/generator/zipfian.go | 4 +- pkg/measurement/histogram.go | 196 +++++- pkg/measurement/measurement.go | 120 ++-- pkg/prop/prop.go | 72 +- pkg/util/concurrent_map.go | 2 +- pkg/util/util.go | 11 +- pkg/workload/core.go | 310 +++++++- pkg/ycsb/measurement.go | 24 +- pkg/ycsb/workload.go | 16 +- workloads/mixgraph-load | 59 ++ workloads/mixgraph-run | 59 ++ workloads/workloada | 4 +- 42 files changed, 1879 insertions(+), 2009 deletions(-) create mode 100644 cmd/go-ycsb/fdb.go create mode 100644 cmd/go-ycsb/rocksdb.go create mode 100644 pkg/generator/pareto.go create mode 100644 pkg/generator/twotermexpkeys.go create mode 100644 workloads/mixgraph-load create mode 100644 workloads/mixgraph-run diff --git a/.gitignore b/.gitignore index 6746da66..dbc1853c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,3 @@ log .idea .vscode vendor -tool/tool -.DS_Store \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 68945151..d14964b2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.18.4-alpine3.16 +FROM golang:1.13.6-alpine3.11 ENV GOPATH /go diff --git a/Makefile b/Makefile index 17089fcc..21e950f0 100644 --- a/Makefile +++ b/Makefile @@ -1,32 +1,16 @@ FDB_CHECK := $(shell command -v fdbcli 2> /dev/null) ROCKSDB_CHECK := $(shell echo "int main() { return 0; }" | gcc -lrocksdb -x c++ -o /dev/null - 2>/dev/null; echo $$?) -SQLITE_CHECK := $(shell echo "int main() { return 0; }" | gcc -lsqlite3 -x c++ -o /dev/null - 2>/dev/null; echo $$?) -TAGS = +TAGS = ifdef FDB_CHECK TAGS += foundationdb -endif - -ifneq ($(shell go env GOOS), $(shell go env GOHOSTOS)) - CROSS_COMPILE := 1 -endif -ifneq ($(shell go env GOARCH), $(shell go env GOHOSTARCH)) - CROSS_COMPILE := 1 -endif - -ifndef CROSS_COMPILE - -ifeq ($(SQLITE_CHECK), 0) - TAGS += libsqlite3 -endif +endif ifeq ($(ROCKSDB_CHECK), 0) TAGS += rocksdb - CGO_CXXFLAGS := "${CGO_CXXFLAGS} -std=c++11" - CGO_FLAGS += CGO_CXXFLAGS=$(CGO_CXXFLAGS) -endif - + CGO_CXXFLAGS := "${CGO_CXXFLAGS} -std=c++11" + CGO_FLAGS += CGO_CXXFLAGS=$(CGO_CXXFLAGS) endif default: build diff --git a/README.md b/README.md index 9b4c1f09..9889bcd5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# go-ycsb +# go-ycsb go-ycsb is a Go port of [YCSB](https://github.com/brianfrankcooper/YCSB). It fully supports all YCSB generators and the Core workload so we can do the basic CRUD benchmarks with Go. @@ -9,46 +9,22 @@ go-ycsb is a Go port of [YCSB](https://github.com/brianfrankcooper/YCSB). It ful ## Getting Started -### Download - -https://github.com/pingcap/go-ycsb/releases/latest - -**Linux** -``` -wget -c https://github.com/pingcap/go-ycsb/releases/latest/download/go-ycsb-linux-amd64.tar.gz -O - | tar -xz - -# give it a try -./go-ycsb --help -``` - -**OSX** -``` -wget -c https://github.com/pingcap/go-ycsb/releases/latest/download/go-ycsb-darwin-amd64.tar.gz -O - | tar -xz - -# give it a try -./go-ycsb --help -``` - -### Building from source - ```bash -git clone https://github.com/pingcap/go-ycsb.git -cd go-ycsb +git clone https://github.com/pingcap/go-ycsb.git $GOPATH/src/github.com/pingcap/go-ycsb +cd $GOPATH/src/github.com/pingcap/go-ycsb make -# give it a try -./bin/go-ycsb --help +./bin/go-ycsb ``` Notice: -+ Minimum supported go version is 1.16. + To use FoundationDB, you must install [client](https://www.foundationdb.org/download/) library at first, now the supported version is 6.2.11. + To use RocksDB, you must follow [INSTALL](https://github.com/facebook/rocksdb/blob/master/INSTALL.md) to install RocksDB at first. -## Usage +## Usage -Mostly, we can start from the official document [Running-a-Workload](https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload). +Mostly, we can start from the offical document [Running-a-Workload](https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload). ### Shell @@ -86,31 +62,22 @@ Available Commands: - MySQL / TiDB - TiKV -- FoundationDB +- FoundationDB - Aerospike - Badger - Cassandra / ScyllaDB - Pegasus -- PostgreSQL / CockroachDB / AlloyDB / Yugabyte +- PostgreSQL / CockroachDB - RocksDB - Spanner - Sqlite - MongoDB - Redis and Redis Cluster - BoltDB -- etcd -- DynamoDB - -## Output configuration - -|field|default value|description| -|-|-|-| -|measurementtype|"histogram"|The mechanism for recording measurements, one of `histogram`, `raw` or `csv`| -|measurement.output_file|""|File to write output to, default writes to stdout| ## Database Configuration -You can pass the database configurations through `-p field=value` in the command line directly. +You can pass the database configuraitons through `-p field=value` in the command line directly. Common configurations: @@ -120,7 +87,7 @@ Common configurations: |verbose|false|Output the execution query| |debug.pprof|":6060"|Go debug profile address| -### MySQL & TiDB +### MySQL |field|default value|description| |-|-|-| @@ -129,8 +96,6 @@ Common configurations: |mysql.user|"root"|MySQL User| |mysql.password||MySQL Password| |mysql.db|"test"|MySQL Database| -|tidb.cluster_index|true|Whether to use cluster index, for TiDB only| -|tidb.instances|""|Comma-seperated address list of tidb instances (eg: `tidb-0:4000,tidb-1:4000`)| ### TiKV @@ -141,9 +106,7 @@ Common configurations: |tikv.type|"raw"|TiKV mode, "raw", "txn", or "coprocessor"| |tikv.conncount|128|gRPC connection count| |tikv.batchsize|128|Request batch size| -|tikv.async_commit|true|Enalbe async commit or not| -|tikv.one_pc|true|Enable one phase or not| -|tikv.apiversion|"V1"|[api-version](https://docs.pingcap.com/tidb/stable/tikv-configuration-file#api-version-new-in-v610) of tikv server, "V1" or "V2"| + ### FoundationDB @@ -153,14 +116,14 @@ Common configurations: |fdb.dbname|"DB"|The cluster database name| |fdb.apiversion|510|API version, now only 5.1 is supported| -### PostgreSQL & CockroachDB & AlloyDB & Yugabyte +### PostgreSQL |field|default value|description| |-|-|-| |pg.host|"127.0.0.1"|PostgreSQL Host| |pg.port|5432|PostgreSQL Port| |pg.user|"root"|PostgreSQL User| -|pg.password||PostgreSQL Password| +|pg.passowrd||PostgreSQL Password| |pg.db|"test"|PostgreSQL Database| |pg.sslmode|"disable|PostgreSQL ssl mode| @@ -230,7 +193,7 @@ Common configurations: |rocksdb.index_type|kBinarySearch|Sets the index type used for this table. __kBinarySearch__: A space efficient index block that is optimized for binary-search-based index. __kHashSearch__: The hash index, if enabled, will do the hash lookup when `Options.prefix_extractor` is provided. __kTwoLevelIndexSearch__: A two-level index implementation. Both levels are binary search indexes| |rocksdb.block_align|false|Enable/Disable align data blocks on lesser of page size and block size| -### Spanner +### Spanner |field|default value|description| |-|-|-| @@ -246,23 +209,19 @@ Common configurations: |sqlite.journalmode|"DELETE"|Journal mode: DELETE, TRUNCSTE, PERSIST, MEMORY, WAL, OFF| |sqlite.cache|"Shared"|Cache: shared, private| -### Cassandra +### Cassandra |field|default value|description| |-|-|-| |cassandra.cluster|"127.0.0.1:9042"|Cassandra cluster| |cassandra.keyspace|"test"|Keyspace| |cassandra.connections|2|Number of connections per host| -|cassandra.username|cassandra|Username| -|cassandra.password|cassandra|Password| ### MongoDB |field|default value|description| |-|-|-| -|mongodb.url|"mongodb://127.0.0.1:27017"|MongoDB URI| -|mongodb.tls_skip_verify|false|Enable/disable server ca certificate verification| -|mongodb.tls_ca_file|""|Path to mongodb server ca certificate file| +|mongodb.uri|"mongodb://127.0.0.1:27017"|MongoDB URI| |mongodb.namespace|"ycsb.ycsb"|Namespace to use| |mongodb.authdb|"admin"|Authentication database| |mongodb.username|N/A|Username for authentication| @@ -271,7 +230,6 @@ Common configurations: ### Redis |field|default value|description| |-|-|-| -|redis.datatype|hash|"hash", "string" or "json" ("json" requires [RedisJSON](https://redis.io/docs/stack/json/) available)| |redis.mode|single|"single" or "cluster"| |redis.network|tcp|"tcp" or "unix"| |redis.addr||Redis server address(es) in "host:port" form, can be semi-colon `;` separated in cluster mode| @@ -286,7 +244,7 @@ Common configurations: |redis.max_retry_backoff|512ms|Maximum backoff between each retry| |redis.dial_timeout|5s|Dial timeout for establishing new connection| |redis.read_timeout|3s|Timeout for socket reads| -|redis.write_timeout|3s|Timeout for socket writes| +|redis.write_timeout|3s|Timeout for socker writes| |redis.pool_size|10|Maximum number of socket connections| |redis.min_idle_conns|0|Minimum number of idle connections| |redis.max_conn_age|0|Connection age at which client closes the connection| @@ -309,32 +267,6 @@ Common configurations: |bolt.mmap_flags|0|Set the DB.MmapFlags flag before memory mapping the file| |bolt.initial_mmap_size|0|The initial mmap size of the database in bytes. If <= 0, the initial map size is 0. If the size is smaller than the previous database, it takes no effect| -### etcd - -|field|default value|description| -|-|-|-| -|etcd.endpoints|"localhost:2379"|The etcd endpoint(s), multiple endpoints can be passed separated by comma.| -|etcd.dial_timeout|"2s"|The dial timeout duration passed into the client config.| -|etcd.cert_file|""|When using secure etcd, this should point to the crt file.| -|etcd.key_file|""|When using secure etcd, this should point to the pem file.| -|etcd.cacert_file|""|When using secure etcd, this should point to the ca file.| - -### DynamoDB - -|field|default value|description| -|-|-|-| -|dynamodb.tablename|"ycsb"|The database tablename| -|dynamodb.primarykey|"_key"|The table primary key fieldname| -|dynamodb.rc.units|10|Read request units throughput| -|dynamodb.wc.units|10|Write request units throughput| -|dynamodb.ensure.clean.table|true|On load mode ensure that the table is clean at the begining. In case of true and if the table previously exists it will be deleted and recreated| -|dynamodb.endpoint|""|Used endpoint for connection. If empty will use the default loaded configs| -|dynamodb.region|""|Used region for connection ( should match endpoint ). If empty will use the default loaded configs| -|dynamodb.consistent.reads|false|Reads on DynamoDB provide an eventually consistent read by default. If your benchmark/use-case requires a strongly consistent read, set this option to true| -|dynamodb.delete.after.run.stage|false|Detele the database table after the run stage| - - - ## TODO - [ ] Support more measurement, like HdrHistogram diff --git a/cmd/go-ycsb/client.go b/cmd/go-ycsb/client.go index 22abb5d3..a29eb0b3 100644 --- a/cmd/go-ycsb/client.go +++ b/cmd/go-ycsb/client.go @@ -24,7 +24,7 @@ import ( "github.com/spf13/cobra" ) -func runClientCommandFunc(cmd *cobra.Command, args []string, doTransactions bool, command string) { +func runClientCommandFunc(cmd *cobra.Command, args []string, doTransactions bool) { dbName := args[0] initialGlobal(dbName, func() { @@ -33,7 +33,6 @@ func runClientCommandFunc(cmd *cobra.Command, args []string, doTransactions bool doTransFlag = "false" } globalProps.Set(prop.DoTransactions, doTransFlag) - globalProps.Set(prop.Command, command) if cmd.Flags().Changed("threads") { // We set the threadArg via command line. @@ -64,11 +63,11 @@ func runClientCommandFunc(cmd *cobra.Command, args []string, doTransactions bool } func runLoadCommandFunc(cmd *cobra.Command, args []string) { - runClientCommandFunc(cmd, args, false, "load") + runClientCommandFunc(cmd, args, false) } func runTransCommandFunc(cmd *cobra.Command, args []string) { - runClientCommandFunc(cmd, args, true, "run") + runClientCommandFunc(cmd, args, true) } var ( diff --git a/cmd/go-ycsb/fdb.go b/cmd/go-ycsb/fdb.go new file mode 100644 index 00000000..523f25e6 --- /dev/null +++ b/cmd/go-ycsb/fdb.go @@ -0,0 +1,20 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build foundationdb + +package main + +import ( // Register FoundationDB database + _ "github.com/pingcap/go-ycsb/db/foundationdb" +) diff --git a/cmd/go-ycsb/main.go b/cmd/go-ycsb/main.go index 2b45bd23..8111594b 100644 --- a/cmd/go-ycsb/main.go +++ b/cmd/go-ycsb/main.go @@ -15,8 +15,6 @@ package main import ( "context" - "fmt" - "log" "net/http" _ "net/http/pprof" "os" @@ -29,7 +27,7 @@ import ( // Register workload - "github.com/spf13/cobra" + "fmt" "github.com/pingcap/go-ycsb/pkg/client" "github.com/pingcap/go-ycsb/pkg/measurement" @@ -37,6 +35,9 @@ import ( "github.com/pingcap/go-ycsb/pkg/util" _ "github.com/pingcap/go-ycsb/pkg/workload" "github.com/pingcap/go-ycsb/pkg/ycsb" + "github.com/spf13/cobra" + + log "github.com/sirupsen/logrus" // Register basic database _ "github.com/pingcap/go-ycsb/db/basic" @@ -50,8 +51,6 @@ import ( _ "github.com/pingcap/go-ycsb/db/aerospike" // Register Badger database _ "github.com/pingcap/go-ycsb/db/badger" - // Register FoundationDB database - _ "github.com/pingcap/go-ycsb/db/foundationdb" // Register RocksDB database _ "github.com/pingcap/go-ycsb/db/rocksdb" // Register Spanner database @@ -70,12 +69,6 @@ import ( _ "github.com/pingcap/go-ycsb/db/boltdb" // Register minio _ "github.com/pingcap/go-ycsb/db/minio" - // Register elastic - _ "github.com/pingcap/go-ycsb/db/elasticsearch" - // Register etcd - _ "github.com/pingcap/go-ycsb/db/etcd" - // Register dynamodb - _ "github.com/pingcap/go-ycsb/db/dynamodb" ) var ( @@ -93,6 +86,8 @@ var ( ) func initialGlobal(dbName string, onProperties func()) { + log.SetLevel(log.WarnLevel) + globalProps = properties.NewProperties() if len(propertyFiles) > 0 { globalProps = properties.MustLoadFiles(propertyFiles, properties.UTF8, false) @@ -100,9 +95,6 @@ func initialGlobal(dbName string, onProperties func()) { for _, prop := range propertyValues { seps := strings.SplitN(prop, "=", 2) - if len(seps) != 2 { - log.Fatalf("bad property: `%s`, expected format `name=value`", prop) - } globalProps.Set(seps[0], seps[1]) } diff --git a/cmd/go-ycsb/rocksdb.go b/cmd/go-ycsb/rocksdb.go new file mode 100644 index 00000000..d1d65eae --- /dev/null +++ b/cmd/go-ycsb/rocksdb.go @@ -0,0 +1,20 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build rocksdb + +package main + +import ( // Register RocksDB database + _ "github.com/pingcap/go-ycsb/db/rocksdb" +) diff --git a/cmd/go-ycsb/shell.go b/cmd/go-ycsb/shell.go index ef1fe2a5..e1be9f35 100644 --- a/cmd/go-ycsb/shell.go +++ b/cmd/go-ycsb/shell.go @@ -66,45 +66,45 @@ func runShellCommand(args []string) { cmd.AddCommand( &cobra.Command{ - Use: "read key [field0 field1 field2 ...]", - Short: "Read a record", - Args: cobra.MinimumNArgs(1), - Run: runShellReadCommand, + Use: "read key [field0 field1 field2 ...]", + Short: "Read a record", + Args: cobra.MinimumNArgs(1), + Run: runShellReadCommand, DisableFlagsInUseLine: true, }, &cobra.Command{ - Use: "scan key recordcount [field0 field1 field2 ...]", - Short: "Scan starting at key", - Args: cobra.MinimumNArgs(2), - Run: runShellScanCommand, + Use: "scan key recordcount [field0 field1 field2 ...]", + Short: "Scan starting at key", + Args: cobra.MinimumNArgs(2), + Run: runShellScanCommand, DisableFlagsInUseLine: true, }, &cobra.Command{ - Use: "insert key field0=value0 [field1=value1 ...]", - Short: "Insert a record", - Args: cobra.MinimumNArgs(2), - Run: runShellInsertCommand, + Use: "insert key field0=value0 [field1=value1 ...]", + Short: "Insert a record", + Args: cobra.MinimumNArgs(2), + Run: runShellInsertCommand, DisableFlagsInUseLine: true, }, &cobra.Command{ - Use: "update key field0=value0 [field1=value1 ...]", - Short: "Update a record", - Args: cobra.MinimumNArgs(2), - Run: runShellUpdateCommand, + Use: "update key field0=value0 [field1=value1 ...]", + Short: "Update a record", + Args: cobra.MinimumNArgs(2), + Run: runShellUpdateCommand, DisableFlagsInUseLine: true, }, &cobra.Command{ - Use: "delete key", - Short: "Delete a record", - Args: cobra.MinimumNArgs(1), - Run: runShellDeleteCommand, + Use: "delete key", + Short: "Delete a record", + Args: cobra.MinimumNArgs(1), + Run: runShellDeleteCommand, DisableFlagsInUseLine: true, }, &cobra.Command{ - Use: "table [tablename]", - Short: "Get or [set] the name of the table", - Args: cobra.MaximumNArgs(1), - Run: runShellTableCommand, + Use: "table [tablename]", + Short: "Get or [set] the name of the table", + Args: cobra.MaximumNArgs(1), + Run: runShellTableCommand, DisableFlagsInUseLine: true, }, ) diff --git a/db/aerospike/db.go b/db/aerospike/db.go index cc8cd4e5..7935d294 100644 --- a/db/aerospike/db.go +++ b/db/aerospike/db.go @@ -34,6 +34,7 @@ func (adb *aerospikedb) InitThread(ctx context.Context, threadID int, threadCoun // CleanupThread cleans up the state when the worker finished. func (adb *aerospikedb) CleanupThread(ctx context.Context) { + return } // Read reads a record from the database and returns a map of each field/value pair. diff --git a/db/badger/db.go b/db/badger/db.go index 6599141a..28f270ee 100644 --- a/db/badger/db.go +++ b/db/badger/db.go @@ -218,15 +218,13 @@ func (db *badgerDB) Update(ctx context.Context, table string, key string, values } buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, data) + rowData, err := db.r.Encode(buf.Bytes(), data) if err != nil { return err } - return txn.Set(rowKey, buf) + return txn.Set(rowKey, rowData) }) return err } @@ -236,15 +234,13 @@ func (db *badgerDB) Insert(ctx context.Context, table string, key string, values rowKey := db.getRowKey(table, key) buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err := db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } - return txn.Set(rowKey, buf) + return txn.Set(rowKey, rowData) }) return err diff --git a/db/boltdb/db.go b/db/boltdb/db.go index 27826122..eb335e85 100644 --- a/db/boltdb/db.go +++ b/db/boltdb/db.go @@ -183,16 +183,14 @@ func (db *boltDB) Update(ctx context.Context, table string, key string, values m } buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, data) + rowData, err := db.r.Encode(buf.Bytes(), data) if err != nil { return err } - return bucket.Put([]byte(key), buf) + return bucket.Put([]byte(key), rowData) }) return err } @@ -205,16 +203,14 @@ func (db *boltDB) Insert(ctx context.Context, table string, key string, values m } buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } - return bucket.Put([]byte(key), buf) + return bucket.Put([]byte(key), rowData) }) return err } diff --git a/db/cassandra/db.go b/db/cassandra/db.go index cc9cd635..c39828c3 100644 --- a/db/cassandra/db.go +++ b/db/cassandra/db.go @@ -33,11 +33,7 @@ const ( cassandraCluster = "cassandra.cluster" cassandraKeyspace = "cassandra.keyspace" cassandraConnections = "cassandra.connections" - cassandraUsername = "cassandra.username" - cassandraPassword = "cassandra.password" - cassandraUsernameDefault = "cassandra" - cassandraPasswordDefault = "cassandra" cassandraClusterDefault = "127.0.0.1:9042" cassandraKeyspaceDefault = "test" cassandraConnectionsDefault = 2 // refer to https://github.com/gocql/gocql/blob/master/cluster.go#L52 @@ -78,10 +74,6 @@ func (c cassandraCreator) Create(p *properties.Properties) (ycsb.DB, error) { cluster.Timeout = 30 * time.Second cluster.Consistency = gocql.Quorum - username := p.GetString(cassandraUsername, cassandraUsernameDefault) - password := p.GetString(cassandraPassword, cassandraPasswordDefault) - cluster.Authenticator = gocql.PasswordAuthenticator{Username: username, Password: password} - session, err := cluster.CreateSession() if err != nil { return nil, err @@ -197,10 +189,8 @@ func (db *cassandraDB) execQuery(ctx context.Context, query string, args ...inte } func (db *cassandraDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("UPDATE ") buf.WriteString(fmt.Sprintf("%s.%s", db.keySpace, table)) @@ -230,10 +220,8 @@ func (db *cassandraDB) Insert(ctx context.Context, table string, key string, val args := make([]interface{}, 0, 1+len(values)) args = append(args, key) - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("INSERT INTO ") buf.WriteString(fmt.Sprintf("%s.%s", db.keySpace, table)) diff --git a/db/foundationdb/db.go b/db/foundationdb/db.go index 962f81d2..eda01e72 100644 --- a/db/foundationdb/db.go +++ b/db/foundationdb/db.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build foundationdb +// +build foundationdb package foundationdb @@ -152,12 +152,12 @@ func (db *fDB) Update(ctx context.Context, table string, key string, values map[ buf := db.bufPool.Get() defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, data) + rowData, err := db.r.Encode(buf.Bytes(), data) if err != nil { return nil, err } - tr.Set(fdb.Key(rowKey), buf) + tr.Set(fdb.Key(rowKey), rowData) return }) @@ -169,14 +169,14 @@ func (db *fDB) Insert(ctx context.Context, table string, key string, values map[ buf := db.bufPool.Get() defer db.bufPool.Put(buf) - buf, err := db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } rowKey := db.getRowKey(table, key) _, err = db.db.Transact(func(tr fdb.Transaction) (ret interface{}, e error) { - tr.Set(fdb.Key(rowKey), buf) + tr.Set(fdb.Key(rowKey), rowData) return }) return err diff --git a/db/mongodb/db.go b/db/mongodb/db.go index 913c6bbf..294fe809 100644 --- a/db/mongodb/db.go +++ b/db/mongodb/db.go @@ -1,41 +1,36 @@ -// Copyright (c) 2020 Daimler TSS GmbH TLS support - package mongodb import ( "context" - "crypto/x509" "errors" "fmt" - "io/ioutil" - "log" - "strings" "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/ycsb" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" - "go.mongodb.org/mongo-driver/x/mongo/driver/connstring" + "go.mongodb.org/mongo-driver/x/network/command" + "go.mongodb.org/mongo-driver/x/network/connstring" ) const ( - mongodbUrl = "mongodb.url" - mongodbAuthdb = "mongodb.authdb" - mongodbUsername = "mongodb.username" - mongodbPassword = "mongodb.password" - - // see https://github.com/brianfrankcooper/YCSB/tree/master/mongodb#mongodb-configuration-parameters - mongodbUrlDefault = "mongodb://127.0.0.1:27017/ycsb?w=1" - mongodbDatabaseDefault = "ycsb" - mongodbAuthdbDefault = "admin" - mongodbTLSSkipVerify = "mongodb.tls_skip_verify" - mongodbTLSCAFile = "mongodb.tls_ca_file" + mongodbUri = "mongodb.uri" + mongodbNamespace = "mongodb.namespace" + mongodbAuthdb = "mongodb.authdb" + mongodbUsername = "mongodb.username" + mongodbPassword = "mongodb.password" + + mongodbUriDefault = "mongodb://127.0.0.1:27017" + mongodbNamespaceDefault = "ycsb.ycsb" + mongodbAuthdbDefault = "admin" ) type mongoDB struct { - cli *mongo.Client - db *mongo.Database + cli *mongo.Client + dbname string + collname string + coll *mongo.Collection } func (m *mongoDB) Close() error { @@ -57,7 +52,7 @@ func (m *mongoDB) Read(ctx context.Context, table string, key string, fields []s } opt := &options.FindOneOptions{Projection: projection} var doc map[string][]byte - if err := m.db.Collection(table).FindOne(ctx, bson.M{"_id": key}, opt).Decode(&doc); err != nil { + if err := m.coll.FindOne(ctx, bson.M{"_id": key}, opt).Decode(&doc); err != nil { return nil, fmt.Errorf("Read error: %s", err.Error()) } return doc, nil @@ -71,7 +66,7 @@ func (m *mongoDB) Scan(ctx context.Context, table string, startKey string, count } limit := int64(count) opt := &options.FindOptions{Projection: projection, Sort: bson.M{"_id": 1}, Limit: &limit} - cursor, err := m.db.Collection(table).Find(ctx, bson.M{"_id": bson.M{"$gte": startKey}}, opt) + cursor, err := m.coll.Find(ctx, bson.M{"_id": bson.M{"$gte": startKey}}, opt) if err != nil { return nil, fmt.Errorf("Scan error: %s", err.Error()) } @@ -93,7 +88,7 @@ func (m *mongoDB) Insert(ctx context.Context, table string, key string, values m for k, v := range values { doc[k] = v } - if _, err := m.db.Collection(table).InsertOne(ctx, doc); err != nil { + if _, err := m.coll.InsertOne(ctx, doc); err != nil { fmt.Println(err) return fmt.Errorf("Insert error: %s", err.Error()) } @@ -102,7 +97,7 @@ func (m *mongoDB) Insert(ctx context.Context, table string, key string, values m // Update a document. func (m *mongoDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - res, err := m.db.Collection(table).UpdateOne(ctx, bson.M{"_id": key}, bson.M{"$set": values}) + res, err := m.coll.UpdateOne(ctx, bson.M{"_id": key}, bson.M{"$set": values}) if err != nil { return fmt.Errorf("Update error: %s", err.Error()) } @@ -114,7 +109,7 @@ func (m *mongoDB) Update(ctx context.Context, table string, key string, values m // Delete a document. func (m *mongoDB) Delete(ctx context.Context, table string, key string) error { - res, err := m.db.Collection(table).DeleteOne(ctx, bson.M{"_id": key}) + res, err := m.coll.DeleteOne(ctx, bson.M{"_id": key}) if err != nil { return fmt.Errorf("Delete error: %s", err.Error()) } @@ -124,16 +119,19 @@ func (m *mongoDB) Delete(ctx context.Context, table string, key string) error { return nil } -type mongodbCreator struct{} +type mongodbCreator struct { +} func (c mongodbCreator) Create(p *properties.Properties) (ycsb.DB, error) { - uri := p.GetString(mongodbUrl, mongodbUrlDefault) + uri := p.GetString(mongodbUri, mongodbUriDefault) + nss := p.GetString(mongodbNamespace, mongodbNamespaceDefault) authdb := p.GetString(mongodbAuthdb, mongodbAuthdbDefault) - tlsSkipVerify := p.GetBool(mongodbTLSSkipVerify, false) - caFile := p.GetString(mongodbTLSCAFile, "") - connString, err := connstring.Parse(uri) - if err != nil { + if _, err := connstring.Parse(uri); err != nil { + return nil, err + } + ns := command.ParseNamespace(nss) + if err := ns.Validate(); err != nil { return nil, err } @@ -141,31 +139,6 @@ func (c mongodbCreator) Create(p *properties.Properties) (ycsb.DB, error) { defer cancel() cliOpts := options.Client().ApplyURI(uri) - if cliOpts.TLSConfig != nil { - if len(connString.Hosts) > 0 { - servername := strings.Split(connString.Hosts[0], ":")[0] - log.Printf("using server name for tls: %s\n", servername) - cliOpts.TLSConfig.ServerName = servername - } - if tlsSkipVerify { - log.Println("skipping tls cert validation") - cliOpts.TLSConfig.InsecureSkipVerify = true - } - - if caFile != "" { - // Load CA cert - caCert, err := ioutil.ReadFile(caFile) - if err != nil { - log.Fatal(err) - } - caCertPool := x509.NewCertPool() - if ok := caCertPool.AppendCertsFromPEM(caCert); !ok { - log.Fatalf("certifacte %s could not be parsed", caFile) - } - - cliOpts.TLSConfig.RootCAs = caCertPool - } - } username, usrExist := p.Get(mongodbUsername) password, pwdExist := p.Get(mongodbPassword) @@ -192,8 +165,10 @@ func (c mongodbCreator) Create(p *properties.Properties) (ycsb.DB, error) { fmt.Println("Connected to MongoDB!") m := &mongoDB{ - cli: cli, - db: cli.Database(mongodbDatabaseDefault), + cli: cli, + dbname: ns.DB, + collname: ns.Collection, + coll: cli.Database(ns.DB).Collection(ns.Collection), } return m, nil } diff --git a/db/mysql/db.go b/db/mysql/db.go index 4c488766..98e876cf 100644 --- a/db/mysql/db.go +++ b/db/mysql/db.go @@ -16,18 +16,16 @@ package mysql import ( "bytes" "context" - "crypto/sha1" "database/sql" - "database/sql/driver" - "encoding/hex" "fmt" "strings" - "sync/atomic" - "github.com/go-sql-driver/mysql" - "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/prop" "github.com/pingcap/go-ycsb/pkg/util" + + // mysql package + _ "github.com/go-sql-driver/mysql" + "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/ycsb" ) @@ -40,42 +38,9 @@ const ( mysqlDBName = "mysql.db" mysqlForceIndex = "mysql.force_index" // TODO: support batch and auto commit - - tidbClusterIndex = "tidb.cluster_index" - tidbInstances = "tidb.instances" ) -type muxDriver struct { - cursor uint64 - instances []string - internal driver.Driver -} - -func (drv *muxDriver) Open(name string) (driver.Conn, error) { - k := atomic.AddUint64(&drv.cursor, 1) - return drv.internal.Open(drv.instances[int(k)%len(drv.instances)]) -} - -func openTiDBInstances(addrs []string, user string, pass string, db string) (*sql.DB, error) { - instances := make([]string, len(addrs)) - hash := sha1.New() - for i, addr := range addrs { - hash.Write([]byte("+" + addr)) - instances[i] = fmt.Sprintf("%s:%s@tcp(%s)/%s", user, pass, addr, db) - } - digest := hash.Sum(nil) - driver := "tidb:" + hex.EncodeToString(digest[:]) - for _, n := range sql.Drivers() { - if n == driver { - return sql.Open(driver, "") - } - } - sql.Register(driver, &muxDriver{instances: instances, internal: &mysql.MySQLDriver{}}) - return sql.Open(driver, "") -} - type mysqlCreator struct { - name string } type mysqlDB struct { @@ -107,25 +72,10 @@ func (c mysqlCreator) Create(p *properties.Properties) (ycsb.DB, error) { user := p.GetString(mysqlUser, "root") password := p.GetString(mysqlPassword, "") dbName := p.GetString(mysqlDBName, "test") - tidbList := p.GetString(tidbInstances, "") - - var ( - db *sql.DB - err error - tidbs []string - ) - for _, tidb := range strings.Split(tidbList, ",") { - tidb = strings.TrimSpace(tidb) - if len(tidb) > 0 { - tidbs = append(tidbs, tidb) - } - } - if len(tidbs) > 0 { - db, err = openTiDBInstances(tidbs, user, password, dbName) - } else { - dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", user, password, host, port, dbName) - db, err = sql.Open("mysql", dsn) - } + + dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", user, password, host, port, dbName) + var err error + db, err := sql.Open("mysql", dsn) if err != nil { return nil, err } @@ -142,17 +92,17 @@ func (c mysqlCreator) Create(p *properties.Properties) (ycsb.DB, error) { d.bufPool = util.NewBufPool() - if err := d.createTable(c.name); err != nil { + if err := d.createTable(); err != nil { return nil, err } return d, nil } -func (db *mysqlDB) createTable(driverName string) error { +func (db *mysqlDB) createTable() error { tableName := db.p.GetString(prop.TableName, prop.TableNameDefault) - if db.p.GetBool(prop.DropData, prop.DropDataDefault) && - !db.p.GetBool(prop.DoTransactions, true) { + + if db.p.GetBool(prop.DropData, prop.DropDataDefault) && !db.p.GetBool(prop.DoTransactions, true) { if _, err := db.db.Exec(fmt.Sprintf("DROP TABLE IF EXISTS %s", tableName)); err != nil { return err } @@ -165,16 +115,16 @@ func (db *mysqlDB) createTable(driverName string) error { s := fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s (YCSB_KEY VARCHAR(64) PRIMARY KEY", tableName) buf.WriteString(s) - if (driverName == "tidb" || driverName == "mysql") && db.p.GetBool(tidbClusterIndex, true) { - buf.WriteString(" /*T![clustered_index] CLUSTERED */") - } - for i := int64(0); i < fieldCount; i++ { buf.WriteString(fmt.Sprintf(", FIELD%d VARCHAR(%d)", i, fieldLength)) } buf.WriteString(");") + if db.verbose { + fmt.Println(buf.String()) + } + _, err := db.db.Exec(buf.String()) return err } @@ -307,37 +257,6 @@ func (db *mysqlDB) Read(ctx context.Context, table string, key string, fields [] return rows[0], nil } -func (db *mysqlDB) BatchRead(ctx context.Context, table string, keys []string, fields []string) ([]map[string][]byte, error) { - args := make([]interface{}, 0, len(keys)) - buf := db.bufPool.Get() - defer db.bufPool.Put(buf) - if len(fields) == 0 { - buf = append(buf, fmt.Sprintf(`SELECT * FROM %s %s WHERE YCSB_KEY IN (`, table, db.forceIndexKeyword)...) - } else { - buf = append(buf, fmt.Sprintf(`SELECT %s FROM %s %s WHERE YCSB_KEY IN (`, strings.Join(fields, ","), table, db.forceIndexKeyword)...) - } - for i, key := range keys { - buf = append(buf, '?') - if i < len(keys)-1 { - buf = append(buf, ',') - } - args = append(args, key) - } - buf = append(buf, ')') - - query := string(buf[:]) - rows, err := db.queryRows(ctx, query, len(keys), args...) - db.clearCacheIfFailed(ctx, query, err) - - if err != nil { - return nil, err - } else if len(rows) == 0 { - return nil, nil - } - - return rows, nil -} - func (db *mysqlDB) Scan(ctx context.Context, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { var query string if len(fields) == 0 { @@ -368,10 +287,8 @@ func (db *mysqlDB) execQuery(ctx context.Context, query string, args ...interfac } func (db *mysqlDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("UPDATE ") buf.WriteString(table) @@ -397,25 +314,12 @@ func (db *mysqlDB) Update(ctx context.Context, table string, key string, values return db.execQuery(ctx, buf.String(), args...) } -func (db *mysqlDB) BatchUpdate(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - // mysql does not support BatchUpdate, fallback to Update like dbwrapper.go - for i := range keys { - err := db.Update(ctx, table, keys[i], values[i]) - if err != nil { - return err - } - } - return nil -} - func (db *mysqlDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { args := make([]interface{}, 0, 1+len(values)) args = append(args, key) - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("INSERT IGNORE INTO ") buf.WriteString(table) @@ -438,75 +342,19 @@ func (db *mysqlDB) Insert(ctx context.Context, table string, key string, values return db.execQuery(ctx, buf.String(), args...) } -func (db *mysqlDB) BatchInsert(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - args := make([]interface{}, 0, (1+len(values))*len(keys)) - buf := db.bufPool.Get() - defer db.bufPool.Put(buf) - buf = append(buf, "INSERT IGNORE INTO "...) - buf = append(buf, table...) - buf = append(buf, " (YCSB_KEY"...) - - valueString := strings.Builder{} - valueString.WriteString("(?") - pairs := util.NewFieldPairs(values[0]) - for _, p := range pairs { - buf = append(buf, " ,"...) - buf = append(buf, p.Field...) - - valueString.WriteString(" ,?") - } - // Example: INSERT IGNORE INTO table ([columns]) VALUES - buf = append(buf, ") VALUES "...) - // Example: (?, ?, ?, ....) - valueString.WriteByte(')') - valueStrings := make([]string, 0, len(keys)) - for range keys { - valueStrings = append(valueStrings, valueString.String()) - } - // Example: INSERT IGNORE INTO table ([columns]) VALUES (?, ?, ?...), (?, ?, ?), ... - buf = append(buf, strings.Join(valueStrings, ",")...) - - for i, key := range keys { - args = append(args, key) - pairs := util.NewFieldPairs(values[i]) - for _, p := range pairs { - args = append(args, p.Value) - } - } - - return db.execQuery(ctx, string(buf[:]), args...) -} - func (db *mysqlDB) Delete(ctx context.Context, table string, key string) error { query := fmt.Sprintf(`DELETE FROM %s WHERE YCSB_KEY = ?`, table) return db.execQuery(ctx, query, key) } -func (db *mysqlDB) BatchDelete(ctx context.Context, table string, keys []string) error { - args := make([]interface{}, 0, len(keys)) - buf := db.bufPool.Get() - defer db.bufPool.Put(buf) - buf = append(buf, fmt.Sprintf("DELETE FROM %s WHERE YCSB_KEY IN (", table)...) - for i, key := range keys { - buf = append(buf, '?') - if i < len(keys)-1 { - buf = append(buf, ',') - } - args = append(args, key) - } - buf = append(buf, ')') - - return db.execQuery(ctx, string(buf[:]), args...) -} - func (db *mysqlDB) Analyze(ctx context.Context, table string) error { _, err := db.db.Exec(fmt.Sprintf(`ANALYZE TABLE %s`, table)) return err } func init() { - ycsb.RegisterDBCreator("mysql", mysqlCreator{name: "mysql"}) - ycsb.RegisterDBCreator("tidb", mysqlCreator{name: "tidb"}) - ycsb.RegisterDBCreator("mariadb", mysqlCreator{name: "mariadb"}) + ycsb.RegisterDBCreator("mysql", mysqlCreator{}) + ycsb.RegisterDBCreator("tidb", mysqlCreator{}) + ycsb.RegisterDBCreator("mariadb", mysqlCreator{}) } diff --git a/db/pg/db.go b/db/pg/db.go index 81a4a0bd..02162ff9 100644 --- a/db/pg/db.go +++ b/db/pg/db.go @@ -288,10 +288,8 @@ func (db *pgDB) execQuery(ctx context.Context, query string, args ...interface{} } func (db *pgDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("UPDATE ") buf.WriteString(table) @@ -322,10 +320,8 @@ func (db *pgDB) Insert(ctx context.Context, table string, key string, values map args := make([]interface{}, 0, 1+len(values)) args = append(args, key) - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("INSERT INTO ") buf.WriteString(table) diff --git a/db/redis/db.go b/db/redis/db.go index 8032dd2b..ee5ad27b 100644 --- a/db/redis/db.go +++ b/db/redis/db.go @@ -8,36 +8,25 @@ import ( "strings" "time" - goredis "github.com/go-redis/redis/v9" + goredis "github.com/go-redis/redis" "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/prop" "github.com/pingcap/go-ycsb/pkg/util" "github.com/pingcap/go-ycsb/pkg/ycsb" ) -const HASH_DATATYPE string = "hash" -const STRING_DATATYPE string = "string" -const JSON_DATATYPE string = "json" -const JSON_SET string = "JSON.SET" -const JSON_GET string = "JSON.GET" -const HSET string = "HSET" -const HMGET string = "HMGET" - type redisClient interface { - Get(ctx context.Context, key string) *goredis.StringCmd - Do(ctx context.Context, args ...interface{}) *goredis.Cmd - Pipeline() goredis.Pipeliner - Scan(ctx context.Context, cursor uint64, match string, count int64) *goredis.ScanCmd - Set(ctx context.Context, key string, value interface{}, expiration time.Duration) *goredis.StatusCmd - Del(ctx context.Context, keys ...string) *goredis.IntCmd - FlushDB(ctx context.Context) *goredis.StatusCmd + Get(key string) *goredis.StringCmd + Scan(cursor uint64, match string, count int64) *goredis.ScanCmd + Set(key string, value interface{}, expiration time.Duration) *goredis.StatusCmd + Del(keys ...string) *goredis.IntCmd + FlushDB() *goredis.StatusCmd Close() error } type redis struct { - client redisClient - mode string - datatype string + client redisClient + mode string } func (r *redis) Close() error { @@ -51,159 +40,63 @@ func (r *redis) InitThread(ctx context.Context, _ int, _ int) context.Context { func (r *redis) CleanupThread(_ context.Context) { } -func (r *redis) Read(ctx context.Context, table string, key string, fields []string) (data map[string][]byte, err error) { - data = make(map[string][]byte, len(fields)) - err = nil - switch r.datatype { - case JSON_DATATYPE: - cmds := make([]*goredis.Cmd, len(fields)) - pipe := r.client.Pipeline() - for pos, fieldName := range fields { - cmds[pos] = pipe.Do(ctx, JSON_GET, getKeyName(table, key), getFieldJsonPath(fieldName)) - } - _, err = pipe.Exec(ctx) - if err != nil { - return - } - var s string = "" - for pos, fieldName := range fields { - s, err = cmds[pos].Text() - if err != nil { - return - } - data[fieldName] = []byte(s) - } - case HASH_DATATYPE: - args := make([]interface{}, 0, len(fields)+2) - args = append(args, HMGET, getKeyName(table, key)) - for _, fieldName := range fields { - args = append(args, fieldName) - } - sliceReply, errI := r.client.Do(ctx, args...).StringSlice() - if errI != nil { - return - } - for pos, slicePos := range sliceReply { - data[fields[pos]] = []byte(slicePos) - } - case STRING_DATATYPE: - fallthrough - default: - { - var res string = "" - res, err = r.client.Get(ctx, getKeyName(table, key)).Result() - if err != nil { - return - } - err = json.Unmarshal([]byte(res), &data) - return - } +func (r *redis) Read(ctx context.Context, table string, key string, fields []string) (map[string][]byte, error) { + data := make(map[string][]byte, len(fields)) + + res, err := r.client.Get(table + "/" + key).Result() + + if err != nil { + return nil, err } - return + err = json.Unmarshal([]byte(res), &data) + if err != nil { + return nil, err + } + + // TODO: filter by fields + + return data, err } func (r *redis) Scan(ctx context.Context, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { return nil, fmt.Errorf("scan is not supported") } -func (r *redis) Update(ctx context.Context, table string, key string, values map[string][]byte) (err error) { - err = nil - switch r.datatype { - case JSON_DATATYPE: - cmds := make([]*goredis.Cmd, 0, len(values)) - pipe := r.client.Pipeline() - for fieldName, bytes := range values { - cmd := pipe.Do(ctx, JSON_SET, getKeyName(table, key), getFieldJsonPath(fieldName), jsonEscape(bytes)) - cmds = append(cmds, cmd) - } - _, err = pipe.Exec(ctx) - if err != nil { - return - } - for _, cmd := range cmds { - err = cmd.Err() - if err != nil { - return - } - } - case HASH_DATATYPE: - args := make([]interface{}, 0, 2*len(values)+2) - args = append(args, HSET, getKeyName(table, key)) - for fieldName, bytes := range values { - args = append(args, fieldName, string(bytes)) - } - err = r.client.Do(ctx, args...).Err() - case STRING_DATATYPE: - fallthrough - default: - { - var initialEncodedJson string = "" - initialEncodedJson, err = r.client.Get(ctx, getKeyName(table, key)).Result() - if err != nil { - return - } - var encodedJson = make([]byte, 0) - err, encodedJson = mergeEncodedJsonWithMap(initialEncodedJson, values) - if err != nil { - return - } - return r.client.Set(ctx, getKeyName(table, key), string(encodedJson), 0).Err() - } +func (r *redis) Update(ctx context.Context, table string, key string, values map[string][]byte) error { + d, err := r.client.Get(table + "/" + key).Result() + if err != nil { + return err } - return -} -func mergeEncodedJsonWithMap(stringReply string, values map[string][]byte) (err error, data []byte) { curVal := map[string][]byte{} - err = json.Unmarshal([]byte(stringReply), &curVal) + err = json.Unmarshal([]byte(d), &curVal) if err != nil { - return + return err } for k, v := range values { curVal[k] = v } + var data []byte data, err = json.Marshal(curVal) - return -} - -func jsonEscape(bytes []byte) string { - return fmt.Sprintf("\"%s\"", string(bytes)) -} - -func getFieldJsonPath(fieldName string) string { - return fmt.Sprintf("$.%s", fieldName) -} + if err != nil { + return err + } -func getKeyName(table string, key string) string { - return table + "/" + key + return r.client.Set(table+"/"+key, string(data), 0).Err() } -func (r *redis) Insert(ctx context.Context, table string, key string, values map[string][]byte) (err error) { +func (r *redis) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { data, err := json.Marshal(values) if err != nil { return err } - switch r.datatype { - case JSON_DATATYPE: - err = r.client.Do(ctx, JSON_SET, getKeyName(table, key), ".", string(data)).Err() - case HASH_DATATYPE: - args := make([]interface{}, 0, 2*len(values)+2) - args = append(args, HSET, getKeyName(table, key)) - for fieldName, bytes := range values { - args = append(args, fieldName, string(bytes)) - } - err = r.client.Do(ctx, args...).Err() - case STRING_DATATYPE: - fallthrough - default: - err = r.client.Set(ctx, getKeyName(table, key), string(data), 0).Err() - } - return + + return r.client.Set(table+"/"+key, string(data), 0).Err() } func (r *redis) Delete(ctx context.Context, table string, key string) error { - return r.client.Del(ctx, getKeyName(table, key)).Err() + return r.client.Del(table + "/" + key).Err() } type redisCreator struct{} @@ -211,13 +104,13 @@ type redisCreator struct{} func (r redisCreator) Create(p *properties.Properties) (ycsb.DB, error) { rds := &redis{} - mode := p.GetString(redisMode, redisModeDefault) + mode, _ := p.Get(redisMode) switch mode { case "cluster": rds.client = goredis.NewClusterClient(getOptionsCluster(p)) if p.GetBool(prop.DropData, prop.DropDataDefault) { - err := rds.client.FlushDB(context.Background()).Err() + err := rds.client.FlushDB().Err() if err != nil { return nil, err } @@ -229,28 +122,21 @@ func (r redisCreator) Create(p *properties.Properties) (ycsb.DB, error) { rds.client = goredis.NewClient(getOptionsSingle(p)) if p.GetBool(prop.DropData, prop.DropDataDefault) { - err := rds.client.FlushDB(context.Background()).Err() + err := rds.client.FlushDB().Err() if err != nil { return nil, err } } } rds.mode = mode - rds.datatype = p.GetString(redisDatatype, redisDatatypeDefault) - fmt.Println(fmt.Sprintf("Using the redis datatype: %s", rds.datatype)) return rds, nil } const ( redisMode = "redis.mode" - redisModeDefault = "single" - redisDatatype = "redis.datatype" - redisDatatypeDefault = "hash" redisNetwork = "redis.network" - redisNetworkDefault = "tcp" redisAddr = "redis.addr" - redisAddrDefault = "localhost:6379" redisPassword = "redis.password" redisDB = "redis.db" redisMaxRedirects = "redis.max_redirects" @@ -264,7 +150,6 @@ const ( redisReadTimeout = "redis.read_timeout" redisWriteTimeout = "redis.write_timeout" redisPoolSize = "redis.pool_size" - redisPoolSizeDefault = 0 redisMinIdleConns = "redis.min_idle_conns" redisMaxConnAge = "redis.max_conn_age" redisPoolTimeout = "redis.pool_timeout" @@ -293,28 +178,23 @@ func parseTLS(p *properties.Properties) *tls.Config { func getOptionsSingle(p *properties.Properties) *goredis.Options { opts := &goredis.Options{} - - opts.Addr = p.GetString(redisAddr, redisAddrDefault) - opts.DB = p.GetInt(redisDB, 0) - opts.Network = p.GetString(redisNetwork, redisNetworkDefault) + opts.Network, _ = p.Get(redisNetwork) + opts.Addr, _ = p.Get(redisAddr) opts.Password, _ = p.Get(redisPassword) + opts.DB = p.GetInt(redisDB, 0) opts.MaxRetries = p.GetInt(redisMaxRetries, 0) opts.MinRetryBackoff = p.GetDuration(redisMinRetryBackoff, time.Millisecond*8) opts.MaxRetryBackoff = p.GetDuration(redisMaxRetryBackoff, time.Millisecond*512) opts.DialTimeout = p.GetDuration(redisDialTimeout, time.Second*5) opts.ReadTimeout = p.GetDuration(redisReadTimeout, time.Second*3) opts.WriteTimeout = p.GetDuration(redisWriteTimeout, opts.ReadTimeout) - opts.PoolSize = p.GetInt(redisPoolSize, redisPoolSizeDefault) - threadCount := p.MustGetInt("threadcount") - if opts.PoolSize == 0 { - opts.PoolSize = threadCount - fmt.Println(fmt.Sprintf("Setting %s=%d (from ) given you haven't specified a value.", redisPoolSize, opts.PoolSize)) - } + opts.PoolSize = p.GetInt(redisPoolSize, 10) opts.MinIdleConns = p.GetInt(redisMinIdleConns, 0) opts.MaxConnAge = p.GetDuration(redisMaxConnAge, 0) opts.PoolTimeout = p.GetDuration(redisPoolTimeout, time.Second+opts.ReadTimeout) opts.IdleTimeout = p.GetDuration(redisIdleTimeout, time.Minute*5) opts.IdleCheckFrequency = p.GetDuration(redisIdleCheckFreq, time.Minute) + opts.TLSConfig = parseTLS(p) return opts @@ -336,12 +216,7 @@ func getOptionsCluster(p *properties.Properties) *goredis.ClusterOptions { opts.DialTimeout = p.GetDuration(redisDialTimeout, time.Second*5) opts.ReadTimeout = p.GetDuration(redisReadTimeout, time.Second*3) opts.WriteTimeout = p.GetDuration(redisWriteTimeout, opts.ReadTimeout) - opts.PoolSize = p.GetInt(redisPoolSize, redisPoolSizeDefault) - threadCount := p.MustGetInt("threadcount") - if opts.PoolSize == 0 { - opts.PoolSize = threadCount - fmt.Println(fmt.Sprintf("Setting %s=%d (from ) given you haven't specified a value.", redisPoolSize, opts.PoolSize)) - } + opts.PoolSize = p.GetInt(redisPoolSize, 10) opts.MinIdleConns = p.GetInt(redisMinIdleConns, 0) opts.MaxConnAge = p.GetDuration(redisMaxConnAge, 0) opts.PoolTimeout = p.GetDuration(redisPoolTimeout, time.Second+opts.ReadTimeout) diff --git a/db/rocksdb/db.go b/db/rocksdb/db.go index 52ac77e8..04a2a66f 100644 --- a/db/rocksdb/db.go +++ b/db/rocksdb/db.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build rocksdb +// +build rocksdb package rocksdb @@ -27,7 +27,7 @@ import ( "github.com/tecbot/gorocksdb" ) -// properties +// properties const ( rocksdbDir = "rocksdb.dir" // DBOptions @@ -59,11 +59,11 @@ const ( rocksdbBlockRestartInterval = "rocksdb.block_restart_interval" rocksdbFilterPolicy = "rocksdb.filter_policy" rocksdbIndexType = "rocksdb.index_type" - rocksdbWALDir = "rocksdb.wal_dir" // TODO: add more configurations ) -type rocksDBCreator struct{} +type rocksDBCreator struct { +} type rocksDB struct { p *properties.Properties @@ -155,7 +155,6 @@ func getOptions(p *properties.Properties) *gorocksdb.Options { opts.SetUseFsync(p.GetBool(rocksdbUseFsync, false)) opts.SetWriteBufferSize(p.GetInt(rocksdbWriteBufferSize, 64<<20)) opts.SetMaxWriteBufferNumber(p.GetInt(rocksdbMaxWriteBufferNumber, 2)) - opts.SetWalDir(p.GetString(rocksdbWALDir, "")) opts.SetBlockBasedTableFactory(getTableOptions(p)) @@ -231,14 +230,14 @@ func (db *rocksDB) Update(ctx context.Context, table string, key string, values buf := db.bufPool.Get() defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, m) + rowData, err := db.r.Encode(buf.Bytes(), m) if err != nil { return err } rowKey := db.getRowKey(table, key) - return db.db.Put(db.writeOpts, rowKey, buf) + return db.db.Put(db.writeOpts, rowKey, rowData) } func (db *rocksDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { @@ -247,11 +246,11 @@ func (db *rocksDB) Insert(ctx context.Context, table string, key string, values buf := db.bufPool.Get() defer db.bufPool.Put(buf) - buf, err := db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } - return db.db.Put(db.writeOpts, rowKey, buf) + return db.db.Put(db.writeOpts, rowKey, rowData) } func (db *rocksDB) Delete(ctx context.Context, table string, key string) error { diff --git a/db/sqlite/db.go b/db/sqlite/db.go index 0e06ab4e..f86e0843 100644 --- a/db/sqlite/db.go +++ b/db/sqlite/db.go @@ -11,8 +11,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build libsqlite3 - package sqlite import ( @@ -23,38 +21,31 @@ import ( "net/url" "os" "strings" - "time" "github.com/pingcap/go-ycsb/pkg/prop" "github.com/pingcap/go-ycsb/pkg/util" "github.com/magiconair/properties" // sqlite package - "github.com/mattn/go-sqlite3" + _ "github.com/mattn/go-sqlite3" "github.com/pingcap/go-ycsb/pkg/ycsb" ) // Sqlite properties const ( - sqliteDBPath = "sqlite.db" - sqliteMode = "sqlite.mode" - sqliteJournalMode = "sqlite.journalmode" - sqliteCache = "sqlite.cache" - sqliteMaxOpenConns = "sqlite.maxopenconns" - sqliteMaxIdleConns = "sqlite.maxidleconns" - sqliteOptimistic = "sqlite.optimistic" - sqliteOptimisticBackoffMs = "sqlite.optimistic_backoff_ms" + sqliteDBPath = "sqlite.db" + sqliteMode = "sqlite.mode" + sqliteJournalMode = "sqlite.journalmode" + sqliteCache = "sqlite.cache" ) type sqliteCreator struct { } type sqliteDB struct { - p *properties.Properties - db *sql.DB - verbose bool - optimistic bool - backoffMs int + p *properties.Properties + db *sql.DB + verbose bool bufPool *util.BufPool } @@ -72,8 +63,6 @@ func (c sqliteCreator) Create(p *properties.Properties) (ycsb.DB, error) { mode := p.GetString(sqliteMode, "rwc") journalMode := p.GetString(sqliteJournalMode, "WAL") cache := p.GetString(sqliteCache, "shared") - maxOpenConns := p.GetInt(sqliteMaxOpenConns, 1) - maxIdleConns := p.GetInt(sqliteMaxIdleConns, 2) v := url.Values{} v.Set("cache", cache) @@ -86,11 +75,8 @@ func (c sqliteCreator) Create(p *properties.Properties) (ycsb.DB, error) { return nil, err } - db.SetMaxOpenConns(maxOpenConns) - db.SetMaxIdleConns(maxIdleConns) + db.SetMaxOpenConns(1) - d.optimistic = p.GetBool(sqliteOptimistic, false) - d.backoffMs = p.GetInt(sqliteOptimisticBackoffMs, 5) d.verbose = p.GetBool(prop.Verbose, prop.VerboseDefault) d.db = db @@ -143,36 +129,12 @@ func (db *sqliteDB) CleanupThread(ctx context.Context) { } -func (db *sqliteDB) optimisticTx(ctx context.Context, f func(tx *sql.Tx) error) error { - for { - tx, err := db.db.BeginTx(ctx, nil) - if err != nil { - return err - } - - if err = f(tx); err != nil { - tx.Rollback() - return err - } - - err = tx.Commit() - if err != nil && db.optimistic { - if err, ok := err.(sqlite3.Error); ok && (err.Code == sqlite3.ErrBusy || - err.ExtendedCode == sqlite3.ErrIoErrUnlock) { - time.Sleep(time.Duration(db.backoffMs) * time.Millisecond) - continue - } - } - return err - } -} - -func (db *sqliteDB) doQueryRows(ctx context.Context, tx *sql.Tx, query string, count int, args ...interface{}) ([]map[string][]byte, error) { +func (db *sqliteDB) queryRows(ctx context.Context, query string, count int, args ...interface{}) ([]map[string][]byte, error) { if db.verbose { fmt.Printf("%s %v\n", query, args) } - rows, err := tx.QueryContext(ctx, query, args...) + rows, err := db.db.QueryContext(ctx, query, args...) if err != nil { return nil, err } @@ -205,7 +167,7 @@ func (db *sqliteDB) doQueryRows(ctx context.Context, tx *sql.Tx, query string, c return vs, rows.Err() } -func (db *sqliteDB) doRead(ctx context.Context, tx *sql.Tx, table string, key string, fields []string) (map[string][]byte, error) { +func (db *sqliteDB) Read(ctx context.Context, table string, key string, fields []string) (map[string][]byte, error) { var query string if len(fields) == 0 { query = fmt.Sprintf(`SELECT * FROM %s WHERE YCSB_KEY = ?`, table) @@ -213,7 +175,7 @@ func (db *sqliteDB) doRead(ctx context.Context, tx *sql.Tx, table string, key st query = fmt.Sprintf(`SELECT %s FROM %s WHERE YCSB_KEY = ?`, strings.Join(fields, ","), table) } - rows, err := db.doQueryRows(ctx, tx, query, 1, key) + rows, err := db.queryRows(ctx, query, 1, key) if err != nil { return nil, err @@ -224,17 +186,7 @@ func (db *sqliteDB) doRead(ctx context.Context, tx *sql.Tx, table string, key st return rows[0], nil } -func (db *sqliteDB) Read(ctx context.Context, table string, key string, fields []string) (map[string][]byte, error) { - var output map[string][]byte - err := db.optimisticTx(ctx, func(tx *sql.Tx) error { - res, err := db.doRead(ctx, tx, table, key, fields) - output = res - return err - }) - return output, err -} - -func (db *sqliteDB) doScan(ctx context.Context, tx *sql.Tx, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { +func (db *sqliteDB) Scan(ctx context.Context, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { var query string if len(fields) == 0 { query = fmt.Sprintf(`SELECT * FROM %s WHERE YCSB_KEY >= ? LIMIT ?`, table) @@ -242,26 +194,27 @@ func (db *sqliteDB) doScan(ctx context.Context, tx *sql.Tx, table string, startK query = fmt.Sprintf(`SELECT %s FROM %s WHERE YCSB_KEY >= ? LIMIT ?`, strings.Join(fields, ","), table) } - rows, err := db.doQueryRows(ctx, tx, query, count, startKey, count) + rows, err := db.queryRows(ctx, query, count, startKey, count) return rows, err } -func (db *sqliteDB) Scan(ctx context.Context, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { - var output []map[string][]byte - err := db.optimisticTx(ctx, func(tx *sql.Tx) error { - res, err := db.doScan(ctx, tx, table, startKey, count, fields) - output = res +func (db *sqliteDB) execQuery(ctx context.Context, query string, args ...interface{}) error { + if db.verbose { + fmt.Printf("%s %v\n", query, args) + } + + _, err := db.db.ExecContext(ctx, query, args) + if err != nil { return err - }) - return output, err + } + + return err } -func (db *sqliteDB) doUpdate(ctx context.Context, tx *sql.Tx, table string, key string, values map[string][]byte) error { - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() +func (db *sqliteDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("UPDATE ") buf.WriteString(table) @@ -284,24 +237,15 @@ func (db *sqliteDB) doUpdate(ctx context.Context, tx *sql.Tx, table string, key args = append(args, key) - _, err := tx.ExecContext(ctx, buf.String(), args...) - return err + return db.execQuery(ctx, buf.String(), args...) } -func (db *sqliteDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { - return db.doUpdate(ctx, tx, table, key, values) - }) -} - -func (db *sqliteDB) doInsert(ctx context.Context, tx *sql.Tx, table string, key string, values map[string][]byte) error { +func (db *sqliteDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { args := make([]interface{}, 0, 1+len(values)) args = append(args, key) - buf := bytes.NewBuffer(db.bufPool.Get()) - defer func() { - db.bufPool.Put(buf.Bytes()) - }() + buf := db.bufPool.Get() + defer db.bufPool.Put(buf) buf.WriteString("INSERT OR IGNORE INTO ") buf.WriteString(table) @@ -321,80 +265,15 @@ func (db *sqliteDB) doInsert(ctx context.Context, tx *sql.Tx, table string, key buf.WriteByte(')') - _, err := tx.ExecContext(ctx, buf.String(), args...) - if err != nil && db.verbose { - fmt.Printf("error(doInsert): %s: %+v\n", buf.String(), err) - } - return err -} - -func (db *sqliteDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { return db.doInsert(ctx, tx, table, key, values) }) -} - -func (db *sqliteDB) doDelete(ctx context.Context, tx *sql.Tx, table string, key string) error { - query := fmt.Sprintf(`DELETE FROM %s WHERE YCSB_KEY = ?`, table) - _, err := tx.ExecContext(ctx, query, key) - return err + return db.execQuery(ctx, buf.String(), args...) } func (db *sqliteDB) Delete(ctx context.Context, table string, key string) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { return db.doDelete(ctx, tx, table, key) }) -} - -func (db *sqliteDB) BatchInsert(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { - for i := 0; i < len(keys); i++ { - err := db.doInsert(ctx, tx, table, keys[i], values[i]) - if err != nil { - return err - } - } - return nil - }) -} - -func (db *sqliteDB) BatchRead(ctx context.Context, table string, keys []string, fields []string) ([]map[string][]byte, error) { - var output []map[string][]byte - err := db.optimisticTx(ctx, func(tx *sql.Tx) error { - for i := 0; i < len(keys); i++ { - res, err := db.doRead(ctx, tx, table, keys[i], fields) - if err != nil { - return err - } - output = append(output, res) - } - return nil - }) - return output, err -} - -func (db *sqliteDB) BatchUpdate(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { - for i := 0; i < len(keys); i++ { - err := db.doUpdate(ctx, tx, table, keys[i], values[i]) - if err != nil { - return err - } - } - return nil - }) -} + query := fmt.Sprintf(`DELETE FROM %s WHERE YCSB_KEY = ?`, table) -func (db *sqliteDB) BatchDelete(ctx context.Context, table string, keys []string) error { - return db.optimisticTx(ctx, func(tx *sql.Tx) error { - for i := 0; i < len(keys); i++ { - err := db.doDelete(ctx, tx, table, keys[i]) - if err != nil { - return err - } - } - return nil - }) + return db.execQuery(ctx, query, key) } func init() { ycsb.RegisterDBCreator("sqlite", sqliteCreator{}) } - -var _ ycsb.BatchDB = (*sqliteDB)(nil) diff --git a/db/tikv/db.go b/db/tikv/db.go index 360e95d4..99f936e7 100644 --- a/db/tikv/db.go +++ b/db/tikv/db.go @@ -18,33 +18,31 @@ import ( "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/ycsb" - "github.com/tikv/client-go/v2/config" + "github.com/tikv/client-go/config" ) const ( tikvPD = "tikv.pd" // raw, txn, or coprocessor - tikvType = "tikv.type" - tikvConnCount = "tikv.conncount" - tikvBatchSize = "tikv.batchsize" - tikvAPIVersion = "tikv.apiversion" + tikvType = "tikv.type" + tikvConnCount = "tikv.conncount" + tikvBatchSize = "tikv.batchsize" ) type tikvCreator struct { } func (c tikvCreator) Create(p *properties.Properties) (ycsb.DB, error) { - config.UpdateGlobal(func(c *config.Config) { - c.TiKVClient.GrpcConnectionCount = p.GetUint(tikvConnCount, 128) - c.TiKVClient.MaxBatchSize = p.GetUint(tikvBatchSize, 128) - }) + conf := config.Default() + conf.RPC.MaxConnectionCount = p.GetUint(tikvConnCount, 128) + conf.RPC.Batch.MaxBatchSize = p.GetUint(tikvBatchSize, 128) tp := p.GetString(tikvType, "raw") switch tp { case "raw": - return createRawDB(p) + return createRawDB(p, conf) case "txn": - return createTxnDB(p) + return createTxnDB(p, conf) default: return nil, fmt.Errorf("unsupported type %s", tp) } diff --git a/db/tikv/raw.go b/db/tikv/raw.go index 562e09bb..ea04e9dc 100644 --- a/db/tikv/raw.go +++ b/db/tikv/raw.go @@ -19,11 +19,10 @@ import ( "strings" "github.com/magiconair/properties" - "github.com/pingcap/errors" "github.com/pingcap/go-ycsb/pkg/util" "github.com/pingcap/go-ycsb/pkg/ycsb" - "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/tikv/client-go/v2/rawkv" + "github.com/tikv/client-go/config" + "github.com/tikv/client-go/rawkv" ) type rawDB struct { @@ -32,15 +31,9 @@ type rawDB struct { bufPool *util.BufPool } -func createRawDB(p *properties.Properties) (ycsb.DB, error) { +func createRawDB(p *properties.Properties, conf config.Config) (ycsb.DB, error) { pdAddr := p.GetString(tikvPD, "127.0.0.1:2379") - apiVersionStr := strings.ToUpper(p.GetString(tikvAPIVersion, "V1")) - apiVersion, ok := kvrpcpb.APIVersion_value[apiVersionStr] - if !ok { - return nil, errors.Errorf("Invalid tikv apiversion %s.", apiVersionStr) - } - db, err := rawkv.NewClientWithOpts(context.Background(), strings.Split(pdAddr, ","), - rawkv.WithAPIVersion(kvrpcpb.APIVersion(apiVersion))) + db, err := rawkv.NewClient(strings.Split(pdAddr, ","), conf) if err != nil { return nil, err } @@ -70,7 +63,7 @@ func (db *rawDB) getRowKey(table string, key string) []byte { } func (db *rawDB) Read(ctx context.Context, table string, key string, fields []string) (map[string][]byte, error) { - row, err := db.db.Get(ctx, db.getRowKey(table, key)) + row, err := db.db.Get(db.getRowKey(table, key)) if err != nil { return nil, err } else if row == nil { @@ -85,7 +78,7 @@ func (db *rawDB) BatchRead(ctx context.Context, table string, keys []string, fie for i, key := range keys { rowKeys[i] = db.getRowKey(table, key) } - values, err := db.db.BatchGet(ctx, rowKeys) + values, err := db.db.BatchGet(rowKeys) if err != nil { return nil, err } @@ -102,7 +95,7 @@ func (db *rawDB) BatchRead(ctx context.Context, table string, keys []string, fie } func (db *rawDB) Scan(ctx context.Context, table string, startKey string, count int, fields []string) ([]map[string][]byte, error) { - _, rows, err := db.db.Scan(ctx, db.getRowKey(table, startKey), nil, count) + _, rows, err := db.db.Scan(db.getRowKey(table, startKey), nil, count) if err != nil { return nil, err } @@ -125,7 +118,7 @@ func (db *rawDB) Scan(ctx context.Context, table string, startKey string, count } func (db *rawDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { - row, err := db.db.Get(ctx, db.getRowKey(table, key)) + row, err := db.db.Get(db.getRowKey(table, key)) if err != nil { return nil } @@ -155,22 +148,20 @@ func (db *rawDB) BatchUpdate(ctx context.Context, table string, keys []string, v } rawValues = append(rawValues, rawData) } - return db.db.BatchPut(ctx, rawKeys, rawValues) + return db.db.BatchPut(rawKeys, rawValues) } func (db *rawDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { // Simulate TiDB data buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err := db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } - return db.db.Put(ctx, db.getRowKey(table, key), buf) + return db.db.Put(db.getRowKey(table, key), rowData) } func (db *rawDB) BatchInsert(ctx context.Context, table string, keys []string, values []map[string][]byte) error { @@ -184,11 +175,11 @@ func (db *rawDB) BatchInsert(ctx context.Context, table string, keys []string, v } rawValues = append(rawValues, rawData) } - return db.db.BatchPut(ctx, rawKeys, rawValues) + return db.db.BatchPut(rawKeys, rawValues) } func (db *rawDB) Delete(ctx context.Context, table string, key string) error { - return db.db.Delete(ctx, db.getRowKey(table, key)) + return db.db.Delete(db.getRowKey(table, key)) } func (db *rawDB) BatchDelete(ctx context.Context, table string, keys []string) error { @@ -196,5 +187,5 @@ func (db *rawDB) BatchDelete(ctx context.Context, table string, keys []string) e for i, key := range keys { rowKeys[i] = db.getRowKey(table, key) } - return db.db.BatchDelete(ctx, rowKeys) + return db.db.BatchDelete(rowKeys) } diff --git a/db/tikv/txn.go b/db/tikv/txn.go index 3c8a08a5..b15a6717 100644 --- a/db/tikv/txn.go +++ b/db/tikv/txn.go @@ -18,52 +18,33 @@ import ( "fmt" "strings" - "github.com/tikv/client-go/v2/txnkv" - "github.com/tikv/client-go/v2/txnkv/transaction" - "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/util" "github.com/pingcap/go-ycsb/pkg/ycsb" - tikverr "github.com/tikv/client-go/v2/error" -) - -const ( - tikvAsyncCommit = "tikv.async_commit" - tikvOnePC = "tikv.one_pc" + "github.com/tikv/client-go/config" + "github.com/tikv/client-go/txnkv" + "github.com/tikv/client-go/txnkv/kv" ) -type txnConfig struct { - asyncCommit bool - onePC bool -} - type txnDB struct { db *txnkv.Client r *util.RowCodec bufPool *util.BufPool - cfg *txnConfig } -func createTxnDB(p *properties.Properties) (ycsb.DB, error) { +func createTxnDB(p *properties.Properties, conf config.Config) (ycsb.DB, error) { pdAddr := p.GetString(tikvPD, "127.0.0.1:2379") - db, err := txnkv.NewClient(strings.Split(pdAddr, ",")) + db, err := txnkv.NewClient(strings.Split(pdAddr, ","), conf) if err != nil { return nil, err } - cfg := txnConfig{ - asyncCommit: p.GetBool(tikvAsyncCommit, true), - onePC: p.GetBool(tikvOnePC, true), - } - bufPool := util.NewBufPool() return &txnDB{ db: db, r: util.NewRowCodec(p), - bufPool: bufPool, - cfg: &cfg, - }, nil + bufPool: bufPool}, nil } func (db *txnDB) Close() error { @@ -81,18 +62,6 @@ func (db *txnDB) getRowKey(table string, key string) []byte { return util.Slice(fmt.Sprintf("%s:%s", table, key)) } -func (db *txnDB) beginTxn() (*transaction.KVTxn, error) { - txn, err := db.db.Begin() - if err != nil { - return nil, err - } - - txn.SetEnableAsyncCommit(db.cfg.asyncCommit) - txn.SetEnable1PC(db.cfg.onePC) - - return txn, err -} - func (db *txnDB) Read(ctx context.Context, table string, key string, fields []string) (map[string][]byte, error) { tx, err := db.db.Begin() if err != nil { @@ -100,8 +69,8 @@ func (db *txnDB) Read(ctx context.Context, table string, key string, fields []st } defer tx.Rollback() - row, err := tx.Get(ctx, db.getRowKey(table, key)) - if tikverr.IsErrNotFound(err) { + row, err := tx.Get(db.getRowKey(table, key)) + if kv.IsErrNotFound(err) { return nil, nil } else if row == nil { return nil, err @@ -123,8 +92,8 @@ func (db *txnDB) BatchRead(ctx context.Context, table string, keys []string, fie rowValues := make([]map[string][]byte, len(keys)) for i, key := range keys { - value, err := tx.Get(ctx, db.getRowKey(table, key)) - if tikverr.IsErrNotFound(err) || value == nil { + value, err := tx.Get(db.getRowKey(table, key)) + if kv.IsErrNotFound(err) || value == nil { rowValues[i] = nil } else { rowValues[i], err = db.r.Decode(value, fields) @@ -183,14 +152,14 @@ func (db *txnDB) Scan(ctx context.Context, table string, startKey string, count func (db *txnDB) Update(ctx context.Context, table string, key string, values map[string][]byte) error { rowKey := db.getRowKey(table, key) - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } defer tx.Rollback() - row, err := tx.Get(ctx, rowKey) - if tikverr.IsErrNotFound(err) { + row, err := tx.Get(rowKey) + if kv.IsErrNotFound(err) { return nil } else if row == nil { return err @@ -206,16 +175,14 @@ func (db *txnDB) Update(ctx context.Context, table string, key string, values ma } buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err = db.r.Encode(buf, data) + rowData, err := db.r.Encode(buf.Bytes(), data) if err != nil { return err } - if err := tx.Set(rowKey, buf); err != nil { + if err := tx.Set(rowKey, rowData); err != nil { return err } @@ -223,7 +190,7 @@ func (db *txnDB) Update(ctx context.Context, table string, key string, values ma } func (db *txnDB) BatchUpdate(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } @@ -245,23 +212,21 @@ func (db *txnDB) BatchUpdate(ctx context.Context, table string, keys []string, v func (db *txnDB) Insert(ctx context.Context, table string, key string, values map[string][]byte) error { // Simulate TiDB data buf := db.bufPool.Get() - defer func() { - db.bufPool.Put(buf) - }() + defer db.bufPool.Put(buf) - buf, err := db.r.Encode(buf, values) + rowData, err := db.r.Encode(buf.Bytes(), values) if err != nil { return err } - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } defer tx.Rollback() - if err = tx.Set(db.getRowKey(table, key), buf); err != nil { + if err = tx.Set(db.getRowKey(table, key), rowData); err != nil { return err } @@ -269,7 +234,7 @@ func (db *txnDB) Insert(ctx context.Context, table string, key string, values ma } func (db *txnDB) BatchInsert(ctx context.Context, table string, keys []string, values []map[string][]byte) error { - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } @@ -288,7 +253,7 @@ func (db *txnDB) BatchInsert(ctx context.Context, table string, keys []string, v } func (db *txnDB) Delete(ctx context.Context, table string, key string) error { - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } @@ -304,7 +269,7 @@ func (db *txnDB) Delete(ctx context.Context, table string, key string) error { } func (db *txnDB) BatchDelete(ctx context.Context, table string, keys []string) error { - tx, err := db.beginTxn() + tx, err := db.db.Begin() if err != nil { return err } diff --git a/go.mod b/go.mod index 4a40d31f..c22931f3 100644 --- a/go.mod +++ b/go.mod @@ -1,144 +1,74 @@ module github.com/pingcap/go-ycsb require ( - cloud.google.com/go/spanner v1.34.1 - github.com/HdrHistogram/hdrhistogram-go v1.1.2 + cloud.google.com/go v0.49.0 // indirect + cloud.google.com/go/spanner v1.1.0 + github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 // indirect github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c github.com/aerospike/aerospike-client-go v1.35.2 + github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d // indirect github.com/apple/foundationdb/bindings/go v0.0.0-20200112054404-407dc0907f4f + github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect + github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/boltdb/bolt v1.3.1 - github.com/cenkalti/backoff/v4 v4.1.3 + github.com/chzyer/logex v1.1.10 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e + github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 // indirect github.com/dgraph-io/badger v1.5.4 - github.com/elastic/go-elasticsearch/v8 v8.3.0 - github.com/envoyproxy/go-control-plane v0.10.3 // indirect - github.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect + github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 // indirect github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect github.com/fortytw2/leaktest v1.3.0 // indirect + github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 // indirect github.com/go-ini/ini v1.49.0 // indirect - github.com/go-redis/redis/v9 v9.0.0-beta.1 - github.com/go-sql-driver/mysql v1.6.0 + github.com/go-redis/redis v6.15.1+incompatible + github.com/go-sql-driver/mysql v1.4.1 + github.com/go-stack/stack v1.8.0 // indirect github.com/gocql/gocql v0.0.0-20181124151448-70385f88b28b - github.com/lib/pq v1.1.1 + github.com/gogo/protobuf v1.2.0 // indirect + github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 // indirect + github.com/google/go-cmp v0.3.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jstemmer/go-junit-report v0.9.1 // indirect + github.com/lib/pq v0.0.0-20181016162627-9eb73efc1fcc github.com/magiconair/properties v1.8.0 - github.com/mattn/go-sqlite3 v2.0.1+incompatible + github.com/mattn/go-sqlite3 v1.10.0 github.com/minio/minio-go v6.0.14+incompatible - github.com/olekukonko/tablewriter v0.0.5 - github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c - github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a - github.com/pkg/errors v0.9.1 // indirect - github.com/spf13/cobra v1.0.0 - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c - github.com/tikv/client-go/v2 v2.0.1-0.20220720064224-aa9ded37d17d - go.mongodb.org/mongo-driver v1.5.1 - google.golang.org/api v0.87.0 - google.golang.org/genproto v0.0.0-20220718134204-073382fd740c -) - -require ( - github.com/aws/aws-sdk-go-v2 v1.16.16 - github.com/aws/aws-sdk-go-v2/config v1.17.8 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.0 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.26 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.17.1 - go.etcd.io/etcd/client/pkg/v3 v3.5.2 - go.etcd.io/etcd/client/v3 v3.5.2 -) - -require ( - cloud.google.com/go v0.103.0 // indirect - cloud.google.com/go/compute v1.7.0 // indirect - github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 // indirect - github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d // indirect - github.com/aws/aws-sdk-go v1.34.28 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.12.21 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 // indirect - github.com/aws/smithy-go v1.13.3 // indirect - github.com/benbjohnson/clock v1.1.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 // indirect - github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect - github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.3.2 // indirect - github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect - github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/elastic/elastic-transport-go/v8 v8.0.0-20211216131617-bbee439d559c // indirect - github.com/go-stack/stack v1.8.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/golang/snappy v0.0.3 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.8 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect - github.com/googleapis/gax-go/v2 v2.4.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.9.5 // indirect - github.com/kr/pretty v0.2.1 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00 // indirect - github.com/pingcap/log v0.0.0-20211215031037-e024ba4eb0ee // indirect - github.com/prometheus/client_golang v1.11.0 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect + github.com/pingcap/errors v0.11.1 + github.com/pingcap/kvproto v0.0.0-20190506024016-26344dff8f48 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 // indirect + github.com/sirupsen/logrus v1.4.2 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a // indirect + github.com/spf13/cobra v0.0.3 github.com/spf13/pflag v1.0.3 // indirect - github.com/stathat/consistent v1.0.0 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710 // indirect - github.com/twmb/murmur3 v1.1.3 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.0.2 // indirect - github.com/xdg-go/stringprep v1.0.2 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c + github.com/tidwall/pretty v1.0.0 // indirect + github.com/tikv/client-go v0.0.0-20190421092910-44b82dcc9f4a + github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect + github.com/xdg/stringprep v1.0.0 // indirect github.com/yuin/gopher-lua v0.0.0-20181031023651-12c4817b42c5 // indirect - go.etcd.io/etcd/api/v3 v3.5.2 // indirect - go.opencensus.io v0.23.0 // indirect - go.uber.org/atomic v1.9.0 // indirect - go.uber.org/multierr v1.7.0 // indirect - go.uber.org/zap v1.20.0 // indirect - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect - golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect - golang.org/x/oauth2 v0.0.0-20220630143837-2104d58473e0 // indirect - golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect - golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect - golang.org/x/text v0.3.7 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/grpc v1.48.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect + go.mongodb.org/mongo-driver v1.0.2 + go.opencensus.io v0.22.2 // indirect + golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 // indirect + golang.org/x/exp v0.0.0-20191129062945-2f5052295587 // indirect + golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect + golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 // indirect + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect + golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 // indirect + golang.org/x/tools v0.0.0-20191210221141-98df12377212 // indirect + google.golang.org/api v0.14.0 + google.golang.org/appengine v1.6.5 // indirect + google.golang.org/genproto v0.0.0-20191206224255-0243a4be9c8f + google.golang.org/grpc v1.25.1 // indirect + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect gopkg.in/ini.v1 v1.42.0 // indirect - gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 // indirect ) replace github.com/apache/thrift => github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d -go 1.18 +go 1.13 diff --git a/go.sum b/go.sum index b24e1567..f1706c6f 100644 --- a/go.sum +++ b/go.sum @@ -4,147 +4,47 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.103.0 h1:YXtxp9ymmZjlGzxV7VrYQ8aaQuAgcqxSy6YhDX4I458= -cloud.google.com/go v0.103.0/go.mod h1:vwLx1nqLrzLX/fpwSMOXmFIqBOyHsvHbnAdbGSJ+mKk= +cloud.google.com/go v0.49.0 h1:CH+lkubJzcPYB1Ggupcq0+k8Ni2ILdG2lYjDIgavDBQ= +cloud.google.com/go v0.49.0/go.mod h1:hGvAdzcWNbyuxS3nWhD7H2cIJxjRRTRLQVB0bdputVY= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/spanner v1.34.1 h1:cPGv32sx9zsz72qO4DY4fljIyoBVDS0gsWax7GE02Xc= -cloud.google.com/go/spanner v1.34.1/go.mod h1:oVJCF8EBcPcAdjkQYTErfxZrr+o/JIwDebhFveE7CrU= +cloud.google.com/go/spanner v1.1.0 h1:hIjiz2Pf6Hy3BWz+Oaw7XUqP+EzWDkj0/DtTkKazxzk= +cloud.google.com/go/spanner v1.1.0/go.mod h1:TzTaF9l2ZY2CIetNvVpUu6ZQy8YEOtzB6ICa5EwYjL0= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7 h1:PqzgE6kAMi81xWQA2QIVxjWkFHptGgC547vchpUbtFo= github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c h1:3fAhdHMhoSG57DjJ/dqLFfgD+FoooPbQH6szINbrr3k= github.com/XiaoMi/pegasus-go-client v0.0.0-20181029071519-9400942c5d1c/go.mod h1:KcL6D/4RZ8RAYzQ5gKI0odcdWUmCVlbQTOlWrhP71CY= github.com/aerospike/aerospike-client-go v1.35.2 h1:TWV2Bn59Ig7SM4Zue84fFsPGlfFJX/6xbuGHyYFS/ag= github.com/aerospike/aerospike-client-go v1.35.2/go.mod h1:zj8LBEnWBDOVEIJt8LvaRvDG5ARAoa5dBeHaB472NRc= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d h1:b/FqDLjWXDQI6XBYvWDVgEKv3xOTs68qRkuqyU37lBc= github.com/apache/thrift v0.0.0-20171203172758-327ebb6c2b6d/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apple/foundationdb/bindings/go v0.0.0-20200112054404-407dc0907f4f h1:HkQOU77BCH+BZPpzwNxm3zjUAt+N7mJWRAGxyCwAGZw= github.com/apple/foundationdb/bindings/go v0.0.0-20200112054404-407dc0907f4f/go.mod h1:OMVSB21p9+xQUIqlGizHPZfjK+SHws1ht+ZytVDoz9U= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.34.28 h1:sscPpn/Ns3i0F4HPEWAVcwdIRaZZCuL7llJ2/60yPIk= -github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= -github.com/aws/aws-sdk-go-v2 v1.16.16 h1:M1fj4FE2lB4NzRb9Y0xdWsn2P0+2UHVxwKyOa4YJNjk= -github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k= -github.com/aws/aws-sdk-go-v2/config v1.17.8 h1:b9LGqNnOdg9vR4Q43tBTVWk4J6F+W774MSchvKJsqnE= -github.com/aws/aws-sdk-go-v2/config v1.17.8/go.mod h1:UkCI3kb0sCdvtjiXYiU4Zx5h07BOpgBTtkPu/49r+kA= -github.com/aws/aws-sdk-go-v2/credentials v1.12.21 h1:4tjlyCD0hRGNQivh5dN8hbP30qQhMLBE/FgQR1vHHWM= -github.com/aws/aws-sdk-go-v2/credentials v1.12.21/go.mod h1:O+4XyAt4e+oBAoIwNUYkRg3CVMscaIJdmZBOcPgJ8D8= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.0 h1:bKbdstt7+PzIRSIXZ11Yo8Qh8t0AHn6jEYUfsbVcLjE= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.10.0/go.mod h1:+CBJZMhsb1pTUcB/NTdS505bDX10xS4xnPMqDZj2Ptw= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.26 h1:4FF+S7M7T/f1ORJSwgUJfywZRjB25W8NdGeosQVy+fE= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression v1.4.26/go.mod h1:RHt+Uh6nvd2kccFcEzgmtsDrGG8AoFCPzvznfUDSg6c= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 h1:r08j4sbZu/RVi+BNxkBJwPMUYY3P8mgSDuKkZ/ZN1lE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17/go.mod h1:yIkQcCDYNsZfXpd5UX2Cy+sWA1jPgIhGTw9cOBzfVnQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 h1:s4g/wnzMf+qepSNgTvaQQHNxyMLKSawNhKCPNy++2xY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 h1:/K482T5A3623WJgWT8w1yRAFK4RzGzEl7y39yhtn9eA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 h1:wj5Rwc05hvUSvKuOF29IYb9QrCLjU+rHAy/x/o0DK2c= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24/go.mod h1:jULHjqqjDlbyTa7pfM7WICATnOv+iOhjletM3N0Xbu8= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.17.1 h1:1QpTkQIAaZpR387it1L+erjB5bStGFCJRvmXsodpPEU= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.17.1/go.mod h1:BZhn/C3z13ULTSstVi2Kymc62bgjFh/JwLO9Tm2OFYI= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.20 h1:V9q4A0qnUfDsfivspY1LQRQTOG3Y9FLHvXIaTbcU7XM= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.13.20/go.mod h1:7qWU48SMzlrfOlNhHpazW3psFWlOIWrq4SmOr2/ESmk= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 h1:Lh1AShsuIJTwMkoxVCAYPJgNG5H+eN6SmoUn8nOZ5wE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9/go.mod h1:a9j48l6yL5XINLHLcOKInjdvknN+vWqPBxqeIDw7ktw= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.17 h1:o0Ia3nb56m8+8NvhbCDiSBiZRNUwIknVWobx5vks0Vk= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.17/go.mod h1:WJD9FbkwzM2a1bZ36ntH6+5Jc+x41Q4K2AcLeHDLAS8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 h1:Jrd/oMh0PKQc6+BowB+pLEwLIgaQF29eYbe7E1Av9Ug= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 h1:pwvCchFUEnlceKIgPUouBJwK81aCkQ8UDMORfeFtW10= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.23/go.mod h1:/w0eg9IhFGjGyyncHIQrXtU8wvNsTJOP0R6PPj0wf80= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6 h1:OwhhKc1P9ElfWbMKPIbMMZBV6hzJlL2JKD76wNNVzgQ= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.6/go.mod h1:csZuQY65DAdFBt1oIjO5hhBR49kQqop4+lcuCjf2arA= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 h1:9pPi0PsFNAGILFfPCk8Y0iyEBGc6lu6OQ97U7hmdesg= -github.com/aws/aws-sdk-go-v2/service/sts v1.16.19/go.mod h1:h4J3oPZQbxLhzGnk+j9dfYHi5qIOVJ5kczZd658/ydM= -github.com/aws/smithy-go v1.13.3 h1:l7LYxGuzK6/K+NzJ2mC+VvLUbae0sL3bXU//04MkmnA= -github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -152,31 +52,16 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa h1:B/lvg4tQ5hfFZd4V2hcSfFVfUvAK6GSFKxIIzwnkv8g= -github.com/cncf/xds/go v0.0.0-20220520190051-1e77728a1eaa/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.12+incompatible h1:pAWNwdf7QiT1zfaWyqCtNZQWCLByQyA3JrSQyuYAqnQ= +github.com/coreos/etcd v3.3.12+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd v0.0.0-20190212144455-93d5ec2c7f76 h1:FE783w8WFh+Rvg+7bZ5g8p7gP4SeVS4AoNwkvazlsBg= +github.com/coreos/go-systemd v0.0.0-20190212144455-93d5ec2c7f76/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -184,472 +69,245 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgraph-io/badger v1.5.4 h1:gVTrpUTbbr/T24uvoCaqY2KSHfNLVGm0w+hbee2HMeg= github.com/dgraph-io/badger v1.5.4/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102 h1:afESQBXJEnj3fu+34X//E8Wg3nEbMJxJkwSc0tPePK0= +github.com/dgryski/go-farm v0.0.0-20180109070241-2de33835d102/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elastic/elastic-transport-go/v8 v8.0.0-20211216131617-bbee439d559c h1:onA2RpIyeCPvYAj1LFYiiMTrSpqVINWMfYFRS7lofJs= -github.com/elastic/elastic-transport-go/v8 v8.0.0-20211216131617-bbee439d559c/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= -github.com/elastic/go-elasticsearch/v8 v8.3.0 h1:RF4iRbvWkiT6UksZ+OwSLeCEtBg/HO8r88xNiSmhb8U= -github.com/elastic/go-elasticsearch/v8 v8.3.0/go.mod h1:Usvydt+x0dv9a1TzEUaovqbJor8rmOHy5dSmPeMAE2k= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3 h1:xdCVXxEe0Y3FQith+0cj2irwZudqGYvecuLB1HtdexY= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y= github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= +github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-ini/ini v1.49.0 h1:ymWFBUkwN3JFPjvjcJJ5TSTwh84M66QrH+8vOytLgRY= github.com/go-ini/ini v1.49.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-redis/redis/v9 v9.0.0-beta.1 h1:oW3jlPic5HhGUbYMH0lidnP+72BgsT+lCwlVud6o2Mc= -github.com/go-redis/redis/v9 v9.0.0-beta.1/go.mod h1:6gNX1bXdwkpEG0M/hEBNK/Fp8zdyCkjwwKc6vBbfCDI= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-redis/redis v6.15.1+incompatible h1:BZ9s4/vHrIqwOb0OPtTQ5uABxETJ3NRuUNoSUurnkew= +github.com/go-redis/redis v6.15.1+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= github.com/gocql/gocql v0.0.0-20181124151448-70385f88b28b h1:dnUw9Ih14dCKzbtZxm+pwQRYIb+9ypiwtZgsCQN4zmg= github.com/gocql/gocql v0.0.0-20181124151448-70385f88b28b/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9 h1:uHTyIjqVhYRhLbJ8nIiOJHkEZZ+5YoOsAbD3sk82NiE= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.7.0 h1:tOSd0UKHQd6urX6ApfOn4XdBMY6Sh1MfxV3kmaazO+U= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway v1.8.1 h1:VNUuLKyFcJ5IektwBKcZU4J5GJKEt+Odb8dl1d61BGQ= +github.com/grpc-ecosystem/grpc-gateway v1.8.1/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lib/pq v0.0.0-20181016162627-9eb73efc1fcc h1:0pifi8wVV/YuUKBDmlH3koJgRVnUJ2RiJQ8ly/1/aJ8= +github.com/lib/pq v0.0.0-20181016162627-9eb73efc1fcc/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v2.0.1+incompatible h1:xQ15muvnzGBHpIpdrNi1DA5x0+TcBZzsIDwmw9uTHzw= -github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o= github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/montanaflynn/stats v0.5.0 h1:2EkzeTSqBB4V4bJwWrt5gIIrZmpJBcoIRGS2kWLgzmk= +github.com/montanaflynn/stats v0.5.0/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= -github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0 h1:HVl5539r48eA+uDuX/ziBmQCxzT1pGrzWbKuXT46Bq0= -github.com/pingcap/check v0.0.0-20211026125417-57bd13f7b5f0/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= -github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c h1:xpW9bvK+HuuTmyFqUwr+jcCvpVkK7sumiz+ko5H9eq4= -github.com/pingcap/errors v0.11.5-0.20211224045212-9687c2b0f87c/go.mod h1:X2r9ueLEUZgtx2cIogM0v4Zj5uvvzhuuiu7Pn8HzMPg= -github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00 h1:C3N3itkduZXDZFh4N3vQ5HEtld3S+Y+StULhWVvumU0= -github.com/pingcap/failpoint v0.0.0-20210918120811-547c13e3eb00/go.mod h1:4qGtCB0QK0wBzKtFEGDhxXnSnbQApw1gc9siScUl8ew= -github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E= -github.com/pingcap/kvproto v0.0.0-20220302110454-c696585a961b/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a h1:nP2wmyw9JTRsk5rm+tZtfAso6c/1FvuaFNbXTaYz3FE= -github.com/pingcap/kvproto v0.0.0-20220705053936-aa9c2d20cd2a/go.mod h1:OYtxs0786qojVTmkVeufx93xe+jUgm56GUYRIKnmaGI= -github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/log v0.0.0-20211215031037-e024ba4eb0ee h1:VO2t6IBpfvW34TdtD/G10VvnGqjLic1jzOuHjUb5VqM= -github.com/pingcap/log v0.0.0-20211215031037-e024ba4eb0ee/go.mod h1:DWQW5jICDR7UJh4HtxXSM20Churx4CQL0fwL/SoOSA4= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pingcap/errors v0.11.1 h1:BXFZ6MdDd2U1uJUa2sRAWTmm+nieEzuyYM0R4aUTcC8= +github.com/pingcap/errors v0.11.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3 h1:04yuCf5NMvLU8rB2m4Qs3rynH7EYpMno3lHkewIOdMo= +github.com/pingcap/gofail v0.0.0-20181217135706-6a951c1e42c3/go.mod h1:DazNTg0PTldtpsQiT9I5tVJwV1onHMKBBgXzmJUlMns= +github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rGrobssy1nVy2VaVpNCuLpCbr+FEaTA8= +github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= +github.com/pingcap/kvproto v0.0.0-20190305055742-ab7debc182d9/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= +github.com/pingcap/kvproto v0.0.0-20190506024016-26344dff8f48 h1:Hhg78/MkogR8HTngXKceQekeZPtBlhrA6xUhiGAezNU= +github.com/pingcap/kvproto v0.0.0-20190506024016-26344dff8f48/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= +github.com/pingcap/pd v2.1.5+incompatible h1:vOLV2tSQdRjjmxaTXtJULoC94dYQOd+6fzn2yChODHc= +github.com/pingcap/pd v2.1.5+incompatible/go.mod h1:nD3+EoYes4+aNNODO99ES59V83MZSI+dFbhyr667a0E= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jOqq0gIVUe6Yk0/QMZ640k6NvkxcBf+8= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 h1:/NRJ5vAYoqz+7sG51ubIDHXeWO8DlTSrToPu6q11ziA= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28= +github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stathat/consistent v1.0.0 h1:ZFJ1QTRn8npNBKW065raSZ8xfOqhpb8vLOkfp4CcL/U= -github.com/stathat/consistent v1.0.0/go.mod h1:uajTPbgSygZBJ+V+0mY7meZ8i0XAcZs7AQ6V121XSxw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tikv/client-go/v2 v2.0.1-0.20220720064224-aa9ded37d17d h1:xllx8pkveVLcnAkWIa+cRpCVckbJF7LHS+9pURqp0Ig= -github.com/tikv/client-go/v2 v2.0.1-0.20220720064224-aa9ded37d17d/go.mod h1:UmDQEoeHXza8RSHBXVFERpxH54VBOf8yKZVphyel3l4= -github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710 h1:jxgmKOscXSjaFEKQGRyY5qOpK8hLqxs2irb/uDJMtwk= -github.com/tikv/pd/client v0.0.0-20220307081149-841fa61e9710/go.mod h1:AtvppPwkiyUgQlR1W9qSqfTB+OsOIu19jDCOxOsPkmU= +github.com/tikv/client-go v0.0.0-20190421092910-44b82dcc9f4a h1:T5KtAsfCLJDwgdJjHp9xzJUYb/s6tPoSMiAHw8SFd3o= +github.com/tikv/client-go v0.0.0-20190421092910-44b82dcc9f4a/go.mod h1:K0NcdVNrXDq92YPLytsrAwRMyuXi7GZCO6dXNH7OzQc= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/twmb/murmur3 v1.1.3 h1:D83U0XYKcHRYwYIpBKf3Pks91Z0Byda/9SJ8B6EMRcA= -github.com/twmb/murmur3 v1.1.3/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= -github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= -github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/ugorji/go v1.1.2 h1:JON3E2/GPW2iDNGoSAusl1KDf5TRQ8k8q7Tp097pZGs= +github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= +github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43 h1:BasDe+IErOQKrMVXab7UayvSlIpiyGwRvuX3EKYY7UA= +github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA= +github.com/unrolled/render v1.0.0 h1:XYtvhA3UkpB7PqkvhUFYmpKD55OudoIeygcfus4vcd4= +github.com/unrolled/render v1.0.0/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/gopher-lua v0.0.0-20181031023651-12c4817b42c5 h1:d9vJ/8gXbVnNk8QFOxFZ7MN7TuHiuvolK1usz5KXVDo= github.com/yuin/gopher-lua v0.0.0-20181031023651-12c4817b42c5/go.mod h1:aEV29XrmTYFr3CiRxZeGHpkvbwq+prZduBqMaascyCU= +go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.2 h1:tXok5yLlKyuQ/SXSjtqHc4uzNaMqZi2XsoSPr/LlJXI= -go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/client/pkg/v3 v3.5.2 h1:4hzqQ6hIb3blLyQ8usCU4h3NghkqcsohEQ3o3VetYxE= -go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v3 v3.5.2 h1:WdnejrUtQC4nCxK0/dLTMqKOB+U5TP/2Ya0BJL+1otA= -go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o= -go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI= -go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw= +go.mongodb.org/mongo-driver v1.0.2 h1:RwjK1tKt7VPqQh3tsjiEqKJg75GNhP/loch+PwRc4ig= +go.mongodb.org/mongo-driver v1.0.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.20.0 h1:N4oPlghZwYG55MlU6LXk/Zp00FVNE9X9wrYO8CEs4lc= -go.uber.org/zap v1.20.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 h1:0hQKqeLdqlt5iIwVOBErRisrHJAN57yOiPRQItI20fU= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587 h1:5Uz0rkjCFu9BC9gCRN7EkwVvhNyQgGWb8KNJrPwBoHY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -657,335 +315,109 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac h1:8R1esu+8QioDxo4E4mX6bFztO+dMTM49DNAaWfO5OeY= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220708220712-1185a9018129 h1:vucSRfWwTsoXro7P+3Cjlr6flUMtzCwzlvkxEQtHHB0= -golang.org/x/net v0.0.0-20220708220712-1185a9018129/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220630143837-2104d58473e0 h1:VnGaRqoLmqZH/3TMLJwYCEWkR4j1nuIU1U9TvbqsDUw= -golang.org/x/oauth2 v0.0.0-20220630143837-2104d58473e0/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= 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/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449 h1:gSbV7h1NRL2G1xTg/owz62CST1oJBmxy4QpMMregXVQ= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/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/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191105231337-689d0f08e67a h1:RzzIfXstYPS78k0QViPGpDcTlV+QuYrbxVmsxDHdxTs= +golang.org/x/tools v0.0.0-20191105231337-689d0f08e67a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.0.0-20191210221141-98df12377212 h1:p0cPlrIZeu8wy/7Cyva+AvJjWtO3ehLV9TloLyItKIc= +golang.org/x/tools v0.0.0-20191210221141-98df12377212/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0 h1:uMf5uLi4eQMRrMKhCplNik4U4H8Z6C1br3zOtAa/aDE= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.87.0 h1:pUQVF/F+X7Tl1lo4LJoJf5BOpjtmINU80p9XpYTU2p4= -google.golang.org/api v0.87.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -993,142 +425,29 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6 h1:UXl+Zk3jqqcbEVV7ace5lrt4YdA4tXiz3f/KbmD29Vo= +google.golang.org/genproto v0.0.0-20191028173616-919d9bdd9fe6/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220718134204-073382fd740c h1:xDUAhRezFnKF6wopxkOfdWYvz2XCiRQzndyDdpwFgbc= -google.golang.org/genproto v0.0.0-20220718134204-073382fd740c/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20191206224255-0243a4be9c8f h1:naitw5DILWPQvG0oG04mR9jF8fmKpRdW3E3zzKA4D0Y= +google.golang.org/genproto v0.0.0-20191206224255-0243a4be9c8f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= @@ -1137,31 +456,17 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXL gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= diff --git a/pkg/client/client.go b/pkg/client/client.go index 71f4d2f0..fc988d6a 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -16,6 +16,7 @@ package client import ( "context" "fmt" + "math" "math/rand" "os" "sync" @@ -27,6 +28,9 @@ import ( "github.com/pingcap/go-ycsb/pkg/ycsb" ) +var KVReqGenChan chan *ycsb.KVRequest +var KVReqDoChan chan *ycsb.KVRequest + type worker struct { p *properties.Properties workDB ycsb.DB @@ -37,8 +41,10 @@ type worker struct { opCount int64 targetOpsPerMs float64 threadID int + threadIDStr string targetOpsTickNs int64 opsDone int64 + overflowOpCount int64 } func newWorker(p *properties.Properties, threadID int, threadCount int, workload ycsb.Workload, db ycsb.DB) *worker { @@ -50,6 +56,7 @@ func newWorker(p *properties.Properties, threadID int, threadCount int, workload w.doBatch = true } w.threadID = threadID + w.threadIDStr = fmt.Sprintf("tid%v", threadID) w.workload = workload w.workDB = db @@ -114,43 +121,232 @@ func (w *worker) run(ctx context.Context) { } startTime := time.Now() + enableWaitingQueue := w.p.GetBool(prop.WaitingQueue, prop.WaitingQueueDefault) - for w.opCount == 0 || w.opsDone < w.opCount { - var err error - opsCount := 1 - if w.doTransactions { - if w.doBatch { - err = w.workload.DoBatchTransaction(ctx, w.batchSize, w.workDB) - opsCount = w.batchSize - } else { - err = w.workload.DoTransaction(ctx, w.workDB) + //========qps waiting queue=============== + if enableWaitingQueue { + + MaxQueueSize := w.p.GetInt(prop.WaitingQueueSize, prop.WaitingQueueSizeDefault) + c := make(chan time.Time, MaxQueueSize) //max_size + finish := make(chan struct{}) + + go func() { + for { + var err error + opsCount := 1 + start := <-c + + if start.Before(startTime) { + break + } + if w.doTransactions { + if w.doBatch { + err = w.workload.DoBatchTransaction(ctx, w.batchSize, w.workDB) + opsCount = w.batchSize + } else { + err = w.workload.DoTransaction(ctx, w.workDB) + } + } else { + if w.doBatch { + err = w.workload.DoBatchInsert(ctx, w.batchSize, w.workDB) + opsCount = w.batchSize + } else { + err = w.workload.DoInsert(ctx, w.workDB) + } + } + + lan := time.Since(start) + measurement.ThreadMeasure("AllWQ", lan) + + if err != nil && !w.p.GetBool(prop.Silence, prop.SilenceDefault) { + fmt.Printf("operation err: %v\n", err) + } + + if measurement.IsWarmUpFinished() { + w.opsDone += int64(opsCount) + w.throttle(ctx, startTime) + } + + select { + case <-ctx.Done(): + return + default: + } } - } else { - if w.doBatch { - err = w.workload.DoBatchInsert(ctx, w.batchSize, w.workDB) - opsCount = w.batchSize - } else { - err = w.workload.DoInsert(ctx, w.workDB) + finish <- struct{}{} + }() + + threadCount := w.p.GetInt(prop.ThreadCount, 1) + enableFluctLoad := w.p.GetBool(prop.FluctuateLoad, prop.FluctuateLoadDefault) + fluctSineA := w.p.GetFloat64(prop.FluctuateSineA, prop.FluctuateSineADefault) + fluctSineB := w.p.GetFloat64(prop.FluctuateSineB, prop.FluctuateSineBDefault) + fluctSineC := w.p.GetFloat64(prop.FluctuateSineC, prop.FluctuateSineCDefault) + fluctSineD := w.p.GetFloat64(prop.FluctuateSineD, prop.FluctuateSineDDefault) + + opCount := int64(0) + timeUnit := 1.0 + for opCount < w.opCount { + curQps := 1000.0 * timeUnit + curTime := time.Now() + if enableFluctLoad { + curSec := curTime.Sub(startTime).Seconds() + curQps = (fluctSineA*math.Sin(fluctSineB*curSec+fluctSineC) + fluctSineD) / float64(threadCount) * timeUnit + if curQps < 1 { + curQps = 1 + } } + // if w.threadID == 0 { + // fmt.Println("curQPs", curQps*float64(threadCount)) + // } + + tmpOp := int64(0) + wakeInterval := int64(timeUnit * float64(time.Second.Nanoseconds()) / curQps) + for { + select { + case <-ctx.Done(): + return + case <-time.After(time.Duration(wakeInterval)): + if len(c) == MaxQueueSize { // overflow, drop op + w.overflowOpCount += 1 + // opCount += 1 + // tmpOp += 1 + } else { + c <- time.Now() + opCount += 1 + tmpOp += 1 + } + } + if time.Since(curTime).Seconds() > timeUnit { + break + } + } + // fmt.Println(w.threadIDStr, "sendOps", tmpOp) + + // tmpOp := int64(0) + // for { + // now := time.Now() + // if len(c) == MaxQueueSize { // overflow, drop op + // w.overflowOpCount += 1 + // // opCount += 1 + // // tmpOp += 1 + // } else { + // c <- now + // opCount += 1 + // tmpOp += 1 + // } + + // if now.Sub(curTime).Seconds() > timeUnit || tmpOp > int64(curQps) { + // break + // } + // } + // leftDur := time.Until(curTime.Add(time.Duration(int64(timeUnit) * time.Second.Nanoseconds()))) + // select { + // case <-ctx.Done(): + // case <-time.After(leftDur): + // } + } - if err != nil && !w.p.GetBool(prop.Silence, prop.SilenceDefault) { - fmt.Printf("operation err: %v\n", err) + c <- startTime.Add(-1000) + <-finish + } else { // normal logic + useTraceReplay := w.p.GetBool(prop.TraceReplay, prop.TraceReplayDefault) + + for w.opCount == 0 || w.opsDone < w.opCount { + var err error + opsCount := 1 + start := time.Now() + if w.doTransactions { + if w.doBatch { + err = w.workload.DoBatchTransaction(ctx, w.batchSize, w.workDB) + opsCount = w.batchSize + } else { + err = w.workload.DoTransaction(ctx, w.workDB) + } + } else { + if w.doBatch { + err = w.workload.DoBatchInsert(ctx, w.batchSize, w.workDB) + opsCount = w.batchSize + } else { + err = w.workload.DoInsert(ctx, w.workDB) + } + } + lan := time.Since(start) + + if !useTraceReplay { + measurement.ThreadMeasure(w.threadIDStr, lan) + } + + if err != nil && !w.p.GetBool(prop.Silence, prop.SilenceDefault) { + fmt.Printf("operation err: %v\n", err) + } + + if measurement.IsWarmUpFinished() { + w.opsDone += int64(opsCount) + w.throttle(ctx, startTime) + } + + select { + case <-ctx.Done(): + return + default: + } } + } +} - if measurement.IsWarmUpFinished() { - w.opsDone += int64(opsCount) - w.throttle(ctx, startTime) +func KVReplay(ctx context.Context, p *properties.Properties, threadID int, threadCount int, workload ycsb.Workload, db ycsb.DB) { + enableFluctLoad := p.GetBool(prop.FluctuateLoad, prop.FluctuateLoadDefault) + fluctSineA := p.GetFloat64(prop.FluctuateSineA, prop.FluctuateSineADefault) + fluctSineB := p.GetFloat64(prop.FluctuateSineB, prop.FluctuateSineBDefault) + fluctSineC := p.GetFloat64(prop.FluctuateSineC, prop.FluctuateSineCDefault) + fluctSineD := p.GetFloat64(prop.FluctuateSineD, prop.FluctuateSineDDefault) + startTime := time.Now() + + opCount := int64(0) + timeUnit := 1.0 + for { + curQps := 1000.0 * timeUnit + curTime := time.Now() + if enableFluctLoad { + curSec := curTime.Sub(startTime).Seconds() + curQps = (fluctSineA*math.Sin(fluctSineB*curSec+fluctSineC) + fluctSineD) / float64(threadCount) * timeUnit + //curQps = ((fluctSineA*math.Sin(fluctSineB*curSec+fluctSineC) + fluctSineD) + (0.3 * fluctSineA * math.Sin(40*fluctSineB*curSec+fluctSineC))) / float64(threadCount) * timeUnit + if curQps < 1 { + curQps = 1 + } } - select { - case <-ctx.Done(): - return - default: + tmpOp := int64(0) + wakeInterval := int64(timeUnit * float64(time.Second.Nanoseconds()) / curQps) + for { + kvReq := <-KVReqGenChan + time.Sleep(time.Duration(wakeInterval)) + kvReq.StartTime = time.Now() + if len(KVReqDoChan) >= 1000000-1 { + continue + } + KVReqDoChan <- kvReq + opCount += 1 + tmpOp += 1 + if time.Since(curTime).Seconds() > timeUnit { + break + } } } } +func KVApply(ctx context.Context, p *properties.Properties, threadID int, threadCount int, workload ycsb.Workload, db ycsb.DB) { + ctx = workload.InitThread(ctx, threadID, threadCount) + ctx = db.InitThread(ctx, threadID, threadCount) + for { + kvReq := <-KVReqDoChan + workload.ProcessKVRequest(ctx, db, kvReq) + lan := time.Since(kvReq.StartTime) + measurement.ThreadMeasure("AllWQ", lan) + } +} + // Client is a struct which is used the run workload to a specific DB. type Client struct { p *properties.Properties @@ -169,6 +365,15 @@ func (c *Client) Run(ctx context.Context) { var wg sync.WaitGroup threadCount := c.p.GetInt(prop.ThreadCount, 1) + enableWaitingQueue := c.p.GetBool(prop.WaitingQueue, prop.WaitingQueueDefault) + useTraceReplay := c.p.GetBool(prop.TraceReplay, prop.TraceReplayDefault) + KVReqGenChan = make(chan *ycsb.KVRequest, 1000000) + KVReqDoChan = make(chan *ycsb.KVRequest, 1000000) + + if useTraceReplay { + threadCount = 16 + } + wg.Add(threadCount) measureCtx, measureCancel := context.WithCancel(ctx) measureCh := make(chan struct{}, 1) @@ -195,13 +400,20 @@ func (c *Client) Run(ctx context.Context) { for { select { case <-t.C: - measurement.Summary() + if enableWaitingQueue || useTraceReplay { + measurement.ThreadOutput() + } + measurement.Output() case <-measureCtx.Done(): + measurement.ThreadOutput() return } } }() + mu := sync.Mutex{} + totalOverflowOps := int64(0) + for i := 0; i < threadCount; i++ { go func(threadId int) { defer wg.Done() @@ -212,10 +424,27 @@ func (c *Client) Run(ctx context.Context) { w.run(ctx) c.db.CleanupThread(ctx) c.workload.CleanupThread(ctx) + + mu.Lock() + totalOverflowOps += w.overflowOpCount + mu.Unlock() }(i) } + applyCount := c.p.GetInt(prop.ApplyThreadCount, 512) + for i := 0; i < applyCount; i++ { + go KVApply(ctx, c.p, i, applyCount, c.workload, c.db) + } + + replayCount := c.p.GetInt(prop.ReplayThreadCount, 512) + for i := 0; i < replayCount; i++ { + go KVReplay(ctx, c.p, i, replayCount, c.workload, c.db) + } + wg.Wait() + + fmt.Println("Total Overflow Op Count:", totalOverflowOps) + if !c.p.GetBool(prop.DoTransactions, true) { // when loading is finished, try to analyze table if possible. if analyzeDB, ok := c.db.(ycsb.AnalyzeDB); ok { diff --git a/pkg/client/dbwrapper.go b/pkg/client/dbwrapper.go index d8ec94d2..f7492c5d 100644 --- a/pkg/client/dbwrapper.go +++ b/pkg/client/dbwrapper.go @@ -30,11 +30,11 @@ type DbWrapper struct { func measure(start time.Time, op string, err error) { lan := time.Now().Sub(start) if err != nil { - measurement.Measure(fmt.Sprintf("%s_ERROR", op), start, lan) + measurement.Measure(fmt.Sprintf("%s_ERROR", op), lan) return } - measurement.Measure(op, start, lan) + measurement.Measure(op, lan) } func (db DbWrapper) Close() error { diff --git a/pkg/generator/pareto.go b/pkg/generator/pareto.go new file mode 100644 index 00000000..33b68d0e --- /dev/null +++ b/pkg/generator/pareto.go @@ -0,0 +1,83 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Copyright (c) 2010-2016 Yahoo! Inc., 2017 YCSB contributors. All rights reserved. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + +package generator + +import ( + "math" + "math/rand" +) + +const ( + // ParetoTheta is the 'theta' of Generized Pareto Distribution. + ParetoTheta = float64(0) + // ParetoK is the 'k' of Generized Pareto Distribution. + ParetoK = float64(0.923) + // ParetoSigma is the 'sigma' of Generized Pareto Distribution. + ParetoSigma = float64(226.409) +) + +// Pareto generates integers follow Pareto distribution. +// "f(x)=(1/sigma)*(1+k*(x-theta)/sigma)^-(1/k+1)"); +type Pareto struct { + Number + maxValue int64 + theta float64 + k float64 + sigma float64 +} + +// NewPareto creates the Pareto generator. +func NewPareto(maxValue int64, theta float64, k float64, sigma float64) *Pareto { + return &Pareto{ + maxValue: maxValue, + theta: theta, + k: k, + sigma: sigma, + } +} + +// Next implements the Generator Next interface. +func (p *Pareto) Next(r *rand.Rand) int64 { + u := r.Float64() + val := 0.0 + if p.k == 0.0 { + val = p.theta - p.sigma*math.Log(u) + } else { + val = p.theta + p.sigma*(math.Pow(u, -1*p.k)-1)/p.k + } + ret := int64(math.Ceil(val)) + if ret <= 0 { + ret = 10 + } else if ret > p.maxValue { + ret = ret % p.maxValue + } + return ret +} diff --git a/pkg/generator/scrambled_zipfian.go b/pkg/generator/scrambled_zipfian.go index a9bdf7d9..b9d80485 100644 --- a/pkg/generator/scrambled_zipfian.go +++ b/pkg/generator/scrambled_zipfian.go @@ -60,6 +60,8 @@ func NewScrambledZipfian(min int64, max int64, zipfianConstant float64) *Scrambl s.itemCount = max - min + 1 if zipfianConstant == usedZipfianConstant { s.gen = NewZipfian(0, itemCount, zipfianConstant, zetan) + } else if zipfianConstant == 1.2 { + s.gen = NewZipfian(0, itemCount, zipfianConstant, 52.7270) } else { s.gen = NewZipfianWithRange(0, itemCount, zipfianConstant) } diff --git a/pkg/generator/twotermexpkeys.go b/pkg/generator/twotermexpkeys.go new file mode 100644 index 00000000..73ed206f --- /dev/null +++ b/pkg/generator/twotermexpkeys.go @@ -0,0 +1,244 @@ +// Copyright 2018 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Copyright (c) 2010-2016 Yahoo! Inc., 2017 YCSB contributors. All rights reserved. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you + * may not use this file except in compliance with the License. You + * may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. See accompanying + * LICENSE file. + */ + +package generator + +import ( + "fmt" + "math" + "math/rand" + "sync" + + "github.com/pingcap/go-ycsb/pkg/util" +) + +// const ( +// // ParetoTheta is the 'theta' of Generized Pareto Distribution. +// ParetoTheta = float64(0) +// // ParetoK is the 'k' of Generized Pareto Distribution. +// ParetoK = float64(0.923) +// // ParetoSigma is the 'sigma' of Generized Pareto Distribution. +// ParetoSigma = float64(226.409) +// ) + +type keyRangeUnit struct { + keyRangeStart int64 + keyRangeAccess int64 + keyRangeKeys int64 +} + +// TwoTermExpKeys generates integers follow TwoTermExpKeys distribution. +type TwoTermExpKeys struct { + Number + keyRangeRandMax int64 + keyRangeSize int64 + keyRangeNum int64 + keyRangeSet []*keyRangeUnit + zipfGen *ScrambledZipfian + bottomIndex int64 + randLocal *rand.Rand + sync.RWMutex +} + +// NewTwoTermExpKeys creates the NewTwoTermExpKeys generator. +func NewTwoTermExpKeys(zipfianRange bool, totalKeys int64, keyRangeNum int64, prefixA float64, prefixB float64, prefixC float64, prefixD float64) *TwoTermExpKeys { + ttek := &TwoTermExpKeys{} + + var amplify int64 + var keyRangeStart int64 + if keyRangeNum <= 0 { + ttek.keyRangeNum = 1 + } else { + ttek.keyRangeNum = keyRangeNum + } + ttek.keyRangeSize = totalKeys / ttek.keyRangeNum + + for pfx := ttek.keyRangeNum; pfx >= 1; pfx-- { + keyRangeP := prefixA*math.Exp(prefixB*float64(pfx)) + prefixC*math.Exp(prefixD*float64(pfx)) + if zipfianRange { + keyRangeP = 1.0 / math.Pow(float64(pfx), 0.99) + } + + if keyRangeP < math.Pow10(-16) { + keyRangeP = float64(0) + } + if amplify == 0 && keyRangeP > 0 { + amplify = int64(math.Floor(1/keyRangeP)) + 1 + } + + pUnit := &keyRangeUnit{} + pUnit.keyRangeStart = keyRangeStart + if 0.0 >= keyRangeP { + pUnit.keyRangeAccess = 0 + } else { + pUnit.keyRangeAccess = int64(math.Floor(float64(amplify) * keyRangeP)) + } + pUnit.keyRangeKeys = ttek.keyRangeSize + ttek.keyRangeSet = append(ttek.keyRangeSet, pUnit) + keyRangeStart += pUnit.keyRangeAccess + + // fmt.Println("key range ", pfx, " access weight : ", pUnit.keyRangeAccess) + } + ttek.keyRangeRandMax = keyRangeStart + + bottomIndex := int64(0) + for ; bottomIndex < ttek.keyRangeNum; bottomIndex++ { + pr := float64(ttek.keyRangeSet[bottomIndex].keyRangeAccess) / float64(ttek.keyRangeRandMax) + if pr >= 0.01 { + break + } + } + + ttek.randLocal = rand.New(rand.NewSource(ttek.keyRangeRandMax)) + for i := int64(0); i < keyRangeNum; i++ { + pos := ttek.randLocal.Int63n(keyRangeNum) + + if i >= bottomIndex || pos >= bottomIndex { + continue + } + + tmp := ttek.keyRangeSet[i] + ttek.keyRangeSet[i] = ttek.keyRangeSet[pos] + ttek.keyRangeSet[pos] = tmp + } + + ttek.bottomIndex = bottomIndex + + offset := int64(0) + for _, pUnit := range ttek.keyRangeSet { + pUnit.keyRangeStart = offset + offset += pUnit.keyRangeAccess + } + + return ttek +} + +// Next implements the Generator Next interface. +func (t *TwoTermExpKeys) Next(r *rand.Rand) int64 { + return 0 +} + +// Adjust adjusts key range +func (t *TwoTermExpKeys) Adjust(smallValPos, bigValPos []int64) { + halfNum := (t.keyRangeNum - t.bottomIndex) / 2 + j := 0 + for i := t.bottomIndex; i < t.bottomIndex+halfNum; i++ { + pos := bigValPos[j] + j++ + if j >= len(bigValPos) { + break + } + tmp := t.keyRangeSet[i] + t.keyRangeSet[i] = t.keyRangeSet[pos] + t.keyRangeSet[pos] = tmp + } + + j = 0 + for i := t.bottomIndex + halfNum; i < t.keyRangeNum; i++ { + pos := smallValPos[j] + j++ + if j >= len(smallValPos) { + break + } + tmp := t.keyRangeSet[i] + t.keyRangeSet[i] = t.keyRangeSet[pos] + t.keyRangeSet[pos] = tmp + } + + offset := int64(0) + for _, pUnit := range t.keyRangeSet { + pUnit.keyRangeStart = offset + offset += pUnit.keyRangeAccess + } +} + +func (t *TwoTermExpKeys) Shuffle() { + t.Lock() + defer t.Unlock() + + for i := int64(0); i < t.keyRangeNum; i++ { + pos := t.randLocal.Int63n(t.keyRangeNum) + + tmp := t.keyRangeSet[i] + t.keyRangeSet[i] = t.keyRangeSet[pos] + t.keyRangeSet[pos] = tmp + } + + offset := int64(0) + for _, pUnit := range t.keyRangeSet { + pUnit.keyRangeStart = offset + offset += pUnit.keyRangeAccess + } + +} + +// PrintKeyRangeInfo prints key range info. +func (t *TwoTermExpKeys) PrintKeyRangeInfo(valSizes []int64) { + fmt.Println("KeyRangeDist: total access weight", t.keyRangeRandMax) + for i := int64(0); i < t.keyRangeNum; i++ { + pr := float64(t.keyRangeSet[i].keyRangeAccess) / float64(t.keyRangeRandMax) + if pr > 0.005 { + fmt.Printf("KeyRangeDist: range %v, start_key %v, access probability %v, value size %v\n", i, t.keyRangeSize*i, pr, valSizes[i]) + } + } +} + +// DistGetKeyID implements DistGetKeyID. +func (t *TwoTermExpKeys) DistGetKeyID(useZipf bool, r *rand.Rand, initRand int64, keyDistA float64, keyDistB float64) int64 { + keyRangeRand := util.Hash64(initRand) % t.keyRangeRandMax + + start := 0 + end := len(t.keyRangeSet) + for start+1 < end { + mid := start + (end-start)/2 + if keyRangeRand < t.keyRangeSet[mid].keyRangeStart { + end = mid + } else { + start = mid + } + } + keyRangeID := start + + if useZipf { + keyRangeID = int(t.zipfGen.Next(r)) + } + + var keyOffset, keySeed int64 + if keyDistA == 0.0 || keyDistB == 0.0 { + keyOffset = initRand % t.keyRangeSize + } else { + u := float64(initRand%t.keyRangeSize) / float64(t.keyRangeSize) + keySeed = int64(math.Ceil(math.Pow(u/keyDistA, 1/keyDistB))) + // randKey := rand.New(rand.NewSource(keySeed)) + // keyOffset = randKey.Int63n(t.keyRangeSize) + keyOffset = util.Hash64(keySeed) % t.keyRangeSize + } + return t.keyRangeSize*int64(keyRangeID) + keyOffset +} diff --git a/pkg/generator/zipfian.go b/pkg/generator/zipfian.go index 4bac6075..c8571050 100644 --- a/pkg/generator/zipfian.go +++ b/pkg/generator/zipfian.go @@ -48,11 +48,11 @@ const ( // others, according to a zipfian distribution. When you construct an instance of this class, you specify the number // of items in the set to draw from, either by specifying an itemcount (so that the sequence is of items from 0 to // itemcount-1) or by specifying a min and a max (so that the sequence is of items from min to max inclusive). After -// you construct the instance, you can change the number of items by calling Next(*rand.Rand). +// you construct the instance, you can change the number of items by calling nextInt(itemcount) or nextLong(itemcount). // // Note that the popular items will be clustered together, e.g. item 0 is the most popular, item 1 the second most // popular, and so on (or min is the most popular, min+1 the next most popular, etc.) If you don't want this clustering, -// and instead want the popular items scattered throughout the item space, then use ScrambledZipfian(located in scrambled_zipfian.go) instead. +// and instead want the popular items scattered throughout the item space, then use ScrambledZipfianGenerator instead. // // Be aware: initializing this generator may take a long time if there are lots of items to choose from (e.g. over a // minute for 100 million objects). This is because certain mathematical values need to be computed to properly diff --git a/pkg/measurement/histogram.go b/pkg/measurement/histogram.go index 5da22c9e..b4dfef38 100644 --- a/pkg/measurement/histogram.go +++ b/pkg/measurement/histogram.go @@ -14,71 +14,184 @@ package measurement import ( + "bytes" + "fmt" + "math" "sort" + "sync/atomic" "time" - hdrhistogram "github.com/HdrHistogram/hdrhistogram-go" + "github.com/magiconair/properties" "github.com/pingcap/go-ycsb/pkg/util" + "github.com/pingcap/go-ycsb/pkg/ycsb" ) type histogram struct { - boundCounts util.ConcurrentMap - startTime time.Time - hist *hdrhistogram.Histogram + shardCount int + boundCounts util.ConcurrentMap + boundInterval int64 + count int64 + sum int64 + min int64 + max int64 + startTime time.Time + lastHist *histogram + outputTick int } // Metric name. const ( - ELAPSED = "ELAPSED" - COUNT = "COUNT" - QPS = "QPS" - AVG = "AVG" - MIN = "MIN" - MAX = "MAX" - PER99TH = "PER99TH" - PER999TH = "PER999TH" - PER9999TH = "PER9999TH" + HistogramBuckets = "histogram.buckets" + HistogramBucketsDefault = 1000 + ShardCount = "cmap.shardCount" + ShardCountDefault = 32 + ELAPSED = "ELAPSED" + COUNT = "COUNT" + QPS = "QPS" + AVG = "AVG" + MIN = "MIN" + MAX = "MAX" + PER99TH = "PER99TH" + PER999TH = "PER999TH" + PER9999TH = "PER9999TH" ) -func newHistogram() *histogram { +func (h *histogram) Info() ycsb.MeasurementInfo { + res := h.getInfo() + delete(res, ELAPSED) + return newHistogramInfo(res) +} + +func newHistogram(p *properties.Properties) *histogram { h := new(histogram) + h.shardCount = p.GetInt(ShardCount, ShardCountDefault) h.startTime = time.Now() - h.hist = hdrhistogram.New(1, 24*60*60*1000*1000, 3) + h.boundCounts = util.New(h.shardCount) + h.boundInterval = p.GetInt64(HistogramBuckets, HistogramBucketsDefault) + h.min = math.MaxInt64 + h.max = math.MinInt64 + + h.lastHist = new(histogram) + h.lastHist.startTime = time.Now() + h.lastHist.boundCounts = util.New(h.shardCount) + h.lastHist.boundInterval = p.GetInt64(HistogramBuckets, HistogramBucketsDefault) + h.lastHist.min = math.MaxInt64 + h.lastHist.max = math.MinInt64 return h } func (h *histogram) Measure(latency time.Duration) { - h.hist.RecordValue(latency.Microseconds()) + n := int64(latency / time.Microsecond) + + atomic.AddInt64(&h.sum, n) + atomic.AddInt64(&h.count, 1) + bound := int(n / h.boundInterval) + h.boundCounts.Upsert(bound, 1, func(ok bool, existedValue int64, newValue int64) int64 { + if ok { + return existedValue + newValue + } + return newValue + }) + + for { + oldMin := atomic.LoadInt64(&h.min) + if n >= oldMin { + break + } + + if atomic.CompareAndSwapInt64(&h.min, oldMin, n) { + break + } + } + + for { + oldMax := atomic.LoadInt64(&h.max) + if n <= oldMax { + break + } + + if atomic.CompareAndSwapInt64(&h.max, oldMax, n) { + break + } + } + + if h.lastHist != nil { + h.lastHist.Measure(latency) + } } -func (h *histogram) Summary() []string { +func (h *histogram) Summary() string { res := h.getInfo() - return []string{ - util.FloatToOneString(res[ELAPSED]), - util.IntToString(res[COUNT]), - util.FloatToOneString(res[QPS]), - util.IntToString(res[AVG]), - util.IntToString(res[MIN]), - util.IntToString(res[MAX]), - util.IntToString(res[PER99TH]), - util.IntToString(res[PER999TH]), - util.IntToString(res[PER9999TH]), + curTime := time.Now().Format("2006-01-02 15:04:05") + + buf := new(bytes.Buffer) + buf.WriteString(fmt.Sprintf("At %s, ", curTime)) + buf.WriteString(fmt.Sprintf("Takes(s): %.1f, ", res[ELAPSED])) + buf.WriteString(fmt.Sprintf("Count: %d, ", res[COUNT])) + buf.WriteString(fmt.Sprintf("OPS: %.1f, ", res[QPS])) + buf.WriteString(fmt.Sprintf("Avg(us): %d, ", res[AVG])) + buf.WriteString(fmt.Sprintf("Min(us): %d, ", res[MIN])) + buf.WriteString(fmt.Sprintf("Max(us): %d, ", res[MAX])) + buf.WriteString(fmt.Sprintf("99th(us): %d, ", res[PER99TH])) + buf.WriteString(fmt.Sprintf("99.9th(us): %d, ", res[PER999TH])) + buf.WriteString(fmt.Sprintf("99.99th(us): %d", res[PER9999TH])) + + h.outputTick++ + res = h.lastHist.getInfo() + if h.outputTick % 6 == 0 { + h.lastHist.sum = 0 + h.lastHist.count = 0 + h.lastHist.min = math.MaxInt64 + h.lastHist.max = math.MinInt64 + h.lastHist.startTime = time.Now() + h.lastHist.boundCounts = util.New(h.shardCount) } + + buf.WriteString(fmt.Sprintf("\n---Last %.1f(s) infos: ", res[ELAPSED])) + buf.WriteString(fmt.Sprintf("Count: %d, ", res[COUNT])) + buf.WriteString(fmt.Sprintf("OPS: %.1f, ", res[QPS])) + buf.WriteString(fmt.Sprintf("Avg(us): %d, ", res[AVG])) + buf.WriteString(fmt.Sprintf("Min(us): %d, ", res[MIN])) + buf.WriteString(fmt.Sprintf("Max(us): %d, ", res[MAX])) + buf.WriteString(fmt.Sprintf("99th(us): %d, ", res[PER99TH])) + buf.WriteString(fmt.Sprintf("99.9th(us): %d, ", res[PER999TH])) + buf.WriteString(fmt.Sprintf("99.99th(us): %d", res[PER9999TH])) + + return buf.String() } func (h *histogram) getInfo() map[string]interface{} { - min := h.hist.Min() - max := h.hist.Max() - avg := int64(h.hist.Mean()) - count := h.hist.TotalCount() + min := atomic.LoadInt64(&h.min) + max := atomic.LoadInt64(&h.max) + sum := atomic.LoadInt64(&h.sum) + count := atomic.LoadInt64(&h.count) bounds := h.boundCounts.Keys() sort.Ints(bounds) - per99 := h.hist.ValueAtPercentile(99) - per999 := h.hist.ValueAtPercentile(99.9) - per9999 := h.hist.ValueAtPercentile(99.99) + avg := int64(float64(sum) / float64(count)) + per99 := 0 + per999 := 0 + per9999 := 0 + + opCount := int64(0) + for _, bound := range bounds { + boundCount, _ := h.boundCounts.Get(bound) + opCount += boundCount + per := float64(opCount) / float64(count) + if per99 == 0 && per >= 0.99 { + per99 = (bound + 1) * 1000 + } + + if per999 == 0 && per >= 0.999 { + per999 = (bound + 1) * 1000 + } + + if per9999 == 0 && per >= 0.9999 { + per9999 = (bound + 1) * 1000 + } + } elapsed := time.Now().Sub(h.startTime).Seconds() qps := float64(count) / elapsed @@ -95,3 +208,18 @@ func (h *histogram) getInfo() map[string]interface{} { return res } + +type histogramInfo struct { + info map[string]interface{} +} + +func newHistogramInfo(info map[string]interface{}) *histogramInfo { + return &histogramInfo{info: info} +} + +func (hi *histogramInfo) Get(metricName string) interface{} { + if value, ok := hi.info[metricName]; ok { + return value + } + return nil +} diff --git a/pkg/measurement/measurement.go b/pkg/measurement/measurement.go index 7260bb31..b0f66471 100644 --- a/pkg/measurement/measurement.go +++ b/pkg/measurement/measurement.go @@ -14,8 +14,8 @@ package measurement import ( - "bufio" - "os" + "fmt" + "sort" "sync" "sync/atomic" "time" @@ -25,80 +25,87 @@ import ( "github.com/pingcap/go-ycsb/pkg/ycsb" ) -var header = []string{"Operation", "Takes(s)", "Count", "OPS", "Avg(us)", "Min(us)", "Max(us)", "99th(us)", "99.9th(us)", "99.99th(us)"} - type measurement struct { sync.RWMutex p *properties.Properties - measurer ycsb.Measurer + opMeasurement map[string]ycsb.Measurement } -func (m *measurement) measure(op string, start time.Time, lan time.Duration) { - m.Lock() - m.measurer.Measure(op, start, lan) - m.Unlock() +func (m *measurement) measure(op string, lan time.Duration) { + m.RLock() + opM, ok := m.opMeasurement[op] + m.RUnlock() + + if !ok { + opM = newHistogram(m.p) + m.Lock() + m.opMeasurement[op] = opM + m.Unlock() + } + + opM.Measure(lan) } func (m *measurement) output() { m.RLock() defer m.RUnlock() - - outFile := m.p.GetString(prop.MeasurementRawOutputFile, "") - var w *bufio.Writer - if outFile == "" { - w = bufio.NewWriter(os.Stdout) - } else { - f, err := os.Create(outFile) - if err != nil { - panic("failed to create output file: " + err.Error()) - } - defer f.Close() - w = bufio.NewWriter(f) + keys := make([]string, len(m.opMeasurement)) + var i = 0 + for k := range m.opMeasurement { + keys[i] = k + i += 1 } + sort.Strings(keys) - err := globalMeasure.measurer.Output(w) - if err != nil { - panic("failed to write output: " + err.Error()) + for _, op := range keys { + fmt.Printf("%-6s - %s\n", op, m.opMeasurement[op].Summary()) } +} + +func (m *measurement) info() map[string]ycsb.MeasurementInfo { + m.RLock() + defer m.RUnlock() - err = w.Flush() - if err != nil { - panic("failed to flush output: " + err.Error()) + opMeasurementInfo := make(map[string]ycsb.MeasurementInfo, len(m.opMeasurement)) + for op, opM := range m.opMeasurement { + opMeasurementInfo[op] = opM.Info() } + return opMeasurementInfo } -func (m *measurement) summary() { +func (m *measurement) getOpName() []string { m.RLock() - globalMeasure.measurer.Summary() - m.RUnlock() + defer m.RUnlock() + + res := make([]string, 0, len(m.opMeasurement)) + for op := range m.opMeasurement { + res = append(res, op) + } + return res } // InitMeasure initializes the global measurement. func InitMeasure(p *properties.Properties) { globalMeasure = new(measurement) globalMeasure.p = p - measurementType := p.GetString(prop.MeasurementType, prop.MeasurementTypeDefault) - switch measurementType { - case "histogram": - globalMeasure.measurer = InitHistograms(p) - case "raw", "csv": - globalMeasure.measurer = InitCSV() - default: - panic("unsupported measurement type: " + measurementType) - } + globalMeasure.opMeasurement = make(map[string]ycsb.Measurement, 16) EnableWarmUp(p.GetInt64(prop.WarmUpTime, 0) > 0) + + threadMeasure = new(measurement) + threadMeasure.p = p + threadMeasure.opMeasurement = make(map[string]ycsb.Measurement) } -// Output prints the complete measurements. +// Output prints the measurement summary. func Output() { globalMeasure.output() } -// Summary prints the measurement summary. -func Summary() { - globalMeasure.summary() +// ThreadOutput prints the measurement summary of threads. +func ThreadOutput() { + threadMeasure.output() } // EnableWarmUp sets whether to enable warm-up. @@ -116,11 +123,34 @@ func IsWarmUpFinished() bool { } // Measure measures the operation. -func Measure(op string, start time.Time, lan time.Duration) { +func Measure(op string, lan time.Duration) { if IsWarmUpFinished() { - globalMeasure.measure(op, start, lan) + globalMeasure.measure(op, lan) } } +// ThreadMeasure measures the thead. +func ThreadMeasure(tid string, lan time.Duration) { + threadMeasure.measure(tid, lan) +} + +// Info returns all the operations MeasurementInfo. +// The key of returned map is the operation name. +func Info() map[string]ycsb.MeasurementInfo { + return globalMeasure.info() +} + +// ThreadInfo returns all the operations MeasurementInfo. +// The key of returned map is the operation name. +func ThreadInfo() map[string]ycsb.MeasurementInfo { + return threadMeasure.info() +} + +// GetOpNames returns a string slice which contains all the operation name measured. +func GetOpNames() []string { + return globalMeasure.getOpName() +} + var globalMeasure *measurement +var threadMeasure *measurement var warmUp int32 // use as bool, 1 means in warmup progress, 0 means warmup finished. diff --git a/pkg/prop/prop.go b/pkg/prop/prop.go index 7ca5d6c1..5c0afd56 100644 --- a/pkg/prop/prop.go +++ b/pkg/prop/prop.go @@ -107,13 +107,73 @@ const ( KeyPrefix = "keyprefix" KeyPrefixDefault = "user" - LogInterval = "measurement.interval" + FluctuateLoad = "fluctuateload" + FluctuateLoadDefault = false + FluctuateLowLoadInterval = "fluctuatelowloadinterval" + FluctuateLowLoadIntervalDefault = 50 + FluctuatePeakLoadInterval = "fluctuatepeakloadinterval" + FluctuatePeakLoadIntervalDefault = 10 + FluctuateLoadRatio = "fluctuateloadratio" + FluctuateLoadRatioDefault = 10 + FluctuateSineA = "fluctuatesinea" + FluctuateSineADefault = 500.0 + FluctuateSineB = "fluctuatesineb" + FluctuateSineBDefault = 0.05 + FluctuateSineC = "fluctuatesinec" + FluctuateSineCDefault = 0.0 + FluctuateSineD = "fluctuatesined" + FluctuateSineDDefault = 500.0 - MeasurementType = "measurementtype" - MeasurementTypeDefault = "histogram" - MeasurementRawOutputFile = "measurement.output_file" + WaitingQueue = "waitingqueue" + WaitingQueueDefault = false + WaitingQueueSize = "waitingqueuesize" + WaitingQueueSizeDefault = 10000 - Command = "command" + NeedShuffleRegion = "needshuffleregion" + NeedShuffleRegionDefault = false + ShuffleRegionInterval = "shuffleregioninterval" + ShuffleRegionIntervalDefault = 240 - OutputStyle = "outputstyle" + TraceReplay = "tracereplay" + TraceReplayDefault = false + ReplayThreadCount = "replaythreadcount" + ApplyThreadCount = "applythreadcount" + + KvSizeUseParetoDistInRegion = "kvSizeUseParetoDistInRegion" + + MixGraphBench = "mixgraph" + MixGraphBenchDefault = false + MixGetRatio = "mixgetratio" + MixGetRatioDefault = float64(0.83) + MixPutRatio = "mixputratio" + MixPutRatioDefault = float64(0.14) + MixSeekRatio = "mixseekratio" + MixSeekRatioDefault = float64(0.03) + KeyRangeNum = "keyrangenum" + KeyRangeNumDefault = int64(30) + KeyRangeDistA = "keyrangedista" + KeyRangeDistADefault = float64(14.18) + KeyRangeDistB = "keyrangedistb" + KeyRangeDistBDefault = float64(-2.917) + KeyRangeDistC = "keyrangedistc" + KeyRangeDistCDefault = float64(0.0164) + KeyRangeDistD = "keyrangedistd" + KeyRangeDistDDefault = float64(-0.08082) + KeyDistA = "keydista" + KeyDistADefault = float64(0.002312) + KeyDistB = "keydistb" + KeyDistBDefault = float64(0.3467) + ValueTheta = "valuetheta" + ValueThetaDefault = float64(0) + ValueK = "valuek" + ValueKDefault = float64(0.2615) + ValueSigma = "valuesigma" + ValueSigmaDefault = float64(25.45) + IterTheta = "itertheta" + IterThetaDefault = float64(0) + IterK = "iterk" + IterKDefault = float64(2.517) + IterSigma = "itersigma" + IterSigmaDefault = float64(14.236) + LogInterval = "measurement.interval" ) diff --git a/pkg/util/concurrent_map.go b/pkg/util/concurrent_map.go index e50e5b02..8f340bf0 100644 --- a/pkg/util/concurrent_map.go +++ b/pkg/util/concurrent_map.go @@ -19,7 +19,7 @@ type ConcurrentMap struct { // A "thread" safe int to int64 map. type ConcurrentMapShared struct { - items map[int]int64 + items map[int]int64 sync.RWMutex // Read Write mutex, guards access to internal map. } diff --git a/pkg/util/util.go b/pkg/util/util.go index 2fed7007..2752ae22 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -14,6 +14,7 @@ package util import ( + "bytes" "fmt" "math/rand" "os" @@ -52,7 +53,7 @@ type BufPool struct { func NewBufPool() *BufPool { p := &sync.Pool{ New: func() interface{} { - return []byte(nil) + return new(bytes.Buffer) }, } return &BufPool{ @@ -61,13 +62,13 @@ func NewBufPool() *BufPool { } // Get gets a buffer. -func (b *BufPool) Get() []byte { - buf := b.p.Get().([]byte) - buf = buf[:0] +func (b *BufPool) Get() *bytes.Buffer { + buf := b.p.Get().(*bytes.Buffer) + buf.Reset() return buf } // Put returns a buffer. -func (b *BufPool) Put(buf []byte) { +func (b *BufPool) Put(buf *bytes.Buffer) { b.p.Put(buf) } diff --git a/pkg/workload/core.go b/pkg/workload/core.go index b6768cb0..dba32889 100644 --- a/pkg/workload/core.go +++ b/pkg/workload/core.go @@ -25,6 +25,7 @@ import ( "time" "github.com/magiconair/properties" + "github.com/pingcap/go-ycsb/pkg/client" "github.com/pingcap/go-ycsb/pkg/generator" "github.com/pingcap/go-ycsb/pkg/measurement" "github.com/pingcap/go-ycsb/pkg/prop" @@ -39,7 +40,8 @@ const stateKey = contextKey("core") type coreState struct { r *rand.Rand // fieldNames is a copy of core.fieldNames to be goroutine-local - fieldNames []string + fieldNames []string + curValueSize int64 } type operationType int64 @@ -76,8 +78,38 @@ type core struct { zeroPadding int64 insertionRetryLimit int64 insertionRetryInterval int64 + fieldLength int64 + maxScanLength int64 valuePool sync.Pool + + runMixGraphBench bool + useDefaultRequest bool + variedSize bool + queryChooser ycsb.Generator + genExp *generator.TwoTermExpKeys + usePrefixModeling bool + keyDistA float64 + keyDistB float64 + valueTheta float64 + valueK float64 + valueSigma float64 + iterTheta float64 + iterK float64 + iterSigma float64 + keyRangeNum int64 + avgValueSizes []int64 + keyRangeFreqs []int64 + keyRangeSumVSize []int64 + keyRangeSize int64 + + traceReplay bool + + nextShuffleRegionTime time.Time + shuffleRegionInterval uint64 + needShuffleRegion bool + kvSizeUseParetoDistInRegion bool + sync.RWMutex } func getFieldLengthGenerator(p *properties.Properties) ycsb.Generator { @@ -95,6 +127,8 @@ func getFieldLengthGenerator(p *properties.Properties) ycsb.Generator { fieldLengthGenerator = generator.NewZipfianWithRange(1, fieldLength, generator.ZipfianConstant) case "histogram": fieldLengthGenerator = generator.NewHistogramFromFile(fieldLengthHistogram) + case "pareto": + fieldLengthGenerator = generator.NewPareto(fieldLength, generator.ParetoTheta, generator.ParetoK, generator.ParetoSigma) default: util.Fatalf("unknown field length distribution %s", fieldLengthDistribution) } @@ -133,11 +167,6 @@ func createOperationGenerator(p *properties.Properties) *generator.Discrete { return operationChooser } -// Load implements the Workload Load interface. -func (c *core) Load(ctx context.Context, db ycsb.DB, totalCount int64) error { - return nil -} - // InitThread implements the Workload InitThread interface. func (c *core) InitThread(ctx context.Context, _ int, _ int) context.Context { r := rand.New(rand.NewSource(time.Now().UnixNano())) @@ -157,6 +186,28 @@ func (c *core) CleanupThread(_ context.Context) { // Close implements the Workload Close interface. func (c *core) Close() error { + // sort.Ints(c.keyRangeFreqs) + freqSum := int64(0) + vsizeSum := int64(0) + for i, freq := range c.keyRangeFreqs { + freqSum += freq + vsizeSum += c.keyRangeSumVSize[i] + } + freqSum /= 100 + vsizeSum /= 100 + if freqSum == 0 || vsizeSum == 0 { + return nil + } + fmt.Println("avg valueSize:", vsizeSum/freqSum, "\n region load info:") + for i, freq := range c.keyRangeFreqs { + if freq > 0 { + freqRatio := float64(freq) / float64(freqSum) + valueSizeRatio := float64(c.keyRangeSumVSize[i]) / float64(vsizeSum) + if freqRatio >= 0.05 || valueSizeRatio >= 0.05 { + fmt.Println("range ", i, ": freq ratio (%) ", freqRatio, ", valueSize ratio (%)", valueSizeRatio, "; avg valueSize", float64(c.keyRangeSumVSize[i])/float64(freq)) + } + } + } return nil } @@ -221,7 +272,11 @@ func (c *core) putValues(values map[string][]byte) { func (c *core) buildRandomValue(state *coreState) []byte { // TODO: use pool for the buffer r := state.r - buf := c.getValueBuffer(int(c.fieldLengthGenerator.Next(r))) + size := c.fieldLengthGenerator.Next(r) + if c.runMixGraphBench || c.variedSize { + size = state.curValueSize + } + buf := c.getValueBuffer(int(size)) util.RandBytes(r, buf) return buf } @@ -230,6 +285,9 @@ func (c *core) buildDeterministicValue(state *coreState, key string, fieldKey st // TODO: use pool for the buffer r := state.r size := c.fieldLengthGenerator.Next(r) + if c.runMixGraphBench || c.variedSize { + size = state.curValueSize + } buf := c.getValueBuffer(int(size + 21)) b := bytes.NewBuffer(buf[0:0]) b.WriteString(key) @@ -355,8 +413,222 @@ func (c *core) DoBatchInsert(ctx context.Context, batchSize int, db ycsb.DB) err return err } +// PowerCdfInversion is the inverse function of power distribution (y=ax^b) +func PowerCdfInversion(u float64, a float64, b float64) int64 { + ret := math.Pow((u / a), (1 / b)) + return int64(math.Ceil(ret)) +} + +// ParetoCdfInversion is the inverse function of Pareto distribution +func ParetoCdfInversion(u float64, theta float64, k float64, sigma float64) int64 { + val := 0.0 + if k == 0.0 { + val = theta - sigma*math.Log(u) + } else { + val = theta + sigma*(math.Pow(u, -1*k)-1)/k + } + return int64(math.Ceil(val)) +} + +func (c *core) InitMixGraphBench() { + c.runMixGraphBench = c.p.GetBool(prop.MixGraphBench, prop.MixGraphBenchDefault) + + ratio := []float64{ + c.p.GetFloat64(prop.MixGetRatio, prop.MixGetRatioDefault), + c.p.GetFloat64(prop.MixPutRatio, prop.MixPutRatioDefault), + c.p.GetFloat64(prop.MixSeekRatio, prop.MixSeekRatioDefault), + } + + queryChooser := generator.NewDiscrete() + for i, r := range ratio { + queryChooser.Add(r, int64(i)) + } + c.queryChooser = queryChooser + + c.useDefaultRequest = c.p.GetBool("usedefaultrequest", false) + + c.keyRangeNum = c.p.GetInt64(prop.KeyRangeNum, prop.KeyRangeNumDefault) + keyRangeDistA := c.p.GetFloat64(prop.KeyRangeDistA, prop.KeyRangeDistADefault) + keyRangeDistB := c.p.GetFloat64(prop.KeyRangeDistB, prop.KeyRangeDistBDefault) + keyRangeDistC := c.p.GetFloat64(prop.KeyRangeDistC, prop.KeyRangeDistCDefault) + keyRangeDistD := c.p.GetFloat64(prop.KeyRangeDistD, prop.KeyRangeDistDDefault) + if keyRangeDistA != 0.0 || keyRangeDistB != 0.0 || keyRangeDistC != 0.0 || keyRangeDistD != 0.0 { + c.usePrefixModeling = true + c.genExp = generator.NewTwoTermExpKeys(c.p.GetBool("zipfianrange", false), c.recordCount, c.keyRangeNum, keyRangeDistA, keyRangeDistB, keyRangeDistC, keyRangeDistD) + } + rangeNum := c.keyRangeNum + 1 + c.keyRangeFreqs = make([]int64, rangeNum) + c.keyRangeSumVSize = make([]int64, rangeNum) + c.keyRangeSize = c.recordCount / c.keyRangeNum + + c.keyDistA = c.p.GetFloat64(prop.KeyDistA, prop.KeyDistADefault) + c.keyDistB = c.p.GetFloat64(prop.KeyDistB, prop.KeyDistBDefault) + // if c.keyDistA == 0 || c.keyDistB == 0 { + // c.useDefaultRequest = true + // } + fmt.Println("usePrefixModeling ", c.usePrefixModeling, ", useDefaultRequest ", c.useDefaultRequest) + c.valueTheta = c.p.GetFloat64(prop.ValueTheta, prop.ValueThetaDefault) + c.valueK = c.p.GetFloat64(prop.ValueK, prop.ValueKDefault) + c.valueSigma = c.p.GetFloat64(prop.ValueSigma, prop.ValueSigmaDefault) + c.iterTheta = c.p.GetFloat64(prop.IterTheta, prop.IterThetaDefault) + c.iterK = c.p.GetFloat64(prop.IterK, prop.IterKDefault) + c.iterSigma = c.p.GetFloat64(prop.IterSigma, prop.IterSigmaDefault) + + c.variedSize = c.p.GetBool("variedsize", false) + c.avgValueSizes = []int64{} + + r := rand.New(rand.NewSource(2)) + avg := int64(0) + smallValPos := []int64{} + bigValPos := []int64{} + for i := int64(0); i < c.keyRangeNum+1; i++ { + u := r.Float64() + cv := ParetoCdfInversion(u, c.valueTheta, c.valueK, c.valueSigma) + if cv <= 0 { + cv = 10 + } + + if cv >= 10 && cv <= 100 { + smallValPos = append(smallValPos, i) + } + if cv >= 1024*3 && cv <= 10240 { + bigValPos = append(bigValPos, i) + } + + avg += cv + c.avgValueSizes = append(c.avgValueSizes, cv) + } + avg /= c.keyRangeNum + + exp := c.valueSigma / (1.0 - c.valueK) + fmt.Printf("avg avg %v, exp %v\n", avg, exp) + + c.nextShuffleRegionTime = time.Now().Add(time.Duration(c.shuffleRegionInterval * uint64(time.Second))) + c.shuffleRegionInterval = c.p.GetUint64(prop.ShuffleRegionInterval, prop.ShuffleRegionIntervalDefault) + c.needShuffleRegion = c.p.GetBool(prop.NeedShuffleRegion, prop.NeedShuffleRegionDefault) + c.kvSizeUseParetoDistInRegion = c.p.GetBool(prop.KvSizeUseParetoDistInRegion, false) + if !c.needShuffleRegion { + c.genExp.Adjust(smallValPos, bigValPos) + c.genExp.PrintKeyRangeInfo(c.avgValueSizes) + } + c.traceReplay = c.p.GetBool(prop.TraceReplay, prop.TraceReplayDefault) +} + +func (c *core) MixGraphBench(ctx context.Context, db ycsb.DB) *ycsb.KVRequest { + var initRand, randV, keyRand, keySeed int64 + + state := ctx.Value(stateKey).(*coreState) + r := state.r + + initRand = r.Int63() % c.recordCount + randV = initRand % c.recordCount + u := float64(randV) / float64(c.recordCount) + + if c.needShuffleRegion && time.Now().After(c.nextShuffleRegionTime) { + c.Lock() + if time.Now().After(c.nextShuffleRegionTime) { + c.genExp.Shuffle() + c.nextShuffleRegionTime = time.Now().Add(time.Duration(c.shuffleRegionInterval * uint64(time.Second))) + } + c.Unlock() + } + + if c.useDefaultRequest { + keyRand = c.nextKeyNum(state) + } else if c.usePrefixModeling { + keyRand = c.genExp.DistGetKeyID(false, r, initRand, c.keyDistA, c.keyDistB) + } else { + keySeed = PowerCdfInversion(u, c.keyDistA, c.keyDistB) + keyRand = util.Hash64(keySeed) % c.recordCount + } + keyName := c.buildKeyName(keyRand) + queryType := c.queryChooser.Next(r) //or generated by randV + + curRange := keyRand / c.keyRangeSize + c.keyRangeFreqs[keyRand/c.keyRangeSize]++ + + kvReq := &ycsb.KVRequest{ + QueryType: queryType, + KeyName: keyName, + } + + if queryType == 0 { + var fields []string + if !c.readAllFields { + fieldName := state.fieldNames[c.fieldChooser.Next(r)] + fields = append(fields, fieldName) + } else { + fields = state.fieldNames + } + + kvReq.Fields = fields + } else if queryType == 1 { + // state.curValueSize = ParetoCdfInversion(u, c.valueTheta, c.valueK, c.valueSigma) + if c.kvSizeUseParetoDistInRegion { + state.curValueSize = ParetoCdfInversion(u, c.valueTheta, c.valueK, float64(c.avgValueSizes[curRange])) + } else { + state.curValueSize = int64(float64(c.avgValueSizes[curRange]) * (0.5*u + 0.75)) + } + if state.curValueSize <= 0 { + state.curValueSize = 10 + } else if state.curValueSize > c.fieldLength { + state.curValueSize = state.curValueSize % c.fieldLength + } + + c.keyRangeSumVSize[keyRand/c.keyRangeSize] += state.curValueSize + + var values map[string][]byte + if c.writeAllFields { + values = c.buildValues(state, keyName) + } else { + values = c.buildSingleValue(state, keyName) + } + + kvReq.Values = values + } else { + scanLen := ParetoCdfInversion(u, c.iterTheta, c.iterK, c.iterSigma) % c.maxScanLength + + var fields []string + if !c.readAllFields { + fieldName := state.fieldNames[c.fieldChooser.Next(r)] + fields = append(fields, fieldName) + } else { + fields = state.fieldNames + } + + kvReq.Fields = fields + kvReq.ScanLen = int(scanLen) + } + + return kvReq +} + +func (c *core) ProcessKVRequest(ctx context.Context, db ycsb.DB, kvReq *ycsb.KVRequest) error { + switch kvReq.QueryType { + case 0: + _, err := db.Read(ctx, c.table, kvReq.KeyName, kvReq.Fields) + return err + case 1: + defer c.putValues(kvReq.Values) + return db.Insert(ctx, c.table, kvReq.KeyName, kvReq.Values) + default: + _, err := db.Scan(ctx, c.table, kvReq.KeyName, kvReq.ScanLen, kvReq.Fields) + return err + } +} + // DoTransaction implements the Workload DoTransaction interface. func (c *core) DoTransaction(ctx context.Context, db ycsb.DB) error { + if c.runMixGraphBench { + kvReq := c.MixGraphBench(ctx, db) + if c.traceReplay { + client.KVReqGenChan <- kvReq + return nil + } else { + return c.ProcessKVRequest(ctx, db, kvReq) + } + } + state := ctx.Value(stateKey).(*coreState) r := state.r @@ -408,7 +680,10 @@ func (c *core) nextKeyNum(state *coreState) int64 { keyNum = c.transactionInsertKeySequence.Last() - c.keyChooser.Next(r) } } else { - keyNum = c.keyChooser.Next(r) + keyNum = math.MaxInt64 + for keyNum > c.transactionInsertKeySequence.Last() { + keyNum = c.keyChooser.Next(r) + } } return keyNum } @@ -441,7 +716,7 @@ func (c *core) doTransactionRead(ctx context.Context, db ycsb.DB, state *coreSta func (c *core) doTransactionReadModifyWrite(ctx context.Context, db ycsb.DB, state *coreState) error { start := time.Now() defer func() { - measurement.Measure("READ_MODIFY_WRITE", start, time.Now().Sub(start)) + measurement.Measure("READ_MODIFY_WRITE", time.Now().Sub(start)) }() r := state.r @@ -615,6 +890,7 @@ func (coreCreator) Create(p *properties.Properties) (ycsb.Workload, error) { c.fieldNames[i] = fmt.Sprintf("field%d", i) } c.fieldLengthGenerator = getFieldLengthGenerator(p) + c.fieldLength = p.GetInt64(prop.FieldLength, prop.FieldLengthDefault) c.recordCount = p.GetInt64(prop.RecordCount, prop.RecordCountDefault) if c.recordCount == 0 { c.recordCount = int64(math.MaxInt32) @@ -623,6 +899,7 @@ func (coreCreator) Create(p *properties.Properties) (ycsb.Workload, error) { requestDistrib := p.GetString(prop.RequestDistribution, prop.RequestDistributionDefault) maxScanLength := p.GetInt64(prop.MaxScanLength, prop.MaxScanLengthDefault) scanLengthDistrib := p.GetString(prop.ScanLengthDistribution, prop.ScanLengthDistributionDefault) + c.maxScanLength = maxScanLength insertStart := p.GetInt64(prop.InsertStart, prop.InsertStartDefault) insertCount := p.GetInt64(prop.InsertCount, c.recordCount-insertStart) @@ -647,27 +924,24 @@ func (coreCreator) Create(p *properties.Properties) (ycsb.Workload, error) { c.keySequence = generator.NewCounter(insertStart) c.operationChooser = createOperationGenerator(p) - var keyrangeLowerBound int64 = insertStart - var keyrangeUpperBound int64 = insertStart + insertCount - 1 c.transactionInsertKeySequence = generator.NewAcknowledgedCounter(c.recordCount) switch requestDistrib { case "uniform": - c.keyChooser = generator.NewUniform(keyrangeLowerBound, keyrangeUpperBound) + c.keyChooser = generator.NewUniform(insertStart, insertStart+insertCount-1) case "sequential": - c.keyChooser = generator.NewSequential(keyrangeLowerBound, keyrangeUpperBound) + c.keyChooser = generator.NewSequential(insertStart, insertStart+insertCount-1) case "zipfian": insertProportion := p.GetFloat64(prop.InsertProportion, prop.InsertProportionDefault) opCount := p.GetInt64(prop.OperationCount, 0) expectedNewKeys := int64(float64(opCount) * insertProportion * 2.0) - keyrangeUpperBound = insertStart + insertCount + expectedNewKeys - c.keyChooser = generator.NewScrambledZipfian(keyrangeLowerBound, keyrangeUpperBound, generator.ZipfianConstant) + c.keyChooser = generator.NewScrambledZipfian(insertStart, insertStart+insertCount+expectedNewKeys, generator.ZipfianConstant) case "latest": c.keyChooser = generator.NewSkewedLatest(c.transactionInsertKeySequence) case "hotspot": hotsetFraction := p.GetFloat64(prop.HotspotDataFraction, prop.HotspotDataFractionDefault) hotopnFraction := p.GetFloat64(prop.HotspotOpnFraction, prop.HotspotOpnFractionDefault) - c.keyChooser = generator.NewHotspot(keyrangeLowerBound, keyrangeUpperBound, hotsetFraction, hotopnFraction) + c.keyChooser = generator.NewHotspot(insertStart, insertStart+insertCount-1, hotsetFraction, hotopnFraction) case "exponential": percentile := p.GetFloat64(prop.ExponentialPercentile, prop.ExponentialPercentileDefault) frac := p.GetFloat64(prop.ExponentialFrac, prop.ExponentialFracDefault) @@ -675,7 +949,6 @@ func (coreCreator) Create(p *properties.Properties) (ycsb.Workload, error) { default: util.Fatalf("unknown request distribution %s", requestDistrib) } - fmt.Println(fmt.Sprintf("Using request distribution '%s' a keyrange of [%d %d]", requestDistrib, keyrangeLowerBound, keyrangeUpperBound)) c.fieldChooser = generator.NewUniform(0, c.fieldCount-1) switch scanLengthDistrib { @@ -697,10 +970,11 @@ func (coreCreator) Create(p *properties.Properties) (ycsb.Workload, error) { }, } + c.InitMixGraphBench() + return c, nil } func init() { ycsb.RegisterWorkloadCreator("core", coreCreator{}) - ycsb.RegisterWorkloadCreator("site.ycsb.workloads.CoreWorkload", coreCreator{}) } diff --git a/pkg/ycsb/measurement.go b/pkg/ycsb/measurement.go index 60e4c46c..e6cfc88b 100644 --- a/pkg/ycsb/measurement.go +++ b/pkg/ycsb/measurement.go @@ -14,18 +14,22 @@ package ycsb import ( - "io" "time" ) -// Measurer is used to capture measurements. -type Measurer interface { - // Measure measures the latency of an operation. - Measure(op string, start time.Time, latency time.Duration) - - // Summary writes a summary of the current measurement results to stdout. - Summary() +// MeasurementInfo contains metrics of one measurement. +type MeasurementInfo interface { + // Get returns the value corresponded to the specified metric, such QPS, MIN, MAX,etc. + // If metric does not exist, the returned value will be nil. + Get(metricName string) interface{} +} - // Output writes the measurement results to the specified writer. - Output(w io.Writer) error +// Measurement measures the operations metrics. +type Measurement interface { + // Measure measures the operation latency. + Measure(latency time.Duration) + // Summary returns the summary of the measurement. + Summary() string + // Info returns the MeasurementInfo of the measurement. + Info() MeasurementInfo } diff --git a/pkg/ycsb/workload.go b/pkg/ycsb/workload.go index 7be59ed4..214113eb 100644 --- a/pkg/ycsb/workload.go +++ b/pkg/ycsb/workload.go @@ -16,6 +16,7 @@ package ycsb import ( "context" "fmt" + "time" "github.com/magiconair/properties" ) @@ -37,9 +38,6 @@ type Workload interface { // CleanupThread cleans up the state when the worker finished. CleanupThread(ctx context.Context) - // Load data into DB. - Load(ctx context.Context, db DB, totalCount int64) error - // DoInsert does one insert operation. DoInsert(ctx context.Context, db DB) error @@ -51,6 +49,18 @@ type Workload interface { // DoBatchTransaction does the batch transaction operation. DoBatchTransaction(ctx context.Context, batchSize int, db DB) error + + ProcessKVRequest(ctx context.Context, db DB, kvReq *KVRequest) error +} + +// KVRequest is used to record kv request +type KVRequest struct { + QueryType int64 + KeyName string + Values map[string][]byte + Fields []string + ScanLen int + StartTime time.Time } var workloadCreators = map[string]WorkloadCreator{} diff --git a/workloads/mixgraph-load b/workloads/mixgraph-load new file mode 100644 index 00000000..e5dd214c --- /dev/null +++ b/workloads/mixgraph-load @@ -0,0 +1,59 @@ +# Copyright (c) 2010 Yahoo! Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you +# may not use this file except in compliance with the License. You +# may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. See accompanying +# LICENSE file. + + +# Yahoo! Cloud System Benchmark +# Workload A: Update heavy workload +# Application example: Session store recording recent actions +# +# Read/update ratio: 50/50 +# Default data size: 1 KB records (10 fields, 100 bytes each, plus key) +# Request distribution: zipfian + +recordcount=500000000 +operationcount=500000000 +threadcount=1024 +workload=core + +# mixgraph parameter +keyrangenum=3000 +mixgetratio=0 +mixputratio=1 +mixseekratio=0 + +keyrangedista=14.18 +keyrangedistb=-2.917 +keyrangedistc=0.0164 +keyrangedistd=-0.08082 + +keydista=0.002312 +keydistb=0.3467 + +valuesigma=226.409 +valuek=0.923 +fieldlengthdistribution=pareto + +mixgraph=true +usedefaultrequest=true +variedsize=true +zipfianrange=false + +# ycsb parameter +insertorder=order +zeropadding=20 +readallfields=true +requestdistribution=uniform +fieldlength=10240 +fieldcount=1 diff --git a/workloads/mixgraph-run b/workloads/mixgraph-run new file mode 100644 index 00000000..af971680 --- /dev/null +++ b/workloads/mixgraph-run @@ -0,0 +1,59 @@ +# Copyright (c) 2010 Yahoo! Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you +# may not use this file except in compliance with the License. You +# may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. See accompanying +# LICENSE file. + + +# Yahoo! Cloud System Benchmark +# Workload A: Update heavy workload +# Application example: Session store recording recent actions +# +# Read/update ratio: 50/50 +# Default data size: 1 KB records (10 fields, 100 bytes each, plus key) +# Request distribution: zipfian + +recordcount=500000000 +operationcount=500000000 +threadcount=1024 +workload=core + +# mixgraph parameter +keyrangenum=3000 +mixgetratio=0 +mixputratio=1 +mixseekratio=0 + +keyrangedista=1.418 +keyrangedistb=-2.917 +keyrangedistc=0.0164 +keyrangedistd=-0.08082 + +keydista=0.002312 +keydistb=0.3467 + +valuesigma=226.409 +valuek=0.923 +fieldlengthdistribution=pareto + +mixgraph=true +usedefaultrequest=false +variedsize=true +zipfianrange=false + +# ycsb parameter +insertorder=order +zeropadding=20 +readallfields=true +requestdistribution=uniform +fieldlength=10240 +fieldcount=1 diff --git a/workloads/workloada b/workloads/workloada index ce71eb7c..e7f6d631 100644 --- a/workloads/workloada +++ b/workloads/workloada @@ -22,8 +22,8 @@ # Default data size: 1 KB records (10 fields, 100 bytes each, plus key) # Request distribution: zipfian -recordcount=1000 -operationcount=1000 +recordcount=100000 +operationcount=100000 workload=core readallfields=true