mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-01-13 22:00:07 +08:00
Add support of coprocessor (#155)
* add coprocessor support Signed-off-by: Connor1996 <zbk602423539@gmail.com> Co-authored-by: Yiding Cui <winoros@gmail.com>
This commit is contained in:
parent
ab9b6a8eae
commit
dd377dedaa
2
Makefile
2
Makefile
@ -9,7 +9,7 @@ endif
|
|||||||
|
|
||||||
GO := GO111MODULE=on go
|
GO := GO111MODULE=on go
|
||||||
GOBUILD := $(GO) build $(BUILD_FLAG) -tags codes
|
GOBUILD := $(GO) build $(BUILD_FLAG) -tags codes
|
||||||
GOTEST := $(GO) test
|
GOTEST := $(GO) test -v --count=1 --parallel=1 -p=1
|
||||||
|
|
||||||
TEST_LDFLAGS := ""
|
TEST_LDFLAGS := ""
|
||||||
|
|
||||||
|
@ -85,4 +85,4 @@ In this part, you will implement `KvScan`, `KvCheckTxnStatus`, `KvBatchRollback`
|
|||||||
> - For scanning, you might find it helpful to implement your own scanner (iterator) abstraction which iterates over logical values, rather than the raw values in underlying storage. `kv/transaction/mvcc/scanner.go` is a framework for you.
|
> - For scanning, you might find it helpful to implement your own scanner (iterator) abstraction which iterates over logical values, rather than the raw values in underlying storage. `kv/transaction/mvcc/scanner.go` is a framework for you.
|
||||||
> - When scanning, some errors can be recorded for an individual key and should not cause the whole scan to stop. For other commands, any single key causing an error should cause the whole operation to stop.
|
> - When scanning, some errors can be recorded for an individual key and should not cause the whole scan to stop. For other commands, any single key causing an error should cause the whole operation to stop.
|
||||||
> - Since `KvResolveLock` either commits or rolls back its keys, you should be able to share code with the `KvBatchRollback` and `KvCommit` implementations.
|
> - Since `KvResolveLock` either commits or rolls back its keys, you should be able to share code with the `KvBatchRollback` and `KvCommit` implementations.
|
||||||
> - A timestamp consists of a physical and a logical component. The physical part is roughly a monotonic version of wall-clock time. Usually we use the whole timestamp, for example when comparing timestamps for equality. However, when calculating timeouts, we must only use the physical part of the timestamp. To do this you may find the `PhysicalTime` function in [server.go](/kv/server/server.go) useful.
|
> - A timestamp consists of a physical and a logical component. The physical part is roughly a monotonic version of wall-clock time. Usually we use the whole timestamp, for example when comparing timestamps for equality. However, when calculating timeouts, we must only use the physical part of the timestamp. To do this you may find the `PhysicalTime` function in [transaction.go](/kv/transaction/mvcc/transaction.go) useful.
|
||||||
|
40
go.mod
40
go.mod
@ -3,37 +3,35 @@ module github.com/pingcap-incubator/tinykv
|
|||||||
require (
|
require (
|
||||||
github.com/BurntSushi/toml v0.3.1
|
github.com/BurntSushi/toml v0.3.1
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570
|
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570
|
||||||
github.com/coocood/badger v1.5.1-0.20191220113928-eaffd0ec7a8c // indirect
|
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f
|
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f
|
||||||
github.com/docker/go-units v0.4.0
|
github.com/docker/go-units v0.4.0
|
||||||
github.com/gogo/protobuf v1.2.1
|
github.com/go-ole/go-ole v1.2.4 // indirect
|
||||||
github.com/golang/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.1
|
||||||
|
github.com/golang/protobuf v1.3.4
|
||||||
github.com/google/btree v1.0.0
|
github.com/google/btree v1.0.0
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.12.1 // indirect
|
||||||
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5
|
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5
|
||||||
github.com/juju/loggo v0.0.0-20180524022052-584905176618 // indirect
|
github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef // indirect
|
||||||
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 // indirect
|
|
||||||
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808
|
|
||||||
github.com/opentracing/opentracing-go v1.0.2
|
github.com/opentracing/opentracing-go v1.0.2
|
||||||
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99
|
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99
|
||||||
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8
|
github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712
|
||||||
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9
|
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9
|
||||||
github.com/pingcap/errors v0.11.4
|
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011
|
||||||
github.com/pingcap/kvproto v0.0.0-20190821201150-798d27658fae
|
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd
|
||||||
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596
|
github.com/pingcap/tidb v1.1.0-beta.0.20200309111804-d8264d47f760
|
||||||
github.com/pingcap/parser v0.0.0-20190903084634-0daf3f706c76
|
github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60
|
||||||
github.com/pingcap/tidb v1.1.0-beta.0.20190904060835-0872b65ff1f9
|
|
||||||
github.com/pkg/errors v0.8.1
|
github.com/pkg/errors v0.8.1
|
||||||
github.com/shirou/gopsutil v2.18.10+incompatible
|
github.com/shirou/gopsutil v2.19.10+incompatible
|
||||||
github.com/sirupsen/logrus v1.2.0
|
github.com/sirupsen/logrus v1.2.0
|
||||||
github.com/stretchr/testify v1.3.0
|
github.com/stretchr/testify v1.4.0
|
||||||
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738
|
||||||
go.uber.org/zap v1.9.1
|
go.uber.org/zap v1.14.0
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect
|
google.golang.org/grpc v1.25.1
|
||||||
google.golang.org/grpc v1.17.0
|
|
||||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect
|
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0
|
||||||
gopkg.in/stretchr/testify.v1 v1.2.2 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
|
replace github.com/pingcap/tidb => github.com/pingcap-incubator/tinysql v0.0.0-20200429065743-414e03ef38bd
|
||||||
|
275
go.sum
275
go.sum
@ -3,64 +3,56 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkBy
|
|||||||
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8=
|
||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/Connor1996/badger v1.5.0 h1:GIETn+enyBZZEs6SNXCGZafzf4W9bf83Ec/Rtf7+ExU=
|
|
||||||
github.com/Connor1996/badger v1.5.0/go.mod h1:i5tVv6WOnUfrDvUwyNe70leuRyNIBfTpXX9I8CoxQjQ=
|
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200220043901-cee19f7bcf4f h1:xNCYfucq8ErQ0obR9SirnxbCXtzwQkORy8KhtKuf0/Q=
|
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200220043901-cee19f7bcf4f/go.mod h1:eDy3lZfjgEs4EC8pePI7y/Qx509ylx/S94y/dimtkxc=
|
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200302104252-6a1b02b1cb4c h1:5BlmQypu3/umx1JZw5sE5lv1zdPMRl1NQLUYCvoRgUk=
|
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200302104252-6a1b02b1cb4c/go.mod h1:eDy3lZfjgEs4EC8pePI7y/Qx509ylx/S94y/dimtkxc=
|
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570 h1:fDz4LQTBQynUkcYDLzVQ8nz4HKoRu4zga7/MGXV/e8s=
|
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570 h1:fDz4LQTBQynUkcYDLzVQ8nz4HKoRu4zga7/MGXV/e8s=
|
||||||
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570/go.mod h1:eDy3lZfjgEs4EC8pePI7y/Qx509ylx/S94y/dimtkxc=
|
github.com/Connor1996/badger v1.5.1-0.20200306031920-9bbcbd8ba570/go.mod h1:eDy3lZfjgEs4EC8pePI7y/Qx509ylx/S94y/dimtkxc=
|
||||||
github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
|
github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
|
||||||
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f h1:5ZfJxyXo8KyX8DgGXC5B7ILL8y51fci/qYz2B4j8iLY=
|
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
|
||||||
github.com/StackExchange/wmi v0.0.0-20180725035823-b12b22c5341f/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
|
||||||
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
|
github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
|
||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
|
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 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 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
|
||||||
github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mod h1:VKt7CNAQxpFpSDz3sXyj9hY/GbVsQCr0sB3w59nE7lU=
|
|
||||||
github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc=
|
github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc=
|
||||||
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
|
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
|
github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
|
||||||
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-20171208011716-f6d7a1f6fbf3 h1:T7Bw4H6z3WAZ2khw+gfKdYmbKHyy5xiHtk9IHfZqm7g=
|
|
||||||
github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w=
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y=
|
||||||
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
|
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
|
||||||
github.com/coocood/badger v1.5.1-0.20191220113928-eaffd0ec7a8c h1:3LUmJxDuX+9aSQl0Szun1ZkfARHD/2NOgcRd2ncyOZI=
|
github.com/coocood/badger v1.5.1-0.20191220113928-eaffd0ec7a8c h1:3LUmJxDuX+9aSQl0Szun1ZkfARHD/2NOgcRd2ncyOZI=
|
||||||
github.com/coocood/badger v1.5.1-0.20191220113928-eaffd0ec7a8c/go.mod h1:nWOxoEl8pfb73mZNB38uYvFfNOykho6REd5J6VerzjM=
|
github.com/coocood/badger v1.5.1-0.20191220113928-eaffd0ec7a8c/go.mod h1:nWOxoEl8pfb73mZNB38uYvFfNOykho6REd5J6VerzjM=
|
||||||
github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64 h1:W1SHiII3e0jVwvaQFglwu3kS9NLxOeTpvik7MbKCyuQ=
|
github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64 h1:W1SHiII3e0jVwvaQFglwu3kS9NLxOeTpvik7MbKCyuQ=
|
||||||
github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64/go.mod h1:F86k/6c7aDUdwSUevnLpHS/3Q9hzYCE99jGk2xsHnt0=
|
github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64/go.mod h1:F86k/6c7aDUdwSUevnLpHS/3Q9hzYCE99jGk2xsHnt0=
|
||||||
github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 h1:NnLfQ77q0G4k2Of2c1ceQ0ec6MkLQyDp+IGdVM0D8XM=
|
github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 h1:NnLfQ77q0G4k2Of2c1ceQ0ec6MkLQyDp+IGdVM0D8XM=
|
||||||
github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2/go.mod h1:7qG7YFnOALvsx6tKTNmQot8d7cGFXM9TidzvRFLWYwM=
|
github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2/go.mod h1:7qG7YFnOALvsx6tKTNmQot8d7cGFXM9TidzvRFLWYwM=
|
||||||
github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY=
|
|
||||||
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ=
|
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
|
||||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||||
github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY=
|
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.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||||
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM=
|
||||||
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142 h1:3jFq2xL4ZajGK4aZY8jz+DAF0FHjI51BXjjSwCzS1Dk=
|
|
||||||
github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
|
||||||
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg=
|
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/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
|
||||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||||
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
|
github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
|
||||||
github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso=
|
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/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
|
||||||
github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE=
|
github.com/cznic/parser v0.0.0-20181122101858-d773202d5b1f/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM=
|
||||||
github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
|
github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4=
|
||||||
|
github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
|
||||||
|
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
|
||||||
|
github.com/cznic/y v0.0.0-20181122101901-b05e8c2e8d7b/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
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/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
@ -77,32 +69,35 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn
|
|||||||
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
|
||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||||
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
|
||||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
|
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/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
|
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.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
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 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew=
|
||||||
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
|
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I=
|
||||||
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
|
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
|
||||||
|
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
|
||||||
github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w=
|
github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w=
|
||||||
github.com/go-sql-driver/mysql v0.0.0-20170715192408-3955978caca4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
github.com/go-sql-driver/mysql v0.0.0-20170715192408-3955978caca4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||||
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
|
||||||
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
|
||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
|
||||||
|
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
||||||
|
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
|
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 v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I=
|
||||||
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
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 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
@ -111,36 +106,32 @@ github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg
|
|||||||
github.com/golang/protobuf v1.3.1/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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
|
github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk=
|
||||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
|
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.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
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 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
|
||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE=
|
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/context v0.0.0-20160226214623-1ea25387ff6f/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
|
||||||
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
|
|
||||||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
|
||||||
github.com/gorilla/mux v1.6.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
|
||||||
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk=
|
||||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c h1:Lh2aW+HnU2Nbe1gqD9SOJLJxW1jBMmQOktN2acDyJk8=
|
||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
||||||
github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
|
|
||||||
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.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg=
|
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-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 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.5.1 h1:3scN4iuXkNOyP98jF55Lv8a9j1o/IwvnDIZ0LHJK1nk=
|
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
|
github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
@ -150,22 +141,25 @@ github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0
|
|||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
|
||||||
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
|
||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||||
|
github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=
|
||||||
|
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok=
|
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok=
|
||||||
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
|
github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q=
|
||||||
github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8=
|
github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8=
|
||||||
github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U=
|
||||||
github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY=
|
|
||||||
github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
|
|
||||||
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs=
|
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs=
|
||||||
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA=
|
||||||
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
|
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/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio=
|
|
||||||
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
|
||||||
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
|
github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w=
|
||||||
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
|
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.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
github.com/kr/pty v1.0.0/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
@ -176,22 +170,20 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP
|
|||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
|
||||||
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
|
||||||
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk=
|
|
||||||
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
|
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
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/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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/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 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||||
github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
|
||||||
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s=
|
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808 h1:pmpDGKLw4n82EtrNiLqB+xSz/JQwFOaZuMALYUHwX5s=
|
||||||
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||||
github.com/myesui/uuid v1.0.0 h1:xCBmH4l5KuvLYc5L7AS7SZg9/jKdIFubM7OVoLqaQUI=
|
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||||
github.com/myesui/uuid v1.0.0/go.mod h1:2CDfNgU0LR8mIdO8vdWd8i9gWWxLlcoIGGpSNgafq84=
|
|
||||||
github.com/ncw/directio v1.0.4 h1:CojwI07mCEmRkajgx42Pf8jyCwTs1ji9/Ij9/PJG12k=
|
github.com/ncw/directio v1.0.4 h1:CojwI07mCEmRkajgx42Pf8jyCwTs1ji9/Ij9/PJG12k=
|
||||||
github.com/ncw/directio v1.0.4/go.mod h1:CKGdcN7StAaqjT7Qack3lAXeX4pjnyc46YeqZH1yWVY=
|
github.com/ncw/directio v1.0.4/go.mod h1:CKGdcN7StAaqjT7Qack3lAXeX4pjnyc46YeqZH1yWVY=
|
||||||
github.com/ngaut/log v0.0.0-20180314031856-b8e36e7ba5ac h1:wyheT2lPXRQqYPWY2IVW5BTLrbqCsnhL61zK2R5goLA=
|
github.com/ngaut/log v0.0.0-20180314031856-b8e36e7ba5ac h1:wyheT2lPXRQqYPWY2IVW5BTLrbqCsnhL61zK2R5goLA=
|
||||||
@ -206,42 +198,44 @@ github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
|
|||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||||
github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
|
github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
|
||||||
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo=
|
|
||||||
github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
|
|
||||||
github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg=
|
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/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
|
github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
|
||||||
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 h1:KcEvVBAvyHkUdFAygKAzwB6LAcZ6LS32WHmRD2VyXMI=
|
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 h1:KcEvVBAvyHkUdFAygKAzwB6LAcZ6LS32WHmRD2VyXMI=
|
||||||
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4=
|
github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4=
|
||||||
|
github.com/pingcap-incubator/tinykv v0.0.0-20200320061650-f660f803e910/go.mod h1:YBDZKrKXGtZ8JnIwiiugENs8ykQiMNKOdaTC5lnEGVc=
|
||||||
|
github.com/pingcap-incubator/tinysql v0.0.0-20200429065743-414e03ef38bd h1:mU/oD21p1lvolThE7AW+2s/LJ2YDdMtcmAnO927YoZU=
|
||||||
|
github.com/pingcap-incubator/tinysql v0.0.0-20200429065743-414e03ef38bd/go.mod h1:r381uAExaY7K6lDM0lSpbWtdSbw1eDdLADMO7ZrvWV8=
|
||||||
github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8 h1:USx2/E1bX46VG32FIw034Au6seQ2fY9NEILmNh/UlQg=
|
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-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ=
|
||||||
|
github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
|
||||||
|
github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390=
|
||||||
|
github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc=
|
||||||
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik=
|
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9 h1:KH4f4Si9XK6/IW50HtoaiLIFHGkapOM6w83za47UYik=
|
||||||
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM=
|
github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM=
|
||||||
github.com/pingcap/errors v0.10.1/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
|
||||||
github.com/pingcap/errors v0.11.0 h1:DCJQB8jrHbQ1VVlMFIrbj2ApScNNotVmkSNplu2yUt4=
|
github.com/pingcap/errors v0.11.0 h1:DCJQB8jrHbQ1VVlMFIrbj2ApScNNotVmkSNplu2yUt4=
|
||||||
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
||||||
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||||
github.com/pingcap/failpoint v0.0.0-20190512135322-30cc7431d99c h1:hvQd3aOLKLF7xvRV6DzvPkKY4QXzfVbjU1BhW0d9yL8=
|
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011 h1:58naV4XMEqm0hl9LcYo6cZoGBGiLtefMQMF/vo3XLgQ=
|
||||||
github.com/pingcap/failpoint v0.0.0-20190512135322-30cc7431d99c/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
|
github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||||
|
github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d h1:F8vp38kTAckN+v8Jlc98uMBvKIzr1a+UhnLyVYn8Q5Q=
|
||||||
|
github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI=
|
||||||
github.com/pingcap/goleveldb v0.0.0-20171020122428-b9ff6c35079e h1:P73/4dPCL96rGrobssy1nVy2VaVpNCuLpCbr+FEaTA8=
|
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/goleveldb v0.0.0-20171020122428-b9ff6c35079e/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw=
|
||||||
github.com/pingcap/kvproto v0.0.0-20190516013202-4cf58ad90b6c/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
|
|
||||||
github.com/pingcap/kvproto v0.0.0-20190821201150-798d27658fae h1:WR4d5ga8zXT+QDWYFzzyA+PJMMszR0kQxyYMh6dvHPg=
|
github.com/pingcap/kvproto v0.0.0-20190821201150-798d27658fae h1:WR4d5ga8zXT+QDWYFzzyA+PJMMszR0kQxyYMh6dvHPg=
|
||||||
github.com/pingcap/kvproto v0.0.0-20190821201150-798d27658fae/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
|
github.com/pingcap/kvproto v0.0.0-20190821201150-798d27658fae/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY=
|
||||||
github.com/pingcap/log v0.0.0-20190214045112-b37da76f67a7/go.mod h1:xsfkWVaFVV5B8e1K9seWfyJWFrIhbtUTAD8NV1Pq3+w=
|
|
||||||
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ=
|
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596 h1:t2OQTpPJnrPDGlvA+3FwJptMTt6MEPdzK1Wt99oaefQ=
|
||||||
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw=
|
github.com/pingcap/log v0.0.0-20190307075452-bd41d9273596/go.mod h1:WpHUKhNZ18v116SvGrmjkA9CBhYmuUTKL+p8JC9ANEw=
|
||||||
|
github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
|
||||||
|
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd h1:CV3VsP3Z02MVtdpTMfEgRJ4T9NGgGTxdHpJerent7rM=
|
||||||
|
github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8=
|
||||||
github.com/pingcap/parser v0.0.0-20190903084634-0daf3f706c76 h1:q8d5NIRT/Urmb5woYWhlrMER8nDV33tjyvJMqODI2Rk=
|
github.com/pingcap/parser v0.0.0-20190903084634-0daf3f706c76 h1:q8d5NIRT/Urmb5woYWhlrMER8nDV33tjyvJMqODI2Rk=
|
||||||
github.com/pingcap/parser v0.0.0-20190903084634-0daf3f706c76/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA=
|
github.com/pingcap/parser v0.0.0-20190903084634-0daf3f706c76/go.mod h1:1FNvfp9+J0wvc4kl8eGNh7Rqrxveg15jJoWo/a0uHwA=
|
||||||
github.com/pingcap/pd v0.0.0-20190712044914-75a1f9f3062b/go.mod h1:3DlDlFT7EF64A1bmb/tulZb6wbPSagm5G4p1AlhaEDs=
|
github.com/pingcap/tipb v0.0.0-20191209145133-44f75c9bef33/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
|
||||||
github.com/pingcap/tidb v1.1.0-beta.0.20190904060835-0872b65ff1f9 h1:Fg4wHf1wd50v0RR+GPIIGrcnCVI/LSXKUYoB5ON1t6k=
|
github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60 h1:aJPXrT1u4VfUSGFA2oQVwl4pOXzqe+YI6wed01cjDH4=
|
||||||
github.com/pingcap/tidb v1.1.0-beta.0.20190904060835-0872b65ff1f9/go.mod h1:vLe4ZQRrNZ98B0W6BMZJ2MFlGuLNhMO0gYLL7o7QHiE=
|
github.com/pingcap/tipb v0.0.0-20200212061130-c4d518eb1d60/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
|
||||||
github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible h1:MkWCxgZpJBgY2f4HtwWMMFzSBb3+JPzeJgF3VrXE/bU=
|
|
||||||
github.com/pingcap/tidb-tools v2.1.3-0.20190321065848-1e8b48f5c168+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM=
|
|
||||||
github.com/pingcap/tipb v0.0.0-20190806070524-16909e03435e h1:H7meq8QPmWGImOkHTQYAWw82zwIqndJaCDPVUknOHbM=
|
|
||||||
github.com/pingcap/tipb v0.0.0-20190806070524-16909e03435e/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI=
|
|
||||||
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
@ -251,24 +245,36 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.0 h1:tXuTFVHC03mW0D+Ua1Q2d1EAVqLTuggX50V0VLICCzY=
|
github.com/prometheus/client_golang v0.9.0 h1:tXuTFVHC03mW0D+Ua1Q2d1EAVqLTuggX50V0VLICCzY=
|
||||||
github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
|
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
|
||||||
|
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||||
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||||
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
|
||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8=
|
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-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/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20180518154759-7600349dcfe1/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4=
|
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39 h1:Cto4X6SVMWRPBkJ/3YHn1iDGDGc/Z+sW+AEMKHMVvN4=
|
||||||
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||||
|
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
|
||||||
|
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||||
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20180612222113-7d6f385de8be/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d h1:GoAlyOgbOEIFdaDqxJVlbOQ1DtGmZWs/Qau0hIlk+WQ=
|
||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7 h1:FUL3b97ZY2EPqg2NbXKuMHs5pXJB9hjj1fDHnF2vl28=
|
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
|
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237 h1:HQagqIiBmr8YXawX/le3+O26N+vPPC1PtjaF3mwnook=
|
||||||
|
github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/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.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||||
github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||||
github.com/shirou/gopsutil v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs=
|
github.com/shirou/gopsutil v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs=
|
||||||
github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
github.com/shirou/gopsutil v2.18.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||||
github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
|
github.com/shirou/gopsutil v2.19.10+incompatible h1:lA4Pi29JEVIQIgATSeftHSY0rMGI9CLrl2ZvDLiahto=
|
||||||
github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
|
github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
|
||||||
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
|
||||||
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
@ -295,33 +301,17 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
|
|||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/struCoder/pidusage v0.1.2/go.mod h1:pWBlW3YuSwRl6h7R5KbvA4N8oOqe9LjaKW5CwT1SPjI=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d h1:4J9HCZVpvDmj2tiKGSTUnb3Ok/9CEQb9oqu9LHKQQpc=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE=
|
||||||
github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6 h1:lYIiVDtZnyTWlNwiAxLj0bbpTcx1BWCFhXjfsvmPdNc=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
|
||||||
github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk=
|
|
||||||
github.com/twinj/uuid v1.0.0/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY=
|
|
||||||
github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo=
|
|
||||||
github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
|
|
||||||
github.com/uber/jaeger-client-go v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1C1PjvOJnJykCzcD5QHbk=
|
|
||||||
github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
|
|
||||||
github.com/uber/jaeger-lib v1.5.0 h1:OHbgr8l656Ub3Fw5k9SWnBfIEwvoHQ+W2y+Aa9D1Uyo=
|
|
||||||
github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
|
|
||||||
github.com/ugorji/go v1.1.2 h1:JON3E2/GPW2iDNGoSAusl1KDf5TRQ8k8q7Tp097pZGs=
|
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 v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
|
||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648=
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648=
|
||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
github.com/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43 h1:BasDe+IErOQKrMVXab7UayvSlIpiyGwRvuX3EKYY7UA=
|
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/ugorji/go/codec v0.0.0-20190204201341-e444a5086c43/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA=
|
||||||
github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
|
|
||||||
github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d h1:ggUgChAeyge4NZ4QUw6lhHsVymzwSDJOZcE0s2X8S20=
|
|
||||||
github.com/unrolled/render v0.0.0-20180914162206-b9786414de4d/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg=
|
|
||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||||
github.com/urfave/negroni v0.3.0 h1:PaXOb61mWeZJxc1Ji2xJjpVg9QfPo0rrB+lHyBxGNSU=
|
|
||||||
github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
|
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
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/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/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||||
@ -331,41 +321,81 @@ go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
|
|||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
|
||||||
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf h1:rmttwKPEgG/l4UscTDYtaJgeUsedKPKSyFfNQLI6q+I=
|
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf h1:rmttwKPEgG/l4UscTDYtaJgeUsedKPKSyFfNQLI6q+I=
|
||||||
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw=
|
go.etcd.io/etcd v0.0.0-20190320044326-77d4b742cdbf/go.mod h1:KSGwdbiFchh5KIC9My2+ZVl5/3ANcwohw50dpPwa2cw=
|
||||||
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 h1:lWF4f9Nypl1ZqSb4gLeh/DGvBYVaUYHuiB93teOmwgc=
|
||||||
|
go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
|
||||||
go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4=
|
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.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||||
|
go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY=
|
||||||
|
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||||
|
go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU=
|
||||||
go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI=
|
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.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 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E=
|
||||||
|
go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
|
||||||
|
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
|
||||||
|
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 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o=
|
||||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
|
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.14.0 h1:/pduUoebOeeJzTDFuoMgC6nRkiasr1sBCIEorly7m4o=
|
||||||
|
go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
|
||||||
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g=
|
||||||
|
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/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/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
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-20180826012351-8a410e7b638d/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-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-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=
|
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
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-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs=
|
||||||
|
golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-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-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-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-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190109145017-48ac38b7c8cb/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
|
||||||
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
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 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/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/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
@ -374,22 +404,41 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb
|
|||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52 h1:JG/0uqcGdTNgq7FdU+61l5Pdmb8putNZlXb65bJBROs=
|
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52 h1:JG/0uqcGdTNgq7FdU+61l5Pdmb8putNZlXb65bJBROs=
|
||||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0 h1:iRpjPej1fPzmfoBhMFkp3HdqzF+ytPmAwiQhJGV0zGw=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190130214255-bb1329dc71a0/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-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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
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 h1:akkRBeitX2EZP59KdtKw310CI4WGPCNPyrLbE7WZA8Y=
|
||||||
|
golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
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/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
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-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275 h1:9oFlwfEGIvmxXTcY53ygNyxIQtWciRHjrnUvZJCYXYU=
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
|
google.golang.org/genproto v0.0.0-20190905072037-92dd089d5514/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo=
|
||||||
|
google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
|
||||||
google.golang.org/grpc v1.16.0 h1:dz5IJGuC2BB7qXR5AyHNwAUBhZscK2xVez7mznh72sY=
|
|
||||||
google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
|
|
||||||
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
|
google.golang.org/grpc v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk=
|
||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
|
||||||
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
|
google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
|
||||||
|
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=
|
||||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
|
||||||
gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo=
|
gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo=
|
||||||
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||||
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
|
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||||
@ -397,6 +446,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw=
|
||||||
|
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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
|
||||||
@ -404,14 +454,21 @@ gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY
|
|||||||
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
|
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/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M=
|
gopkg.in/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M=
|
||||||
gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU=
|
gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
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.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
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.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 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 h1:VO9oZbbkvTwqLimlQt15QNdOOBArT2dw/bvzsMZBiqQ=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k=
|
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=
|
||||||
|
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
|
||||||
|
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||||
|
@ -83,7 +83,7 @@ func NewDefaultConfig() *Config {
|
|||||||
|
|
||||||
func NewTestConfig() *Config {
|
func NewTestConfig() *Config {
|
||||||
return &Config{
|
return &Config{
|
||||||
LogLevel: "info",
|
LogLevel: "fatal",
|
||||||
Raft: true,
|
Raft: true,
|
||||||
RaftBaseTickInterval: 50 * time.Millisecond,
|
RaftBaseTickInterval: 50 * time.Millisecond,
|
||||||
RaftHeartbeatTicks: 2,
|
RaftHeartbeatTicks: 2,
|
||||||
|
318
kv/coprocessor/analyze.go
Normal file
318
kv/coprocessor/analyze.go
Normal file
@ -0,0 +1,318 @@
|
|||||||
|
// Copyright 2019-present 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 2019-present 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.
|
||||||
|
|
||||||
|
package coprocessor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Connor1996/badger/y"
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
"github.com/juju/errors"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/storage"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/transaction/mvcc"
|
||||||
|
"github.com/pingcap-incubator/tinykv/proto/pkg/coprocessor"
|
||||||
|
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/coprocessor/rowcodec"
|
||||||
|
"github.com/pingcap/tidb/kv"
|
||||||
|
"github.com/pingcap/tidb/parser/ast"
|
||||||
|
"github.com/pingcap/tidb/parser/charset"
|
||||||
|
"github.com/pingcap/tidb/parser/model"
|
||||||
|
"github.com/pingcap/tidb/parser/mysql"
|
||||||
|
"github.com/pingcap/tidb/statistics"
|
||||||
|
"github.com/pingcap/tidb/tablecodec"
|
||||||
|
"github.com/pingcap/tidb/types"
|
||||||
|
"github.com/pingcap/tidb/util/chunk"
|
||||||
|
"github.com/pingcap/tidb/util/codec"
|
||||||
|
"github.com/pingcap/tipb/go-tipb"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (svr *CopHandler) HandleCopAnalyzeRequest(reader storage.StorageReader, req *coprocessor.Request) *coprocessor.Response {
|
||||||
|
resp := &coprocessor.Response{}
|
||||||
|
if len(req.Ranges) == 0 {
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
if req.GetTp() != kv.ReqTypeAnalyze {
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
analyzeReq := new(tipb.AnalyzeReq)
|
||||||
|
err := proto.Unmarshal(req.Data, analyzeReq)
|
||||||
|
if err != nil {
|
||||||
|
resp.OtherError = err.Error()
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
ranges, err := svr.extractKVRanges(reader, req.Ranges, false)
|
||||||
|
if err != nil {
|
||||||
|
resp.OtherError = err.Error()
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
y.Assert(len(ranges) == 1)
|
||||||
|
if analyzeReq.Tp == tipb.AnalyzeType_TypeIndex {
|
||||||
|
resp, err = svr.handleAnalyzeIndexReq(reader, ranges[0], analyzeReq, req.StartTs)
|
||||||
|
} else {
|
||||||
|
resp, err = svr.handleAnalyzeColumnsReq(reader, ranges[0], analyzeReq, req.StartTs)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
resp = &coprocessor.Response{
|
||||||
|
OtherError: err.Error(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) handleAnalyzeIndexReq(reader storage.StorageReader, ran kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) {
|
||||||
|
processor := &analyzeIndexProcessor{
|
||||||
|
colLen: int(analyzeReq.IdxReq.NumColumns),
|
||||||
|
statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob)),
|
||||||
|
}
|
||||||
|
if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil {
|
||||||
|
processor.cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth)
|
||||||
|
}
|
||||||
|
|
||||||
|
txn := mvcc.MvccTxn{Reader: reader, StartTS: startTS}
|
||||||
|
scanner := mvcc.NewScanner(ran.StartKey, &txn)
|
||||||
|
defer scanner.Close()
|
||||||
|
for {
|
||||||
|
key, val, err := scanner.Next()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if key == nil && val == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if bytes.Compare(key, ran.EndKey) >= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
err = processor.Process(key, val)
|
||||||
|
if err != nil {
|
||||||
|
if err == ScanBreak {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hg := statistics.HistogramToProto(processor.statsBuilder.Hist())
|
||||||
|
var cm *tipb.CMSketch
|
||||||
|
if processor.cms != nil {
|
||||||
|
cm = statistics.CMSketchToProto(processor.cms)
|
||||||
|
}
|
||||||
|
data, err := proto.Marshal(&tipb.AnalyzeIndexResp{Hist: hg, Cms: cm})
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
return &coprocessor.Response{Data: data}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type analyzeIndexProcessor struct {
|
||||||
|
skipVal
|
||||||
|
|
||||||
|
colLen int
|
||||||
|
statsBuilder *statistics.SortedBuilder
|
||||||
|
cms *statistics.CMSketch
|
||||||
|
rowBuf []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *analyzeIndexProcessor) Process(key, value []byte) error {
|
||||||
|
values, _, err := tablecodec.CutIndexKeyNew(key, p.colLen)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
p.rowBuf = p.rowBuf[:0]
|
||||||
|
for _, val := range values {
|
||||||
|
p.rowBuf = append(p.rowBuf, val...)
|
||||||
|
}
|
||||||
|
rowData := append([]byte{}, p.rowBuf...)
|
||||||
|
err = p.statsBuilder.Iterate(types.NewBytesDatum(rowData))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if p.cms != nil {
|
||||||
|
p.cms.InsertBytes(rowData)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type analyzeColumnsExec struct {
|
||||||
|
skipVal
|
||||||
|
reader storage.StorageReader
|
||||||
|
seekKey []byte
|
||||||
|
endKey []byte
|
||||||
|
startTS uint64
|
||||||
|
|
||||||
|
chk *chunk.Chunk
|
||||||
|
decoder *rowcodec.Decoder
|
||||||
|
req *chunk.Chunk
|
||||||
|
evalCtx *evalContext
|
||||||
|
fields []*ast.ResultField
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) handleAnalyzeColumnsReq(reader storage.StorageReader, ran kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) {
|
||||||
|
sc := flagsToStatementContext(analyzeReq.Flags)
|
||||||
|
sc.TimeZone = time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset))
|
||||||
|
evalCtx := &evalContext{sc: sc}
|
||||||
|
columns := analyzeReq.ColReq.ColumnsInfo
|
||||||
|
evalCtx.setColumnInfo(columns)
|
||||||
|
decoder, err := evalCtx.newRowDecoder()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
e := &analyzeColumnsExec{
|
||||||
|
reader: reader,
|
||||||
|
seekKey: ran.StartKey,
|
||||||
|
endKey: ran.EndKey,
|
||||||
|
startTS: startTS,
|
||||||
|
chk: chunk.NewChunkWithCapacity(evalCtx.fieldTps, 1),
|
||||||
|
decoder: decoder,
|
||||||
|
evalCtx: evalCtx,
|
||||||
|
}
|
||||||
|
e.fields = make([]*ast.ResultField, len(columns))
|
||||||
|
for i := range e.fields {
|
||||||
|
rf := new(ast.ResultField)
|
||||||
|
rf.Column = new(model.ColumnInfo)
|
||||||
|
rf.Column.FieldType = types.FieldType{Tp: mysql.TypeBlob, Flen: mysql.MaxBlobWidth, Charset: charset.CharsetUTF8, Collate: charset.CollationUTF8}
|
||||||
|
e.fields[i] = rf
|
||||||
|
}
|
||||||
|
|
||||||
|
pkID := int64(-1)
|
||||||
|
numCols := len(columns)
|
||||||
|
if columns[0].GetPkHandle() {
|
||||||
|
pkID = columns[0].ColumnId
|
||||||
|
numCols--
|
||||||
|
}
|
||||||
|
colReq := analyzeReq.ColReq
|
||||||
|
builder := statistics.SampleBuilder{
|
||||||
|
Sc: sc,
|
||||||
|
RecordSet: e,
|
||||||
|
ColLen: numCols,
|
||||||
|
MaxBucketSize: colReq.BucketSize,
|
||||||
|
MaxFMSketchSize: colReq.SketchSize,
|
||||||
|
MaxSampleSize: colReq.SampleSize,
|
||||||
|
}
|
||||||
|
if pkID != -1 {
|
||||||
|
builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob))
|
||||||
|
}
|
||||||
|
if colReq.CmsketchWidth != nil && colReq.CmsketchDepth != nil {
|
||||||
|
builder.CMSketchWidth = *colReq.CmsketchWidth
|
||||||
|
builder.CMSketchDepth = *colReq.CmsketchDepth
|
||||||
|
}
|
||||||
|
collectors, pkBuilder, err := builder.CollectColumnStats()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
colResp := &tipb.AnalyzeColumnsResp{}
|
||||||
|
if pkID != -1 {
|
||||||
|
colResp.PkHist = statistics.HistogramToProto(pkBuilder.Hist())
|
||||||
|
}
|
||||||
|
for _, c := range collectors {
|
||||||
|
colResp.Collectors = append(colResp.Collectors, statistics.SampleCollectorToProto(c))
|
||||||
|
}
|
||||||
|
data, err := proto.Marshal(colResp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
return &coprocessor.Response{Data: data}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fields implements the sqlexec.RecordSet Fields interface.
|
||||||
|
func (e *analyzeColumnsExec) Fields() []*ast.ResultField {
|
||||||
|
return e.fields
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *analyzeColumnsExec) Next(ctx context.Context, req *chunk.Chunk) error {
|
||||||
|
req.Reset()
|
||||||
|
e.req = req
|
||||||
|
processor := e
|
||||||
|
txn := mvcc.MvccTxn{Reader: e.reader, StartTS: e.startTS}
|
||||||
|
scanner := mvcc.NewScanner(e.seekKey, &txn)
|
||||||
|
defer scanner.Close()
|
||||||
|
for {
|
||||||
|
key, val, err := scanner.Next()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if key == nil && val == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if bytes.Compare(key, e.endKey) >= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
err = processor.Process(key, val)
|
||||||
|
if err != nil {
|
||||||
|
if err == ScanBreak {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.NumRows() < req.Capacity() {
|
||||||
|
e.seekKey = e.endKey
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *analyzeColumnsExec) Process(key, value []byte) error {
|
||||||
|
handle, err := tablecodec.DecodeRowKey(key)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
err = e.decoder.Decode(value, handle, e.chk)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
row := e.chk.GetRow(0)
|
||||||
|
for i, tp := range e.evalCtx.fieldTps {
|
||||||
|
d := row.GetDatum(i, tp)
|
||||||
|
value, err := codec.EncodeValue(e.evalCtx.sc, nil, d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
e.req.AppendBytes(i, value)
|
||||||
|
}
|
||||||
|
e.chk.Reset()
|
||||||
|
if e.req.NumRows() == e.req.Capacity() {
|
||||||
|
e.seekKey = kv.Key(key).PrefixNext()
|
||||||
|
return ScanBreak
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *analyzeColumnsExec) NewChunk() *chunk.Chunk {
|
||||||
|
fields := make([]*types.FieldType, 0, len(e.fields))
|
||||||
|
for _, field := range e.fields {
|
||||||
|
fields = append(fields, &field.Column.FieldType)
|
||||||
|
}
|
||||||
|
return chunk.NewChunkWithCapacity(fields, 1024)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close implements the sqlexec.RecordSet Close interface.
|
||||||
|
func (e *analyzeColumnsExec) Close() error {
|
||||||
|
return nil
|
||||||
|
}
|
739
kv/coprocessor/closure_exec.go
Normal file
739
kv/coprocessor/closure_exec.go
Normal file
@ -0,0 +1,739 @@
|
|||||||
|
package coprocessor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/juju/errors"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/coprocessor/rowcodec"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/storage"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/transaction/mvcc"
|
||||||
|
"github.com/pingcap/tidb/expression"
|
||||||
|
"github.com/pingcap/tidb/expression/aggregation"
|
||||||
|
"github.com/pingcap/tidb/kv"
|
||||||
|
"github.com/pingcap/tidb/parser/model"
|
||||||
|
"github.com/pingcap/tidb/parser/mysql"
|
||||||
|
"github.com/pingcap/tidb/sessionctx"
|
||||||
|
"github.com/pingcap/tidb/sessionctx/stmtctx"
|
||||||
|
"github.com/pingcap/tidb/tablecodec"
|
||||||
|
"github.com/pingcap/tidb/types"
|
||||||
|
"github.com/pingcap/tidb/util/chunk"
|
||||||
|
"github.com/pingcap/tidb/util/codec"
|
||||||
|
mockpkg "github.com/pingcap/tidb/util/mock"
|
||||||
|
"github.com/pingcap/tipb/go-tipb"
|
||||||
|
)
|
||||||
|
|
||||||
|
const chunkMaxRows = 1024
|
||||||
|
|
||||||
|
const (
|
||||||
|
pkColNotExists = iota
|
||||||
|
pkColIsSigned
|
||||||
|
pkColIsUnsigned
|
||||||
|
)
|
||||||
|
|
||||||
|
// buildClosureExecutor build a closureExecutor for the DAGRequest.
|
||||||
|
// Currently the composition of executors are:
|
||||||
|
// tableScan|indexScan [selection] [topN | limit | agg]
|
||||||
|
func (svr *CopHandler) buildClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closureExecutor, error) {
|
||||||
|
ce, err := svr.newClosureExecutor(dagCtx, dagReq)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
executors := dagReq.Executors
|
||||||
|
scanExec := executors[0]
|
||||||
|
if scanExec.Tp == tipb.ExecType_TypeTableScan {
|
||||||
|
ce.processor = &tableScanProcessor{closureExecutor: ce}
|
||||||
|
} else {
|
||||||
|
ce.processor = &indexScanProcessor{closureExecutor: ce}
|
||||||
|
}
|
||||||
|
if len(executors) == 1 {
|
||||||
|
return ce, nil
|
||||||
|
}
|
||||||
|
if secondExec := executors[1]; secondExec.Tp == tipb.ExecType_TypeSelection {
|
||||||
|
ce.selectionCtx.conditions, err = convertToExprs(ce.sc, ce.fieldTps, secondExec.Selection.Conditions)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
ce.processor = &selectionProcessor{closureExecutor: ce}
|
||||||
|
}
|
||||||
|
lastExecutor := executors[len(executors)-1]
|
||||||
|
switch lastExecutor.Tp {
|
||||||
|
case tipb.ExecType_TypeLimit:
|
||||||
|
ce.limit = int(lastExecutor.Limit.Limit)
|
||||||
|
case tipb.ExecType_TypeTopN:
|
||||||
|
err = svr.buildTopNProcessor(ce, lastExecutor.TopN)
|
||||||
|
case tipb.ExecType_TypeAggregation:
|
||||||
|
err = svr.buildHashAggProcessor(ce, dagCtx, lastExecutor.Aggregation)
|
||||||
|
case tipb.ExecType_TypeStreamAgg:
|
||||||
|
err = svr.buildStreamAggProcessor(ce, dagCtx, executors)
|
||||||
|
case tipb.ExecType_TypeSelection:
|
||||||
|
ce.processor = &selectionProcessor{closureExecutor: ce}
|
||||||
|
default:
|
||||||
|
panic("unknown executor type " + lastExecutor.Tp.String())
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ce, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertToExprs(sc *stmtctx.StatementContext, fieldTps []*types.FieldType, pbExprs []*tipb.Expr) ([]expression.Expression, error) {
|
||||||
|
exprs := make([]expression.Expression, 0, len(pbExprs))
|
||||||
|
for _, expr := range pbExprs {
|
||||||
|
e, err := expression.PBToExpr(expr, fieldTps, sc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
exprs = append(exprs, e)
|
||||||
|
}
|
||||||
|
return exprs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) newClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closureExecutor, error) {
|
||||||
|
e := &closureExecutor{
|
||||||
|
evalContext: dagCtx.evalCtx,
|
||||||
|
reader: dagCtx.reader,
|
||||||
|
outputOff: dagReq.OutputOffsets,
|
||||||
|
startTS: dagCtx.startTS,
|
||||||
|
limit: math.MaxInt64,
|
||||||
|
}
|
||||||
|
seCtx := mockpkg.NewContext()
|
||||||
|
seCtx.GetSessionVars().StmtCtx = e.sc
|
||||||
|
e.seCtx = seCtx
|
||||||
|
executors := dagReq.Executors
|
||||||
|
scanExec := executors[0]
|
||||||
|
switch scanExec.Tp {
|
||||||
|
case tipb.ExecType_TypeTableScan:
|
||||||
|
tblScan := executors[0].TblScan
|
||||||
|
e.unique = true
|
||||||
|
e.scanCtx.desc = tblScan.Desc
|
||||||
|
case tipb.ExecType_TypeIndexScan:
|
||||||
|
idxScan := executors[0].IdxScan
|
||||||
|
e.unique = idxScan.GetUnique()
|
||||||
|
e.scanCtx.desc = idxScan.Desc
|
||||||
|
e.initIdxScanCtx()
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unknown first executor type %s", executors[0].Tp))
|
||||||
|
}
|
||||||
|
ranges, err := svr.extractKVRanges(dagCtx.reader, dagCtx.keyRanges, e.scanCtx.desc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
e.kvRanges = ranges
|
||||||
|
e.scanCtx.chk = chunk.NewChunkWithCapacity(e.fieldTps, 32)
|
||||||
|
if e.idxScanCtx == nil {
|
||||||
|
e.scanCtx.decoder, err = e.evalContext.newRowDecoder()
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return e, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) initIdxScanCtx() {
|
||||||
|
e.idxScanCtx = new(idxScanCtx)
|
||||||
|
e.idxScanCtx.columnLen = len(e.columnInfos)
|
||||||
|
e.idxScanCtx.pkStatus = pkColNotExists
|
||||||
|
lastColumn := e.columnInfos[len(e.columnInfos)-1]
|
||||||
|
// The PKHandle column info has been collected in ctx.
|
||||||
|
if lastColumn.GetPkHandle() {
|
||||||
|
if mysql.HasUnsignedFlag(uint(lastColumn.GetFlag())) {
|
||||||
|
e.idxScanCtx.pkStatus = pkColIsUnsigned
|
||||||
|
} else {
|
||||||
|
e.idxScanCtx.pkStatus = pkColIsSigned
|
||||||
|
}
|
||||||
|
e.idxScanCtx.columnLen--
|
||||||
|
} else if lastColumn.ColumnId == model.ExtraHandleID {
|
||||||
|
e.idxScanCtx.pkStatus = pkColIsSigned
|
||||||
|
e.idxScanCtx.columnLen--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) isCountAgg(pbAgg *tipb.Aggregation) bool {
|
||||||
|
if len(pbAgg.AggFunc) == 1 && len(pbAgg.GroupBy) == 0 {
|
||||||
|
aggFunc := pbAgg.AggFunc[0]
|
||||||
|
if aggFunc.Tp == tipb.ExprType_Count && len(aggFunc.Children) == 1 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) tryBuildCountProcessor(e *closureExecutor, executors []*tipb.Executor) (bool, error) {
|
||||||
|
if len(executors) > 2 {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
agg := executors[1].Aggregation
|
||||||
|
if !svr.isCountAgg(agg) {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
child := agg.AggFunc[0].Children[0]
|
||||||
|
switch child.Tp {
|
||||||
|
case tipb.ExprType_ColumnRef:
|
||||||
|
_, idx, err := codec.DecodeInt(child.Val)
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.Trace(err)
|
||||||
|
}
|
||||||
|
e.aggCtx.col = e.columnInfos[idx]
|
||||||
|
if e.aggCtx.col.PkHandle {
|
||||||
|
e.processor = &countStarProcessor{skipVal: skipVal(true), closureExecutor: e}
|
||||||
|
} else {
|
||||||
|
e.processor = &countColumnProcessor{closureExecutor: e}
|
||||||
|
}
|
||||||
|
case tipb.ExprType_Null, tipb.ExprType_ScalarFunc:
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
e.processor = &countStarProcessor{skipVal: skipVal(true), closureExecutor: e}
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) buildTopNProcessor(e *closureExecutor, topN *tipb.TopN) error {
|
||||||
|
heap, conds, err := svr.getTopNInfo(e.evalContext, topN)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := &topNCtx{
|
||||||
|
heap: heap,
|
||||||
|
orderByExprs: conds,
|
||||||
|
sortRow: e.newTopNSortRow(),
|
||||||
|
}
|
||||||
|
|
||||||
|
e.topNCtx = ctx
|
||||||
|
e.processor = &topNProcessor{closureExecutor: e}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) buildHashAggProcessor(e *closureExecutor, ctx *dagContext, agg *tipb.Aggregation) error {
|
||||||
|
aggs, groupBys, err := svr.getAggInfo(ctx, agg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
e.processor = &hashAggProcessor{
|
||||||
|
closureExecutor: e,
|
||||||
|
aggExprs: aggs,
|
||||||
|
groupByExprs: groupBys,
|
||||||
|
groups: map[string]struct{}{},
|
||||||
|
groupKeys: nil,
|
||||||
|
aggCtxsMap: map[string][]*aggregation.AggEvaluateContext{},
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) buildStreamAggProcessor(e *closureExecutor, ctx *dagContext, executors []*tipb.Executor) error {
|
||||||
|
ok, err := svr.tryBuildCountProcessor(e, executors)
|
||||||
|
if err != nil || ok {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return svr.buildHashAggProcessor(e, ctx, executors[len(executors)-1].Aggregation)
|
||||||
|
}
|
||||||
|
|
||||||
|
// closureExecutor is an execution engine that flatten the DAGRequest.Executors to a single closure `processor` that
|
||||||
|
// process key/value pairs. We can define many closures for different kinds of requests, try to use the specially
|
||||||
|
// optimized one for some frequently used query.
|
||||||
|
type closureExecutor struct {
|
||||||
|
*evalContext
|
||||||
|
|
||||||
|
reader storage.StorageReader
|
||||||
|
outputOff []uint32
|
||||||
|
seCtx sessionctx.Context
|
||||||
|
kvRanges []kv.KeyRange
|
||||||
|
startTS uint64
|
||||||
|
ignoreLock bool
|
||||||
|
lockChecked bool
|
||||||
|
scanCtx scanCtx
|
||||||
|
idxScanCtx *idxScanCtx
|
||||||
|
selectionCtx selectionCtx
|
||||||
|
aggCtx aggCtx
|
||||||
|
topNCtx *topNCtx
|
||||||
|
|
||||||
|
rowCount int
|
||||||
|
unique bool
|
||||||
|
limit int
|
||||||
|
|
||||||
|
oldChunks []tipb.Chunk
|
||||||
|
oldRowBuf []byte
|
||||||
|
processor closureProcessor
|
||||||
|
}
|
||||||
|
|
||||||
|
type closureProcessor interface {
|
||||||
|
// Process accepts key and value, should not keep reference to them.
|
||||||
|
// Returns ScanBreak will break the scan loop.
|
||||||
|
Process(key, value []byte) error
|
||||||
|
// SkipValue returns if we can skip the value.
|
||||||
|
SkipValue() bool
|
||||||
|
Finish() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type scanCtx struct {
|
||||||
|
count int
|
||||||
|
limit int
|
||||||
|
chk *chunk.Chunk
|
||||||
|
desc bool
|
||||||
|
decoder *rowcodec.Decoder
|
||||||
|
}
|
||||||
|
|
||||||
|
type idxScanCtx struct {
|
||||||
|
pkStatus int
|
||||||
|
columnLen int
|
||||||
|
}
|
||||||
|
|
||||||
|
type aggCtx struct {
|
||||||
|
col *tipb.ColumnInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
type selectionCtx struct {
|
||||||
|
conditions []expression.Expression
|
||||||
|
}
|
||||||
|
|
||||||
|
type topNCtx struct {
|
||||||
|
heap *topNHeap
|
||||||
|
orderByExprs []expression.Expression
|
||||||
|
sortRow *sortRow
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) execute() ([]tipb.Chunk, error) {
|
||||||
|
txn := mvcc.MvccTxn{Reader: e.reader, StartTS: e.startTS}
|
||||||
|
for _, ran := range e.kvRanges {
|
||||||
|
if e.unique && ran.IsPoint() {
|
||||||
|
val, err := txn.GetValue(ran.StartKey)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
if len(val) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
err = e.processor.Process(ran.StartKey, val)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if e.scanCtx.desc {
|
||||||
|
panic("do not support desc scan")
|
||||||
|
} else {
|
||||||
|
scanner := mvcc.NewScanner(ran.StartKey, &txn)
|
||||||
|
for {
|
||||||
|
key, val, err := scanner.Next()
|
||||||
|
if err != nil {
|
||||||
|
scanner.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if key == nil && val == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if bytes.Compare(key, ran.EndKey) >= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
err = e.processor.Process(key, val)
|
||||||
|
if err != nil {
|
||||||
|
if err == ScanBreak {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
scanner.Close()
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
scanner.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if e.rowCount == e.limit {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err := e.processor.Finish()
|
||||||
|
return e.oldChunks, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type countStarProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
// countStarProcess is used for `count(*)`.
|
||||||
|
func (e *countStarProcessor) Process(key, value []byte) error {
|
||||||
|
e.rowCount++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *countStarProcessor) Finish() error {
|
||||||
|
return e.countFinish()
|
||||||
|
}
|
||||||
|
|
||||||
|
// countFinish is used for `count(*)`.
|
||||||
|
func (e *closureExecutor) countFinish() error {
|
||||||
|
d := types.NewIntDatum(int64(e.rowCount))
|
||||||
|
rowData, err := codec.EncodeValue(e.sc, nil, d)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
e.oldChunks = appendRow(e.oldChunks, rowData, 0)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type countColumnProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *countColumnProcessor) Process(key, value []byte) error {
|
||||||
|
if e.idxScanCtx != nil {
|
||||||
|
values, _, err := tablecodec.CutIndexKeyNew(key, e.idxScanCtx.columnLen)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
if values[0][0] != codec.NilFlag {
|
||||||
|
e.rowCount++
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Since the handle value doesn't affect the count result, we don't need to decode the handle.
|
||||||
|
isNull, err := e.scanCtx.decoder.ColumnIsNull(value, e.aggCtx.col.ColumnId, e.aggCtx.col.DefaultVal)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
if !isNull {
|
||||||
|
e.rowCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *countColumnProcessor) Finish() error {
|
||||||
|
return e.countFinish()
|
||||||
|
}
|
||||||
|
|
||||||
|
type skipVal bool
|
||||||
|
|
||||||
|
func (s skipVal) SkipValue() bool {
|
||||||
|
return bool(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ScanBreak is returnd by ScanFunc to break the scan loop.
|
||||||
|
var ScanBreak = errors.New("scan break")
|
||||||
|
|
||||||
|
type tableScanProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *tableScanProcessor) Process(key, value []byte) error {
|
||||||
|
if e.rowCount == e.limit {
|
||||||
|
return ScanBreak
|
||||||
|
}
|
||||||
|
e.rowCount++
|
||||||
|
err := e.tableScanProcessCore(key, value)
|
||||||
|
if e.scanCtx.chk.NumRows() == chunkMaxRows {
|
||||||
|
err = e.chunkToOldChunk(e.scanCtx.chk)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *tableScanProcessor) Finish() error {
|
||||||
|
return e.scanFinish()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) processCore(key, value []byte) error {
|
||||||
|
if e.idxScanCtx != nil {
|
||||||
|
return e.indexScanProcessCore(key, value)
|
||||||
|
} else {
|
||||||
|
return e.tableScanProcessCore(key, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) hasSelection() bool {
|
||||||
|
return len(e.selectionCtx.conditions) > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) processSelection() (gotRow bool, err error) {
|
||||||
|
chk := e.scanCtx.chk
|
||||||
|
row := chk.GetRow(chk.NumRows() - 1)
|
||||||
|
gotRow = true
|
||||||
|
for _, expr := range e.selectionCtx.conditions {
|
||||||
|
d, err := expr.Eval(row)
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.Trace(err)
|
||||||
|
}
|
||||||
|
if d.IsNull() {
|
||||||
|
gotRow = false
|
||||||
|
} else {
|
||||||
|
i, err := d.ToBool(e.sc)
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.Trace(err)
|
||||||
|
}
|
||||||
|
gotRow = i != 0
|
||||||
|
}
|
||||||
|
if !gotRow {
|
||||||
|
chk.TruncateTo(chk.NumRows() - 1)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) tableScanProcessCore(key, value []byte) error {
|
||||||
|
handle, err := tablecodec.DecodeRowKey(key)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
err = e.scanCtx.decoder.Decode(value, handle, e.scanCtx.chk)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) scanFinish() error {
|
||||||
|
return e.chunkToOldChunk(e.scanCtx.chk)
|
||||||
|
}
|
||||||
|
|
||||||
|
type indexScanProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *indexScanProcessor) Process(key, value []byte) error {
|
||||||
|
if e.rowCount == e.limit {
|
||||||
|
return ScanBreak
|
||||||
|
}
|
||||||
|
e.rowCount++
|
||||||
|
err := e.indexScanProcessCore(key, value)
|
||||||
|
if e.scanCtx.chk.NumRows() == chunkMaxRows {
|
||||||
|
err = e.chunkToOldChunk(e.scanCtx.chk)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *indexScanProcessor) Finish() error {
|
||||||
|
return e.scanFinish()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) indexScanProcessCore(key, value []byte) error {
|
||||||
|
colLen := e.idxScanCtx.columnLen
|
||||||
|
pkStatus := e.idxScanCtx.pkStatus
|
||||||
|
chk := e.scanCtx.chk
|
||||||
|
values, b, err := tablecodec.CutIndexKeyNew(key, colLen)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
decoder := codec.NewDecoder(chk, e.sc.TimeZone)
|
||||||
|
for i, colVal := range values {
|
||||||
|
_, err = decoder.DecodeOne(colVal, i, e.fieldTps[i])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(b) > 0 {
|
||||||
|
if pkStatus != pkColNotExists {
|
||||||
|
_, err = decoder.DecodeOne(b, colLen, e.fieldTps[colLen])
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if pkStatus != pkColNotExists {
|
||||||
|
chk.AppendInt64(colLen, int64(binary.BigEndian.Uint64(value)))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) chunkToOldChunk(chk *chunk.Chunk) error {
|
||||||
|
var oldRow []types.Datum
|
||||||
|
for i := 0; i < chk.NumRows(); i++ {
|
||||||
|
oldRow = oldRow[:0]
|
||||||
|
for _, outputOff := range e.outputOff {
|
||||||
|
d := chk.GetRow(i).GetDatum(int(outputOff), e.fieldTps[outputOff])
|
||||||
|
oldRow = append(oldRow, d)
|
||||||
|
}
|
||||||
|
var err error
|
||||||
|
e.oldRowBuf, err = codec.EncodeValue(e.sc, e.oldRowBuf[:0], oldRow...)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
e.oldChunks = appendRow(e.oldChunks, e.oldRowBuf, i)
|
||||||
|
}
|
||||||
|
chk.Reset()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type selectionProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *selectionProcessor) Process(key, value []byte) error {
|
||||||
|
if e.rowCount == e.limit {
|
||||||
|
return ScanBreak
|
||||||
|
}
|
||||||
|
err := e.processCore(key, value)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
gotRow, err := e.processSelection()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if gotRow {
|
||||||
|
e.rowCount++
|
||||||
|
if e.scanCtx.chk.NumRows() == chunkMaxRows {
|
||||||
|
err = e.chunkToOldChunk(e.scanCtx.chk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *selectionProcessor) Finish() error {
|
||||||
|
return e.scanFinish()
|
||||||
|
}
|
||||||
|
|
||||||
|
type topNProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *topNProcessor) Process(key, value []byte) (err error) {
|
||||||
|
if err = e.processCore(key, value); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if e.hasSelection() {
|
||||||
|
gotRow, err1 := e.processSelection()
|
||||||
|
if err1 != nil || !gotRow {
|
||||||
|
return err1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := e.topNCtx
|
||||||
|
row := e.scanCtx.chk.GetRow(0)
|
||||||
|
for i, expr := range ctx.orderByExprs {
|
||||||
|
ctx.sortRow.key[i], err = expr.Eval(row)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.scanCtx.chk.Reset()
|
||||||
|
|
||||||
|
if ctx.heap.tryToAddRow(ctx.sortRow) {
|
||||||
|
ctx.sortRow.data[0] = append([]byte{}, key...)
|
||||||
|
ctx.sortRow.data[1] = append([]byte{}, value...)
|
||||||
|
ctx.sortRow = e.newTopNSortRow()
|
||||||
|
}
|
||||||
|
return errors.Trace(ctx.heap.err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *closureExecutor) newTopNSortRow() *sortRow {
|
||||||
|
return &sortRow{
|
||||||
|
key: make([]types.Datum, len(e.evalContext.columnInfos)),
|
||||||
|
data: make([][]byte, 2),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *topNProcessor) Finish() error {
|
||||||
|
ctx := e.topNCtx
|
||||||
|
sort.Sort(&ctx.heap.topNSorter)
|
||||||
|
chk := e.scanCtx.chk
|
||||||
|
for _, row := range ctx.heap.rows {
|
||||||
|
err := e.processCore(row.data[0], row.data[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if chk.NumRows() == chunkMaxRows {
|
||||||
|
if err = e.chunkToOldChunk(chk); err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return e.chunkToOldChunk(chk)
|
||||||
|
}
|
||||||
|
|
||||||
|
type hashAggProcessor struct {
|
||||||
|
skipVal
|
||||||
|
*closureExecutor
|
||||||
|
|
||||||
|
aggExprs []aggregation.Aggregation
|
||||||
|
groupByExprs []expression.Expression
|
||||||
|
groups map[string]struct{}
|
||||||
|
groupKeys [][]byte
|
||||||
|
aggCtxsMap map[string][]*aggregation.AggEvaluateContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *hashAggProcessor) Process(key, value []byte) (err error) {
|
||||||
|
err = e.processCore(key, value)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if e.hasSelection() {
|
||||||
|
gotRow, err1 := e.processSelection()
|
||||||
|
if err1 != nil || !gotRow {
|
||||||
|
return err1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row := e.scanCtx.chk.GetRow(e.scanCtx.chk.NumRows() - 1)
|
||||||
|
gk, err := e.getGroupKey(row)
|
||||||
|
if _, ok := e.groups[string(gk)]; !ok {
|
||||||
|
e.groups[string(gk)] = struct{}{}
|
||||||
|
e.groupKeys = append(e.groupKeys, gk)
|
||||||
|
}
|
||||||
|
// Update aggregate expressions.
|
||||||
|
aggCtxs := e.getContexts(gk)
|
||||||
|
for i, agg := range e.aggExprs {
|
||||||
|
err = agg.Update(aggCtxs[i], e.sc, row)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.scanCtx.chk.Reset()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *hashAggProcessor) getGroupKey(row chunk.Row) ([]byte, error) {
|
||||||
|
length := len(e.groupByExprs)
|
||||||
|
if length == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
key := make([]byte, 0, 32)
|
||||||
|
for _, item := range e.groupByExprs {
|
||||||
|
v, err := item.Eval(row)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
b, err := codec.EncodeValue(e.sc, nil, v)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
key = append(key, b...)
|
||||||
|
}
|
||||||
|
return key, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *hashAggProcessor) getContexts(groupKey []byte) []*aggregation.AggEvaluateContext {
|
||||||
|
aggCtxs, ok := e.aggCtxsMap[string(groupKey)]
|
||||||
|
if !ok {
|
||||||
|
aggCtxs = make([]*aggregation.AggEvaluateContext, 0, len(e.aggExprs))
|
||||||
|
for _, agg := range e.aggExprs {
|
||||||
|
aggCtxs = append(aggCtxs, agg.CreateContext(e.sc))
|
||||||
|
}
|
||||||
|
e.aggCtxsMap[string(groupKey)] = aggCtxs
|
||||||
|
}
|
||||||
|
return aggCtxs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *hashAggProcessor) Finish() error {
|
||||||
|
for i, gk := range e.groupKeys {
|
||||||
|
aggCtxs := e.getContexts(gk)
|
||||||
|
e.oldRowBuf = e.oldRowBuf[:0]
|
||||||
|
for i, agg := range e.aggExprs {
|
||||||
|
partialResults := agg.GetPartialResult(aggCtxs[i])
|
||||||
|
var err error
|
||||||
|
e.oldRowBuf, err = codec.EncodeValue(e.sc, e.oldRowBuf, partialResults...)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.oldRowBuf = append(e.oldRowBuf, gk...)
|
||||||
|
e.oldChunks = appendRow(e.oldChunks, e.oldRowBuf, i)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
340
kv/coprocessor/cop_handler.go
Normal file
340
kv/coprocessor/cop_handler.go
Normal file
@ -0,0 +1,340 @@
|
|||||||
|
// Copyright 2019-present 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.
|
||||||
|
|
||||||
|
package coprocessor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/golang/protobuf/proto"
|
||||||
|
"github.com/juju/errors"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/coprocessor/rowcodec"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/storage"
|
||||||
|
"github.com/pingcap-incubator/tinykv/kv/transaction/mvcc"
|
||||||
|
"github.com/pingcap-incubator/tinykv/proto/pkg/coprocessor"
|
||||||
|
"github.com/pingcap/tidb/expression"
|
||||||
|
"github.com/pingcap/tidb/expression/aggregation"
|
||||||
|
"github.com/pingcap/tidb/kv"
|
||||||
|
"github.com/pingcap/tidb/parser/mysql"
|
||||||
|
"github.com/pingcap/tidb/parser/terror"
|
||||||
|
"github.com/pingcap/tidb/sessionctx/stmtctx"
|
||||||
|
"github.com/pingcap/tidb/tablecodec"
|
||||||
|
"github.com/pingcap/tidb/types"
|
||||||
|
"github.com/pingcap/tipb/go-tipb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var dummySlice = make([]byte, 0)
|
||||||
|
|
||||||
|
type dagContext struct {
|
||||||
|
reader storage.StorageReader
|
||||||
|
dagReq *tipb.DAGRequest
|
||||||
|
keyRanges []*coprocessor.KeyRange
|
||||||
|
evalCtx *evalContext
|
||||||
|
startTS uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
type CopHandler struct{}
|
||||||
|
|
||||||
|
func (svr *CopHandler) HandleCopDAGRequest(reader storage.StorageReader, req *coprocessor.Request) *coprocessor.Response {
|
||||||
|
startTime := time.Now()
|
||||||
|
resp := &coprocessor.Response{}
|
||||||
|
dagCtx, dagReq, err := svr.buildDAG(reader, req)
|
||||||
|
if err != nil {
|
||||||
|
resp.OtherError = err.Error()
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
closureExec, err := svr.buildClosureExecutor(dagCtx, dagReq)
|
||||||
|
if err != nil {
|
||||||
|
return buildResp(nil, nil, err, dagCtx.evalCtx.sc.GetWarnings(), time.Since(startTime))
|
||||||
|
}
|
||||||
|
chunks, err := closureExec.execute()
|
||||||
|
return buildResp(chunks, nil, err, dagCtx.evalCtx.sc.GetWarnings(), time.Since(startTime))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) buildDAG(reader storage.StorageReader, req *coprocessor.Request) (*dagContext, *tipb.DAGRequest, error) {
|
||||||
|
if len(req.Ranges) == 0 {
|
||||||
|
return nil, nil, errors.New("request range is null")
|
||||||
|
}
|
||||||
|
if req.GetTp() != kv.ReqTypeDAG {
|
||||||
|
return nil, nil, errors.Errorf("unsupported request type %d", req.GetTp())
|
||||||
|
}
|
||||||
|
|
||||||
|
dagReq := new(tipb.DAGRequest)
|
||||||
|
err := proto.Unmarshal(req.Data, dagReq)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
sc := flagsToStatementContext(dagReq.Flags)
|
||||||
|
sc.TimeZone = time.FixedZone("UTC", int(dagReq.TimeZoneOffset))
|
||||||
|
ctx := &dagContext{
|
||||||
|
reader: reader,
|
||||||
|
dagReq: dagReq,
|
||||||
|
keyRanges: req.Ranges,
|
||||||
|
evalCtx: &evalContext{sc: sc},
|
||||||
|
startTS: req.StartTs,
|
||||||
|
}
|
||||||
|
scanExec := dagReq.Executors[0]
|
||||||
|
if scanExec.Tp == tipb.ExecType_TypeTableScan {
|
||||||
|
ctx.evalCtx.setColumnInfo(scanExec.TblScan.Columns)
|
||||||
|
} else {
|
||||||
|
ctx.evalCtx.setColumnInfo(scanExec.IdxScan.Columns)
|
||||||
|
}
|
||||||
|
return ctx, dagReq, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) getAggInfo(ctx *dagContext, pbAgg *tipb.Aggregation) ([]aggregation.Aggregation, []expression.Expression, error) {
|
||||||
|
length := len(pbAgg.AggFunc)
|
||||||
|
aggs := make([]aggregation.Aggregation, 0, length)
|
||||||
|
var err error
|
||||||
|
for _, expr := range pbAgg.AggFunc {
|
||||||
|
var aggExpr aggregation.Aggregation
|
||||||
|
aggExpr, err = aggregation.NewDistAggFunc(expr, ctx.evalCtx.fieldTps, ctx.evalCtx.sc)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
aggs = append(aggs, aggExpr)
|
||||||
|
}
|
||||||
|
groupBys, err := convertToExprs(ctx.evalCtx.sc, ctx.evalCtx.fieldTps, pbAgg.GetGroupBy())
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return aggs, groupBys, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svr *CopHandler) getTopNInfo(ctx *evalContext, topN *tipb.TopN) (heap *topNHeap, conds []expression.Expression, err error) {
|
||||||
|
pbConds := make([]*tipb.Expr, len(topN.OrderBy))
|
||||||
|
for i, item := range topN.OrderBy {
|
||||||
|
pbConds[i] = item.Expr
|
||||||
|
}
|
||||||
|
heap = &topNHeap{
|
||||||
|
totalCount: int(topN.Limit),
|
||||||
|
topNSorter: topNSorter{
|
||||||
|
orderByItems: topN.OrderBy,
|
||||||
|
sc: ctx.sc,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
if conds, err = convertToExprs(ctx.sc, ctx.fieldTps, pbConds); err != nil {
|
||||||
|
return nil, nil, errors.Trace(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return heap, conds, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type evalContext struct {
|
||||||
|
colIDs map[int64]int
|
||||||
|
columnInfos []*tipb.ColumnInfo
|
||||||
|
fieldTps []*types.FieldType
|
||||||
|
sc *stmtctx.StatementContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *evalContext) setColumnInfo(cols []*tipb.ColumnInfo) {
|
||||||
|
e.columnInfos = make([]*tipb.ColumnInfo, len(cols))
|
||||||
|
copy(e.columnInfos, cols)
|
||||||
|
|
||||||
|
e.colIDs = make(map[int64]int, len(e.columnInfos))
|
||||||
|
e.fieldTps = make([]*types.FieldType, 0, len(e.columnInfos))
|
||||||
|
for i, col := range e.columnInfos {
|
||||||
|
ft := fieldTypeFromPBColumn(col)
|
||||||
|
e.fieldTps = append(e.fieldTps, ft)
|
||||||
|
e.colIDs[col.GetColumnId()] = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *evalContext) newRowDecoder() (*rowcodec.Decoder, error) {
|
||||||
|
colIDs := make([]int64, len(e.columnInfos))
|
||||||
|
defaultVals := make([][]byte, len(e.columnInfos))
|
||||||
|
var handleColID int64
|
||||||
|
for i, colInfo := range e.columnInfos {
|
||||||
|
colIDs[i] = colInfo.ColumnId
|
||||||
|
defaultVals[i] = colInfo.DefaultVal
|
||||||
|
if colInfo.PkHandle {
|
||||||
|
handleColID = colInfo.ColumnId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rowcodec.NewDecoder(colIDs, handleColID, e.fieldTps, defaultVals, e.sc.TimeZone)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *evalContext) newRowDecoderForOffsets(colOffsets []int) (*rowcodec.Decoder, error) {
|
||||||
|
var (
|
||||||
|
handleColID int64
|
||||||
|
colIDs = make([]int64, len(colOffsets))
|
||||||
|
defaultVals = make([][]byte, len(colOffsets))
|
||||||
|
fieldsTps = make([]*types.FieldType, len(colOffsets))
|
||||||
|
)
|
||||||
|
for i, off := range colOffsets {
|
||||||
|
info := e.columnInfos[off]
|
||||||
|
colIDs[i] = info.ColumnId
|
||||||
|
defaultVals[i] = info.DefaultVal
|
||||||
|
fieldsTps[i] = e.fieldTps[off]
|
||||||
|
if info.PkHandle {
|
||||||
|
handleColID = info.ColumnId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rowcodec.NewDecoder(colIDs, handleColID, fieldsTps, defaultVals, e.sc.TimeZone)
|
||||||
|
}
|
||||||
|
|
||||||
|
// decodeRelatedColumnVals decodes data to Datum slice according to the row information.
|
||||||
|
func (e *evalContext) decodeRelatedColumnVals(relatedColOffsets []int, value [][]byte, row []types.Datum) error {
|
||||||
|
var err error
|
||||||
|
for _, offset := range relatedColOffsets {
|
||||||
|
row[offset], err = tablecodec.DecodeColumnValue(value[offset], e.fieldTps[offset], e.sc.TimeZone)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Trace(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flags are used by tipb.SelectRequest.Flags to handle execution mode, like how to handle truncate error.
|
||||||
|
const (
|
||||||
|
// FlagIgnoreTruncate indicates if truncate error should be ignored.
|
||||||
|
// Read-only statements should ignore truncate error, write statements should not ignore truncate error.
|
||||||
|
FlagIgnoreTruncate uint64 = 1
|
||||||
|
// FlagTruncateAsWarning indicates if truncate error should be returned as warning.
|
||||||
|
// This flag only matters if FlagIgnoreTruncate is not set, in strict sql mode, truncate error should
|
||||||
|
// be returned as error, in non-strict sql mode, truncate error should be saved as warning.
|
||||||
|
FlagTruncateAsWarning uint64 = 1 << 1
|
||||||
|
|
||||||
|
// FlagPadCharToFullLength indicates if sql_mode 'PAD_CHAR_TO_FULL_LENGTH' is set.
|
||||||
|
FlagPadCharToFullLength uint64 = 1 << 2
|
||||||
|
)
|
||||||
|
|
||||||
|
// flagsToStatementContext creates a StatementContext from a `tipb.SelectRequest.Flags`.
|
||||||
|
func flagsToStatementContext(flags uint64) *stmtctx.StatementContext {
|
||||||
|
sc := &stmtctx.StatementContext{
|
||||||
|
IgnoreTruncate: (flags & FlagIgnoreTruncate) > 0,
|
||||||
|
TruncateAsWarning: (flags & FlagTruncateAsWarning) > 0,
|
||||||
|
PadCharToFullLength: (flags & FlagPadCharToFullLength) > 0,
|
||||||
|
}
|
||||||
|
return sc
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildResp(chunks []tipb.Chunk, counts []int64, err error, warnings []stmtctx.SQLWarn, dur time.Duration) *coprocessor.Response {
|
||||||
|
resp := &coprocessor.Response{}
|
||||||
|
selResp := &tipb.SelectResponse{
|
||||||
|
Error: toPBError(err),
|
||||||
|
Chunks: chunks,
|
||||||
|
OutputCounts: counts,
|
||||||
|
}
|
||||||
|
if len(warnings) > 0 {
|
||||||
|
selResp.Warnings = make([]*tipb.Error, 0, len(warnings))
|
||||||
|
for i := range warnings {
|
||||||
|
selResp.Warnings = append(selResp.Warnings, toPBError(warnings[i].Err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
if ke, ok := err.(*mvcc.KeyError); ok {
|
||||||
|
if ke.Locked == nil {
|
||||||
|
resp.OtherError = ke.Error()
|
||||||
|
} else {
|
||||||
|
resp.Locked = ke.Locked
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resp.OtherError = err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data, err := proto.Marshal(selResp)
|
||||||
|
if err != nil {
|
||||||
|
resp.OtherError = err.Error()
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
resp.Data = data
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
func toPBError(err error) *tipb.Error {
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
perr := new(tipb.Error)
|
||||||
|
switch x := err.(type) {
|
||||||
|
case *terror.Error:
|
||||||
|
sqlErr := x.ToSQLError()
|
||||||
|
perr.Code = int32(sqlErr.Code)
|
||||||
|
perr.Msg = sqlErr.Message
|
||||||
|
default:
|
||||||
|
perr.Code = int32(1)
|
||||||
|
perr.Msg = err.Error()
|
||||||
|
}
|
||||||
|
return perr
|
||||||
|
}
|
||||||
|
|
||||||
|
// extractKVRanges extracts kv.KeyRanges slice from a SelectRequest.
|
||||||
|
func (svr *CopHandler) extractKVRanges(reader storage.StorageReader, keyRanges []*coprocessor.KeyRange, descScan bool) (kvRanges []kv.KeyRange, err error) {
|
||||||
|
kvRanges = make([]kv.KeyRange, 0, len(keyRanges))
|
||||||
|
for _, kran := range keyRanges {
|
||||||
|
if bytes.Compare(kran.GetStart(), kran.GetEnd()) >= 0 {
|
||||||
|
err = errors.Errorf("invalid range, start should be smaller than end: %v %v", kran.GetStart(), kran.GetEnd())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
upperKey := kran.GetEnd()
|
||||||
|
lowerKey := kran.GetStart()
|
||||||
|
r := kv.KeyRange{
|
||||||
|
StartKey: kv.Key(lowerKey),
|
||||||
|
EndKey: kv.Key(upperKey),
|
||||||
|
}
|
||||||
|
kvRanges = append(kvRanges, r)
|
||||||
|
}
|
||||||
|
if descScan {
|
||||||
|
reverseKVRanges(kvRanges)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func reverseKVRanges(kvRanges []kv.KeyRange) {
|
||||||
|
for i := 0; i < len(kvRanges)/2; i++ {
|
||||||
|
j := len(kvRanges) - i - 1
|
||||||
|
kvRanges[i], kvRanges[j] = kvRanges[j], kvRanges[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rowsPerChunk = 64
|
||||||
|
|
||||||
|
func appendRow(chunks []tipb.Chunk, data []byte, rowCnt int) []tipb.Chunk {
|
||||||
|
if rowCnt%rowsPerChunk == 0 {
|
||||||
|
chunks = append(chunks, tipb.Chunk{})
|
||||||
|
}
|
||||||
|
cur := &chunks[len(chunks)-1]
|
||||||
|
cur.RowsData = append(cur.RowsData, data...)
|
||||||
|
return chunks
|
||||||
|
}
|
||||||
|
|
||||||
|
func maxStartKey(rangeStartKey kv.Key, regionStartKey []byte) []byte {
|
||||||
|
if bytes.Compare([]byte(rangeStartKey), regionStartKey) > 0 {
|
||||||
|
return []byte(rangeStartKey)
|
||||||
|
}
|
||||||
|
return regionStartKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func minEndKey(rangeEndKey kv.Key, regionEndKey []byte) []byte {
|
||||||
|
if len(regionEndKey) == 0 || bytes.Compare([]byte(rangeEndKey), regionEndKey) < 0 {
|
||||||
|
return []byte(rangeEndKey)
|
||||||
|
}
|
||||||
|
return regionEndKey
|
||||||
|
}
|
||||||
|
|
||||||
|
// fieldTypeFromPBColumn creates a types.FieldType from tipb.ColumnInfo.
|
||||||
|
func fieldTypeFromPBColumn(col *tipb.ColumnInfo) *types.FieldType {
|
||||||
|
return &types.FieldType{
|
||||||
|
Tp: byte(col.GetTp()),
|
||||||
|
Flag: uint(col.Flag),
|
||||||
|
Flen: int(col.GetColumnLen()),
|
||||||
|
Decimal: int(col.GetDecimal()),
|
||||||
|
Elems: col.Elems,
|
||||||
|
Collate: mysql.Collations[uint8(col.GetCollation())],
|
||||||
|
}
|
||||||
|
}
|
@ -35,11 +35,8 @@ type row struct {
|
|||||||
numNullCols uint16
|
numNullCols uint16
|
||||||
colIDs []byte
|
colIDs []byte
|
||||||
|
|
||||||
// valFlags is used for converting new row format to old row format.
|
offsets []uint16
|
||||||
// It can be removed once TiDB implemented the new row format.
|
data []byte
|
||||||
valFlags []byte
|
|
||||||
offsets []uint16
|
|
||||||
data []byte
|
|
||||||
|
|
||||||
// for large row
|
// for large row
|
||||||
colIDs32 []uint32
|
colIDs32 []uint32
|
||||||
@ -65,13 +62,7 @@ func (r row) String() string {
|
|||||||
offEnd = int64(r.offsets[i])
|
offEnd = int64(r.offsets[i])
|
||||||
}
|
}
|
||||||
colValData := r.data[offStart:offEnd]
|
colValData := r.data[offStart:offEnd]
|
||||||
valFlag := r.valFlags[i]
|
colValStr := fmt.Sprintf("(%d:%v)", colID, colValData)
|
||||||
var colValStr string
|
|
||||||
if valFlag == BytesFlag {
|
|
||||||
colValStr = fmt.Sprintf("(%d:'%s')", colID, colValData)
|
|
||||||
} else {
|
|
||||||
colValStr = fmt.Sprintf("(%d:%d)", colID, colValData)
|
|
||||||
}
|
|
||||||
colValStrs = append(colValStrs, colValStr)
|
colValStrs = append(colValStrs, colValStr)
|
||||||
}
|
}
|
||||||
return strings.Join(colValStrs, ",")
|
return strings.Join(colValStrs, ",")
|
||||||
@ -101,8 +92,6 @@ func (r *row) setRowData(rowData []byte) error {
|
|||||||
r.numNotNullCols = binary.LittleEndian.Uint16(rowData[2:])
|
r.numNotNullCols = binary.LittleEndian.Uint16(rowData[2:])
|
||||||
r.numNullCols = binary.LittleEndian.Uint16(rowData[4:])
|
r.numNullCols = binary.LittleEndian.Uint16(rowData[4:])
|
||||||
cursor := 6
|
cursor := 6
|
||||||
r.valFlags = rowData[cursor : cursor+int(r.numNotNullCols)]
|
|
||||||
cursor += int(r.numNotNullCols)
|
|
||||||
if r.large {
|
if r.large {
|
||||||
colIDsLen := int(r.numNotNullCols+r.numNullCols) * 4
|
colIDsLen := int(r.numNotNullCols+r.numNullCols) * 4
|
||||||
r.colIDs32 = bytesToU32Slice(rowData[cursor : cursor+colIDsLen])
|
r.colIDs32 = bytesToU32Slice(rowData[cursor : cursor+colIDsLen])
|
||||||
|
@ -5,9 +5,8 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/juju/errors"
|
"github.com/juju/errors"
|
||||||
"github.com/pingcap/parser/mysql"
|
"github.com/pingcap/tidb/parser/mysql"
|
||||||
"github.com/pingcap/tidb/types"
|
"github.com/pingcap/tidb/types"
|
||||||
"github.com/pingcap/tidb/types/json"
|
|
||||||
"github.com/pingcap/tidb/util/chunk"
|
"github.com/pingcap/tidb/util/chunk"
|
||||||
"github.com/pingcap/tidb/util/codec"
|
"github.com/pingcap/tidb/util/codec"
|
||||||
)
|
)
|
||||||
@ -200,53 +199,9 @@ func (decoder *Decoder) decodeColData(colIdx int, colData []byte, chk *chunk.Chu
|
|||||||
case mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeString,
|
case mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeString,
|
||||||
mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob:
|
mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob:
|
||||||
chk.AppendBytes(colIdx, colData)
|
chk.AppendBytes(colIdx, colData)
|
||||||
case mysql.TypeNewDecimal:
|
|
||||||
_, dec, _, _, err := codec.DecodeDecimal(colData)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
chk.AppendMyDecimal(colIdx, dec)
|
|
||||||
case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp:
|
|
||||||
var t types.Time
|
|
||||||
t.Type = ft.Tp
|
|
||||||
t.Fsp = int8(ft.Decimal)
|
|
||||||
err := t.FromPackedUint(decodeUint(colData))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if ft.Tp == mysql.TypeTimestamp && !t.IsZero() {
|
|
||||||
err = t.ConvertTimeZone(time.UTC, decoder.loc)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chk.AppendTime(colIdx, t)
|
|
||||||
case mysql.TypeDuration:
|
|
||||||
var dur types.Duration
|
|
||||||
dur.Duration = time.Duration(decodeInt(colData))
|
|
||||||
dur.Fsp = int8(ft.Decimal)
|
|
||||||
chk.AppendDuration(colIdx, dur)
|
|
||||||
case mysql.TypeEnum:
|
|
||||||
// ignore error deliberately, to read empty enum value.
|
|
||||||
enum, err := types.ParseEnumValue(ft.Elems, decodeUint(colData))
|
|
||||||
if err != nil {
|
|
||||||
enum = types.Enum{}
|
|
||||||
}
|
|
||||||
chk.AppendEnum(colIdx, enum)
|
|
||||||
case mysql.TypeSet:
|
|
||||||
set, err := types.ParseSetValue(ft.Elems, decodeUint(colData))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
chk.AppendSet(colIdx, set)
|
|
||||||
case mysql.TypeBit:
|
case mysql.TypeBit:
|
||||||
byteSize := (ft.Flen + 7) >> 3
|
byteSize := (ft.Flen + 7) >> 3
|
||||||
chk.AppendBytes(colIdx, types.NewBinaryLiteralFromUint(decodeUint(colData), byteSize))
|
chk.AppendBytes(colIdx, types.NewBinaryLiteralFromUint(decodeUint(colData), byteSize))
|
||||||
case mysql.TypeJSON:
|
|
||||||
var j json.BinaryJSON
|
|
||||||
j.TypeCode = colData[0]
|
|
||||||
j.Value = colData[1:]
|
|
||||||
chk.AppendJSON(colIdx, j)
|
|
||||||
default:
|
default:
|
||||||
return errors.Errorf("unknown type %d", ft.Tp)
|
return errors.Errorf("unknown type %d", ft.Tp)
|
||||||
}
|
}
|
||||||
|
@ -116,18 +116,14 @@ func (encoder *Encoder) build(buf []byte) ([]byte, error) {
|
|||||||
sort.Sort(smallNullSorter)
|
sort.Sort(smallNullSorter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
encoder.initValFlags()
|
|
||||||
for i := 0; i < notNullIdx; i++ {
|
for i := 0; i < notNullIdx; i++ {
|
||||||
d := encoder.values[i]
|
d := encoder.values[i]
|
||||||
switch d.Kind() {
|
switch d.Kind() {
|
||||||
case types.KindInt64:
|
case types.KindInt64:
|
||||||
r.valFlags[i] = IntFlag
|
|
||||||
r.data = encodeInt(r.data, d.GetInt64())
|
r.data = encodeInt(r.data, d.GetInt64())
|
||||||
case types.KindUint64:
|
case types.KindUint64:
|
||||||
r.valFlags[i] = UintFlag
|
|
||||||
r.data = encodeUint(r.data, d.GetUint64())
|
r.data = encodeUint(r.data, d.GetUint64())
|
||||||
case types.KindString, types.KindBytes:
|
case types.KindString, types.KindBytes:
|
||||||
r.valFlags[i] = BytesFlag
|
|
||||||
r.data = append(r.data, d.GetBytes()...)
|
r.data = append(r.data, d.GetBytes()...)
|
||||||
default:
|
default:
|
||||||
var err error
|
var err error
|
||||||
@ -135,7 +131,6 @@ func (encoder *Encoder) build(buf []byte) ([]byte, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Trace(err)
|
return nil, errors.Trace(err)
|
||||||
}
|
}
|
||||||
r.valFlags[i] = encoder.tempData[0]
|
|
||||||
r.data = append(r.data, encoder.tempData[1:]...)
|
r.data = append(r.data, encoder.tempData[1:]...)
|
||||||
}
|
}
|
||||||
if len(r.data) > math.MaxUint16 && !r.large {
|
if len(r.data) > math.MaxUint16 && !r.large {
|
||||||
@ -178,7 +173,6 @@ func (encoder *Encoder) build(buf []byte) ([]byte, error) {
|
|||||||
buf = append(buf, flag)
|
buf = append(buf, flag)
|
||||||
buf = append(buf, byte(r.numNotNullCols), byte(r.numNotNullCols>>8))
|
buf = append(buf, byte(r.numNotNullCols), byte(r.numNotNullCols>>8))
|
||||||
buf = append(buf, byte(r.numNullCols), byte(r.numNullCols>>8))
|
buf = append(buf, byte(r.numNullCols), byte(r.numNullCols>>8))
|
||||||
buf = append(buf, r.valFlags...)
|
|
||||||
if r.large {
|
if r.large {
|
||||||
buf = append(buf, u32SliceToBytes(r.colIDs32)...)
|
buf = append(buf, u32SliceToBytes(r.colIDs32)...)
|
||||||
buf = append(buf, u32SliceToBytes(r.offsets32)...)
|
buf = append(buf, u32SliceToBytes(r.offsets32)...)
|
||||||
@ -190,14 +184,6 @@ func (encoder *Encoder) build(buf []byte) ([]byte, error) {
|
|||||||
return buf, nil
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (encoder *Encoder) initValFlags() {
|
|
||||||
if cap(encoder.valFlags) >= int(encoder.numNotNullCols) {
|
|
||||||
encoder.valFlags = encoder.valFlags[:encoder.numNotNullCols]
|
|
||||||
} else {
|
|
||||||
encoder.valFlags = make([]byte, encoder.numNotNullCols)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (encoder *Encoder) initColIDs() {
|
func (encoder *Encoder) initColIDs() {
|
||||||
numCols := int(encoder.numNotNullCols + encoder.numNullCols)
|
numCols := int(encoder.numNotNullCols + encoder.numNullCols)
|
||||||
if cap(encoder.colIDs) >= numCols {
|
if cap(encoder.colIDs) >= numCols {
|
||||||
@ -315,54 +301,3 @@ func IsRowKeyWithShardByte(key []byte) bool {
|
|||||||
func IsRowKey(key []byte) bool {
|
func IsRowKey(key []byte) bool {
|
||||||
return len(key) == rowKeyLen && key[0] == 't' && key[recordPrefixIdx] == 'r'
|
return len(key) == rowKeyLen && key[0] == 't' && key[recordPrefixIdx] == 'r'
|
||||||
}
|
}
|
||||||
|
|
||||||
// RowToOldRow converts a row to old-format row.
|
|
||||||
func RowToOldRow(rowData, buf []byte) ([]byte, error) {
|
|
||||||
if len(rowData) == 0 {
|
|
||||||
return rowData, nil
|
|
||||||
}
|
|
||||||
buf = buf[:0]
|
|
||||||
var r row
|
|
||||||
err := r.setRowData(rowData)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if !r.large {
|
|
||||||
for i, colID := range r.colIDs {
|
|
||||||
buf = encodeOldOne(&r, buf, i, int64(colID))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for i, colID := range r.colIDs32 {
|
|
||||||
buf = encodeOldOne(&r, buf, i, int64(colID))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(buf) == 0 {
|
|
||||||
buf = append(buf, NilFlag)
|
|
||||||
}
|
|
||||||
return buf, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func encodeOldOne(r *row, buf []byte, i int, colID int64) []byte {
|
|
||||||
buf = append(buf, VarintFlag)
|
|
||||||
buf = codec.EncodeVarint(buf, colID)
|
|
||||||
if i < int(r.numNotNullCols) {
|
|
||||||
val := r.getData(i)
|
|
||||||
switch r.valFlags[i] {
|
|
||||||
case BytesFlag:
|
|
||||||
buf = append(buf, CompactBytesFlag)
|
|
||||||
buf = codec.EncodeCompactBytes(buf, val)
|
|
||||||
case IntFlag:
|
|
||||||
buf = append(buf, VarintFlag)
|
|
||||||
buf = codec.EncodeVarint(buf, decodeInt(val))
|
|
||||||
case UintFlag:
|
|
||||||
buf = append(buf, VaruintFlag)
|
|
||||||
buf = codec.EncodeUvarint(buf, decodeUint(val))
|
|
||||||
default:
|
|
||||||
buf = append(buf, r.valFlags[i])
|
|
||||||
buf = append(buf, val...)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
buf = append(buf, NilFlag)
|
|
||||||
}
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
@ -1,160 +0,0 @@
|
|||||||
package rowcodec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
. "github.com/pingcap/check"
|
|
||||||
"github.com/pingcap/parser/mysql"
|
|
||||||
"github.com/pingcap/tidb/sessionctx/stmtctx"
|
|
||||||
"github.com/pingcap/tidb/tablecodec"
|
|
||||||
"github.com/pingcap/tidb/types"
|
|
||||||
"github.com/pingcap/tidb/util/chunk"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestT(t *testing.T) {
|
|
||||||
TestingT(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = Suite(&testSuite{})
|
|
||||||
|
|
||||||
type testSuite struct{}
|
|
||||||
|
|
||||||
func (s *testSuite) TestRowCodec(c *C) {
|
|
||||||
colIDs := []int64{1, 2, 3}
|
|
||||||
tps := make([]*types.FieldType, 3)
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
tps[i] = types.NewFieldType(mysql.TypeLonglong)
|
|
||||||
}
|
|
||||||
sc := new(stmtctx.StatementContext)
|
|
||||||
oldRow, err := tablecodec.EncodeRow(sc, types.MakeDatums(1, 2, 3), colIDs, nil, nil)
|
|
||||||
c.Check(err, IsNil)
|
|
||||||
|
|
||||||
var rb Encoder
|
|
||||||
newRow, err := rb.EncodeFromOldRow(oldRow, nil)
|
|
||||||
c.Check(err, IsNil)
|
|
||||||
rd, err := NewDecoder(colIDs, 0, tps, make([][]byte, 3), time.Local)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
chk := chunk.NewChunkWithCapacity(tps, 1)
|
|
||||||
err = rd.Decode(newRow, -1, chk)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
row := chk.GetRow(0)
|
|
||||||
for i := 0; i < 3; i++ {
|
|
||||||
c.Assert(row.GetInt64(i), Equals, int64(i)+1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *testSuite) TestRowCodecIsNull(c *C) {
|
|
||||||
colIDs := []int64{1, 2}
|
|
||||||
tps := make([]*types.FieldType, 2)
|
|
||||||
for i := 0; i < 2; i++ {
|
|
||||||
tps[i] = types.NewFieldType(mysql.TypeLonglong)
|
|
||||||
}
|
|
||||||
var rb Encoder
|
|
||||||
newRow, err := rb.Encode(colIDs, types.MakeDatums(1, nil), nil)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
rd, err := NewDecoder(colIDs, 0, tps, make([][]byte, 3), time.Local)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
defaultVal := make([]byte, 1)
|
|
||||||
isNull, err := rd.ColumnIsNull(newRow, 1, defaultVal)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(isNull, IsFalse)
|
|
||||||
isNull, err = rd.ColumnIsNull(newRow, 1, nil)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(isNull, IsFalse)
|
|
||||||
isNull, err = rd.ColumnIsNull(newRow, 2, defaultVal)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(isNull, IsTrue)
|
|
||||||
isNull, err = rd.ColumnIsNull(newRow, 3, defaultVal)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(isNull, IsFalse)
|
|
||||||
isNull, err = rd.ColumnIsNull(newRow, 3, nil)
|
|
||||||
c.Assert(err, IsNil)
|
|
||||||
c.Assert(isNull, IsTrue)
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkEncode(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
oldRow := types.MakeDatums(1, "abc", 1.1)
|
|
||||||
var xb Encoder
|
|
||||||
var buf []byte
|
|
||||||
colIDs := []int64{1, 2, 3}
|
|
||||||
var err error
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
buf, err = xb.Encode(colIDs, oldRow, buf)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkEncodeFromOldRow(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
oldRow := types.MakeDatums(1, "abc", 1.1)
|
|
||||||
oldRowData, err := tablecodec.EncodeRow(new(stmtctx.StatementContext), oldRow, []int64{1, 2, 3}, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
var xb Encoder
|
|
||||||
var buf []byte
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
buf, err = xb.EncodeFromOldRow(oldRowData, buf)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkDecode(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
oldRow := types.MakeDatums(1, "abc", 1.1)
|
|
||||||
colIDs := []int64{-1, 2, 3}
|
|
||||||
tps := []*types.FieldType{
|
|
||||||
types.NewFieldType(mysql.TypeLonglong),
|
|
||||||
types.NewFieldType(mysql.TypeString),
|
|
||||||
types.NewFieldType(mysql.TypeDouble),
|
|
||||||
}
|
|
||||||
var xb Encoder
|
|
||||||
xRowData, err := xb.Encode(colIDs, oldRow, nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
decoder, err := NewDecoder(colIDs, -1, tps, make([][]byte, 3), time.Local)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
chk := chunk.NewChunkWithCapacity(tps, 1)
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
chk.Reset()
|
|
||||||
err = decoder.Decode(xRowData, 1, chk)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkIsNull(b *testing.B) {
|
|
||||||
b.ReportAllocs()
|
|
||||||
oldRow := types.MakeDatums(1, "abc", 1.1)
|
|
||||||
colIDs := []int64{-1, 2, 3}
|
|
||||||
tps := []*types.FieldType{
|
|
||||||
types.NewFieldType(mysql.TypeLonglong),
|
|
||||||
types.NewFieldType(mysql.TypeString),
|
|
||||||
types.NewFieldType(mysql.TypeDouble),
|
|
||||||
}
|
|
||||||
var xb Encoder
|
|
||||||
xRowData, err := xb.Encode(colIDs, oldRow, nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
decoder, err := NewDecoder(colIDs, -1, tps, make([][]byte, 3), time.Local)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
_, err = decoder.ColumnIsNull(xRowData, int64(i)%4, nil)
|
|
||||||
if err != nil {
|
|
||||||
b.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
139
kv/coprocessor/topn.go
Normal file
139
kv/coprocessor/topn.go
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
// Copyright 2019-present 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.
|
||||||
|
|
||||||
|
package coprocessor
|
||||||
|
|
||||||
|
import (
|
||||||
|
"container/heap"
|
||||||
|
|
||||||
|
"github.com/juju/errors"
|
||||||
|
"github.com/pingcap/tidb/sessionctx/stmtctx"
|
||||||
|
"github.com/pingcap/tidb/types"
|
||||||
|
tipb "github.com/pingcap/tipb/go-tipb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type sortRow struct {
|
||||||
|
key []types.Datum
|
||||||
|
data [][]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// topNSorter implements sort.Interface. When all rows have been processed, the topNSorter will sort the whole data in heap.
|
||||||
|
type topNSorter struct {
|
||||||
|
orderByItems []*tipb.ByItem
|
||||||
|
rows []*sortRow
|
||||||
|
err error
|
||||||
|
sc *stmtctx.StatementContext
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNSorter) Len() int {
|
||||||
|
return len(t.rows)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNSorter) Swap(i, j int) {
|
||||||
|
t.rows[i], t.rows[j] = t.rows[j], t.rows[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNSorter) Less(i, j int) bool {
|
||||||
|
for index, by := range t.orderByItems {
|
||||||
|
v1 := t.rows[i].key[index]
|
||||||
|
v2 := t.rows[j].key[index]
|
||||||
|
|
||||||
|
ret, err := v1.CompareDatum(t.sc, &v2)
|
||||||
|
if err != nil {
|
||||||
|
t.err = errors.Trace(err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if by.Desc {
|
||||||
|
ret = -ret
|
||||||
|
}
|
||||||
|
|
||||||
|
if ret < 0 {
|
||||||
|
return true
|
||||||
|
} else if ret > 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// topNHeap holds the top n elements using heap structure. It implements heap.Interface.
|
||||||
|
// When we insert a row, topNHeap will check if the row can become one of the top n element or not.
|
||||||
|
type topNHeap struct {
|
||||||
|
topNSorter
|
||||||
|
|
||||||
|
// totalCount is equal to the limit count, which means the max size of heap.
|
||||||
|
totalCount int
|
||||||
|
// heapSize means the current size of this heap.
|
||||||
|
heapSize int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNHeap) Len() int {
|
||||||
|
return t.heapSize
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNHeap) Push(x interface{}) {
|
||||||
|
t.rows = append(t.rows, x.(*sortRow))
|
||||||
|
t.heapSize++
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNHeap) Pop() interface{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *topNHeap) Less(i, j int) bool {
|
||||||
|
for index, by := range t.orderByItems {
|
||||||
|
v1 := t.rows[i].key[index]
|
||||||
|
v2 := t.rows[j].key[index]
|
||||||
|
|
||||||
|
ret, err := v1.CompareDatum(t.sc, &v2)
|
||||||
|
if err != nil {
|
||||||
|
t.err = errors.Trace(err)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if by.Desc {
|
||||||
|
ret = -ret
|
||||||
|
}
|
||||||
|
|
||||||
|
if ret > 0 {
|
||||||
|
return true
|
||||||
|
} else if ret < 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// tryToAddRow tries to add a row to heap.
|
||||||
|
// When this row is not less than any rows in heap, it will never become the top n element.
|
||||||
|
// Then this function returns false.
|
||||||
|
func (t *topNHeap) tryToAddRow(row *sortRow) bool {
|
||||||
|
success := false
|
||||||
|
if t.heapSize == t.totalCount {
|
||||||
|
t.rows = append(t.rows, row)
|
||||||
|
// When this row is less than the top element, it will replace it and adjust the heap structure.
|
||||||
|
if t.Less(0, t.heapSize) {
|
||||||
|
t.Swap(0, t.heapSize)
|
||||||
|
heap.Fix(t, 0)
|
||||||
|
success = true
|
||||||
|
}
|
||||||
|
t.rows = t.rows[:t.heapSize]
|
||||||
|
} else {
|
||||||
|
heap.Push(t, row)
|
||||||
|
success = true
|
||||||
|
}
|
||||||
|
return success
|
||||||
|
}
|
@ -15,6 +15,7 @@ package scheduler_client
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
@ -269,7 +270,7 @@ func (c *client) doRequest(ctx context.Context, f func(context.Context, schedule
|
|||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errors.New("failed too many times")
|
return errors.New(fmt.Sprintf("failed too many times: %v", err))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) heartbeatStreamLoop() {
|
func (c *client) heartbeatStreamLoop() {
|
||||||
|
@ -3,14 +3,14 @@ package server
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/pingcap-incubator/tinykv/scheduler/pkg/tsoutil"
|
"github.com/pingcap-incubator/tinykv/kv/coprocessor"
|
||||||
|
|
||||||
"github.com/pingcap-incubator/tinykv/kv/storage"
|
"github.com/pingcap-incubator/tinykv/kv/storage"
|
||||||
"github.com/pingcap-incubator/tinykv/kv/storage/raft_storage"
|
"github.com/pingcap-incubator/tinykv/kv/storage/raft_storage"
|
||||||
"github.com/pingcap-incubator/tinykv/kv/transaction/latches"
|
"github.com/pingcap-incubator/tinykv/kv/transaction/latches"
|
||||||
"github.com/pingcap-incubator/tinykv/proto/pkg/coprocessor"
|
coppb "github.com/pingcap-incubator/tinykv/proto/pkg/coprocessor"
|
||||||
"github.com/pingcap-incubator/tinykv/proto/pkg/kvrpcpb"
|
"github.com/pingcap-incubator/tinykv/proto/pkg/kvrpcpb"
|
||||||
"github.com/pingcap-incubator/tinykv/proto/pkg/tinykvpb"
|
"github.com/pingcap-incubator/tinykv/proto/pkg/tinykvpb"
|
||||||
|
"github.com/pingcap/tidb/kv"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ tinykvpb.TinyKvServer = new(Server)
|
var _ tinykvpb.TinyKvServer = new(Server)
|
||||||
@ -21,6 +21,9 @@ type Server struct {
|
|||||||
|
|
||||||
// (Used in 4A/4B)
|
// (Used in 4A/4B)
|
||||||
Latches *latches.Latches
|
Latches *latches.Latches
|
||||||
|
|
||||||
|
// coprocessor API handler, out of course scope
|
||||||
|
copHandler *coprocessor.CopHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewServer(storage storage.Storage) *Server {
|
func NewServer(storage storage.Storage) *Server {
|
||||||
@ -102,11 +105,21 @@ func (server *Server) KvResolveLock(_ context.Context, req *kvrpcpb.ResolveLockR
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SQL push down commands.
|
// SQL push down commands.
|
||||||
func (server *Server) Coprocessor(_ context.Context, req *coprocessor.Request) (*coprocessor.Response, error) {
|
func (server *Server) Coprocessor(_ context.Context, req *coppb.Request) (*coppb.Response, error) {
|
||||||
return &coprocessor.Response{}, nil
|
resp := new(coppb.Response)
|
||||||
}
|
reader, err := server.storage.Reader(req.Context)
|
||||||
|
if err != nil {
|
||||||
// PhysicalTime returns the physical time part of the timestamp.
|
if regionErr, ok := err.(*raft_storage.RegionError); ok {
|
||||||
func PhysicalTime(ts uint64) uint64 {
|
resp.RegionError = regionErr.RequestErr
|
||||||
return ts >> tsoutil.PhysicalShiftBits
|
return resp, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
switch req.Tp {
|
||||||
|
case kv.ReqTypeDAG:
|
||||||
|
return server.copHandler.HandleCopDAGRequest(reader, req), nil
|
||||||
|
case kv.ReqTypeAnalyze:
|
||||||
|
return server.copHandler.HandleCopAnalyzeRequest(reader, req), nil
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,19 @@ import (
|
|||||||
|
|
||||||
"github.com/pingcap-incubator/tinykv/kv/storage"
|
"github.com/pingcap-incubator/tinykv/kv/storage"
|
||||||
"github.com/pingcap-incubator/tinykv/kv/util/codec"
|
"github.com/pingcap-incubator/tinykv/kv/util/codec"
|
||||||
|
"github.com/pingcap-incubator/tinykv/proto/pkg/kvrpcpb"
|
||||||
|
"github.com/pingcap-incubator/tinykv/scheduler/pkg/tsoutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// KeyError is a wrapper type so we can implement the `error` interface.
|
||||||
|
type KeyError struct {
|
||||||
|
kvrpcpb.KeyError
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ke *KeyError) Error() string {
|
||||||
|
return ke.String()
|
||||||
|
}
|
||||||
|
|
||||||
// MvccTxn groups together writes as part of a single transaction. It also provides an abstraction over low-level
|
// MvccTxn groups together writes as part of a single transaction. It also provides an abstraction over low-level
|
||||||
// storage, lowering the concepts of timestamps, writes, and locks into plain keys and values.
|
// storage, lowering the concepts of timestamps, writes, and locks into plain keys and values.
|
||||||
type MvccTxn struct {
|
type MvccTxn struct {
|
||||||
@ -107,3 +118,8 @@ func decodeTimestamp(key []byte) uint64 {
|
|||||||
}
|
}
|
||||||
return ^binary.BigEndian.Uint64(left)
|
return ^binary.BigEndian.Uint64(left)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PhysicalTime returns the physical time part of the timestamp.
|
||||||
|
func PhysicalTime(ts uint64) uint64 {
|
||||||
|
return ts >> tsoutil.PhysicalShiftBits
|
||||||
|
}
|
||||||
|
@ -264,5 +264,5 @@ func New() *Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewLogger(w io.Writer, prefix string) *Logger {
|
func NewLogger(w io.Writer, prefix string) *Logger {
|
||||||
return &Logger{_log: log.New(w, prefix, LstdFlags), level: LOG_LEVEL_ALL, highlighting: true}
|
return &Logger{_log: log.New(w, prefix, LstdFlags), level: LOG_LEVEL_INFO, highlighting: true}
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,6 @@ import (
|
|||||||
errorpb "github.com/pingcap-incubator/tinykv/proto/pkg/errorpb"
|
errorpb "github.com/pingcap-incubator/tinykv/proto/pkg/errorpb"
|
||||||
|
|
||||||
kvrpcpb "github.com/pingcap-incubator/tinykv/proto/pkg/kvrpcpb"
|
kvrpcpb "github.com/pingcap-incubator/tinykv/proto/pkg/kvrpcpb"
|
||||||
|
|
||||||
github_com_pingcap_kvproto_pkg_sharedbytes "github.com/pingcap/kvproto/pkg/sharedbytes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
@ -43,7 +41,7 @@ func (m *KeyRange) Reset() { *m = KeyRange{} }
|
|||||||
func (m *KeyRange) String() string { return proto.CompactTextString(m) }
|
func (m *KeyRange) String() string { return proto.CompactTextString(m) }
|
||||||
func (*KeyRange) ProtoMessage() {}
|
func (*KeyRange) ProtoMessage() {}
|
||||||
func (*KeyRange) Descriptor() ([]byte, []int) {
|
func (*KeyRange) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_coprocessor_be2a9258674b12d6, []int{0}
|
return fileDescriptor_coprocessor_91b73e0df1108b57, []int{0}
|
||||||
}
|
}
|
||||||
func (m *KeyRange) XXX_Unmarshal(b []byte) error {
|
func (m *KeyRange) XXX_Unmarshal(b []byte) error {
|
||||||
return m.Unmarshal(b)
|
return m.Unmarshal(b)
|
||||||
@ -101,7 +99,7 @@ func (m *Request) Reset() { *m = Request{} }
|
|||||||
func (m *Request) String() string { return proto.CompactTextString(m) }
|
func (m *Request) String() string { return proto.CompactTextString(m) }
|
||||||
func (*Request) ProtoMessage() {}
|
func (*Request) ProtoMessage() {}
|
||||||
func (*Request) Descriptor() ([]byte, []int) {
|
func (*Request) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_coprocessor_be2a9258674b12d6, []int{1}
|
return fileDescriptor_coprocessor_91b73e0df1108b57, []int{1}
|
||||||
}
|
}
|
||||||
func (m *Request) XXX_Unmarshal(b []byte) error {
|
func (m *Request) XXX_Unmarshal(b []byte) error {
|
||||||
return m.Unmarshal(b)
|
return m.Unmarshal(b)
|
||||||
@ -166,21 +164,21 @@ func (m *Request) GetRanges() []*KeyRange {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Response struct {
|
type Response struct {
|
||||||
Data github_com_pingcap_kvproto_pkg_sharedbytes.SharedBytes `protobuf:"bytes,1,opt,name=data,proto3,customtype=github.com/pingcap/kvproto/pkg/sharedbytes.SharedBytes" json:"data"`
|
Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
|
||||||
RegionError *errorpb.Error `protobuf:"bytes,2,opt,name=region_error,json=regionError" json:"region_error,omitempty"`
|
RegionError *errorpb.Error `protobuf:"bytes,2,opt,name=region_error,json=regionError" json:"region_error,omitempty"`
|
||||||
Locked *kvrpcpb.LockInfo `protobuf:"bytes,3,opt,name=locked" json:"locked,omitempty"`
|
Locked *kvrpcpb.LockInfo `protobuf:"bytes,3,opt,name=locked" json:"locked,omitempty"`
|
||||||
OtherError string `protobuf:"bytes,4,opt,name=other_error,json=otherError,proto3" json:"other_error,omitempty"`
|
OtherError string `protobuf:"bytes,4,opt,name=other_error,json=otherError,proto3" json:"other_error,omitempty"`
|
||||||
Range *KeyRange `protobuf:"bytes,5,opt,name=range" json:"range,omitempty"`
|
Range *KeyRange `protobuf:"bytes,5,opt,name=range" json:"range,omitempty"`
|
||||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||||
XXX_unrecognized []byte `json:"-"`
|
XXX_unrecognized []byte `json:"-"`
|
||||||
XXX_sizecache int32 `json:"-"`
|
XXX_sizecache int32 `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Response) Reset() { *m = Response{} }
|
func (m *Response) Reset() { *m = Response{} }
|
||||||
func (m *Response) String() string { return proto.CompactTextString(m) }
|
func (m *Response) String() string { return proto.CompactTextString(m) }
|
||||||
func (*Response) ProtoMessage() {}
|
func (*Response) ProtoMessage() {}
|
||||||
func (*Response) Descriptor() ([]byte, []int) {
|
func (*Response) Descriptor() ([]byte, []int) {
|
||||||
return fileDescriptor_coprocessor_be2a9258674b12d6, []int{2}
|
return fileDescriptor_coprocessor_91b73e0df1108b57, []int{2}
|
||||||
}
|
}
|
||||||
func (m *Response) XXX_Unmarshal(b []byte) error {
|
func (m *Response) XXX_Unmarshal(b []byte) error {
|
||||||
return m.Unmarshal(b)
|
return m.Unmarshal(b)
|
||||||
@ -209,6 +207,13 @@ func (m *Response) XXX_DiscardUnknown() {
|
|||||||
|
|
||||||
var xxx_messageInfo_Response proto.InternalMessageInfo
|
var xxx_messageInfo_Response proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func (m *Response) GetData() []byte {
|
||||||
|
if m != nil {
|
||||||
|
return m.Data
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Response) GetRegionError() *errorpb.Error {
|
func (m *Response) GetRegionError() *errorpb.Error {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
return m.RegionError
|
return m.RegionError
|
||||||
@ -349,33 +354,31 @@ func (m *Response) MarshalTo(dAtA []byte) (int, error) {
|
|||||||
_ = i
|
_ = i
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
dAtA[i] = 0xa
|
if len(m.Data) > 0 {
|
||||||
i++
|
dAtA[i] = 0xa
|
||||||
i = encodeVarintCoprocessor(dAtA, i, uint64(m.Data.Size()))
|
i++
|
||||||
n2, err := m.Data.MarshalTo(dAtA[i:])
|
i = encodeVarintCoprocessor(dAtA, i, uint64(len(m.Data)))
|
||||||
if err != nil {
|
i += copy(dAtA[i:], m.Data)
|
||||||
return 0, err
|
|
||||||
}
|
}
|
||||||
i += n2
|
|
||||||
if m.RegionError != nil {
|
if m.RegionError != nil {
|
||||||
dAtA[i] = 0x12
|
dAtA[i] = 0x12
|
||||||
i++
|
i++
|
||||||
i = encodeVarintCoprocessor(dAtA, i, uint64(m.RegionError.Size()))
|
i = encodeVarintCoprocessor(dAtA, i, uint64(m.RegionError.Size()))
|
||||||
n3, err := m.RegionError.MarshalTo(dAtA[i:])
|
n2, err := m.RegionError.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n3
|
i += n2
|
||||||
}
|
}
|
||||||
if m.Locked != nil {
|
if m.Locked != nil {
|
||||||
dAtA[i] = 0x1a
|
dAtA[i] = 0x1a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintCoprocessor(dAtA, i, uint64(m.Locked.Size()))
|
i = encodeVarintCoprocessor(dAtA, i, uint64(m.Locked.Size()))
|
||||||
n4, err := m.Locked.MarshalTo(dAtA[i:])
|
n3, err := m.Locked.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n4
|
i += n3
|
||||||
}
|
}
|
||||||
if len(m.OtherError) > 0 {
|
if len(m.OtherError) > 0 {
|
||||||
dAtA[i] = 0x22
|
dAtA[i] = 0x22
|
||||||
@ -387,11 +390,11 @@ func (m *Response) MarshalTo(dAtA []byte) (int, error) {
|
|||||||
dAtA[i] = 0x2a
|
dAtA[i] = 0x2a
|
||||||
i++
|
i++
|
||||||
i = encodeVarintCoprocessor(dAtA, i, uint64(m.Range.Size()))
|
i = encodeVarintCoprocessor(dAtA, i, uint64(m.Range.Size()))
|
||||||
n5, err := m.Range.MarshalTo(dAtA[i:])
|
n4, err := m.Range.MarshalTo(dAtA[i:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
i += n5
|
i += n4
|
||||||
}
|
}
|
||||||
if m.XXX_unrecognized != nil {
|
if m.XXX_unrecognized != nil {
|
||||||
i += copy(dAtA[i:], m.XXX_unrecognized)
|
i += copy(dAtA[i:], m.XXX_unrecognized)
|
||||||
@ -457,8 +460,10 @@ func (m *Request) Size() (n int) {
|
|||||||
func (m *Response) Size() (n int) {
|
func (m *Response) Size() (n int) {
|
||||||
var l int
|
var l int
|
||||||
_ = l
|
_ = l
|
||||||
l = m.Data.Size()
|
l = len(m.Data)
|
||||||
n += 1 + l + sovCoprocessor(uint64(l))
|
if l > 0 {
|
||||||
|
n += 1 + l + sovCoprocessor(uint64(l))
|
||||||
|
}
|
||||||
if m.RegionError != nil {
|
if m.RegionError != nil {
|
||||||
l = m.RegionError.Size()
|
l = m.RegionError.Size()
|
||||||
n += 1 + l + sovCoprocessor(uint64(l))
|
n += 1 + l + sovCoprocessor(uint64(l))
|
||||||
@ -846,8 +851,9 @@ func (m *Response) Unmarshal(dAtA []byte) error {
|
|||||||
if postIndex > l {
|
if postIndex > l {
|
||||||
return io.ErrUnexpectedEOF
|
return io.ErrUnexpectedEOF
|
||||||
}
|
}
|
||||||
if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
|
m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
|
||||||
return err
|
if m.Data == nil {
|
||||||
|
m.Data = []byte{}
|
||||||
}
|
}
|
||||||
iNdEx = postIndex
|
iNdEx = postIndex
|
||||||
case 2:
|
case 2:
|
||||||
@ -1105,33 +1111,30 @@ var (
|
|||||||
ErrIntOverflowCoprocessor = fmt.Errorf("proto: integer overflow")
|
ErrIntOverflowCoprocessor = fmt.Errorf("proto: integer overflow")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() { proto.RegisterFile("coprocessor.proto", fileDescriptor_coprocessor_be2a9258674b12d6) }
|
func init() { proto.RegisterFile("coprocessor.proto", fileDescriptor_coprocessor_91b73e0df1108b57) }
|
||||||
|
|
||||||
var fileDescriptor_coprocessor_be2a9258674b12d6 = []byte{
|
var fileDescriptor_coprocessor_91b73e0df1108b57 = []byte{
|
||||||
// 400 bytes of a gzipped FileDescriptorProto
|
// 345 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x51, 0x3d, 0x6f, 0xd4, 0x40,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x51, 0xc1, 0x4e, 0xab, 0x40,
|
||||||
0x10, 0xcd, 0xde, 0x37, 0xe3, 0x24, 0xba, 0xac, 0x82, 0x64, 0x52, 0xf8, 0xac, 0xab, 0x0c, 0x08,
|
0x14, 0x7d, 0x53, 0x68, 0xe9, 0xbb, 0xb4, 0x4d, 0x3b, 0xa9, 0x09, 0x76, 0x81, 0xa4, 0x2b, 0xd4,
|
||||||
0x5b, 0x18, 0x89, 0x92, 0xe2, 0x10, 0x05, 0x82, 0x6a, 0xa1, 0x8f, 0xec, 0xf5, 0xe2, 0x3b, 0x19,
|
0x88, 0x11, 0xff, 0x40, 0xe3, 0xc2, 0xe8, 0x6a, 0xe2, 0xbe, 0xa1, 0x74, 0x44, 0x53, 0xc3, 0xc5,
|
||||||
0x3c, 0xcb, 0xee, 0x26, 0x22, 0x7f, 0x81, 0x5f, 0x40, 0xcf, 0x9f, 0x49, 0x49, 0x4d, 0x11, 0xa1,
|
0x99, 0xd1, 0xe8, 0x9f, 0xb8, 0xf7, 0x67, 0x8c, 0x2b, 0x3f, 0xc1, 0xd4, 0x1f, 0x31, 0xdc, 0x29,
|
||||||
0xe3, 0x8f, 0x20, 0xcf, 0xda, 0xd1, 0x35, 0x54, 0x7e, 0xf3, 0xfc, 0xfc, 0x66, 0xde, 0x33, 0x9c,
|
0x4d, 0x37, 0xae, 0xb8, 0xe7, 0x70, 0x38, 0xf7, 0x9c, 0x0b, 0x8c, 0x72, 0xac, 0x14, 0xe6, 0x52,
|
||||||
0x49, 0xd4, 0x06, 0xa5, 0xb2, 0x16, 0x4d, 0xaa, 0x0d, 0x3a, 0xe4, 0xc1, 0x01, 0x75, 0x71, 0xa2,
|
0x6b, 0x54, 0x49, 0xa5, 0xd0, 0x20, 0xf7, 0xb7, 0xa8, 0x49, 0x5f, 0x2a, 0x85, 0xaa, 0x9a, 0xdb,
|
||||||
0x8c, 0x41, 0xa3, 0x4b, 0xff, 0xee, 0xe2, 0xa4, 0xb9, 0x36, 0x5a, 0xde, 0x8f, 0xe7, 0x35, 0xd6,
|
0x77, 0x93, 0xfe, 0xf2, 0x59, 0x55, 0xf9, 0x06, 0x8e, 0x0b, 0x2c, 0x90, 0xc6, 0xe3, 0x7a, 0xb2,
|
||||||
0x48, 0x30, 0xeb, 0x90, 0x67, 0xd7, 0x39, 0x2c, 0xde, 0xa9, 0x1b, 0x51, 0xb4, 0xb5, 0xe2, 0xe7,
|
0xec, 0x34, 0x85, 0xee, 0x95, 0x7c, 0x15, 0x59, 0x59, 0x48, 0x3e, 0x86, 0xb6, 0x36, 0x99, 0x32,
|
||||||
0x30, 0xb5, 0xae, 0x30, 0x2e, 0x64, 0x31, 0x4b, 0x8e, 0x85, 0x1f, 0xf8, 0x12, 0xc6, 0xaa, 0xad,
|
0x01, 0x8b, 0x58, 0xdc, 0x13, 0x16, 0xf0, 0x21, 0x38, 0xb2, 0x5c, 0x04, 0x2d, 0xe2, 0xea, 0x71,
|
||||||
0xc2, 0x11, 0x71, 0x1d, 0x5c, 0xff, 0x64, 0x30, 0x17, 0xea, 0xeb, 0x95, 0xb2, 0x8e, 0x3f, 0x81,
|
0xfa, 0xce, 0xc0, 0x13, 0xf2, 0xf1, 0x49, 0x6a, 0xc3, 0x0f, 0xc0, 0xcb, 0xb1, 0x34, 0xf2, 0xc5,
|
||||||
0xb9, 0xc4, 0xd6, 0xa9, 0x6f, 0xfe, 0xab, 0x20, 0x5f, 0xa6, 0xc3, 0xda, 0xd7, 0x9e, 0x17, 0x83,
|
0x7e, 0xe5, 0xa7, 0xc3, 0xa4, 0x59, 0x7b, 0x6e, 0x79, 0xd1, 0x08, 0xf8, 0x00, 0x5a, 0xa6, 0x22,
|
||||||
0x80, 0x9f, 0xc2, 0xc8, 0x69, 0x32, 0x1a, 0x8b, 0x91, 0xd3, 0x9c, 0xc3, 0xa4, 0x2a, 0x5c, 0x11,
|
0x23, 0x47, 0xb4, 0x4c, 0xc5, 0x39, 0xb8, 0x8b, 0xcc, 0x64, 0x81, 0x43, 0xd6, 0x34, 0xf3, 0x23,
|
||||||
0x8e, 0xc9, 0x9a, 0x30, 0x7f, 0x06, 0x33, 0xd3, 0x1d, 0x63, 0xc3, 0x49, 0x3c, 0x4e, 0x82, 0xfc,
|
0xe8, 0xa8, 0x3a, 0x8c, 0x0e, 0xdc, 0xc8, 0x89, 0xfd, 0x74, 0x27, 0xd9, 0x2e, 0xdd, 0x44, 0x15,
|
||||||
0x61, 0x7a, 0x18, 0x7a, 0x38, 0x55, 0xf4, 0x22, 0xfe, 0x08, 0x16, 0x74, 0xe5, 0xa5, 0xb3, 0xe1,
|
0x6b, 0x11, 0xdf, 0x85, 0x2e, 0xa5, 0x9c, 0x19, 0x1d, 0x78, 0x11, 0x8b, 0x5d, 0xe1, 0x11, 0xbe,
|
||||||
0x3c, 0x66, 0xc9, 0x44, 0xcc, 0x69, 0xfe, 0x68, 0xd7, 0xdf, 0x47, 0xb0, 0x10, 0xca, 0x6a, 0x6c,
|
0xd1, 0xd3, 0x4f, 0x06, 0x5d, 0x21, 0x75, 0x85, 0xa5, 0x96, 0x9b, 0x55, 0x6c, 0x6b, 0xd5, 0x09,
|
||||||
0xad, 0xe2, 0xa2, 0x5f, 0x45, 0xc9, 0x36, 0xaf, 0x6e, 0xef, 0x56, 0x47, 0xbf, 0xef, 0x56, 0x2f,
|
0xf4, 0x94, 0x2c, 0xee, 0xb1, 0x9c, 0xd1, 0xdd, 0x28, 0x98, 0x9f, 0x0e, 0x92, 0xe6, 0x8a, 0x17,
|
||||||
0xeb, 0x9d, 0xdb, 0x5e, 0x95, 0xa9, 0xc4, 0x2f, 0x99, 0xde, 0xb5, 0xb5, 0x2c, 0x74, 0xd6, 0x5c,
|
0xf5, 0x53, 0xf8, 0x56, 0x43, 0x80, 0xef, 0x43, 0xe7, 0x01, 0xf3, 0xa5, 0x5c, 0x50, 0x66, 0x3f,
|
||||||
0xfb, 0x8e, 0x74, 0x53, 0x67, 0x76, 0x5b, 0x18, 0x55, 0x95, 0x37, 0x4e, 0xd9, 0xf4, 0x03, 0xe1,
|
0x1d, 0x6d, 0xca, 0x5e, 0x63, 0xbe, 0xbc, 0x2c, 0x6f, 0x51, 0xac, 0x05, 0x7c, 0x0f, 0x7c, 0x34,
|
||||||
0x4d, 0x87, 0xfb, 0x53, 0x9f, 0xc3, 0xb1, 0x51, 0xf5, 0x0e, 0xdb, 0x4b, 0xea, 0x9d, 0x82, 0x05,
|
0x77, 0x52, 0xad, 0xcd, 0xdd, 0x88, 0xc5, 0xff, 0x05, 0x10, 0x65, 0xbd, 0x0e, 0xa1, 0x4d, 0x25,
|
||||||
0xf9, 0x69, 0x3a, 0xfc, 0x85, 0x37, 0xdd, 0x53, 0x04, 0x5e, 0x43, 0x03, 0x7f, 0x0c, 0xb3, 0xcf,
|
0x82, 0x36, 0x59, 0xfd, 0x51, 0xd4, 0x6a, 0xce, 0x86, 0x1f, 0xab, 0x90, 0x7d, 0xad, 0x42, 0xf6,
|
||||||
0x28, 0x1b, 0x55, 0x51, 0xe6, 0x20, 0x3f, 0xbb, 0x2f, 0xeb, 0x3d, 0xca, 0xe6, 0x6d, 0xfb, 0x09,
|
0xbd, 0x0a, 0xd9, 0xdb, 0x4f, 0xf8, 0x6f, 0xde, 0xa1, 0xff, 0x77, 0xfa, 0x1b, 0x00, 0x00, 0xff,
|
||||||
0x45, 0x2f, 0xe0, 0x2b, 0x08, 0xd0, 0x6d, 0x95, 0xe9, 0xcd, 0x27, 0x31, 0x4b, 0x1e, 0x08, 0x20,
|
0xff, 0xbb, 0xf7, 0xf1, 0x61, 0x15, 0x02, 0x00, 0x00,
|
||||||
0xca, 0x7b, 0x3d, 0x85, 0x29, 0x95, 0x10, 0x4e, 0xc9, 0xea, 0x3f, 0x45, 0x79, 0xcd, 0x66, 0x79,
|
|
||||||
0xbb, 0x8f, 0xd8, 0xaf, 0x7d, 0xc4, 0xfe, 0xec, 0x23, 0xf6, 0xe3, 0x6f, 0x74, 0x54, 0xce, 0x28,
|
|
||||||
0xe6, 0x8b, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x25, 0xbf, 0xd1, 0x29, 0x55, 0x02, 0x00, 0x00,
|
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ message Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message Response {
|
message Response {
|
||||||
bytes data = 1 [(gogoproto.customtype) = "github.com/pingcap/kvproto/pkg/sharedbytes.SharedBytes", (gogoproto.nullable) = false];
|
bytes data = 1;
|
||||||
errorpb.Error region_error = 2;
|
errorpb.Error region_error = 2;
|
||||||
kvrpcpb.LockInfo locked = 3;
|
kvrpcpb.LockInfo locked = 3;
|
||||||
string other_error = 4;
|
string other_error = 4;
|
||||||
|
@ -1,106 +0,0 @@
|
|||||||
TEST_PKGS := $(shell find . -iname "*_test.go" -exec dirname {} \; | \
|
|
||||||
sort -u | sed -e "s/^\./github.com\/pingcap\/pd/")
|
|
||||||
INTEGRATION_TEST_PKGS := $(shell find . -iname "*_test.go" -exec dirname {} \; | \
|
|
||||||
sort -u | sed -e "s/^\./github.com\/pingcap\/pd/" | grep -E "tests")
|
|
||||||
BASIC_TEST_PKGS := $(filter-out $(INTEGRATION_TEST_PKGS),$(TEST_PKGS))
|
|
||||||
|
|
||||||
PACKAGES := go list ./...
|
|
||||||
PACKAGE_DIRECTORIES := $(PACKAGES) | sed 's|github.com/pingcap-incubator/tinykv/scheduler/||'
|
|
||||||
GOCHECKER := awk '{ print } END { if (NR > 0) { exit 1 } }'
|
|
||||||
RETOOL := ./scripts/retool
|
|
||||||
OVERALLS := overalls
|
|
||||||
|
|
||||||
FAILPOINT_ENABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|\.retools)" | xargs ./scripts/retool do failpoint-ctl enable)
|
|
||||||
FAILPOINT_DISABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|\.retools)" | xargs ./scripts/retool do failpoint-ctl disable)
|
|
||||||
|
|
||||||
GOVER_MAJOR := $(shell go version | sed -E -e "s/.*go([0-9]+)[.]([0-9]+).*/\1/")
|
|
||||||
GOVER_MINOR := $(shell go version | sed -E -e "s/.*go([0-9]+)[.]([0-9]+).*/\2/")
|
|
||||||
GO111 := $(shell [ $(GOVER_MAJOR) -gt 1 ] || [ $(GOVER_MAJOR) -eq 1 ] && [ $(GOVER_MINOR) -ge 11 ]; echo $$?)
|
|
||||||
ifeq ($(GO111), 1)
|
|
||||||
$(error "go below 1.11 does not support modules")
|
|
||||||
endif
|
|
||||||
|
|
||||||
default: build
|
|
||||||
|
|
||||||
all: dev
|
|
||||||
|
|
||||||
dev: build check test
|
|
||||||
|
|
||||||
ci: build check basic-test
|
|
||||||
|
|
||||||
build: pd-server
|
|
||||||
pd-server: export GO111MODULE=on
|
|
||||||
pd-server:
|
|
||||||
ifeq ("$(WITH_RACE)", "1")
|
|
||||||
CGO_ENABLED=1 go build -race -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o bin/pd-server cmd/pd-server/main.go
|
|
||||||
else
|
|
||||||
CGO_ENABLED=0 go build -gcflags '$(GCFLAGS)' -ldflags '$(LDFLAGS)' -o bin/pd-server cmd/pd-server/main.go
|
|
||||||
endif
|
|
||||||
|
|
||||||
test: retool-setup
|
|
||||||
# testing...
|
|
||||||
@$(DEADLOCK_ENABLE)
|
|
||||||
@$(FAILPOINT_ENABLE)
|
|
||||||
CGO_ENABLED=1 GO111MODULE=on go test -race -cover $(TEST_PKGS) || { $(FAILPOINT_DISABLE); $(DEADLOCK_DISABLE); exit 1; }
|
|
||||||
@$(FAILPOINT_DISABLE)
|
|
||||||
@$(DEADLOCK_DISABLE)
|
|
||||||
|
|
||||||
basic-test:
|
|
||||||
@$(FAILPOINT_ENABLE)
|
|
||||||
GO111MODULE=on go test $(BASIC_TEST_PKGS) || { $(FAILPOINT_DISABLE); exit 1; }
|
|
||||||
@$(FAILPOINT_DISABLE)
|
|
||||||
|
|
||||||
# These need to be fixed before they can be ran regularly
|
|
||||||
check-fail:
|
|
||||||
CGO_ENABLED=0 ./scripts/retool do gometalinter.v2 --disable-all \
|
|
||||||
--enable errcheck \
|
|
||||||
$$($(PACKAGE_DIRECTORIES))
|
|
||||||
CGO_ENABLED=0 ./scripts/retool do gosec $$($(PACKAGE_DIRECTORIES))
|
|
||||||
|
|
||||||
check-all: static lint tidy
|
|
||||||
@echo "checking"
|
|
||||||
|
|
||||||
retool-setup: export GO111MODULE=off
|
|
||||||
retool-setup:
|
|
||||||
@which retool >/dev/null 2>&1 || go get github.com/twitchtv/retool
|
|
||||||
@./scripts/retool sync
|
|
||||||
|
|
||||||
check: retool-setup check-all
|
|
||||||
|
|
||||||
static: export GO111MODULE=on
|
|
||||||
static:
|
|
||||||
@ # Not running vet and fmt through metalinter becauase it ends up looking at vendor
|
|
||||||
gofmt -s -l $$($(PACKAGE_DIRECTORIES)) 2>&1 | $(GOCHECKER)
|
|
||||||
./scripts/retool do govet --shadow $$($(PACKAGE_DIRECTORIES)) 2>&1 | $(GOCHECKER)
|
|
||||||
|
|
||||||
CGO_ENABLED=0 ./scripts/retool do golangci-lint run --disable-all --deadline 120s \
|
|
||||||
--enable misspell \
|
|
||||||
--enable staticcheck \
|
|
||||||
--enable ineffassign \
|
|
||||||
$$($(PACKAGE_DIRECTORIES))
|
|
||||||
|
|
||||||
lint:
|
|
||||||
@echo "linting"
|
|
||||||
CGO_ENABLED=0 ./scripts/retool do revive -formatter friendly -config revive.toml $$($(PACKAGES))
|
|
||||||
|
|
||||||
tidy:
|
|
||||||
@echo "go mod tidy"
|
|
||||||
GO111MODULE=on go mod tidy
|
|
||||||
git diff --quiet go.mod go.sum
|
|
||||||
|
|
||||||
travis_coverage: export GO111MODULE=on
|
|
||||||
travis_coverage:
|
|
||||||
ifeq ("$(TRAVIS_COVERAGE)", "1")
|
|
||||||
@$(FAILPOINT_ENABLE)
|
|
||||||
CGO_ENABLED=1 ./scripts/retool do $(OVERALLS) -concurrency=8 -project=github.com/pingcap-incubator/tinykv/scheduler -covermode=count -ignore='.git,vendor' -- -coverpkg=./... || { $(FAILPOINT_DISABLE); exit 1; }
|
|
||||||
@$(FAILPOINT_DISABLE)
|
|
||||||
else
|
|
||||||
@echo "coverage only runs in travis."
|
|
||||||
endif
|
|
||||||
|
|
||||||
clean-test:
|
|
||||||
rm -rf /tmp/test_pd*
|
|
||||||
rm -rf /tmp/pd-tests*
|
|
||||||
rm -rf /tmp/test_etcd*
|
|
||||||
|
|
||||||
.PHONY: all ci vendor clean-test tidy
|
|
@ -137,7 +137,6 @@ func NewConfig() *Config {
|
|||||||
|
|
||||||
fs.StringVar(&cfg.Log.Level, "L", "", "log level: debug, info, warn, error, fatal (default 'info')")
|
fs.StringVar(&cfg.Log.Level, "L", "", "log level: debug, info, warn, error, fatal (default 'info')")
|
||||||
fs.StringVar(&cfg.Log.File.Filename, "log-file", "", "log file path")
|
fs.StringVar(&cfg.Log.File.Filename, "log-file", "", "log file path")
|
||||||
fs.BoolVar(&cfg.Log.File.LogRotate, "log-rotate", true, "rotate log")
|
|
||||||
|
|
||||||
fs.StringVar(&cfg.Security.CAPath, "cacert", "", "Path of file that contains list of trusted TLS CAs")
|
fs.StringVar(&cfg.Security.CAPath, "cacert", "", "Path of file that contains list of trusted TLS CAs")
|
||||||
fs.StringVar(&cfg.Security.CertPath, "cert", "", "Path of file that contains X509 certificate in PEM format")
|
fs.StringVar(&cfg.Security.CertPath, "cert", "", "Path of file that contains X509 certificate in PEM format")
|
||||||
|
Loading…
Reference in New Issue
Block a user