diff --git a/.build-tools/go.mod b/.build-tools/go.mod index 29ced0a66..4bf0c0562 100644 --- a/.build-tools/go.mod +++ b/.build-tools/go.mod @@ -7,16 +7,16 @@ require ( github.com/invopop/jsonschema v0.6.0 github.com/spf13/cobra v1.6.1 github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc sigs.k8s.io/yaml v1.3.0 ) require ( - github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce // indirect + github.com/dapr/kit v0.0.5 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect diff --git a/.build-tools/go.sum b/.build-tools/go.sum index cbd0568f1..a4bb55b64 100644 --- a/.build-tools/go.sum +++ b/.build-tools/go.sum @@ -1,10 +1,10 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= +github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg= +github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= @@ -12,16 +12,16 @@ github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7P github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hCbmY= github.com/invopop/jsonschema v0.6.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -37,8 +37,8 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 h1:ImnGIsrcG8vwbovhYvvSY8fagVV6QhCWSWXfzwGDLVs= github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/bindings/zeebe/command/deploy_process.go b/bindings/zeebe/command/deploy_process.go index 134b4490a..fe8242b14 100644 --- a/bindings/zeebe/command/deploy_process.go +++ b/bindings/zeebe/command/deploy_process.go @@ -38,10 +38,9 @@ func (z *ZeebeCommand) deployProcess(ctx context.Context, req *bindings.InvokeRe return nil, ErrMissingFileName } - // TODO: Replace with a method that is not deprecated. - response, err := z.client.NewDeployProcessCommand(). //nolint:staticcheck - AddResource(req.Data, deployFileName). - Send(ctx) + response, err := z.client.NewDeployResourceCommand(). + AddResource(req.Data, deployFileName). + Send(ctx) if err != nil { return nil, fmt.Errorf("cannot deploy process with fileName %s: %w", deployFileName, err) } diff --git a/go.mod b/go.mod index 4d6ebd5dc..8f2dc772b 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/apache/rocketmq-client-go/v2 v2.1.2-0.20230412142645-25003f6f083d github.com/apache/thrift v0.13.0 github.com/aws/aws-sdk-go v1.44.214 - github.com/benbjohnson/clock v1.3.0 + github.com/benbjohnson/clock v1.3.4 github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746 github.com/camunda/zeebe/clients/go/v8 v8.1.8 github.com/cenkalti/backoff/v4 v4.2.1 @@ -51,13 +51,13 @@ require ( github.com/cloudwego/kitex-examples v0.1.1 github.com/cyphar/filepath-securejoin v0.2.3 github.com/dancannon/gorethink v4.0.0+incompatible - github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce + github.com/dapr/kit v0.0.5 github.com/didip/tollbooth/v7 v7.0.1 github.com/eclipse/paho.mqtt.golang v1.4.2 github.com/fasthttp-contrib/sessions v0.0.0-20160905201309-74f6ac73d5d5 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/go-redis/redis/v8 v8.11.5 - github.com/go-sql-driver/mysql v1.7.0 + github.com/go-sql-driver/mysql v1.7.1 github.com/go-zookeeper/zk v1.0.3 github.com/gocql/gocql v1.3.1 github.com/golang/mock v1.6.0 @@ -67,7 +67,6 @@ require ( github.com/grandcat/zeroconf v1.0.0 github.com/hamba/avro/v2 v2.5.0 github.com/hashicorp/consul/api v1.13.0 - github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru/v2 v2.0.2 github.com/hazelcast/hazelcast-go-client v0.0.0-20190530123621-6cf767c2f31a github.com/http-wasm/http-wasm-host-go v0.4.2 @@ -97,14 +96,14 @@ require ( github.com/rabbitmq/amqp091-go v1.7.0 github.com/redis/go-redis/v9 v9.0.3 github.com/sendgrid/sendgrid-go v3.12.0+incompatible - github.com/sijms/go-ora/v2 v2.6.11 - github.com/spf13/cast v1.5.0 + github.com/sijms/go-ora/v2 v2.7.6 + github.com/spf13/cast v1.5.1 github.com/stretchr/testify v1.8.2 github.com/supplyon/gremcos v0.1.40 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.608 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm v1.0.608 github.com/tetratelabs/wazero v1.1.0 - github.com/valyala/fasthttp v1.45.0 + github.com/valyala/fasthttp v1.47.0 github.com/vmware/vmware-go-kcl v1.5.0 github.com/xdg-go/scram v1.1.2 go.etcd.io/etcd/client/v3 v3.5.5 @@ -113,11 +112,11 @@ require ( go.temporal.io/sdk v1.21.1 go.uber.org/multierr v1.11.0 go.uber.org/ratelimit v0.2.0 - golang.org/x/crypto v0.8.0 - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 + golang.org/x/crypto v0.9.0 + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc golang.org/x/mod v0.10.0 - golang.org/x/net v0.9.0 - golang.org/x/oauth2 v0.6.0 + golang.org/x/net v0.10.0 + golang.org/x/oauth2 v0.8.0 google.golang.org/api v0.115.0 google.golang.org/grpc v1.54.0 gopkg.in/couchbase/gocb.v1 v1.6.7 @@ -128,7 +127,7 @@ require ( k8s.io/apimachinery v0.26.3 k8s.io/client-go v0.26.3 k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 - modernc.org/sqlite v1.21.1 + modernc.org/sqlite v1.22.1 ) require ( @@ -249,6 +248,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect @@ -360,13 +360,13 @@ require ( go.opencensus.io v0.24.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/arch v0.2.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/sync v0.2.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.9.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect @@ -388,7 +388,7 @@ require ( lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.3 // indirect + modernc.org/libc v1.22.6 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/opt v0.1.3 // indirect diff --git a/go.sum b/go.sum index 7938ab3fa..934e5fcd7 100644 --- a/go.sum +++ b/go.sum @@ -615,8 +615,9 @@ github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f h1: github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f/go.mod h1:SghidfnxvX7ribW6nHI7T+IBbc9puZ9kk5Tx/88h8P4= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4= +github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= @@ -783,8 +784,8 @@ github.com/dancannon/gorethink v4.0.0+incompatible h1:KFV7Gha3AuqT+gr0B/eKvGhbjm github.com/dancannon/gorethink v4.0.0+incompatible/go.mod h1:BLvkat9KmZc1efyYwhz3WnybhRZtgF1K929FD8z1avU= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= +github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg= +github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= 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= @@ -891,7 +892,7 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -976,8 +977,9 @@ github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPr github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -1414,8 +1416,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -1770,8 +1772,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So 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/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= @@ -1799,8 +1801,8 @@ github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+ github.com/shirou/gopsutil/v3 v3.22.2 h1:wCrArWFkHYIdDxx/FSfF5RB4dpJYW6t7rcp3+zL8uks= github.com/shirou/gopsutil/v3 v3.22.2/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sijms/go-ora/v2 v2.6.11 h1:inBa/Tp0/kEl2prd3p5VabDXvmgVEelg328RYwsOCiE= -github.com/sijms/go-ora/v2 v2.6.11/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= +github.com/sijms/go-ora/v2 v2.7.6 h1:QyR1CKFxG+VVk2+LdHoHF4NxDSvcQ3deBXtZCrahSq4= +github.com/sijms/go-ora/v2 v2.7.6/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1835,8 +1837,8 @@ github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= @@ -1932,8 +1934,8 @@ github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhA github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.21.0/go.mod h1:jjraHZVbKOXftJfsOYoAjaeygpj5hr8ermTRJNroD7A= -github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= -github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= +github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= @@ -2089,8 +2091,9 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2122,8 +2125,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2139,8 +2142,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2273,8 +2276,8 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2302,8 +2305,8 @@ golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -2319,8 +2322,9 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2464,8 +2468,8 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230105183443-b8be2fde2a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2475,8 +2479,8 @@ golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2587,8 +2591,8 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2967,22 +2971,22 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= -modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= +modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= +modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= -modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= +modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= +modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/component/postgresql/dbaccess.go b/internal/component/postgresql/dbaccess.go index 13a1cef13..d9e73e085 100644 --- a/internal/component/postgresql/dbaccess.go +++ b/internal/component/postgresql/dbaccess.go @@ -26,11 +26,9 @@ import ( type dbAccess interface { Init(ctx context.Context, metadata state.Metadata) error Set(ctx context.Context, req *state.SetRequest) error - BulkSet(ctx context.Context, req []state.SetRequest) error Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) BulkGet(ctx context.Context, req []state.GetRequest) ([]state.BulkGetResponse, error) Delete(ctx context.Context, req *state.DeleteRequest) error - BulkDelete(ctx context.Context, req []state.DeleteRequest) error ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error Query(ctx context.Context, req *state.QueryRequest) (*state.QueryResponse, error) Close() error // io.Closer diff --git a/internal/component/postgresql/postgresdbaccess.go b/internal/component/postgresql/postgresdbaccess.go index d0dcfc41b..ae2dc27ec 100644 --- a/internal/component/postgresql/postgresdbaccess.go +++ b/internal/component/postgresql/postgresdbaccess.go @@ -32,6 +32,7 @@ import ( "github.com/dapr/components-contrib/state/query" stateutils "github.com/dapr/components-contrib/state/utils" "github.com/dapr/kit/logger" + "github.com/dapr/kit/ptr" ) var errMissingConnectionString = errors.New("missing connection string") @@ -228,32 +229,6 @@ func (p *PostgresDBAccess) doSet(parentCtx context.Context, db dbquerier, req *s return nil } -func (p *PostgresDBAccess) BulkSet(parentCtx context.Context, req []state.SetRequest) error { - tx, err := p.beginTx(parentCtx) - if err != nil { - return err - } - defer p.rollbackTx(parentCtx, tx, "BulkSet") - - if len(req) > 0 { - for i := range req { - err = p.doSet(parentCtx, tx, &req[i]) - if err != nil { - return err - } - } - } - - ctx, cancel := context.WithTimeout(parentCtx, p.metadata.Timeout) - err = tx.Commit(ctx) - cancel() - if err != nil { - return fmt.Errorf("failed to commit transaction: %w", err) - } - - return nil -} - // Get returns data from the database. If data does not exist for the key an empty state.GetResponse will be returned. func (p *PostgresDBAccess) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) { if req.Key == "" { @@ -280,7 +255,7 @@ func (p *PostgresDBAccess) Get(parentCtx context.Context, req *state.GetRequest) return &state.GetResponse{ Data: value, - ETag: &etag, + ETag: etag, }, nil } @@ -314,36 +289,32 @@ func (p *PostgresDBAccess) BulkGet(parentCtx context.Context, req []state.GetReq } // Scan all rows - var ( - n int - etag string - ) + var n int res := make([]state.BulkGetResponse, len(req)) for ; rows.Next(); n++ { r := state.BulkGetResponse{} - r.Key, r.Data, etag, err = readRow(rows) + r.Key, r.Data, r.ETag, err = readRow(rows) if err != nil { r.Error = err.Error() } - r.ETag = &etag res[n] = r } return res[:n], nil } -func readRow(row pgx.Row) (key string, value []byte, etagS string, err error) { +func readRow(row pgx.Row) (key string, value []byte, etagS *string, err error) { var ( isBinary bool etag pgtype.Int8 ) err = row.Scan(&key, &value, &isBinary, &etag) if err != nil { - return key, nil, "", err + return key, nil, nil, err } if etag.Valid { - etagS = strconv.FormatInt(etag.Int64, 10) + etagS = ptr.Of(strconv.FormatInt(etag.Int64, 10)) } if isBinary { @@ -354,12 +325,12 @@ func readRow(row pgx.Row) (key string, value []byte, etagS string, err error) { err = json.Unmarshal(value, &s) if err != nil { - return key, nil, "", fmt.Errorf("failed to unmarshal JSON data: %w", err) + return key, nil, nil, fmt.Errorf("failed to unmarshal JSON data: %w", err) } data, err = base64.StdEncoding.DecodeString(s) if err != nil { - return key, nil, "", fmt.Errorf("failed to decode base64 data: %w", err) + return key, nil, nil, fmt.Errorf("failed to decode base64 data: %w", err) } return key, data, etagS, nil @@ -405,32 +376,6 @@ func (p *PostgresDBAccess) doDelete(parentCtx context.Context, db dbquerier, req return nil } -func (p *PostgresDBAccess) BulkDelete(parentCtx context.Context, req []state.DeleteRequest) error { - tx, err := p.beginTx(parentCtx) - if err != nil { - return err - } - defer p.rollbackTx(parentCtx, tx, "BulkDelete") - - if len(req) > 0 { - for i := range req { - err = p.doDelete(parentCtx, tx, &req[i]) - if err != nil { - return err - } - } - } - - ctx, cancel := context.WithTimeout(parentCtx, p.metadata.Timeout) - err = tx.Commit(ctx) - cancel() - if err != nil { - return fmt.Errorf("failed to commit transaction: %w", err) - } - - return nil -} - func (p *PostgresDBAccess) ExecuteMulti(parentCtx context.Context, request *state.TransactionalStateRequest) error { tx, err := p.beginTx(parentCtx) if err != nil { diff --git a/internal/component/postgresql/postgresdbaccess_test.go b/internal/component/postgresql/postgresdbaccess_test.go index 326467d01..dfccd3313 100644 --- a/internal/component/postgresql/postgresdbaccess_test.go +++ b/internal/component/postgresql/postgresdbaccess_test.go @@ -180,118 +180,6 @@ func TestMultiOperationOrder(t *testing.T) { assert.NoError(t, err) } -func TestInvalidBulkSetNoKey(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.db.Close() - - m.db.ExpectBegin() - m.db.ExpectRollback() - - sets := []state.SetRequest{ - // Set request without key is not valid for Set operation - {Value: "value1"}, - } - - // Act - err := m.pgDba.BulkSet(context.Background(), sets) - - // Assert - assert.Error(t, err) -} - -func TestInvalidBulkSetEmptyValue(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.db.Close() - - m.db.ExpectBegin() - m.db.ExpectRollback() - - sets := []state.SetRequest{ - // Set request without value is not valid for Set operation - {Key: "key1", Value: "value1"}, - } - - // Act - err := m.pgDba.BulkSet(context.Background(), sets) - - // Assert - assert.Error(t, err) -} - -func TestValidBulkSet(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.db.Close() - - sets := []state.SetRequest{ - { - Key: "key1", - Value: "value1", - }, - } - - m.db.ExpectBegin() - m.db.ExpectExec("INSERT INTO"). - WithArgs("key1", `"value1"`, false). - WillReturnResult(pgxmock.NewResult("INSERT", 1)) - m.db.ExpectCommit() - // There's also a rollback called after a commit, which is expected and will not have effect - m.db.ExpectRollback() - - // Act - err := m.pgDba.BulkSet(context.Background(), sets) - - // Assert - assert.NoError(t, err) -} - -func TestInvalidBulkDeleteNoKey(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.db.Close() - - m.db.ExpectBegin() - m.db.ExpectRollback() - - var deletes []state.DeleteRequest - - deletes = append(deletes, state.DeleteRequest{ // Delete request without key is not valid for Delete operation - Key: "", - }) - - // Act - err := m.pgDba.BulkDelete(context.Background(), deletes) - - // Assert - assert.Error(t, err) -} - -func TestValidBulkDelete(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.db.Close() - - deletes := []state.DeleteRequest{ - {Key: "key1"}, - } - - m.db.ExpectBegin() - m.db.ExpectExec("DELETE FROM"). - WithArgs("key1"). - WillReturnResult(pgxmock.NewResult("DELETE", 1)) - m.db.ExpectCommit() - // There's also a rollback called after a commit, which is expected and will not have effect - m.db.ExpectRollback() - - // Act - err := m.pgDba.BulkDelete(context.Background(), deletes) - - // Assert - assert.NoError(t, err) -} - func createSetRequest() state.SetRequest { return state.SetRequest{ Key: randomKey(), diff --git a/internal/component/postgresql/postgresql.go b/internal/component/postgresql/postgresql.go index 25ff7eeb8..d5fc0f401 100644 --- a/internal/component/postgresql/postgresql.go +++ b/internal/component/postgresql/postgresql.go @@ -79,11 +79,6 @@ func (p *PostgreSQL) Delete(ctx context.Context, req *state.DeleteRequest) error return p.dbaccess.Delete(ctx, req) } -// BulkDelete removes multiple entries from the store. -func (p *PostgreSQL) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - return p.dbaccess.BulkDelete(ctx, req) -} - // Get returns an entity from store. func (p *PostgreSQL) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { return p.dbaccess.Get(ctx, req) @@ -100,11 +95,6 @@ func (p *PostgreSQL) Set(ctx context.Context, req *state.SetRequest) error { return p.dbaccess.Set(ctx, req) } -// BulkSet adds/updates multiple entities on store. -func (p *PostgreSQL) BulkSet(ctx context.Context, req []state.SetRequest) error { - return p.dbaccess.BulkSet(ctx, req) -} - // Multi handles multiple transactions. Implements TransactionalStore. func (p *PostgreSQL) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { return p.dbaccess.ExecuteMulti(ctx, request) diff --git a/internal/component/postgresql/postgresql_test.go b/internal/component/postgresql/postgresql_test.go index 49447172b..971b93334 100644 --- a/internal/component/postgresql/postgresql_test.go +++ b/internal/component/postgresql/postgresql_test.go @@ -66,14 +66,6 @@ func (m *fakeDBaccess) Delete(ctx context.Context, req *state.DeleteRequest) err return nil } -func (m *fakeDBaccess) BulkSet(ctx context.Context, req []state.SetRequest) error { - return nil -} - -func (m *fakeDBaccess) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - return nil -} - func (m *fakeDBaccess) ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error { return nil } diff --git a/state/alicloud/tablestore/tablestore.go b/state/alicloud/tablestore/tablestore.go index e3b70c389..fc2de00dd 100644 --- a/state/alicloud/tablestore/tablestore.go +++ b/state/alicloud/tablestore/tablestore.go @@ -215,35 +215,6 @@ func (s *AliCloudTableStore) deleteRowChange(req *state.DeleteRequest) *tablesto return change } -func (s *AliCloudTableStore) BulkSet(ctx context.Context, reqs []state.SetRequest) error { - return s.batchWrite(ctx, reqs, nil) -} - -func (s *AliCloudTableStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest) error { - return s.batchWrite(ctx, nil, reqs) -} - -func (s *AliCloudTableStore) batchWrite(ctx context.Context, setReqs []state.SetRequest, deleteReqs []state.DeleteRequest) error { - bathReq := &tablestore.BatchWriteRowRequest{ - IsAtomic: true, - } - - for i := range setReqs { - bathReq.AddRowChange(s.updateRowChange(&setReqs[i])) - } - - for i := range deleteReqs { - bathReq.AddRowChange(s.deleteRowChange(&deleteReqs[i])) - } - - _, err := s.client.BatchWriteRow(bathReq) - if err != nil { - return err - } - - return nil -} - func (s *AliCloudTableStore) parse(meta state.Metadata) (*tablestoreMetadata, error) { var m tablestoreMetadata err := metadata.DecodeMetadata(meta.Properties, &m) diff --git a/state/alicloud/tablestore/tablestore_test.go b/state/alicloud/tablestore/tablestore_test.go index fa195cbfd..0f99a39d5 100644 --- a/state/alicloud/tablestore/tablestore_test.go +++ b/state/alicloud/tablestore/tablestore_test.go @@ -55,6 +55,7 @@ func TestReadAndWrite(t *testing.T) { store := &AliCloudTableStore{ logger: logger.NewLogger("test"), } + store.BulkStore = state.NewDefaultBulkStore(store) store.Init(context.Background(), state.Metadata{}) store.client = &mockClient{ @@ -108,7 +109,7 @@ func TestReadAndWrite(t *testing.T) { }, { Key: "theSecondKey", Value: "777", - }}) + }}, state.BulkStoreOpts{}) require.NoError(t, err) }) diff --git a/state/aws/dynamodb/dynamodb.go b/state/aws/dynamodb/dynamodb.go index e6adc1a2d..d7bc6cb32 100644 --- a/state/aws/dynamodb/dynamodb.go +++ b/state/aws/dynamodb/dynamodb.go @@ -187,44 +187,6 @@ func (d *StateStore) Set(ctx context.Context, req *state.SetRequest) error { return err } -// BulkSet performs a bulk set operation. -func (d *StateStore) BulkSet(ctx context.Context, req []state.SetRequest) error { - if len(req) == 1 { - return d.Set(ctx, &req[0]) - } - - writeRequests := make([]*dynamodb.WriteRequest, len(req)) - for i := range req { - if req[i].ETag != nil && *req[i].ETag != "" { - return errors.New("dynamodb error: BulkSet() does not support etags; please use Set() instead") - } - if req[i].Options.Concurrency == state.FirstWrite { - return errors.New("dynamodb error: BulkSet() does not support FirstWrite concurrency; please use Set() instead") - } - - item, err := d.getItemFromReq(&req[i]) - if err != nil { - return err - } - - writeRequests[i] = &dynamodb.WriteRequest{ - PutRequest: &dynamodb.PutRequest{ - Item: item, - }, - } - } - - requestItems := map[string][]*dynamodb.WriteRequest{ - d.table: writeRequests, - } - - _, e := d.client.BatchWriteItemWithContext(ctx, &dynamodb.BatchWriteItemInput{ - RequestItems: requestItems, - }) - - return e -} - // Delete performs a delete operation. func (d *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error { input := &dynamodb.DeleteItemInput{ @@ -257,40 +219,6 @@ func (d *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error return err } -// BulkDelete performs a bulk delete operation. -func (d *StateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - if len(req) == 1 { - return d.Delete(ctx, &req[0]) - } - - writeRequests := make([]*dynamodb.WriteRequest, len(req)) - for i, r := range req { - if r.ETag != nil && *r.ETag != "" { - return errors.New("dynamodb error: BulkDelete() does not support etags; please use Delete() instead") - } - - writeRequests[i] = &dynamodb.WriteRequest{ - DeleteRequest: &dynamodb.DeleteRequest{ - Key: map[string]*dynamodb.AttributeValue{ - d.partitionKey: { - S: aws.String(r.Key), - }, - }, - }, - } - } - - requestItems := map[string][]*dynamodb.WriteRequest{ - d.table: writeRequests, - } - - _, e := d.client.BatchWriteItemWithContext(ctx, &dynamodb.BatchWriteItemInput{ - RequestItems: requestItems, - }) - - return e -} - func (d *StateStore) GetComponentMetadata() map[string]string { metadataStruct := dynamoDBMetadata{} metadataInfo := map[string]string{} diff --git a/state/aws/dynamodb/dynamodb_test.go b/state/aws/dynamodb/dynamodb_test.go index 202e0daf6..4b612af80 100644 --- a/state/aws/dynamodb/dynamodb_test.go +++ b/state/aws/dynamodb/dynamodb_test.go @@ -18,7 +18,6 @@ package dynamodb import ( "context" "fmt" - "strconv" "testing" "time" @@ -663,256 +662,6 @@ func TestSet(t *testing.T) { }) } -func TestBulkSet(t *testing.T) { - type value struct { - Value string - } - - t.Run("Successfully set items", func(t *testing.T) { - ss := &StateStore{ - partitionKey: defaultPartitionKeyName, - } - ss.client = &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - expected := map[string][]*dynamodb.WriteRequest{} - expected[tableName] = []*dynamodb.WriteRequest{ - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key1"), - }, - "value": { - S: aws.String(`{"Value":"value1"}`), - }, - }, - }, - }, - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key2"), - }, - "value": { - S: aws.String(`{"Value":"value2"}`), - }, - }, - }, - }, - } - - for tbl := range expected { - for reqNum := range expected[tbl] { - expectedItem := expected[tbl][reqNum].PutRequest.Item - inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item - - assert.Equal(t, expectedItem["key"], inputItem["key"]) - assert.Equal(t, expectedItem["value"], inputItem["value"]) - } - } - - return &dynamodb.BatchWriteItemOutput{ - UnprocessedItems: map[string][]*dynamodb.WriteRequest{}, - }, nil - }, - } - ss.table = tableName - - req := []state.SetRequest{ - { - Key: "key1", - Value: value{ - Value: "value1", - }, - }, - { - Key: "key2", - Value: value{ - Value: "value2", - }, - }, - } - err := ss.BulkSet(context.Background(), req) - assert.NoError(t, err) - }) - t.Run("Successfully set items with ttl = -1", func(t *testing.T) { - ss := &StateStore{ - partitionKey: defaultPartitionKeyName, - } - ss.client = &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - expected := map[string][]*dynamodb.WriteRequest{} - expected[tableName] = []*dynamodb.WriteRequest{ - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key1"), - }, - "value": { - S: aws.String(`{"Value":"value1"}`), - }, - "testAttributeName": { - N: aws.String(strconv.FormatInt(time.Now().Unix()-1, 10)), - }, - }, - }, - }, - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key2"), - }, - "value": { - S: aws.String(`{"Value":"value2"}`), - }, - }, - }, - }, - } - for tbl := range expected { - for reqNum := range expected[tbl] { - expectedItem := expected[tbl][reqNum].PutRequest.Item - inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item - - assert.Equal(t, expectedItem["key"], inputItem["key"]) - assert.Equal(t, expectedItem["value"], inputItem["value"]) - } - } - - return &dynamodb.BatchWriteItemOutput{ - UnprocessedItems: map[string][]*dynamodb.WriteRequest{}, - }, nil - }, - } - ss.table = tableName - ss.ttlAttributeName = "testAttributeName" - - req := []state.SetRequest{ - { - Key: "key1", - Value: value{ - Value: "value1", - }, - Metadata: map[string]string{ - "ttlInSeconds": "-1", - }, - }, - { - Key: "key2", - Value: value{ - Value: "value2", - }, - }, - } - err := ss.BulkSet(context.Background(), req) - assert.NoError(t, err) - }) - t.Run("Successfully set items with ttl", func(t *testing.T) { - ss := &StateStore{ - partitionKey: defaultPartitionKeyName, - } - ss.client = &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - expected := map[string][]*dynamodb.WriteRequest{} - // This might fail occasionally due to timestamp precision. - timestamp := time.Now().Unix() + 90 - expected[tableName] = []*dynamodb.WriteRequest{ - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key1"), - }, - "value": { - S: aws.String(`{"Value":"value1"}`), - }, - "testAttributeName": { - N: aws.String(strconv.FormatInt(timestamp, 10)), - }, - }, - }, - }, - { - PutRequest: &dynamodb.PutRequest{ - Item: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key2"), - }, - "value": { - S: aws.String(`{"Value":"value2"}`), - }, - }, - }, - }, - } - for tbl := range expected { - for reqNum := range expected[tbl] { - expectedItem := expected[tbl][reqNum].PutRequest.Item - inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item - - assert.Equal(t, expectedItem["key"], inputItem["key"]) - assert.Equal(t, expectedItem["value"], inputItem["value"]) - } - } - - return &dynamodb.BatchWriteItemOutput{ - UnprocessedItems: map[string][]*dynamodb.WriteRequest{}, - }, nil - }, - } - ss.table = tableName - ss.ttlAttributeName = "testAttributeName" - - req := []state.SetRequest{ - { - Key: "key1", - Value: value{ - Value: "value1", - }, - Metadata: map[string]string{ - "ttlInSeconds": "90", - }, - }, - { - Key: "key2", - Value: value{ - Value: "value2", - }, - }, - } - err := ss.BulkSet(context.Background(), req) - assert.NoError(t, err) - }) - t.Run("Unsuccessfully set items", func(t *testing.T) { - ss := StateStore{ - client: &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - return nil, fmt.Errorf("unable to bulk write items") - }, - }, - } - req := []state.SetRequest{ - { - Key: "key", - Value: value{ - Value: "value", - }, - }, - { - Key: "key", - Value: value{ - Value: "value", - }, - }, - } - err := ss.BulkSet(context.Background(), req) - assert.Error(t, err) - }) -} - func TestDelete(t *testing.T) { t.Run("Successfully delete item", func(t *testing.T) { req := &state.DeleteRequest{ @@ -1020,75 +769,6 @@ func TestDelete(t *testing.T) { }) } -func TestBulkDelete(t *testing.T) { - t.Run("Successfully delete items", func(t *testing.T) { - ss := &StateStore{ - partitionKey: defaultPartitionKeyName, - } - ss.client = &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - expected := map[string][]*dynamodb.WriteRequest{} - expected[tableName] = []*dynamodb.WriteRequest{ - { - DeleteRequest: &dynamodb.DeleteRequest{ - Key: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key1"), - }, - }, - }, - }, - { - DeleteRequest: &dynamodb.DeleteRequest{ - Key: map[string]*dynamodb.AttributeValue{ - "key": { - S: aws.String("key2"), - }, - }, - }, - }, - } - assert.Equal(t, expected, input.RequestItems) - - return &dynamodb.BatchWriteItemOutput{ - UnprocessedItems: map[string][]*dynamodb.WriteRequest{}, - }, nil - }, - } - ss.table = tableName - - req := []state.DeleteRequest{ - { - Key: "key1", - }, - { - Key: "key2", - }, - } - err := ss.BulkDelete(context.Background(), req) - assert.NoError(t, err) - }) - t.Run("Unsuccessfully delete items", func(t *testing.T) { - ss := StateStore{ - client: &mockedDynamoDB{ - BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) { - return nil, fmt.Errorf("unable to bulk write items") - }, - }, - } - req := []state.DeleteRequest{ - { - Key: "key", - }, - { - Key: "key", - }, - } - err := ss.BulkDelete(context.Background(), req) - assert.Error(t, err) - }) -} - func TestMultiTx(t *testing.T) { t.Run("Successfully Multiple Transaction Operations", func(t *testing.T) { ss := &StateStore{ diff --git a/state/azure/cosmosdb/cosmosdb.go b/state/azure/cosmosdb/cosmosdb.go index 8cc1511f0..834fca37b 100644 --- a/state/azure/cosmosdb/cosmosdb.go +++ b/state/azure/cosmosdb/cosmosdb.go @@ -42,6 +42,8 @@ import ( // StateStore is a CosmosDB state store. type StateStore struct { + state.BulkStore + client *azcosmos.ContainerClient metadata metadata contentType string @@ -96,9 +98,11 @@ func (p crossPartitionQueryPolicy) Do(req *policy.Request) (*http.Response, erro // NewCosmosDBStateStore returns a new CosmosDB state store. func NewCosmosDBStateStore(logger logger.Logger) state.Store { - return &StateStore{ + s := &StateStore{ logger: logger, } + s.BulkStore = state.NewDefaultBulkStore(s) + return s } func (c *StateStore) GetComponentMetadata() map[string]string { @@ -414,16 +418,15 @@ func (c *StateStore) Set(ctx context.Context, req *state.SetRequest) error { pk := azcosmos.NewPartitionKeyString(partitionKey) _, err = c.client.UpsertItem(upsertCtx, pk, marsh, &options) if err != nil { + resErr := &azcore.ResponseError{} + if errors.As(err, &resErr) && resErr.StatusCode == http.StatusPreconditionFailed { + return state.NewETagError(state.ETagMismatch, err) + } return err } return nil } -// BulkSet performs a bulk save operation. -func (c *StateStore) BulkSet(ctx context.Context, req []state.SetRequest) error { - return c.doBulkSetDelete(ctx, state.ToTransactionalStateOperationSlice(req)) -} - // Delete performs a delete operation. func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error { err := state.CheckRequestOptions(req.Options) @@ -456,7 +459,8 @@ func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error pk := azcosmos.NewPartitionKeyString(partitionKey) _, err = c.client.DeleteItem(deleteCtx, pk, req.Key, &options) if err != nil && !isNotFoundError(err) { - if req.ETag != nil && *req.ETag != "" { + resErr := &azcore.ResponseError{} + if errors.As(err, &resErr) && resErr.StatusCode == http.StatusPreconditionFailed { return state.NewETagError(state.ETagMismatch, err) } return err @@ -465,52 +469,6 @@ func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error return nil } -// BulkDelete performs a bulk delete operation. -func (c *StateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - return c.doBulkSetDelete(ctx, state.ToTransactionalStateOperationSlice(req)) -} - -// Custom implementation for BulkSet and BulkDelete. We can't use the standard in DefaultBulkStore because we need to be aware of partition keys. -func (c *StateStore) doBulkSetDelete(ctx context.Context, req []state.TransactionalStateOperation) error { - // Group all requests by partition key - // This has initial size of len(req) as pessimistic scenario - partitions := make(map[string]*state.TransactionalStateRequest, len(req)) - for i := range req { - r := req[i] - pk := populatePartitionMetadata(r.GetKey(), r.GetMetadata()) - if partitions[pk] == nil { - partitions[pk] = &state.TransactionalStateRequest{ - Operations: make([]state.TransactionalStateOperation, 0), - Metadata: map[string]string{ - metadataPartitionKey: pk, - }, - } - } - - partitions[pk].Operations = append(partitions[pk].Operations, r) - } - - // Execute all transactions in parallel - errs := make(chan error) - for pk := range partitions { - go func(pk string) { - err := c.Multi(ctx, partitions[pk]) - if err != nil { - err = fmt.Errorf("error while processing bulk set in partition %s: %w", pk, err) - } - errs <- err - }(pk) - } - - // Wait for all results - var err error - for i := 0; i < len(partitions); i++ { - err = errors.Join(<-errs) - } - - return err -} - // Multi performs a transactional operation. Succeeds only if all operations succeed, and fails if one or more operations fail. // Note that all operations must be in the same partition. func (c *StateStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) (err error) { diff --git a/state/bulk.go b/state/bulk.go index 9c2aee230..3d7d8ac50 100644 --- a/state/bulk.go +++ b/state/bulk.go @@ -16,9 +16,10 @@ package state import ( "context" "encoding/json" + "errors" ) -// BulkGetOpts contains options for the BulkGet method +// BulkGetOpts contains options for the BulkGet method. type BulkGetOpts struct { // Number of requests made in parallel while retrieving values in bulk. // When set to <= 0 (the default value), will fetch all requested values in bulk without limit. @@ -26,11 +27,18 @@ type BulkGetOpts struct { Parallelism int } +// BulkStoreOpts contains options for the BulkSet and BulkDelete methods. +type BulkStoreOpts struct { + // Number of requests made in parallel while storing/deleting values in bulk. + // When set to <= 0 (the default value), will perform all operations in parallel without limit. + Parallelism int +} + // BulkStore is an interface to perform bulk operations on store. type BulkStore interface { BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) - BulkDelete(ctx context.Context, req []DeleteRequest) error - BulkSet(ctx context.Context, req []SetRequest) error + BulkSet(ctx context.Context, req []SetRequest, opts BulkStoreOpts) error + BulkDelete(ctx context.Context, req []DeleteRequest, opts BulkStoreOpts) error } // DefaultBulkStore is a default implementation of BulkStore. @@ -47,6 +55,21 @@ func NewDefaultBulkStore(base BaseStore) BulkStore { // BulkGet performs a Get operation in bulk. func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) { + return DoBulkGet(ctx, req, opts, b.base.Get) +} + +// BulkSet performs a bulk save operation. +func (b *DefaultBulkStore) BulkSet(ctx context.Context, req []SetRequest, opts BulkStoreOpts) error { + return DoBulkSetDelete(ctx, req, b.base.Set, opts) +} + +// BulkDelete performs a bulk delete operation. +func (b *DefaultBulkStore) BulkDelete(ctx context.Context, req []DeleteRequest, opts BulkStoreOpts) error { + return DoBulkSetDelete(ctx, req, b.base.Delete, opts) +} + +// DoBulkGet performs BulkGet. +func DoBulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts, getFn func(ctx context.Context, req *GetRequest) (*GetResponse, error)) ([]BulkGetResponse, error) { // If parallelism isn't set, run all operations in parallel if opts.Parallelism <= 0 { opts.Parallelism = len(req) @@ -64,7 +87,7 @@ func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts B r := req[i] res[i].Key = r.Key - item, rErr := b.base.Get(ctx, &r) + item, rErr := getFn(ctx, &r) if rErr != nil { res[i].Error = rErr.Error() return @@ -86,51 +109,49 @@ func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts B return res, nil } -// BulkSet performs a bulk save operation. -func (b *DefaultBulkStore) BulkSet(ctx context.Context, req []SetRequest) error { - // Check if the base implementation supports transactions - if ts, ok := b.base.(TransactionalStore); ok { - return ts.Multi(ctx, &TransactionalStateRequest{ - Operations: ToTransactionalStateOperationSlice(req), - }) - } +type stateRequestConstraint interface { + SetRequest | DeleteRequest + StateRequest +} - // Fallback to executing all operations in sequence +// DoBulkSetDelete performs BulkSet and BulkDelete. +func DoBulkSetDelete[T stateRequestConstraint](ctx context.Context, req []T, method func(ctx context.Context, req *T) error, opts BulkStoreOpts) error { + // If parallelism isn't set, run all operations in parallel + var limitCh chan struct{} + if opts.Parallelism > 0 { + limitCh = make(chan struct{}, opts.Parallelism) + } + errCh := make(chan error, len(req)) + + // Execute all operations in parallel for i := range req { - err := b.base.Set(ctx, &req[i]) - if err != nil { - return err + // Limit concurrency + if limitCh != nil { + limitCh <- struct{}{} } + + go func(i int) { + rErr := method(ctx, &req[i]) + if rErr != nil { + errCh <- BulkStoreError{ + key: req[i].GetKey(), + err: rErr, + } + } else { + errCh <- nil + } + + // Release the token for concurrency + if limitCh != nil { + <-limitCh + } + }(i) } - return nil -} - -// BulkDelete performs a bulk delete operation. -func (b *DefaultBulkStore) BulkDelete(ctx context.Context, req []DeleteRequest) error { - // Check if the base implementation supports transactions - if ts, ok := b.base.(TransactionalStore); ok { - return ts.Multi(ctx, &TransactionalStateRequest{ - Operations: ToTransactionalStateOperationSlice(req), - }) - } - - // Fallback to executing all operations in sequence - for i := range req { - err := b.base.Delete(ctx, &req[i]) - if err != nil { - return err - } - } - - return nil -} - -// ToTransactionalStateOperationSlice is necessary to convert []SetRequest and []DeleteRequest to []TransactionalStateOperation. -func ToTransactionalStateOperationSlice[T TransactionalStateOperation](req []T) []TransactionalStateOperation { - ops := make([]TransactionalStateOperation, len(req)) - for i, r := range req { - ops[i] = r - } - return ops + errs := make([]error, len(req)) + for i := 0; i < len(req); i++ { + errs[i] = <-errCh + } + + return errors.Join(errs...) } diff --git a/state/bulk_test.go b/state/bulk_test.go index f1bf0a340..d9e098d7c 100644 --- a/state/bulk_test.go +++ b/state/bulk_test.go @@ -15,115 +15,115 @@ package state import ( "context" + "errors" + "strings" + "sync/atomic" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +var errSimulated = errors.New("simulated") + func TestBulkStore(t *testing.T) { t.Run("default implementation", func(t *testing.T) { var ( - expectCount int - expectBulkCount int + expectCount int32 + expectBulkCount int32 ) + ctx := context.Background() + s := &storeBulk{} s.BulkStore = NewDefaultBulkStore(s) - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - s.Get(context.Background(), &GetRequest{}) - s.Set(context.Background(), &SetRequest{}) - s.Delete(context.Background(), &DeleteRequest{}) + s.Get(ctx, &GetRequest{}) + s.Set(ctx, &SetRequest{}) + s.Delete(ctx, &DeleteRequest{}) expectCount += 3 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - _, err := s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) + _, err := s.BulkGet(ctx, []GetRequest{{}, {}, {}}, BulkGetOpts{}) require.NoError(t, err) expectCount += 3 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}}) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) + + s.BulkSet(ctx, []SetRequest{{}, {}, {}, {}}, BulkStoreOpts{}) expectCount += 4 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}}) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) + + s.BulkDelete(ctx, []DeleteRequest{{}, {}, {}, {}, {}}, BulkStoreOpts{}) expectCount += 5 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) - }) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - t.Run("default implementation on transactional store", func(t *testing.T) { - var ( - expectCount int - expectTransactionalCount int - expectBulkCount int - ) + // Test errors + err = s.Set(ctx, &SetRequest{Key: "error-key"}) + require.Error(t, err) + expectCount++ + require.Equal(t, errSimulated, err) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - s := &storeBulkTransactional{} - s.BulkStore = NewDefaultBulkStore(s) - require.Equal(t, expectCount, s.count) - require.Equal(t, expectTransactionalCount, s.transactionalCount) - require.Equal(t, expectBulkCount, s.bulkCount) - - s.Get(context.Background(), &GetRequest{}) - s.Set(context.Background(), &SetRequest{}) - s.Delete(context.Background(), &DeleteRequest{}) - expectCount += 3 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectTransactionalCount, s.transactionalCount) - require.Equal(t, expectBulkCount, s.bulkCount) - - _, err := s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) - require.NoError(t, err) - expectCount += 3 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectTransactionalCount, s.transactionalCount) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}}) - expectTransactionalCount += 1 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectTransactionalCount, s.transactionalCount) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}}) - expectTransactionalCount += 1 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectTransactionalCount, s.transactionalCount) - require.Equal(t, expectBulkCount, s.bulkCount) + err = s.BulkSet(ctx, []SetRequest{{Key: "error-key1"}, {}, {Key: "error-key2"}, {}}, BulkStoreOpts{}) + expectCount += 4 + require.Error(t, err) + merr, ok := err.(interface{ Unwrap() []error }) + require.True(t, ok) + errs := merr.Unwrap() + require.Len(t, errs, 2) + for i := 0; i < 2; i++ { + var bse BulkStoreError + assert.ErrorAs(t, errs[i], &bse) + assert.True(t, bse.key == "error-key1" || bse.key == "error-key2") + assert.ErrorIs(t, bse, errSimulated) + assert.ErrorIs(t, errs[i], errSimulated) + } + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) }) t.Run("native bulk implementation", func(t *testing.T) { var ( - expectCount int - expectBulkCount int + expectCount int32 + expectBulkCount int32 ) + ctx := context.Background() + s := &storeBulkNative{} s.BulkStore = NewDefaultBulkStore(s) - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - s.Get(context.Background(), &GetRequest{}) - s.Set(context.Background(), &SetRequest{}) - s.Delete(context.Background(), &DeleteRequest{}) + s.Get(ctx, &GetRequest{}) + s.Set(ctx, &SetRequest{}) + s.Delete(ctx, &DeleteRequest{}) expectCount += 3 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) - _, _ = s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) + _, _ = s.BulkGet(ctx, []GetRequest{{}, {}, {}}, BulkGetOpts{}) expectBulkCount += 1 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}}) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) + + s.BulkSet(ctx, []SetRequest{{}, {}, {}, {}}, BulkStoreOpts{}) expectBulkCount += 1 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) - s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}}) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) + + s.BulkDelete(ctx, []DeleteRequest{{}, {}, {}, {}, {}}, BulkStoreOpts{}) expectBulkCount += 1 - require.Equal(t, expectCount, s.count) - require.Equal(t, expectBulkCount, s.bulkCount) + require.Equal(t, expectCount, s.count.Load()) + require.Equal(t, expectBulkCount, s.bulkCount.Load()) }) } @@ -136,8 +136,8 @@ var ( type storeBulk struct { BulkStore - count int - bulkCount int + count atomic.Int32 + bulkCount atomic.Int32 } func (s *storeBulk) Init(ctx context.Context, metadata Metadata) error { @@ -145,17 +145,20 @@ func (s *storeBulk) Init(ctx context.Context, metadata Metadata) error { } func (s *storeBulk) Delete(ctx context.Context, req *DeleteRequest) error { - s.count++ + s.count.Add(1) return nil } func (s *storeBulk) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) { - s.count++ + s.count.Add(1) return &GetResponse{}, nil } func (s *storeBulk) Set(ctx context.Context, req *SetRequest) error { - s.count++ + s.count.Add(1) + if strings.Contains(req.Key, "error-key") { + return errSimulated + } return nil } @@ -167,34 +170,22 @@ func (s *storeBulk) Features() []Feature { return nil } -// example of a transactional store which doesn't support native bulk methods -type storeBulkTransactional struct { - storeBulk - - transactionalCount int -} - -func (s *storeBulkTransactional) Multi(ctx context.Context, request *TransactionalStateRequest) error { - s.transactionalCount++ - return nil -} - // example of a store which supports native bulk methods type storeBulkNative struct { storeBulk } func (s *storeBulkNative) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) { - s.bulkCount++ + s.bulkCount.Add(1) return nil, nil } -func (s *storeBulkNative) BulkSet(ctx context.Context, req []SetRequest) error { - s.bulkCount++ +func (s *storeBulkNative) BulkSet(ctx context.Context, req []SetRequest, _ BulkStoreOpts) error { + s.bulkCount.Add(1) return nil } -func (s *storeBulkNative) BulkDelete(ctx context.Context, req []DeleteRequest) error { - s.bulkCount++ +func (s *storeBulkNative) BulkDelete(ctx context.Context, req []DeleteRequest, _ BulkStoreOpts) error { + s.bulkCount.Add(1) return nil } diff --git a/state/cockroachdb/cockroachdb_integration_test.go b/state/cockroachdb/cockroachdb_integration_test.go index f7065c870..7fb82365d 100644 --- a/state/cockroachdb/cockroachdb_integration_test.go +++ b/state/cockroachdb/cockroachdb_integration_test.go @@ -576,7 +576,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) { }, } - err := pgs.BulkSet(context.Background(), setReq) + err := pgs.BulkSet(context.Background(), setReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[1].Key)) @@ -590,7 +590,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) { }, } - err = pgs.BulkDelete(context.Background(), deleteReq) + err = pgs.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[1].Key)) diff --git a/state/errors.go b/state/errors.go index 8d3871da0..6f7b293dd 100644 --- a/state/errors.go +++ b/state/errors.go @@ -34,27 +34,6 @@ type ETagError struct { kind ETagErrorKind } -func (e *ETagError) Kind() ETagErrorKind { - return e.kind -} - -func (e *ETagError) Error() string { - var prefix string - - switch e.kind { - case ETagInvalid: - prefix = invalidPrefix - case ETagMismatch: - prefix = mismatchPrefix - } - - if e.err != nil { - return fmt.Sprintf("%s: %s", prefix, e.err) - } - - return errors.New(prefix).Error() -} - // NewETagError returns an ETagError wrapping an existing context error. func NewETagError(kind ETagErrorKind, err error) *ETagError { return &ETagError{ @@ -63,16 +42,36 @@ func NewETagError(kind ETagErrorKind, err error) *ETagError { } } +func (e *ETagError) Kind() ETagErrorKind { + return e.kind +} + +func (e *ETagError) Error() string { + var prefix string + switch e.kind { + case ETagInvalid: + prefix = invalidPrefix + case ETagMismatch: + prefix = mismatchPrefix + } + + if e.err != nil { + return prefix + ": " + e.err.Error() + } + + return prefix +} + +func (e *ETagError) Unwrap() error { + return e.err +} + // BulkDeleteRowMismatchError represents mismatch in rowcount while deleting rows. type BulkDeleteRowMismatchError struct { expected uint64 affected uint64 } -func (e *BulkDeleteRowMismatchError) Error() string { - return fmt.Sprintf("delete affected only %d rows, expected %d", e.affected, e.expected) -} - // BulkDeleteRowMismatchError returns a BulkDeleteRowMismatchError. func NewBulkDeleteRowMismatchError(expected, affected uint64) *BulkDeleteRowMismatchError { return &BulkDeleteRowMismatchError{ @@ -80,3 +79,44 @@ func NewBulkDeleteRowMismatchError(expected, affected uint64) *BulkDeleteRowMism affected: affected, } } + +func (e *BulkDeleteRowMismatchError) Error() string { + return fmt.Sprintf("delete affected only %d rows, expected %d", e.affected, e.expected) +} + +// BulkStoreError is an error object that contains details on the operations that failed. +type BulkStoreError struct { + key string + err error +} + +func NewBulkStoreError(key string, err error) BulkStoreError { + return BulkStoreError{ + key: key, + err: err, + } +} + +// Key returns the key of the operation that failed. +func (e BulkStoreError) Key() string { + return e.key +} + +// Error returns the error message. It implements the error interface. +func (e BulkStoreError) Error() string { + return e.err.Error() +} + +// Unwrap returns the wrapped error. It implements the error wrapping interface. +func (e BulkStoreError) Unwrap() error { + return e.err +} + +// ETagError returns an *ETagError if the wrapped error is of that kind; otherwise, returns nil +func (e BulkStoreError) ETagError() *ETagError { + var etagErr *ETagError + if errors.As(e.err, &etagErr) { + return etagErr + } + return nil +} diff --git a/state/in-memory/in_memory.go b/state/in-memory/in_memory.go index 32ee8ab49..42c142e32 100644 --- a/state/in-memory/in_memory.go +++ b/state/in-memory/in_memory.go @@ -32,6 +32,8 @@ import ( ) type inMemoryStore struct { + state.BulkStore + items map[string]*inMemStateStoreItem lock sync.RWMutex log logger.Logger @@ -45,11 +47,13 @@ func NewInMemoryStateStore(log logger.Logger) state.Store { } func newStateStore(log logger.Logger) *inMemoryStore { - return &inMemoryStore{ + s := &inMemoryStore{ items: map[string]*inMemStateStoreItem{}, log: log, closeCh: make(chan struct{}), } + s.BulkStore = state.NewDefaultBulkStore(s) + return s } func (store *inMemoryStore) Init(ctx context.Context, metadata state.Metadata) error { @@ -138,37 +142,6 @@ func (store *inMemoryStore) doDelete(ctx context.Context, key string) { delete(store.items, key) } -func (store *inMemoryStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - if len(req) == 0 { - return nil - } - - // step1: validate parameters - for i := 0; i < len(req); i++ { - if err := state.CheckRequestOptions(&req[i].Options); err != nil { - return err - } - } - - // step2 and step3 should be protected by write-lock - store.lock.Lock() - defer store.lock.Unlock() - - // step2: validate etag if needed - for _, dr := range req { - err := store.doValidateEtag(dr.Key, dr.ETag, dr.Options.Concurrency) - if err != nil { - return fmt.Errorf("etag mismatch for key %s", dr.Key) - } - } - - // step3: do really delete - for _, dr := range req { - store.doDelete(ctx, dr.Key) - } - return nil -} - func (store *inMemoryStore) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { store.lock.RLock() item := store.items[req.Key] @@ -332,51 +305,6 @@ func (r innerSetRequest) GetMetadata() map[string]string { return r.req.Metadata } -func (store *inMemoryStore) BulkSet(ctx context.Context, req []state.SetRequest) error { - if len(req) == 0 { - return nil - } - - // step1: validate parameters - innerSetRequestList := make([]*innerSetRequest, 0, len(req)) - for i := 0; i < len(req); i++ { - ttlInSeconds, err := store.doSetValidateParameters(&req[i]) - if err != nil { - return err - } - - bt, err := store.marshal(req[i].Value) - if err != nil { - return err - } - innerSetRequest := &innerSetRequest{ - req: req[i], - ttl: ttlInSeconds, - data: bt, - } - innerSetRequestList = append(innerSetRequestList, innerSetRequest) - } - - // step2 and step3 should be protected by write-lock - store.lock.Lock() - defer store.lock.Unlock() - - // step2: validate etag if needed - for _, dr := range req { - err := store.doValidateEtag(dr.Key, dr.ETag, dr.Options.Concurrency) - if err != nil { - return fmt.Errorf("etag mismatch for key %s", dr.Key) - } - } - - // step3: do really set - // these operations won't fail - for _, innerSetRequest := range innerSetRequestList { - store.doSet(ctx, innerSetRequest.req.Key, innerSetRequest.data, innerSetRequest.ttl) - } - return nil -} - func (store *inMemoryStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { if len(request.Operations) == 0 { return nil diff --git a/state/in-memory/in_memory_test.go b/state/in-memory/in_memory_test.go index 6ee368426..4fc900b39 100644 --- a/state/in-memory/in_memory_test.go +++ b/state/in-memory/in_memory_test.go @@ -102,7 +102,7 @@ func TestReadAndWrite(t *testing.T) { }, { Key: "theSecondKey", Value: "84", - }}) + }}, state.BulkStoreOpts{}) assert.NoError(t, err) }) diff --git a/state/mongodb/mongodb.go b/state/mongodb/mongodb.go index 74b7fb2d6..ef221db95 100644 --- a/state/mongodb/mongodb.go +++ b/state/mongodb/mongodb.go @@ -73,6 +73,8 @@ const ( // MongoDB is a state store implementation for MongoDB. type MongoDB struct { + state.BulkStore + client *mongo.Client collection *mongo.Collection operationTimeout time.Duration @@ -106,10 +108,12 @@ type Item struct { // NewMongoDB returns a new MongoDB state store. func NewMongoDB(logger logger.Logger) state.Store { - return &MongoDB{ + s := &MongoDB{ features: []state.Feature{state.FeatureETag, state.FeatureTransactional, state.FeatureQueryAPI}, logger: logger, } + s.BulkStore = state.NewDefaultBulkStore(s) + return s } // Init establishes connection to the store based on the metadata. @@ -202,7 +206,7 @@ func (m *MongoDB) setInternal(ctx context.Context, req *state.SetRequest) error // create a document based on request key and value filter := bson.M{id: req.Key} - if req.ETag != nil { + if req.ETag != nil && *req.ETag != "" { filter[etag] = *req.ETag } else if req.Options.Concurrency == state.FirstWrite { uuid, err := uuid.NewRandom() @@ -254,7 +258,10 @@ func (m *MongoDB) setInternal(ctx context.Context, req *state.SetRequest) error _, err = m.collection.UpdateOne(ctx, filter, update, options.Update().SetUpsert(true)) if err != nil { - return fmt.Errorf("error in updating document: %s", err) + if mongo.IsDuplicateKeyError(err) { + return state.NewETagError(state.ETagMismatch, err) + } + return fmt.Errorf("error in updating document: %w", err) } return nil @@ -420,7 +427,7 @@ func (m *MongoDB) Delete(ctx context.Context, req *state.DeleteRequest) error { func (m *MongoDB) deleteInternal(ctx context.Context, req *state.DeleteRequest) error { filter := bson.M{id: req.Key} - if req.ETag != nil { + if req.ETag != nil && *req.ETag != "" { filter[etag] = *req.ETag } result, err := m.collection.DeleteOne(ctx, filter) @@ -428,55 +435,13 @@ func (m *MongoDB) deleteInternal(ctx context.Context, req *state.DeleteRequest) return err } - if result.DeletedCount == 0 && req.ETag != nil { + if result.DeletedCount == 0 && req.ETag != nil && *req.ETag != "" { return errors.New("key or etag not found") } return nil } -// BulkSet performs a bulk save operation. -// We need to implement a custom BulkSet/BulkDelete because with MongoDB transactions are not always available (only when connecting to a replica set), and when they're not, we need to fall back to performing operations in sequence. -func (m *MongoDB) BulkSet(ctx context.Context, req []state.SetRequest) error { - // Use transactions if we can - if m.isReplicaSet { - return m.Multi(ctx, &state.TransactionalStateRequest{ - Operations: state.ToTransactionalStateOperationSlice(req), - }) - } - - // Fallback to executing all operations in sequence - for i := range req { - err := m.Set(ctx, &req[i]) - if err != nil { - return err - } - } - - return nil -} - -// BulkDelete performs a bulk delete operation. -// We need to implement a custom BulkSet/BulkDelete because with MongoDB transactions are not always available (only when connecting to a replica set), and when they're not, we need to fall back to performing operations in sequence. -func (m *MongoDB) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - // Use transactions if we can - if m.isReplicaSet { - return m.Multi(ctx, &state.TransactionalStateRequest{ - Operations: state.ToTransactionalStateOperationSlice(req), - }) - } - - // Fallback to executing all operations in sequence - for i := range req { - err := m.Delete(ctx, &req[i]) - if err != nil { - return err - } - } - - return nil -} - // Multi performs a transactional operation. succeeds only if all operations succeed, and fails if one or more operations fail. func (m *MongoDB) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { if !m.isReplicaSet { diff --git a/state/mysql/mysql.go b/state/mysql/mysql.go index 50a939da8..c5393e55e 100644 --- a/state/mysql/mysql.go +++ b/state/mysql/mysql.go @@ -73,6 +73,8 @@ const ( // MySQL state store. type MySQL struct { + state.BulkStore + tableName string metadataTableName string cleanupInterval *time.Duration @@ -113,11 +115,13 @@ func NewMySQLStateStore(logger logger.Logger) state.Store { func newMySQLStateStore(logger logger.Logger, factory iMySQLFactory) *MySQL { // Store the provided logger and return the object. The rest of the // properties will be populated in the Init function - return &MySQL{ + s := &MySQL{ logger: logger, factory: factory, timeout: 5 * time.Second, } + s.BulkStore = state.NewDefaultBulkStore(s) + return s } // Init initializes the SQL server state store @@ -517,32 +521,6 @@ func (m *MySQL) deleteValue(parentCtx context.Context, querier querier, req *sta return nil } -// BulkDelete removes multiple entries from the store -// Store Interface. -func (m *MySQL) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - tx, err := m.db.Begin() - if err != nil { - return err - } - defer func() { - rollbackErr := tx.Rollback() - if rollbackErr != nil && !errors.Is(rollbackErr, sql.ErrTxDone) { - m.logger.Errorf("Error rolling back transaction: %v", rollbackErr) - } - }() - - if len(req) > 0 { - for i := range req { - err = m.deleteValue(ctx, tx, &req[i]) - if err != nil { - return err - } - } - } - - return tx.Commit() -} - // Get returns an entity from store // Store Interface. func (m *MySQL) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) { @@ -566,7 +544,7 @@ func (m *MySQL) Get(parentCtx context.Context, req *state.GetRequest) (*state.Ge } return &state.GetResponse{ Data: value, - ETag: &etag, + ETag: etag, Metadata: req.Metadata, }, nil } @@ -741,29 +719,28 @@ func (m *MySQL) BulkGet(parentCtx context.Context, req []state.GetRequest, _ sta return nil, err } - var ( - n int - etag string - ) + var n int res := make([]state.BulkGetResponse, len(req)) for ; rows.Next(); n++ { r := state.BulkGetResponse{} - r.Key, r.Data, etag, err = readRow(rows) + r.Key, r.Data, r.ETag, err = readRow(rows) if err != nil { r.Error = err.Error() } - r.ETag = &etag res[n] = r } return res[:n], nil } -func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etag string, err error) { - var isBinary bool +func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etagP *string, err error) { + var ( + etag string + isBinary bool + ) err = row.Scan(&key, &value, &etag, &isBinary) if err != nil { - return key, nil, "", err + return key, nil, nil, err } if isBinary { @@ -774,43 +751,17 @@ func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte err = json.Unmarshal(value, &s) if err != nil { - return key, nil, "", fmt.Errorf("failed to unmarshal JSON binary data: %w", err) + return key, nil, nil, fmt.Errorf("failed to unmarshal JSON binary data: %w", err) } data, err = base64.StdEncoding.DecodeString(s) if err != nil { - return key, nil, "", fmt.Errorf("failed to decode binary data: %w", err) + return key, nil, nil, fmt.Errorf("failed to decode binary data: %w", err) } - return key, data, etag, nil + return key, data, &etag, nil } - return key, value, etag, nil -} - -// BulkSet adds/updates multiple entities on store -// Store Interface. -func (m *MySQL) BulkSet(ctx context.Context, req []state.SetRequest) error { - tx, err := m.db.Begin() - if err != nil { - return err - } - defer func() { - rollbackErr := tx.Rollback() - if rollbackErr != nil && !errors.Is(rollbackErr, sql.ErrTxDone) { - m.logger.Errorf("Error rolling back transaction: %v", rollbackErr) - } - }() - - if len(req) > 0 { - for i := range req { - err = m.setValue(ctx, tx, &req[i]) - if err != nil { - return err - } - } - } - - return tx.Commit() + return key, value, &etag, nil } // Multi handles multiple transactions. diff --git a/state/mysql/mysql_integration_test.go b/state/mysql/mysql_integration_test.go index 19e16a226..34ec04327 100644 --- a/state/mysql/mysql_integration_test.go +++ b/state/mysql/mysql_integration_test.go @@ -552,7 +552,7 @@ func testBulkSetAndBulkDelete(t *testing.T, mys *MySQL) { }, } - err := mys.BulkSet(context.Background(), setReq) + err := mys.BulkSet(context.Background(), setReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[1].Key)) @@ -566,7 +566,7 @@ func testBulkSetAndBulkDelete(t *testing.T, mys *MySQL) { }, } - err = mys.BulkDelete(context.Background(), deleteReq) + err = mys.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[1].Key)) diff --git a/state/mysql/mysql_test.go b/state/mysql/mysql_test.go index ebe02a1e4..b88328dbc 100644 --- a/state/mysql/mysql_test.go +++ b/state/mysql/mysql_test.go @@ -174,44 +174,6 @@ func TestExecuteMultiCannotBeginTransaction(t *testing.T) { assert.Equal(t, "beginError", err.Error(), "wrong error returned") } -func TestMySQLBulkDeleteRollbackDeletes(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.mySQL.Close() - - m.mock1.ExpectBegin() - m.mock1.ExpectExec("DELETE FROM").WillReturnError(fmt.Errorf("deleteError")) - m.mock1.ExpectRollback() - - deletes := []state.DeleteRequest{createDeleteRequest()} - - // Act - err := m.mySQL.BulkDelete(context.Background(), deletes) - - // Assert - assert.NotNil(t, err, "no error returned") - assert.Equal(t, "deleteError", err.Error(), "wrong error returned") -} - -func TestMySQLBulkSetRollbackSets(t *testing.T) { - // Arrange - m, _ := mockDatabase(t) - defer m.mySQL.Close() - - m.mock1.ExpectBegin() - m.mock1.ExpectExec("INSERT INTO").WillReturnError(fmt.Errorf("setError")) - m.mock1.ExpectRollback() - - sets := []state.SetRequest{createSetRequest()} - - // Act - err := m.mySQL.BulkSet(context.Background(), sets) - - // Assert - assert.NotNil(t, err, "no error returned") - assert.Equal(t, "setError", err.Error(), "wrong error returned") -} - func TestExecuteMultiCommitSetsAndDeletes(t *testing.T) { // Arrange m, _ := mockDatabase(t) diff --git a/state/oracledatabase/oracledatabase_integration_test.go b/state/oracledatabase/oracledatabase_integration_test.go index 59e082ba8..10f92219d 100644 --- a/state/oracledatabase/oracledatabase_integration_test.go +++ b/state/oracledatabase/oracledatabase_integration_test.go @@ -618,7 +618,7 @@ func testBulkSetAndBulkDelete(t *testing.T, ods state.Store) { }, } - err := ods.BulkSet(context.Background(), setReq) + err := ods.BulkSet(context.Background(), setReq, state.BulkStoreOpts{}) require.NoError(t, err) assert.True(t, storeItemExists(t, db, setReq[0].Key)) assert.True(t, storeItemExists(t, db, setReq[1].Key)) @@ -632,7 +632,7 @@ func testBulkSetAndBulkDelete(t *testing.T, ods state.Store) { }, } - err = ods.BulkDelete(context.Background(), deleteReq) + err = ods.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{}) require.NoError(t, err) assert.False(t, storeItemExists(t, db, setReq[0].Key)) assert.False(t, storeItemExists(t, db, setReq[1].Key)) diff --git a/state/oracledatabase/oracledatabaseaccess.go b/state/oracledatabase/oracledatabaseaccess.go index b56642f7b..79db875f3 100644 --- a/state/oracledatabase/oracledatabaseaccess.go +++ b/state/oracledatabase/oracledatabaseaccess.go @@ -194,9 +194,6 @@ func (o *oracleDatabaseAccess) doSet(ctx context.Context, db querier, req *state result, err = db.ExecContext(ctx, updateStatement, value, binaryYN, etag, req.Key, *req.ETag) } if err != nil { - if req.ETag != nil && *req.ETag != "" { - return state.NewETagError(state.ETagMismatch, err) - } return err } rows, err := result.RowsAffected() @@ -204,6 +201,9 @@ func (o *oracleDatabaseAccess) doSet(ctx context.Context, db querier, req *state return err } if rows != 1 { + if req.ETag != nil && *req.ETag != "" { + return state.NewETagError(state.ETagMismatch, err) + } return errors.New("no item was updated") } return nil diff --git a/state/postgresql/postgresql_integration_test.go b/state/postgresql/postgresql_integration_test.go index ebf744632..aa7bcd1d5 100644 --- a/state/postgresql/postgresql_integration_test.go +++ b/state/postgresql/postgresql_integration_test.go @@ -412,7 +412,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) { }, } - err := pgs.BulkSet(context.Background(), setReq) + err := pgs.BulkSet(context.Background(), setReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[1].Key)) @@ -426,7 +426,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) { }, } - err = pgs.BulkDelete(context.Background(), deleteReq) + err = pgs.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[1].Key)) diff --git a/state/rethinkdb/rethinkdb.go b/state/rethinkdb/rethinkdb.go index 4cac1f9b1..f506920a5 100644 --- a/state/rethinkdb/rethinkdb.go +++ b/state/rethinkdb/rethinkdb.go @@ -39,8 +39,6 @@ const ( // RethinkDB is a state store implementation with transactional support for RethinkDB. type RethinkDB struct { - state.BulkStore - session *r.Session config *stateConfig features []state.Feature @@ -66,7 +64,6 @@ func NewRethinkDBStateStore(logger logger.Logger) state.Store { features: []state.Feature{}, logger: logger, } - s.BulkStore = state.NewDefaultBulkStore(s) return s } @@ -201,17 +198,21 @@ func (s *RethinkDB) Get(ctx context.Context, req *state.GetRequest) (*state.GetR return resp, nil } +func (s *RethinkDB) BulkGet(ctx context.Context, req []state.GetRequest, opts state.BulkGetOpts) ([]state.BulkGetResponse, error) { + return state.DoBulkGet(ctx, req, opts, s.Get) +} + // Set saves a state KV item. func (s *RethinkDB) Set(ctx context.Context, req *state.SetRequest) error { if req == nil || req.Key == "" || req.Value == nil { return errors.New("invalid state request, key and value required") } - return s.BulkSet(ctx, []state.SetRequest{*req}) + return s.BulkSet(ctx, []state.SetRequest{*req}, state.BulkStoreOpts{}) } // BulkSet performs a bulk save operation. -func (s *RethinkDB) BulkSet(ctx context.Context, req []state.SetRequest) error { +func (s *RethinkDB) BulkSet(ctx context.Context, req []state.SetRequest, _ state.BulkStoreOpts) error { docs := make([]*stateRecord, len(req)) now := time.Now().UnixNano() for i, v := range req { @@ -272,11 +273,11 @@ func (s *RethinkDB) Delete(ctx context.Context, req *state.DeleteRequest) error return errors.New("invalid request, missing key") } - return s.BulkDelete(ctx, []state.DeleteRequest{*req}) + return s.BulkDelete(ctx, []state.DeleteRequest{*req}, state.BulkStoreOpts{}) } // BulkDelete performs a bulk delete operation. -func (s *RethinkDB) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { +func (s *RethinkDB) BulkDelete(ctx context.Context, req []state.DeleteRequest, _ state.BulkStoreOpts) error { list := make([]string, len(req)) for i, d := range req { list[i] = d.Key diff --git a/state/rethinkdb/rethinkdb_test.go b/state/rethinkdb/rethinkdb_test.go index 3bce8498e..0d24b7e01 100644 --- a/state/rethinkdb/rethinkdb_test.go +++ b/state/rethinkdb/rethinkdb_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/assert" + "github.com/dapr/components-contrib/internal/utils" "github.com/dapr/components-contrib/metadata" "github.com/dapr/components-contrib/state" "github.com/dapr/kit/logger" @@ -148,7 +149,6 @@ func TestRethinkDBStateStore(t *testing.T) { }) t.Run("With bulk", func(t *testing.T) { - db.BulkStore = state.NewDefaultBulkStore(db) testBulk(t, db, 0) }) } @@ -181,7 +181,7 @@ func testBulk(t *testing.T, db state.Store, i int) { } // bulk set it - if err := db.BulkSet(context.Background(), setList); err != nil { + if err := db.BulkSet(context.Background(), setList, state.BulkStoreOpts{}); err != nil { t.Fatalf("error setting data to db: %v -- run %d", err, i) } @@ -194,7 +194,7 @@ func testBulk(t *testing.T, db state.Store, i int) { } // delete data - if err := db.BulkDelete(context.Background(), deleteList); err != nil { + if err := db.BulkDelete(context.Background(), deleteList, state.BulkStoreOpts{}); err != nil { t.Fatalf("error on data deletion: %v -- run %d", err, i) } @@ -227,7 +227,7 @@ func testGetTestObj(t *testing.T, resp *state.GetResponse) *testObj { } func isLiveTest() bool { - return os.Getenv("RUN_LIVE_RETHINKDB_TEST") == "true" + return utils.IsTruthy(os.Getenv("RUN_LIVE_RETHINKDB_TEST")) } func getTestMetadata() map[string]string { diff --git a/state/sqlite/sqlite_dbaccess.go b/state/sqlite/sqlite_dbaccess.go index 24a326f67..20ff3a61b 100644 --- a/state/sqlite/sqlite_dbaccess.go +++ b/state/sqlite/sqlite_dbaccess.go @@ -267,7 +267,7 @@ func (a *sqliteDBAccess) Get(parentCtx context.Context, req *state.GetRequest) ( return &state.GetResponse{ Data: value, - ETag: &etag, + ETag: etag, Metadata: req.Metadata, }, nil } @@ -297,29 +297,28 @@ func (a *sqliteDBAccess) BulkGet(parentCtx context.Context, req []state.GetReque return nil, err } - var ( - n int - etag string - ) + var n int res := make([]state.BulkGetResponse, len(req)) for ; rows.Next(); n++ { r := state.BulkGetResponse{} - r.Key, r.Data, etag, err = readRow(rows) + r.Key, r.Data, r.ETag, err = readRow(rows) if err != nil { r.Error = err.Error() } - r.ETag = &etag res[n] = r } return res[:n], nil } -func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etag string, err error) { - var isBinary bool +func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etagP *string, err error) { + var ( + isBinary bool + etag string + ) err = row.Scan(&key, &value, &isBinary, &etag) if err != nil { - return key, nil, "", err + return key, nil, nil, err } if isBinary { @@ -327,12 +326,12 @@ func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte data := make([]byte, len(value)) n, err = base64.StdEncoding.Decode(data, value) if err != nil { - return key, nil, "", fmt.Errorf("failed to decode binary data: %w", err) + return key, nil, nil, fmt.Errorf("failed to decode binary data: %w", err) } - return key, data[:n], etag, nil + return key, data[:n], &etag, nil } - return key, value, etag, nil + return key, value, &etag, nil } func (a *sqliteDBAccess) Set(ctx context.Context, req *state.SetRequest) error { diff --git a/state/sqlite/sqlite_integration_test.go b/state/sqlite/sqlite_integration_test.go index dd2969f91..6aea7fba9 100644 --- a/state/sqlite/sqlite_integration_test.go +++ b/state/sqlite/sqlite_integration_test.go @@ -582,7 +582,7 @@ func testBulkSetAndBulkDelete(t *testing.T, s state.Store) { }, } - err := s.BulkSet(context.Background(), setReq) + err := s.BulkSet(context.Background(), setReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.True(t, storeItemExists(t, s, setReq[0].Key)) assert.True(t, storeItemExists(t, s, setReq[1].Key)) @@ -596,7 +596,7 @@ func testBulkSetAndBulkDelete(t *testing.T, s state.Store) { }, } - err = s.BulkDelete(context.Background(), deleteReq) + err = s.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{}) assert.NoError(t, err) assert.False(t, storeItemExists(t, s, setReq[0].Key)) assert.False(t, storeItemExists(t, s, setReq[1].Key)) diff --git a/state/sqlserver/migration.go b/state/sqlserver/migration.go index fed3e99ac..a7e3fef1b 100644 --- a/state/sqlserver/migration.go +++ b/state/sqlserver/migration.go @@ -28,8 +28,6 @@ type migration struct { } type migrationResult struct { - bulkDeleteProcName string - bulkDeleteProcFullName string itemRefTableTypeName string upsertProcName string upsertProcFullName string @@ -47,7 +45,6 @@ func newMigration(metadata *sqlServerMetadata) migrator { func (m *migration) newMigrationResult() migrationResult { r := migrationResult{ - bulkDeleteProcName: fmt.Sprintf("sp_BulkDelete_%s", m.metadata.TableName), itemRefTableTypeName: fmt.Sprintf("[%s].%s_Table", m.metadata.Schema, m.metadata.TableName), upsertProcName: fmt.Sprintf("sp_Upsert_v3_%s", m.metadata.TableName), getCommand: fmt.Sprintf("SELECT [Data], [RowVersion] FROM [%s].[%s] WHERE [Key] = @Key AND ([ExpireDate] IS NULL OR [ExpireDate] > GETDATE())", m.metadata.Schema, m.metadata.TableName), @@ -55,7 +52,6 @@ func (m *migration) newMigrationResult() migrationResult { deleteWithoutETagCommand: fmt.Sprintf(`DELETE [%s].[%s] WHERE [Key]=@Key`, m.metadata.Schema, m.metadata.TableName), } - r.bulkDeleteProcFullName = fmt.Sprintf("[%s].%s", m.metadata.Schema, r.bulkDeleteProcName) r.upsertProcFullName = fmt.Sprintf("[%s].%s", m.metadata.Schema, r.upsertProcName) //nolint:exhaustive @@ -248,36 +244,12 @@ func (m *migration) ensureTypeExists(ctx context.Context, db *sql.DB, mr migrati return runCommand(ctx, db, tsql) } -/* #nosec. */ -func (m *migration) ensureBulkDeleteStoredProcedureExists(ctx context.Context, db *sql.DB, mr migrationResult) error { - tsql := fmt.Sprintf(` - CREATE PROCEDURE %s - @itemsToDelete %s READONLY - AS - DELETE [%s].[%s] - FROM [%s].[%s] x - JOIN @itemsToDelete i ON i.[Key] = x.[Key] AND (i.[RowVersion] IS NULL OR i.[RowVersion] = x.[RowVersion])`, - mr.bulkDeleteProcFullName, - mr.itemRefTableTypeName, - m.metadata.Schema, - m.metadata.TableName, - m.metadata.Schema, - m.metadata.TableName) - - return m.createStoredProcedureIfNotExists(ctx, db, mr.bulkDeleteProcName, tsql) -} - func (m *migration) ensureStoredProcedureExists(ctx context.Context, db *sql.DB, mr migrationResult) error { err := m.ensureTypeExists(ctx, db, mr) if err != nil { return err } - err = m.ensureBulkDeleteStoredProcedureExists(ctx, db, mr) - if err != nil { - return err - } - err = m.ensureUpsertStoredProcedureExists(ctx, db, mr) if err != nil { return err diff --git a/state/sqlserver/sqlserver.go b/state/sqlserver/sqlserver.go index 6ca6d3fdf..b066fc8c9 100644 --- a/state/sqlserver/sqlserver.go +++ b/state/sqlserver/sqlserver.go @@ -22,8 +22,6 @@ import ( "fmt" "time" - mssql "github.com/microsoft/go-mssqldb" - internalsql "github.com/dapr/components-contrib/internal/component/sql" "github.com/dapr/components-contrib/state" "github.com/dapr/components-contrib/state/utils" @@ -88,7 +86,6 @@ type SQLServer struct { migratorFactory func(*sqlServerMetadata) migrator - bulkDeleteCommand string itemRefTableTypeName string upsertCommand string getCommand string @@ -116,7 +113,6 @@ func (s *SQLServer) Init(ctx context.Context, metadata state.Metadata) error { } s.itemRefTableTypeName = mr.itemRefTableTypeName - s.bulkDeleteCommand = fmt.Sprintf("exec %s @itemsToDelete;", mr.bulkDeleteProcFullName) s.upsertCommand = mr.upsertProcFullName s.getCommand = mr.getCommand s.deleteWithETagCommand = mr.deleteWithETagCommand @@ -246,58 +242,6 @@ type TvpDeleteTableStringKey struct { RowVersion []byte } -// BulkDelete removes multiple entries from the store. -func (s *SQLServer) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { - tx, err := s.db.BeginTx(ctx, nil) - defer tx.Rollback() - if err != nil { - return err - } - - err = s.executeBulkDelete(ctx, tx, req) - if err != nil { - return err - } - - return tx.Commit() -} - -func (s *SQLServer) executeBulkDelete(ctx context.Context, db dbExecutor, req []state.DeleteRequest) error { - values := make([]TvpDeleteTableStringKey, len(req)) - for i, d := range req { - var etag []byte - var err error - if d.ETag != nil { - etag, err = hex.DecodeString(*d.ETag) - if err != nil { - return state.NewETagError(state.ETagInvalid, err) - } - } - values[i] = TvpDeleteTableStringKey{ID: d.Key, RowVersion: etag} - } - - itemsToDelete := mssql.TVP{ - TypeName: s.itemRefTableTypeName, - Value: values, - } - - res, err := db.ExecContext(ctx, s.bulkDeleteCommand, sql.Named("itemsToDelete", itemsToDelete)) - if err != nil { - return err - } - - rows, err := res.RowsAffected() - if err != nil { - return err - } - - if int(rows) != len(req) { - return state.NewBulkDeleteRowMismatchError(uint64(rows), uint64(len(req))) - } - - return nil -} - // Get returns an entity from store. func (s *SQLServer) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { rows, err := s.db.QueryContext(ctx, s.getCommand, sql.Named(keyColumnName, req.Key)) @@ -374,10 +318,6 @@ func (s *SQLServer) executeSet(ctx context.Context, db dbExecutor, req *state.Se } if err != nil { - if req.ETag != nil && *req.ETag != "" { - return state.NewETagError(state.ETagMismatch, err) - } - return err } @@ -387,30 +327,15 @@ func (s *SQLServer) executeSet(ctx context.Context, db dbExecutor, req *state.Se } if rows != 1 { + if req.ETag != nil && *req.ETag != "" { + return state.NewETagError(state.ETagMismatch, err) + } return errors.New("no item was updated") } return nil } -// BulkSet adds/updates multiple entities on store. -func (s *SQLServer) BulkSet(ctx context.Context, req []state.SetRequest) error { - tx, err := s.db.BeginTx(ctx, nil) - defer tx.Rollback() - if err != nil { - return err - } - - for i := range req { - err = s.executeSet(ctx, tx, &req[i]) - if err != nil { - return err - } - } - - return tx.Commit() -} - func (s *SQLServer) GetComponentMetadata() map[string]string { return map[string]string{} } diff --git a/state/sqlserver/sqlserver_integration_test.go b/state/sqlserver/sqlserver_integration_test.go index 8a9bec781..83d0a027c 100644 --- a/state/sqlserver/sqlserver_integration_test.go +++ b/state/sqlserver/sqlserver_integration_test.go @@ -290,7 +290,7 @@ func testIndexedProperties(t *testing.T) { {Key: "2", Value: userWithPets{user{"2", "Laura", "Water"}, 1}}, {Key: "3", Value: userWithPets{user{"3", "Carl", "Beer"}, 0}}, {Key: "4", Value: userWithPets{user{"4", "Maria", "Wine"}, 100}}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) @@ -347,7 +347,7 @@ func testMultiOperations(t *testing.T) { bulkSet[i] = state.SetRequest{Key: u.ID, Value: u} } - err := store.BulkSet(context.Background(), bulkSet) + err := store.BulkSet(context.Background(), bulkSet, state.BulkStoreOpts{}) require.NoError(t, err) assertUserCountIsEqualTo(t, store, len(initialUsers)) @@ -524,7 +524,7 @@ func testBulkSet(t *testing.T) { sets[i] = state.SetRequest{Key: u.ID, Value: u} } - err := store.BulkSet(context.Background(), sets) + err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{}) require.NoError(t, err) totalUsers = len(sets) assertUserCountIsEqualTo(t, store, totalUsers) @@ -539,7 +539,7 @@ func testBulkSet(t *testing.T) { err := store.BulkSet(context.Background(), []state.SetRequest{ {Key: modified.ID, Value: modified, ETag: &toModifyETag}, {Key: toInsert.ID, Value: toInsert}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) assertLoadedUserIsEqual(t, store, modified.ID, modified) assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert) @@ -558,7 +558,7 @@ func testBulkSet(t *testing.T) { err := store.BulkSet(context.Background(), []state.SetRequest{ {Key: modified.ID, Value: modified}, {Key: toInsert.ID, Value: toInsert}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) assertLoadedUserIsEqual(t, store, modified.ID, modified) assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert) @@ -582,7 +582,7 @@ func testBulkSet(t *testing.T) { {Key: modified.ID, Value: modified, ETag: &invEtag}, } - err := store.BulkSet(context.Background(), sets) + err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{}) assert.NotNil(t, err) assertUserCountIsEqualTo(t, store, totalUsers) assertUserDoesNotExist(t, store, toInsert1.ID) @@ -625,7 +625,7 @@ func testBulkDelete(t *testing.T) { for i, u := range initialUsers { sets[i] = state.SetRequest{Key: u.ID, Value: u} } - err := store.BulkSet(context.Background(), sets) + err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{}) require.NoError(t, err) totalUsers := len(initialUsers) assertUserCountIsEqualTo(t, store, totalUsers) @@ -638,7 +638,7 @@ func testBulkDelete(t *testing.T) { err := store.BulkDelete(context.Background(), []state.DeleteRequest{ {Key: deleted1}, {Key: deleted2}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) totalUsers -= 2 assertUserCountIsEqualTo(t, store, totalUsers) @@ -655,7 +655,7 @@ func testBulkDelete(t *testing.T) { err := store.BulkDelete(context.Background(), []state.DeleteRequest{ {Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted2.ID, ETag: &deleted2Etag}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) totalUsers -= 2 assertUserCountIsEqualTo(t, store, totalUsers) @@ -672,7 +672,7 @@ func testBulkDelete(t *testing.T) { err := store.BulkDelete(context.Background(), []state.DeleteRequest{ {Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted2.ID}, - }) + }, state.BulkStoreOpts{}) require.NoError(t, err) totalUsers -= 2 assertUserCountIsEqualTo(t, store, totalUsers) @@ -690,7 +690,7 @@ func testBulkDelete(t *testing.T) { err := store.BulkDelete(context.Background(), []state.DeleteRequest{ {Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted2.ID, ETag: &invEtag}, - }) + }, state.BulkStoreOpts{}) assert.NotNil(t, err) assert.NotNil(t, err) assertUserCountIsEqualTo(t, store, totalUsers) diff --git a/state/zookeeper/zk.go b/state/zookeeper/zk.go index dd8f041a0..5c6da42d5 100644 --- a/state/zookeeper/zk.go +++ b/state/zookeeper/zk.go @@ -23,7 +23,6 @@ import ( "time" "github.com/go-zookeeper/zk" - "github.com/hashicorp/go-multierror" jsoniter "github.com/json-iterator/go" "github.com/dapr/components-contrib/metadata" @@ -197,33 +196,6 @@ func (s *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error return nil } -// BulkDelete performs a bulk delete operation. -func (s *StateStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest) error { - ops := make([]any, 0, len(reqs)) - - for i := range reqs { - req, err := s.newDeleteRequest(&reqs[i]) - if err != nil { - return err - } - - ops = append(ops, req) - } - - res, err := s.conn.Multi(ops...) - if err != nil { - return err - } - - for _, res := range res { - if res.Error != nil && !errors.Is(res.Error, zk.ErrNoNode) { - err = multierror.Append(err, res.Error) - } - } - - return err -} - // Set saves state into Zookeeper. func (s *StateStore) Set(ctx context.Context, req *state.SetRequest) error { r, err := s.newSetDataRequest(req) @@ -247,52 +219,6 @@ func (s *StateStore) Set(ctx context.Context, req *state.SetRequest) error { return nil } -// BulkSet performs a bulks save operation. -func (s *StateStore) BulkSet(ctx context.Context, reqs []state.SetRequest) error { - ops := make([]any, 0, len(reqs)) - - for i := range reqs { - req, err := s.newSetDataRequest(&reqs[i]) - if err != nil { - return err - } - ops = append(ops, req) - } - - for { - res, err := s.conn.Multi(ops...) - if err != nil { - return err - } - - var retry []any - - for i, res := range res { - if res.Error != nil { - if errors.Is(res.Error, zk.ErrNoNode) { - if req, ok := ops[i].(*zk.SetDataRequest); ok { - retry = append(retry, s.newCreateRequest(req)) - - continue - } - } - - err = multierror.Append(err, res.Error) - } - } - - if err != nil || retry == nil { - return err - } - - ops = retry - } -} - -func (s *StateStore) newCreateRequest(req *zk.SetDataRequest) *zk.CreateRequest { - return &zk.CreateRequest{Path: req.Path, Data: req.Data} -} - func (s *StateStore) newDeleteRequest(req *state.DeleteRequest) (*zk.DeleteRequest, error) { err := state.CheckRequestOptions(req) if err != nil { diff --git a/state/zookeeper/zk_test.go b/state/zookeeper/zk_test.go index ac0ad22a8..4fa6bfb1e 100644 --- a/state/zookeeper/zk_test.go +++ b/state/zookeeper/zk_test.go @@ -21,7 +21,6 @@ import ( "github.com/go-zookeeper/zk" gomock "github.com/golang/mock/gomock" - "github.com/hashicorp/go-multierror" "github.com/stretchr/testify/assert" "github.com/dapr/components-contrib/state" @@ -146,48 +145,6 @@ func TestDelete(t *testing.T) { }) } -// BulkDelete. -func TestBulkDelete(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - conn := NewMockConn(ctrl) - s := StateStore{conn: conn} - - t.Run("With keys", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)}, - &zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{{}, {}}, nil).Times(1) - - err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}}) - assert.NoError(t, err, "Key must be exists") - }) - - t.Run("With keys and error", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)}, - &zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{ - {Error: zk.ErrUnknown}, {Error: zk.ErrNoAuth}, - }, nil).Times(1) - - err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}}) - assert.Equal(t, err.(*multierror.Error).Errors, []error{zk.ErrUnknown, zk.ErrNoAuth}) - }) - t.Run("With keys and ignore NoNode error", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)}, - &zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{ - {Error: zk.ErrNoNode}, {}, - }, nil).Times(1) - - err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}}) - assert.NoError(t, err, "Key must be exists") - }) -} - // Set. func TestSet(t *testing.T) { ctrl := gomock.NewController(t) @@ -237,57 +194,3 @@ func TestSet(t *testing.T) { assert.NoError(t, err, "Key must be create") }) } - -// BulkSet. -func TestBulkSet(t *testing.T) { - ctrl := gomock.NewController(t) - defer ctrl.Finish() - - conn := NewMockConn(ctrl) - s := StateStore{conn: conn} - - t.Run("With keys", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)}, - &zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{{}, {}}, nil).Times(1) - - err := s.BulkSet(context.Background(), []state.SetRequest{ - {Key: "foo", Value: "bar"}, - {Key: "bar", Value: "foo"}, - }) - assert.NoError(t, err, "Key must be set") - }) - - t.Run("With keys and error", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)}, - &zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{ - {Error: zk.ErrUnknown}, {Error: zk.ErrNoAuth}, - }, nil).Times(1) - - err := s.BulkSet(context.Background(), []state.SetRequest{ - {Key: "foo", Value: "bar"}, - {Key: "bar", Value: "foo"}, - }) - assert.Equal(t, err.(*multierror.Error).Errors, []error{zk.ErrUnknown, zk.ErrNoAuth}) - }) - t.Run("With keys and retry NoNode error", func(t *testing.T) { - conn.EXPECT().Multi([]interface{}{ - &zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)}, - &zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)}, - }).Return([]zk.MultiResponse{ - {Error: zk.ErrNoNode}, {}, - }, nil).Times(1) - conn.EXPECT().Multi([]interface{}{ - &zk.CreateRequest{Path: "foo", Data: []byte("\"bar\"")}, - }).Return([]zk.MultiResponse{{}, {}}, nil).Times(1) - - err := s.BulkSet(context.Background(), []state.SetRequest{ - {Key: "foo", Value: "bar"}, - {Key: "bar", Value: "foo"}, - }) - assert.NoError(t, err, "Key must be set") - }) -} diff --git a/tests/certification/go.mod b/tests/certification/go.mod index 6acdf72f8..3ec18cd0a 100644 --- a/tests/certification/go.mod +++ b/tests/certification/go.mod @@ -12,14 +12,14 @@ require ( github.com/apache/pulsar-client-go v0.9.0 github.com/apache/thrift v0.13.0 github.com/aws/aws-sdk-go v1.44.214 - github.com/benbjohnson/clock v1.3.0 + github.com/benbjohnson/clock v1.3.4 github.com/cenkalti/backoff/v4 v4.2.1 github.com/cloudwego/kitex v0.5.0 github.com/cloudwego/kitex-examples v0.1.1 - github.com/dapr/components-contrib v1.10.6-0.20230426221256-e099a548fbb5 + github.com/dapr/components-contrib v1.11.0-rc.1 github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37 - github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 + github.com/dapr/kit v0.0.5 github.com/eclipse/paho.mqtt.golang v1.4.2 github.com/go-chi/chi/v5 v5.0.8 github.com/go-redis/redis/v8 v8.11.5 @@ -37,8 +37,8 @@ require ( go.mongodb.org/mongo-driver v1.11.2 go.uber.org/multierr v1.11.0 go.uber.org/ratelimit v0.2.0 - golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c - modernc.org/sqlite v1.21.1 + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc + modernc.org/sqlite v1.22.1 ) require ( @@ -110,7 +110,7 @@ require ( github.com/eapache/go-resiliency v1.3.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/emicklei/go-restful/v3 v3.9.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/fasthttp/router v1.4.18 // indirect github.com/fatih/color v1.15.0 // indirect @@ -127,7 +127,7 @@ require ( github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/validator/v10 v10.11.0 // indirect - github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/gocql/gocql v1.3.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect @@ -197,7 +197,7 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.18 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6 // indirect + github.com/microsoft/durabletask-go v0.2.1 // indirect github.com/microsoft/go-mssqldb v0.21.0 // indirect github.com/miekg/dns v1.1.50 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect @@ -216,7 +216,7 @@ require ( github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.1 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pierrec/lz4 v2.6.0+incompatible // indirect + github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -228,14 +228,14 @@ require ( github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/redis/go-redis/v9 v9.0.3 // indirect + github.com/redis/go-redis/v9 v9.0.4 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect github.com/shirou/gopsutil/v3 v3.22.2 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/sony/gobreaker v0.5.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -246,7 +246,7 @@ require ( github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/numcpus v0.4.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.45.0 // indirect + github.com/valyala/fasthttp v1.47.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect @@ -264,17 +264,17 @@ require ( go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/arch v0.2.0 // indirect - golang.org/x/crypto v0.8.0 // indirect + golang.org/x/arch v0.3.0 // indirect + golang.org/x/crypto v0.9.0 // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/net v0.10.0 // indirect + golang.org/x/oauth2 v0.8.0 // indirect + golang.org/x/sync v0.2.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.9.1 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/api v0.115.0 // indirect @@ -298,7 +298,7 @@ require ( lukechampine.com/uint128 v1.3.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.3 // indirect + modernc.org/libc v1.22.6 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/opt v0.1.3 // indirect @@ -311,3 +311,5 @@ require ( ) replace github.com/dapr/components-contrib => ../../ + +replace github.com/dapr/dapr => github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f diff --git a/tests/certification/go.sum b/tests/certification/go.sum index 690776156..89f27e6f3 100644 --- a/tests/certification/go.sum +++ b/tests/certification/go.sum @@ -198,8 +198,9 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+ github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4= +github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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= @@ -342,12 +343,10 @@ github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= -github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b h1:+6TVW2t2GveAxqVNSOezU2fUJVec5MCS5J/MXycfwFs= -github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b/go.mod h1:o/M7becq2NE4unx2v3Hv6vq2DrLmUQx5Knkn+6QTkY4= github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37 h1:gAiBprMLnsdaz4mhr28RlmK1PTnz+UXDNy0Giujty5c= github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37/go.mod h1:+ec5FDv7wGcy+Hlg7vY6msKQClm6es2Q5yCGbDHoURQ= -github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 h1:G55KmJAn2UsJm2+T0Vyz8gPcbphDe1PvjrES18JxfHQ= -github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= +github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg= +github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -398,8 +397,8 @@ github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6r github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= -github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -435,7 +434,7 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8 github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -508,8 +507,8 @@ github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= @@ -772,6 +771,8 @@ github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f h1:4FT6qv1JAyBezr6MYHzSvKmp8YqMhC+wvIm85diT73k= +github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f/go.mod h1:Y/h2dMv9ZpWOXzrp2GyIuxlpsCEZ2xBZ49FNPD4Zz5I= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -866,8 +867,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -939,8 +940,8 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6 h1:MOZFQfiTG1CDRW1ZZD9zpMbzYK99a1ZCvhHm4dYkbSc= -github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6/go.mod h1:UtJXHmKalksdccRiN9Y16cHJYYtZN0bqmqOSiy56V8g= +github.com/microsoft/durabletask-go v0.2.1 h1:ZSEJi43KOEALwWOlj0oJI2LezEgwQeUsITyTUbH2DYQ= +github.com/microsoft/durabletask-go v0.2.1/go.mod h1:UtJXHmKalksdccRiN9Y16cHJYYtZN0bqmqOSiy56V8g= github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -1068,8 +1069,8 @@ github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= -github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= @@ -1148,8 +1149,8 @@ github.com/rabbitmq/amqp091-go v1.7.0/go.mod h1:wfClAtY0C7bOHxd3GjmF26jEHn+rR/0B github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= -github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= +github.com/redis/go-redis/v9 v9.0.4 h1:FC82T+CHJ/Q/PdyLW++GeCO+Ol59Y4T7R4jbgjvktgc= +github.com/redis/go-redis/v9 v9.0.4/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1203,8 +1204,8 @@ github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= @@ -1285,8 +1286,8 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= -github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= +github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= @@ -1420,8 +1421,9 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1442,8 +1444,8 @@ golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1459,8 +1461,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c h1:HDdYQYKOkvJT/Plb5HwJJywTVyUnIctjQm6XSnZ/0CY= -golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1571,8 +1573,8 @@ golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1588,8 +1590,8 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= 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= @@ -1603,8 +1605,9 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/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= @@ -1717,15 +1720,15 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/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.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1826,8 +1829,8 @@ golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyj golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2067,22 +2070,22 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= -modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= +modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo= +modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= -modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= +modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= +modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/tests/certification/state/azure/cosmosdb/cosmosdb_test.go b/tests/certification/state/azure/cosmosdb/cosmosdb_test.go index 8a851ee1a..922267d51 100644 --- a/tests/certification/state/azure/cosmosdb/cosmosdb_test.go +++ b/tests/certification/state/azure/cosmosdb/cosmosdb_test.go @@ -191,7 +191,7 @@ func TestAzureCosmosDBStorage(t *testing.T) { Metadata: setMetadata, }) } - err := store.BulkSet(ctx, reqs) + err := store.BulkSet(ctx, reqs, state.BulkStoreOpts{}) require.NoError(t, err) }) @@ -249,7 +249,7 @@ func TestAzureCosmosDBStorage(t *testing.T) { } // Delete - err := store.BulkDelete(ctx, deleteReqs) + err := store.BulkDelete(ctx, deleteReqs, state.BulkStoreOpts{}) require.NoError(t, err) // Retrieve diff --git a/tests/conformance/state/state.go b/tests/conformance/state/state.go index dbe35a080..0fd8e42df 100644 --- a/tests/conformance/state/state.go +++ b/tests/conformance/state/state.go @@ -357,7 +357,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St }) } } - err := statestore.BulkSet(context.Background(), bulk) + err := statestore.BulkSet(context.Background(), bulk, state.BulkStoreOpts{}) require.NoError(t, err) for _, scenario := range scenarios { @@ -412,7 +412,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St }) } } - err := statestore.BulkDelete(context.Background(), bulk) + err := statestore.BulkDelete(context.Background(), bulk, state.BulkStoreOpts{}) assert.NoError(t, err) for _, req := range bulk { diff --git a/tests/e2e/bindings/zeebe/helper.go b/tests/e2e/bindings/zeebe/helper.go index 20617f17d..fb47ba7af 100644 --- a/tests/e2e/bindings/zeebe/helper.go +++ b/tests/e2e/bindings/zeebe/helper.go @@ -187,7 +187,8 @@ func DeployProcess( } // TODO: pb.DeployProcessResponse is deprecated and needs to be replaced eventually - deployment := &pb.DeployProcessResponse{} //nolint:staticcheck + //nolint:staticcheck + deployment := &pb.DeployProcessResponse{} err = json.Unmarshal(res.Data, deployment) if err != nil { return nil, err diff --git a/tests/e2e/pubsub/jetstream/go.mod b/tests/e2e/pubsub/jetstream/go.mod index 1d9b90186..4130cdf96 100644 --- a/tests/e2e/pubsub/jetstream/go.mod +++ b/tests/e2e/pubsub/jetstream/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/dapr/components-contrib v1.10.6-0.20230403162214-9ee9d56cb7ea - github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce + github.com/dapr/kit v0.0.5 ) require ( @@ -21,10 +21,10 @@ require ( github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/cast v1.5.0 // indirect - golang.org/x/crypto v0.8.0 // indirect - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect - golang.org/x/sys v0.7.0 // indirect + github.com/spf13/cast v1.5.1 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect + golang.org/x/sys v0.8.0 // indirect google.golang.org/protobuf v1.30.0 // indirect ) diff --git a/tests/e2e/pubsub/jetstream/go.sum b/tests/e2e/pubsub/jetstream/go.sum index b177a87e1..922fc94ad 100644 --- a/tests/e2e/pubsub/jetstream/go.sum +++ b/tests/e2e/pubsub/jetstream/go.sum @@ -4,12 +4,12 @@ github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0 h1:iPKdoP+7qq68 github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0/go.mod h1:Wpbh+0sQ/E5AA5EpqLncez2noG65dlyedpp5qfoYyPE= github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= -github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= +github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg= +github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= 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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -21,7 +21,7 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= @@ -41,11 +41,11 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -54,15 +54,15 @@ go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= -golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=