From c4dac2095f2abae4b185bb43c407b762d76224af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 03:34:23 +0800 Subject: [PATCH 01/58] chore(deps): bump google.golang.org/grpc from 1.61.1 to 1.62.0 (#3928) --- go.mod | 12 ++++++------ go.sum | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 6296f70a..ebc801bc 100644 --- a/go.mod +++ b/go.mod @@ -36,8 +36,8 @@ require ( golang.org/x/net v0.21.0 golang.org/x/sys v0.17.0 golang.org/x/time v0.5.0 - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 - google.golang.org/grpc v1.61.1 + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 + google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.32.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/h2non/gock.v1 v1.1.2 @@ -105,13 +105,13 @@ require ( go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.19.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/term v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.110.1 // indirect diff --git a/go.sum b/go.sum index 73ce3f32..2db7bd70 100644 --- a/go.sum +++ b/go.sum @@ -56,7 +56,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -249,15 +249,15 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -300,14 +300,14 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= -google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= From cb8161c799bbb95713131f4c4744caa80196643b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 23 Feb 2024 10:26:41 +0800 Subject: [PATCH 02/58] chore(deps): bump google.golang.org/grpc from 1.61.1 to 1.62.0 in /tools/goctl (#3929) --- tools/goctl/go.mod | 12 ++++++------ tools/goctl/go.sum | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index 2e403db7..1df5dda8 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -17,7 +17,7 @@ require ( github.com/zeromicro/ddl-parser v1.0.5 github.com/zeromicro/go-zero v1.6.2 golang.org/x/text v0.14.0 - google.golang.org/grpc v1.61.1 + google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.32.0 ) @@ -93,15 +93,15 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/net v0.20.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect + golang.org/x/oauth2 v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect golang.org/x/sys v0.16.0 // indirect golang.org/x/term v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index 26455724..5ad2188a 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -57,7 +57,7 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -236,15 +236,15 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/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.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -284,14 +284,14 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= -google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= +google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= From e38cb0118d74fdefa6420d6cb051a5835b8d5367 Mon Sep 17 00:00:00 2001 From: fffreedom Date: Fri, 23 Feb 2024 22:00:58 +0800 Subject: [PATCH 03/58] =?UTF-8?q?when=20the=20Unmarshaler=20parsing=20valu?= =?UTF-8?q?e=20by=20fillSliceFromString,=20if=20the=20val=E2=80=A6=20(#392?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: danahan --- core/mapping/unmarshaler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 1e1f2e67..982d69e5 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -223,11 +223,11 @@ func (u *Unmarshaler) fillSliceFromString(fieldType reflect.Type, value reflect. switch v := mapValue.(type) { case fmt.Stringer: if err := jsonx.UnmarshalFromString(v.String(), &slice); err != nil { - return err + return fmt.Errorf("fullName: `%s`, error: `%w`", fullName, err) } case string: if err := jsonx.UnmarshalFromString(v, &slice); err != nil { - return err + return fmt.Errorf("fullName: `%s`, error: `%w`", fullName, err) } default: return errUnsupportedType From 914bcdcf2b6c72d1f69f73a8d1424317aa8c9975 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Fri, 23 Feb 2024 23:00:35 +0800 Subject: [PATCH 04/58] chore: add tests (#3931) --- core/stat/metrics_test.go | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/core/stat/metrics_test.go b/core/stat/metrics_test.go index 7172994f..30f8d316 100644 --- a/core/stat/metrics_test.go +++ b/core/stat/metrics_test.go @@ -1,11 +1,13 @@ package stat import ( + "errors" "strconv" "testing" "time" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/logx/logtest" ) func TestMetrics(t *testing.T) { @@ -30,6 +32,34 @@ func TestMetrics(t *testing.T) { } } +func TestTopDurationWithEmpty(t *testing.T) { + assert.Equal(t, float32(0), getTopDuration(nil)) + assert.Equal(t, float32(0), getTopDuration([]Task{})) +} + +func TestLogAndReport(t *testing.T) { + buf := logtest.NewCollector(t) + old := logEnabled.True() + logEnabled.Set(true) + t.Cleanup(func() { + logEnabled.Set(old) + }) + + log(&StatReport{}) + assert.NotEmpty(t, buf.String()) + + writerLock.Lock() + writer := reportWriter + writerLock.Unlock() + buf = logtest.NewCollector(t) + t.Cleanup(func() { + SetReportWriter(writer) + }) + SetReportWriter(&badWriter{}) + writeReport(&StatReport{}) + assert.NotEmpty(t, buf.String()) +} + type mockedWriter struct { report *StatReport } @@ -38,3 +68,9 @@ func (m *mockedWriter) Write(report *StatReport) error { m.report = report return nil } + +type badWriter struct{} + +func (b *badWriter) Write(report *StatReport) error { + return errors.New("bad") +} From 0dfaf135dd3fd8f98200485b170710549ee8c994 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sun, 25 Feb 2024 11:24:44 +0800 Subject: [PATCH 05/58] feat: support breaker with sql statements (#3936) --- core/breaker/breakers.go | 2 +- core/breaker/nopbreaker.go | 3 +- core/breaker/nopbreaker_test.go | 2 +- core/stores/sqlx/sqlconn.go | 123 +++------------------------- core/stores/sqlx/sqlconn_test.go | 1 + core/stores/sqlx/stmt.go | 132 +++++++++++++++++++++++++++++++ core/stores/sqlx/stmt_test.go | 25 ++++++ core/stores/sqlx/tx.go | 3 + 8 files changed, 177 insertions(+), 114 deletions(-) diff --git a/core/breaker/breakers.go b/core/breaker/breakers.go index 314965c4..1df42d3e 100644 --- a/core/breaker/breakers.go +++ b/core/breaker/breakers.go @@ -59,7 +59,7 @@ func GetBreaker(name string) Breaker { // NoBreakerFor disables the circuit breaker for the given name. func NoBreakerFor(name string) { lock.Lock() - breakers[name] = newNopBreaker() + breakers[name] = NopBreaker() lock.Unlock() } diff --git a/core/breaker/nopbreaker.go b/core/breaker/nopbreaker.go index cd030b63..baa09801 100644 --- a/core/breaker/nopbreaker.go +++ b/core/breaker/nopbreaker.go @@ -4,7 +4,8 @@ const nopBreakerName = "nopBreaker" type nopBreaker struct{} -func newNopBreaker() Breaker { +// NopBreaker returns a breaker that never trigger breaker circuit. +func NopBreaker() Breaker { return nopBreaker{} } diff --git a/core/breaker/nopbreaker_test.go b/core/breaker/nopbreaker_test.go index 1756aa2a..ac26428d 100644 --- a/core/breaker/nopbreaker_test.go +++ b/core/breaker/nopbreaker_test.go @@ -8,7 +8,7 @@ import ( ) func TestNopBreaker(t *testing.T) { - b := newNopBreaker() + b := NopBreaker() assert.Equal(t, nopBreakerName, b.Name()) p, err := b.Allow() assert.Nil(t, err) diff --git a/core/stores/sqlx/sqlconn.go b/core/stores/sqlx/sqlconn.go index 9603af5b..11838056 100644 --- a/core/stores/sqlx/sqlconn.go +++ b/core/stores/sqlx/sqlconn.go @@ -42,21 +42,6 @@ type ( // SqlOption defines the method to customize a sql connection. SqlOption func(*commonSqlConn) - // StmtSession interface represents a session that can be used to execute statements. - StmtSession interface { - Close() error - Exec(args ...any) (sql.Result, error) - ExecCtx(ctx context.Context, args ...any) (sql.Result, error) - QueryRow(v any, args ...any) error - QueryRowCtx(ctx context.Context, v any, args ...any) error - QueryRowPartial(v any, args ...any) error - QueryRowPartialCtx(ctx context.Context, v any, args ...any) error - QueryRows(v any, args ...any) error - QueryRowsCtx(ctx context.Context, v any, args ...any) error - QueryRowsPartial(v any, args ...any) error - QueryRowsPartialCtx(ctx context.Context, v any, args ...any) error - } - // thread-safe // Because CORBA doesn't support PREPARE, so we need to combine the // query arguments into one string and do underlying query without arguments @@ -65,7 +50,7 @@ type ( onError func(context.Context, error) beginTx beginnable brk breaker.Breaker - accept func(error) bool + accept breaker.Acceptable } connProvider func() (*sql.DB, error) @@ -76,18 +61,6 @@ type ( Query(query string, args ...any) (*sql.Rows, error) QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error) } - - statement struct { - query string - stmt *sql.Stmt - } - - stmtConn interface { - Exec(args ...any) (sql.Result, error) - ExecContext(ctx context.Context, args ...any) (sql.Result, error) - Query(args ...any) (*sql.Rows, error) - QueryContext(ctx context.Context, args ...any) (*sql.Rows, error) - } ) // NewSqlConn returns a SqlConn with given driver name and datasource. @@ -189,8 +162,10 @@ func (db *commonSqlConn) PrepareCtx(ctx context.Context, query string) (stmt Stm } stmt = statement{ - query: query, - stmt: st, + query: query, + stmt: st, + brk: db.brk, + accept: db.acceptable, } return nil }, db.acceptable) @@ -311,7 +286,7 @@ func (db *commonSqlConn) acceptable(err error) bool { func (db *commonSqlConn) queryRows(ctx context.Context, scanner func(*sql.Rows) error, q string, args ...any) (err error) { - var qerr error + var scanFailed bool err = db.brk.DoWithAcceptable(func() error { conn, err := db.connProv() if err != nil { @@ -320,11 +295,14 @@ func (db *commonSqlConn) queryRows(ctx context.Context, scanner func(*sql.Rows) } return query(ctx, conn, func(rows *sql.Rows) error { - qerr = scanner(rows) - return qerr + e := scanner(rows) + if e != nil { + scanFailed = true + } + return e }, q, args...) }, func(err error) bool { - return errors.Is(err, qerr) || db.acceptable(err) + return scanFailed || db.acceptable(err) }) if errors.Is(err, breaker.ErrServiceUnavailable) { metricReqErr.Inc("queryRows", "breaker") @@ -333,83 +311,6 @@ func (db *commonSqlConn) queryRows(ctx context.Context, scanner func(*sql.Rows) return } -func (s statement) Close() error { - return s.stmt.Close() -} - -func (s statement) Exec(args ...any) (sql.Result, error) { - return s.ExecCtx(context.Background(), args...) -} - -func (s statement) ExecCtx(ctx context.Context, args ...any) (result sql.Result, err error) { - ctx, span := startSpan(ctx, "Exec") - defer func() { - endSpan(span, err) - }() - - return execStmt(ctx, s.stmt, s.query, args...) -} - -func (s statement) QueryRow(v any, args ...any) error { - return s.QueryRowCtx(context.Background(), v, args...) -} - -func (s statement) QueryRowCtx(ctx context.Context, v any, args ...any) (err error) { - ctx, span := startSpan(ctx, "QueryRow") - defer func() { - endSpan(span, err) - }() - - return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { - return unmarshalRow(v, rows, true) - }, s.query, args...) -} - -func (s statement) QueryRowPartial(v any, args ...any) error { - return s.QueryRowPartialCtx(context.Background(), v, args...) -} - -func (s statement) QueryRowPartialCtx(ctx context.Context, v any, args ...any) (err error) { - ctx, span := startSpan(ctx, "QueryRowPartial") - defer func() { - endSpan(span, err) - }() - - return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { - return unmarshalRow(v, rows, false) - }, s.query, args...) -} - -func (s statement) QueryRows(v any, args ...any) error { - return s.QueryRowsCtx(context.Background(), v, args...) -} - -func (s statement) QueryRowsCtx(ctx context.Context, v any, args ...any) (err error) { - ctx, span := startSpan(ctx, "QueryRows") - defer func() { - endSpan(span, err) - }() - - return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { - return unmarshalRows(v, rows, true) - }, s.query, args...) -} - -func (s statement) QueryRowsPartial(v any, args ...any) error { - return s.QueryRowsPartialCtx(context.Background(), v, args...) -} - -func (s statement) QueryRowsPartialCtx(ctx context.Context, v any, args ...any) (err error) { - ctx, span := startSpan(ctx, "QueryRowsPartial") - defer func() { - endSpan(span, err) - }() - - return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { - return unmarshalRows(v, rows, false) - }, s.query, args...) -} - // WithAcceptable returns a SqlOption that setting the acceptable function. // acceptable is the func to check if the error can be accepted. func WithAcceptable(acceptable func(err error) bool) SqlOption { diff --git a/core/stores/sqlx/sqlconn_test.go b/core/stores/sqlx/sqlconn_test.go index 339d30cc..ab83e2c6 100644 --- a/core/stores/sqlx/sqlconn_test.go +++ b/core/stores/sqlx/sqlconn_test.go @@ -156,6 +156,7 @@ func TestStatement(t *testing.T) { st := statement{ query: "foo", stmt: stmt, + brk: breaker.NopBreaker(), } assert.NoError(t, st.Close()) }) diff --git a/core/stores/sqlx/stmt.go b/core/stores/sqlx/stmt.go index ab688abb..e140a064 100644 --- a/core/stores/sqlx/stmt.go +++ b/core/stores/sqlx/stmt.go @@ -5,6 +5,7 @@ import ( "database/sql" "time" + "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/syncx" "github.com/zeromicro/go-zero/core/timex" @@ -18,6 +19,137 @@ var ( logSlowSql = syncx.ForAtomicBool(true) ) +type ( + // StmtSession interface represents a session that can be used to execute statements. + StmtSession interface { + Close() error + Exec(args ...any) (sql.Result, error) + ExecCtx(ctx context.Context, args ...any) (sql.Result, error) + QueryRow(v any, args ...any) error + QueryRowCtx(ctx context.Context, v any, args ...any) error + QueryRowPartial(v any, args ...any) error + QueryRowPartialCtx(ctx context.Context, v any, args ...any) error + QueryRows(v any, args ...any) error + QueryRowsCtx(ctx context.Context, v any, args ...any) error + QueryRowsPartial(v any, args ...any) error + QueryRowsPartialCtx(ctx context.Context, v any, args ...any) error + } + + statement struct { + query string + stmt *sql.Stmt + brk breaker.Breaker + accept breaker.Acceptable + } + + stmtConn interface { + Exec(args ...any) (sql.Result, error) + ExecContext(ctx context.Context, args ...any) (sql.Result, error) + Query(args ...any) (*sql.Rows, error) + QueryContext(ctx context.Context, args ...any) (*sql.Rows, error) + } +) + +func (s statement) Close() error { + return s.stmt.Close() +} + +func (s statement) Exec(args ...any) (sql.Result, error) { + return s.ExecCtx(context.Background(), args...) +} + +func (s statement) ExecCtx(ctx context.Context, args ...any) (result sql.Result, err error) { + ctx, span := startSpan(ctx, "Exec") + defer func() { + endSpan(span, err) + }() + + err = s.brk.DoWithAcceptable(func() error { + result, err = execStmt(ctx, s.stmt, s.query, args...) + return err + }, func(err error) bool { + return s.accept(err) + }) + + return +} + +func (s statement) QueryRow(v any, args ...any) error { + return s.QueryRowCtx(context.Background(), v, args...) +} + +func (s statement) QueryRowCtx(ctx context.Context, v any, args ...any) (err error) { + ctx, span := startSpan(ctx, "QueryRow") + defer func() { + endSpan(span, err) + }() + + return s.queryRows(ctx, func(v any, scanner rowsScanner) error { + return unmarshalRow(v, scanner, true) + }, v, args...) +} + +func (s statement) QueryRowPartial(v any, args ...any) error { + return s.QueryRowPartialCtx(context.Background(), v, args...) +} + +func (s statement) QueryRowPartialCtx(ctx context.Context, v any, args ...any) (err error) { + ctx, span := startSpan(ctx, "QueryRowPartial") + defer func() { + endSpan(span, err) + }() + + return s.queryRows(ctx, func(v any, scanner rowsScanner) error { + return unmarshalRow(v, scanner, false) + }, v, args...) +} + +func (s statement) QueryRows(v any, args ...any) error { + return s.QueryRowsCtx(context.Background(), v, args...) +} + +func (s statement) QueryRowsCtx(ctx context.Context, v any, args ...any) (err error) { + ctx, span := startSpan(ctx, "QueryRows") + defer func() { + endSpan(span, err) + }() + + return s.queryRows(ctx, func(v any, scanner rowsScanner) error { + return unmarshalRows(v, scanner, true) + }, v, args...) +} + +func (s statement) QueryRowsPartial(v any, args ...any) error { + return s.QueryRowsPartialCtx(context.Background(), v, args...) +} + +func (s statement) QueryRowsPartialCtx(ctx context.Context, v any, args ...any) (err error) { + ctx, span := startSpan(ctx, "QueryRowsPartial") + defer func() { + endSpan(span, err) + }() + + return s.queryRows(ctx, func(v any, scanner rowsScanner) error { + return unmarshalRows(v, scanner, false) + }, v, args...) +} + +func (s statement) queryRows(ctx context.Context, scanFn func(any, rowsScanner) error, + v any, args ...any) error { + var scanFailed bool + return s.brk.DoWithAcceptable(func() error { + return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { + err := scanFn(v, rows) + if err != nil { + scanFailed = true + } + return err + }, s.query, args...) + }, func(err error) bool { + return scanFailed || s.accept(err) + }) +} + // DisableLog disables logging of sql statements, includes info and slow logs. func DisableLog() { logSql.Set(false) diff --git a/core/stores/sqlx/stmt_test.go b/core/stores/sqlx/stmt_test.go index 215bf2b2..68aed9b6 100644 --- a/core/stores/sqlx/stmt_test.go +++ b/core/stores/sqlx/stmt_test.go @@ -7,7 +7,10 @@ import ( "testing" "time" + "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/breaker" + "github.com/zeromicro/go-zero/core/stores/dbtest" ) var errMockedPlaceholder = errors.New("placeholder") @@ -219,6 +222,28 @@ func TestNilGuard(t *testing.T) { assert.Equal(t, nilGuard{}, guard) } +func TestStmtScanFailed(t *testing.T) { + dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) { + mock.ExpectPrepare("any") + + conn := NewSqlConnFromDB(db) + stmt, err := conn.Prepare("any") + assert.NoError(t, err) + + var val struct { + Foo int + Bar string + } + for i := 0; i < 1000; i++ { + row := sqlmock.NewRows([]string{"foo"}).AddRow("bar") + mock.ExpectQuery("any").WillReturnRows(row) + err := stmt.QueryRow(&val) + assert.Error(t, err) + assert.NotErrorIs(t, err, breaker.ErrServiceUnavailable) + } + }) +} + type mockedSessionConn struct { lastInsertId int64 rowsAffected int64 diff --git a/core/stores/sqlx/tx.go b/core/stores/sqlx/tx.go index d983077c..ea2fd2be 100644 --- a/core/stores/sqlx/tx.go +++ b/core/stores/sqlx/tx.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" "fmt" + + "github.com/zeromicro/go-zero/core/breaker" ) type ( @@ -75,6 +77,7 @@ func (t txSession) PrepareCtx(ctx context.Context, q string) (stmtSession StmtSe return statement{ query: q, stmt: stmt, + brk: breaker.NopBreaker(), }, nil } From 1f63cbe9c6ff89efb2aeeb816fc744a0fdb72325 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Mon, 26 Feb 2024 17:24:52 +0800 Subject: [PATCH 06/58] Update readme-cn.md (#3939) --- readme-cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme-cn.md b/readme-cn.md index 941c9f8b..0263b64b 100644 --- a/readme-cn.md +++ b/readme-cn.md @@ -300,6 +300,7 @@ go-zero 已被许多公司用于生产部署,接入场景如在线教育、电 >96. Sonderbase Technologies >97. 上海荣时信息科技有限公司 >98. 上海同犀智能科技有限公司 +>99. 新华三技术有限公司 如果贵公司也已使用 go-zero,欢迎在 [登记地址](https://github.com/zeromicro/go-zero/issues/602) 登记,仅仅为了推广,不做其它用途。 From 88aab8f63546ea4a58e9ae3cb65dac9c5427ac36 Mon Sep 17 00:00:00 2001 From: MarkJoyMa <64180138+MarkJoyMa@users.noreply.github.com> Date: Wed, 28 Feb 2024 00:23:47 +0800 Subject: [PATCH 07/58] fix: mapping FillDefault is optional! bug (#3940) --- core/mapping/unmarshaler.go | 4 ++++ core/mapping/unmarshaler_test.go | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index 982d69e5..fbaeb69a 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -428,6 +428,10 @@ func (u *Unmarshaler) parseOptionsWithContext(field reflect.StructField, m Value } } + if u.opts.fillDefault { + return key, &options.fieldOptionsWithContext, nil + } + optsWithContext, err := options.toOptionsWithContext(key, m, fullName) if err != nil { return "", nil, err diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index fdbdf4e0..c258e3a6 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/stringx" ) @@ -5411,6 +5412,16 @@ func TestFillDefaultUnmarshal(t *testing.T) { assert.Equal(t, "c", st.C) }) + t.Run("optional !", func(t *testing.T) { + type St struct { + A string `json:",optional"` + B string `json:",optional=!A"` + } + var st = St{} + err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) + assert.NoError(t, err) + }) + t.Run("has value", func(t *testing.T) { type St struct { A string `json:",default=a"` From 52e5d85221cc684b4bc726c81083d1c541c11653 Mon Sep 17 00:00:00 2001 From: mongobaba <66656234+mongobaba@users.noreply.github.com> Date: Fri, 1 Mar 2024 22:55:32 +0800 Subject: [PATCH 08/58] feat: add break metrics for sqlx.statement (#3947) --- core/stores/sqlx/stmt.go | 12 ++++++++- core/stores/sqlx/stmt_test.go | 48 ++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/core/stores/sqlx/stmt.go b/core/stores/sqlx/stmt.go index e140a064..cc35f2b5 100644 --- a/core/stores/sqlx/stmt.go +++ b/core/stores/sqlx/stmt.go @@ -3,6 +3,7 @@ package sqlx import ( "context" "database/sql" + "errors" "time" "github.com/zeromicro/go-zero/core/breaker" @@ -70,6 +71,9 @@ func (s statement) ExecCtx(ctx context.Context, args ...any) (result sql.Result, }, func(err error) bool { return s.accept(err) }) + if errors.Is(err, breaker.ErrServiceUnavailable) { + metricReqErr.Inc("stmt_exec", "breaker") + } return } @@ -137,7 +141,8 @@ func (s statement) QueryRowsPartialCtx(ctx context.Context, v any, args ...any) func (s statement) queryRows(ctx context.Context, scanFn func(any, rowsScanner) error, v any, args ...any) error { var scanFailed bool - return s.brk.DoWithAcceptable(func() error { + + err := s.brk.DoWithAcceptable(func() error { return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { err := scanFn(v, rows) if err != nil { @@ -148,6 +153,11 @@ func (s statement) queryRows(ctx context.Context, scanFn func(any, rowsScanner) }, func(err error) bool { return scanFailed || s.accept(err) }) + if errors.Is(err, breaker.ErrServiceUnavailable) { + metricReqErr.Inc("stmt_queryRows", "breaker") + } + + return err } // DisableLog disables logging of sql statements, includes info and slow logs. diff --git a/core/stores/sqlx/stmt_test.go b/core/stores/sqlx/stmt_test.go index 68aed9b6..84de7577 100644 --- a/core/stores/sqlx/stmt_test.go +++ b/core/stores/sqlx/stmt_test.go @@ -222,7 +222,7 @@ func TestNilGuard(t *testing.T) { assert.Equal(t, nilGuard{}, guard) } -func TestStmtScanFailed(t *testing.T) { +func TestStmtBreaker(t *testing.T) { dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) { mock.ExpectPrepare("any") @@ -242,6 +242,52 @@ func TestStmtScanFailed(t *testing.T) { assert.NotErrorIs(t, err, breaker.ErrServiceUnavailable) } }) + + dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) { + mock.ExpectPrepare("any") + conn := NewSqlConnFromDB(db) + stmt, err := conn.Prepare("any") + assert.NoError(t, err) + + for i := 0; i < 1000; i++ { + assert.Error(t, conn.Transact(func(session Session) error { + return nil + })) + } + + var breakerTriggered bool + for i := 0; i < 1000; i++ { + _, err = stmt.Exec("any") + if errors.Is(err, breaker.ErrServiceUnavailable) { + breakerTriggered = true + break + } + } + assert.True(t, breakerTriggered) + }) + + dbtest.RunTest(t, func(db *sql.DB, mock sqlmock.Sqlmock) { + mock.ExpectPrepare("any") + conn := NewSqlConnFromDB(db) + stmt, err := conn.Prepare("any") + assert.NoError(t, err) + + for i := 0; i < 1000; i++ { + assert.Error(t, conn.Transact(func(session Session) error { + return nil + })) + } + + var breakerTriggered bool + for i := 0; i < 1000; i++ { + err = stmt.QueryRows(&struct{}{}, "any") + if errors.Is(err, breaker.ErrServiceUnavailable) { + breakerTriggered = true + break + } + } + assert.True(t, breakerTriggered) + }) } type mockedSessionConn struct { From a7363f0c21c10081eae8f40eef7bf1be8c799575 Mon Sep 17 00:00:00 2001 From: Alex Last Date: Fri, 1 Mar 2024 15:52:20 +0000 Subject: [PATCH 09/58] feat: add nocgroup build tag for systems without cgroup (#3948) --- core/stat/internal/cpu_linux.go | 2 ++ core/stat/internal/cpu_other.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/stat/internal/cpu_linux.go b/core/stat/internal/cpu_linux.go index 245d0ad8..29ce9dec 100644 --- a/core/stat/internal/cpu_linux.go +++ b/core/stat/internal/cpu_linux.go @@ -1,3 +1,5 @@ +//go:build !nocgroup + package internal import ( diff --git a/core/stat/internal/cpu_other.go b/core/stat/internal/cpu_other.go index b9c27ff7..0634828c 100644 --- a/core/stat/internal/cpu_other.go +++ b/core/stat/internal/cpu_other.go @@ -1,4 +1,4 @@ -//go:build !linux +//go:build !linux || nocgroup package internal From 5263805b3b557ab8628ba362a57b55a3a84ae790 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 00:23:52 +0800 Subject: [PATCH 10/58] chore: simplify linux nocgroup logic (#3949) --- core/stat/internal/cpu_linux.go | 10 ++++++++-- core/stat/internal/cpu_other.go | 2 +- core/stores/sqlx/stmt.go | 1 - readme-cn.md | 4 ++-- readme.md | 4 ++-- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/core/stat/internal/cpu_linux.go b/core/stat/internal/cpu_linux.go index 29ce9dec..faf36c70 100644 --- a/core/stat/internal/cpu_linux.go +++ b/core/stat/internal/cpu_linux.go @@ -1,5 +1,3 @@ -//go:build !nocgroup - package internal import ( @@ -25,6 +23,7 @@ var ( preTotal uint64 limit float64 cores uint64 + noCgroup bool initOnce sync.Once ) @@ -32,6 +31,7 @@ var ( func initialize() { cpus, err := effectiveCpus() if err != nil { + noCgroup = true logx.Error(err) return } @@ -47,12 +47,14 @@ func initialize() { preSystem, err = systemCpuUsage() if err != nil { + noCgroup = true logx.Error(err) return } preTotal, err = cpuUsage() if err != nil { + noCgroup = true logx.Error(err) return } @@ -62,6 +64,10 @@ func initialize() { func RefreshCpu() uint64 { initOnce.Do(initialize) + if noCgroup { + return 0 + } + total, err := cpuUsage() if err != nil { return 0 diff --git a/core/stat/internal/cpu_other.go b/core/stat/internal/cpu_other.go index 0634828c..b9c27ff7 100644 --- a/core/stat/internal/cpu_other.go +++ b/core/stat/internal/cpu_other.go @@ -1,4 +1,4 @@ -//go:build !linux || nocgroup +//go:build !linux package internal diff --git a/core/stores/sqlx/stmt.go b/core/stores/sqlx/stmt.go index cc35f2b5..b66dcc7f 100644 --- a/core/stores/sqlx/stmt.go +++ b/core/stores/sqlx/stmt.go @@ -141,7 +141,6 @@ func (s statement) QueryRowsPartialCtx(ctx context.Context, v any, args ...any) func (s statement) queryRows(ctx context.Context, scanFn func(any, rowsScanner) error, v any, args ...any) error { var scanFailed bool - err := s.brk.DoWithAcceptable(func() error { return queryStmt(ctx, s.stmt, func(rows *sql.Rows) error { err := scanFn(v, rows) diff --git a/readme-cn.md b/readme-cn.md index 0263b64b..30c5c997 100644 --- a/readme-cn.md +++ b/readme-cn.md @@ -307,8 +307,8 @@ go-zero 已被许多公司用于生产部署,接入场景如在线教育、电 ## 10. CNCF 云原生技术全景图

-    - +    +

go-zero 收录在 [CNCF Cloud Native 云原生技术全景图](https://landscape.cncf.io/?selected=go-zero)。 diff --git a/readme.md b/readme.md index 63800fc7..f629149c 100644 --- a/readme.md +++ b/readme.md @@ -248,8 +248,8 @@ Join the chat via https://discord.gg/4JQvC5A4Fe ## Cloud Native Landscape

-    - +    +

go-zero enlisted in the [CNCF Cloud Native Landscape](https://landscape.cncf.io/?selected=go-zero). From ec4188047615c6bc4272a74a83d0118630a67c63 Mon Sep 17 00:00:00 2001 From: chentong Date: Sat, 2 Mar 2024 00:32:39 +0800 Subject: [PATCH 11/58] fix: BatchError.Add() non thread safe (#3946) --- core/errorx/batcherror.go | 9 ++++++++- core/errorx/batcherror_test.go | 24 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/core/errorx/batcherror.go b/core/errorx/batcherror.go index 92ae644d..b63867cb 100644 --- a/core/errorx/batcherror.go +++ b/core/errorx/batcherror.go @@ -1,10 +1,14 @@ package errorx -import "bytes" +import ( + "bytes" + "sync" +) type ( // A BatchError is an error that can hold multiple errors. BatchError struct { + mu sync.Mutex errs errorArray } @@ -13,6 +17,9 @@ type ( // Add adds errs to be, nil errors are ignored. func (be *BatchError) Add(errs ...error) { + be.mu.Lock() + defer be.mu.Unlock() + for _, err := range errs { if err != nil { be.errs = append(be.errs, err) diff --git a/core/errorx/batcherror_test.go b/core/errorx/batcherror_test.go index ae5c8c3e..3e345343 100644 --- a/core/errorx/batcherror_test.go +++ b/core/errorx/batcherror_test.go @@ -3,6 +3,7 @@ package errorx import ( "errors" "fmt" + "sync" "testing" "github.com/stretchr/testify/assert" @@ -33,7 +34,7 @@ func TestBatchErrorNilFromFunc(t *testing.T) { func TestBatchErrorOneError(t *testing.T) { var batch BatchError batch.Add(errors.New(err1)) - assert.NotNil(t, batch) + assert.NotNil(t, batch.Err()) assert.Equal(t, err1, batch.Err().Error()) assert.True(t, batch.NotNil()) } @@ -42,7 +43,26 @@ func TestBatchErrorWithErrors(t *testing.T) { var batch BatchError batch.Add(errors.New(err1)) batch.Add(errors.New(err2)) - assert.NotNil(t, batch) + assert.NotNil(t, batch.Err()) assert.Equal(t, fmt.Sprintf("%s\n%s", err1, err2), batch.Err().Error()) assert.True(t, batch.NotNil()) } + +func TestBatchErrorConcurrentAdd(t *testing.T) { + const count = 10000 + var batch BatchError + var wg sync.WaitGroup + + wg.Add(count) + for i := 0; i < count; i++ { + go func() { + defer wg.Done() + batch.Add(errors.New(err1)) + }() + } + wg.Wait() + + assert.NotNil(t, batch.Err()) + assert.Equal(t, count, len(batch.errs)) + assert.True(t, batch.NotNil()) +} From 03b6e377d75b423f946f95ee1f20b29fe086e14a Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 00:59:15 +0800 Subject: [PATCH 12/58] chore: add lock for batcherror (#3950) --- core/errorx/batcherror.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/errorx/batcherror.go b/core/errorx/batcherror.go index b63867cb..e0fcbb27 100644 --- a/core/errorx/batcherror.go +++ b/core/errorx/batcherror.go @@ -8,8 +8,8 @@ import ( type ( // A BatchError is an error that can hold multiple errors. BatchError struct { - mu sync.Mutex errs errorArray + lock sync.Mutex } errorArray []error @@ -17,8 +17,8 @@ type ( // Add adds errs to be, nil errors are ignored. func (be *BatchError) Add(errs ...error) { - be.mu.Lock() - defer be.mu.Unlock() + be.lock.Lock() + defer be.lock.Unlock() for _, err := range errs { if err != nil { @@ -29,6 +29,9 @@ func (be *BatchError) Add(errs ...error) { // Err returns an error that represents all errors. func (be *BatchError) Err() error { + be.lock.Lock() + defer be.lock.Unlock() + switch len(be.errs) { case 0: return nil @@ -41,6 +44,9 @@ func (be *BatchError) Err() error { // NotNil checks if any error inside. func (be *BatchError) NotNil() bool { + be.lock.Lock() + defer be.lock.Unlock() + return len(be.errs) > 0 } From 8367af3416598aacdcdeee7bcc214df06757d7be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 06:42:25 +0800 Subject: [PATCH 13/58] chore(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 (#3951) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ebc801bc..0a66df64 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/prometheus/client_golang v1.18.0 github.com/redis/go-redis/v9 v9.4.0 github.com/spaolacci/murmur3 v1.1.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 go.etcd.io/etcd/api/v3 v3.5.12 go.etcd.io/etcd/client/v3 v3.5.12 go.mongodb.org/mongo-driver v1.13.1 diff --git a/go.sum b/go.sum index 2db7bd70..6602d0dd 100644 --- a/go.sum +++ b/go.sum @@ -163,15 +163,16 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= 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= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 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.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= From 2ee43b41b88b9d1a7477e45a588a0b1e3fcf890e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 06:50:33 +0800 Subject: [PATCH 14/58] chore(deps): bump github.com/stretchr/testify from 1.8.4 to 1.9.0 in /tools/goctl (#3952) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/goctl/go.mod | 2 +- tools/goctl/go.sum | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index 1df5dda8..a6fcd1f3 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -11,7 +11,7 @@ require ( github.com/iancoleman/strcase v0.3.0 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 github.com/zeromicro/antlr v0.0.1 github.com/zeromicro/ddl-parser v1.0.5 diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index 5ad2188a..8d8ec4c0 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -155,15 +155,16 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= 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= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 h1:+dBg5k7nuTE38VVdoroRsT0Z88fmvdYrI2EjzJst35I= github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1/go.mod h1:nmuySobZb4kFgFy6BptpXp/BBw+xFSyvVPP6auoJB4k= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= From c98d5fdaf4be434b89cb05cdacd587571fc89ece Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 07:13:41 +0800 Subject: [PATCH 15/58] chore: simplify linux nocgroup logic (#3953) --- core/stat/internal/cpu_linux.go | 76 ++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/core/stat/internal/cpu_linux.go b/core/stat/internal/cpu_linux.go index faf36c70..c10196c1 100644 --- a/core/stat/internal/cpu_linux.go +++ b/core/stat/internal/cpu_linux.go @@ -27,42 +27,9 @@ var ( initOnce sync.Once ) -// if /proc not present, ignore the cpu calculation, like wsl linux -func initialize() { - cpus, err := effectiveCpus() - if err != nil { - noCgroup = true - logx.Error(err) - return - } - - cores = uint64(cpus) - limit = float64(cpus) - quota, err := cpuQuota() - if err == nil && quota > 0 { - if quota < limit { - limit = quota - } - } - - preSystem, err = systemCpuUsage() - if err != nil { - noCgroup = true - logx.Error(err) - return - } - - preTotal, err = cpuUsage() - if err != nil { - noCgroup = true - logx.Error(err) - return - } -} - // RefreshCpu refreshes cpu usage and returns. func RefreshCpu() uint64 { - initOnce.Do(initialize) + initializeOnce() if noCgroup { return 0 @@ -120,6 +87,47 @@ func effectiveCpus() (int, error) { return cg.effectiveCpus() } +// if /proc not present, ignore the cpu calculation, like wsl linux +func initialize() error { + cpus, err := effectiveCpus() + if err != nil { + return err + } + + cores = uint64(cpus) + limit = float64(cpus) + quota, err := cpuQuota() + if err == nil && quota > 0 { + if quota < limit { + limit = quota + } + } + + preSystem, err = systemCpuUsage() + if err != nil { + return err + } + + preTotal, err = cpuUsage() + return err +} + +func initializeOnce() { + initOnce.Do(func() { + defer func() { + if p := recover(); p != nil { + noCgroup = true + logx.Error(p) + } + }() + + if err := initialize(); err != nil { + noCgroup = true + logx.Error(err) + } + }) +} + func systemCpuUsage() (uint64, error) { lines, err := iox.ReadTextLines(statFile, iox.WithoutBlank()) if err != nil { From a1bacd3fc894eda7d0a20bc2a5737269bc8cc303 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 10:03:58 +0800 Subject: [PATCH 16/58] feat: a concurrent runner with messages taken in pushing order (#3941) --- core/mapping/unmarshaler_test.go | 4 +- core/threading/stablerunner.go | 105 ++++++++++++++++++++++++++++ core/threading/stablerunner_test.go | 97 +++++++++++++++++++++++++ 3 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 core/threading/stablerunner.go create mode 100644 core/threading/stablerunner_test.go diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index c258e3a6..08a80495 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -12,7 +12,6 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" - "github.com/zeromicro/go-zero/core/stringx" ) @@ -5413,11 +5412,10 @@ func TestFillDefaultUnmarshal(t *testing.T) { }) t.Run("optional !", func(t *testing.T) { - type St struct { + var st struct { A string `json:",optional"` B string `json:",optional=!A"` } - var st = St{} err := fillDefaultUnmarshal.Unmarshal(map[string]any{}, &st) assert.NoError(t, err) }) diff --git a/core/threading/stablerunner.go b/core/threading/stablerunner.go new file mode 100644 index 00000000..0449dae8 --- /dev/null +++ b/core/threading/stablerunner.go @@ -0,0 +1,105 @@ +package threading + +import ( + "errors" + "runtime" + "sync" + "sync/atomic" +) + +const factor = 10 + +var ( + ErrRunnerClosed = errors.New("runner closed") + + bufSize = runtime.NumCPU() * factor +) + +// StableRunner is a runner that guarantees messages are taken out with the pushed order. +// This runner is typically useful for Kafka consumers with parallel processing. +type StableRunner[I, O any] struct { + handle func(I) O + consumedIndex uint64 + writtenIndex uint64 + ring []*struct { + value chan O + lock sync.Mutex + } + runner *TaskRunner + done chan struct{} +} + +// NewStableRunner returns a new StableRunner with given message processor fn. +func NewStableRunner[I, O any](fn func(I) O) *StableRunner[I, O] { + ring := make([]*struct { + value chan O + lock sync.Mutex + }, bufSize) + for i := 0; i < bufSize; i++ { + ring[i] = &struct { + value chan O + lock sync.Mutex + }{ + value: make(chan O, 1), + } + } + + return &StableRunner[I, O]{ + handle: fn, + ring: ring, + runner: NewTaskRunner(runtime.NumCPU()), + done: make(chan struct{}), + } +} + +// Get returns the next processed message in order. +// This method should be called in one goroutine. +func (r *StableRunner[I, O]) Get() (O, error) { + defer atomic.AddUint64(&r.consumedIndex, 1) + + index := atomic.LoadUint64(&r.consumedIndex) + offset := index % uint64(bufSize) + holder := r.ring[offset] + + select { + case o := <-holder.value: + return o, nil + case <-r.done: + if atomic.LoadUint64(&r.consumedIndex) < atomic.LoadUint64(&r.writtenIndex) { + return <-holder.value, nil + } + + var o O + return o, ErrRunnerClosed + } +} + +// Push pushes the message v into the runner and to be processed concurrently, +// after processed, it will be cached to let caller take it in pushing order. +func (r *StableRunner[I, O]) Push(v I) error { + select { + case <-r.done: + return ErrRunnerClosed + default: + index := atomic.AddUint64(&r.writtenIndex, 1) + offset := (index - 1) % uint64(bufSize) + holder := r.ring[offset] + holder.lock.Lock() + r.runner.Schedule(func() { + defer holder.lock.Unlock() + o := r.handle(v) + holder.value <- o + }) + + return nil + } +} + +// Wait waits all the messages to be processed and taken from inner buffer. +func (r *StableRunner[I, O]) Wait() { + close(r.done) + r.runner.Wait() + for atomic.LoadUint64(&r.consumedIndex) < atomic.LoadUint64(&r.writtenIndex) { + runtime.Gosched() + } +} diff --git a/core/threading/stablerunner_test.go b/core/threading/stablerunner_test.go new file mode 100644 index 00000000..b39e81bc --- /dev/null +++ b/core/threading/stablerunner_test.go @@ -0,0 +1,97 @@ +package threading + +import ( + "math/rand" + "sort" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestStableRunner(t *testing.T) { + size := bufSize * 2 + rand.Seed(time.Now().UnixNano()) + runner := NewStableRunner(func(v int) float64 { + if v == 0 { + time.Sleep(time.Millisecond * 100) + } else { + time.Sleep(time.Millisecond * time.Duration(rand.Intn(10))) + } + return float64(v) + 0.5 + }) + + var waitGroup sync.WaitGroup + waitGroup.Add(1) + go func() { + for i := 0; i < size; i++ { + assert.NoError(t, runner.Push(i)) + } + runner.Wait() + waitGroup.Done() + }() + + values := make([]float64, size) + for i := 0; i < size; i++ { + var err error + values[i], err = runner.Get() + assert.NoError(t, err) + time.Sleep(time.Millisecond) + } + + assert.True(t, sort.Float64sAreSorted(values)) + waitGroup.Wait() + + assert.Equal(t, ErrRunnerClosed, runner.Push(1)) + _, err := runner.Get() + assert.Equal(t, ErrRunnerClosed, err) +} + +func FuzzStableRunner(f *testing.F) { + rand.Seed(time.Now().UnixNano()) + f.Add(uint64(bufSize)) + f.Fuzz(func(t *testing.T, n uint64) { + runner := NewStableRunner(func(v int) float64 { + if v == 0 { + time.Sleep(time.Millisecond * 100) + } else { + time.Sleep(time.Millisecond * time.Duration(rand.Intn(10))) + } + return float64(v) + 0.5 + }) + + go func() { + for i := 0; i < int(n); i++ { + assert.NoError(t, runner.Push(i)) + } + }() + + values := make([]float64, n) + for i := 0; i < int(n); i++ { + var err error + values[i], err = runner.Get() + assert.NoError(t, err) + } + + runner.Wait() + assert.True(t, sort.Float64sAreSorted(values)) + + // make sure returning errors after runner is closed + assert.Equal(t, ErrRunnerClosed, runner.Push(1)) + _, err := runner.Get() + assert.Equal(t, ErrRunnerClosed, err) + }) +} + +func BenchmarkStableRunner(b *testing.B) { + runner := NewStableRunner(func(v int) float64 { + time.Sleep(time.Millisecond * time.Duration(rand.Intn(10))) + return float64(v) + 0.5 + }) + + for i := 0; i < b.N; i++ { + _ = runner.Push(i) + _, _ = runner.Get() + } +} From 0ee44c7064b58ad19de811dec1b12cf252d6c64b Mon Sep 17 00:00:00 2001 From: #Suyghur Date: Sat, 2 Mar 2024 10:15:10 +0800 Subject: [PATCH 17/58] feat(redis): added and impl `ZADDNX` command (#3944) --- core/stores/redis/redis.go | 39 +++++++++++++++++++++++++++++++++ core/stores/redis/redis_test.go | 18 +++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 40fb008c..96881115 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -2074,6 +2074,45 @@ func (s *Redis) ZaddFloatCtx(ctx context.Context, key string, score float64, val return } +// Zaddnx is the implementation of redis zadd nx command. +func (s *Redis) Zaddnx(key string, score int64, value string) (val bool, err error) { + return s.ZaddnxCtx(context.Background(), key, score, value) +} + +// ZaddnxCtx is the implementation of redis zadd nx command. +func (s *Redis) ZaddnxCtx(ctx context.Context, key string, score int64, value string) (val bool, err error) { + return s.ZaddnxFloatCtx(ctx, key, float64(score), value) +} + +// ZaddnxFloat is the implementation of redis zaddnx command. +func (s *Redis) ZaddnxFloat(key string, score float64, value string) (bool, error) { + return s.ZaddFloatCtx(context.Background(), key, score, value) +} + +// ZaddnxFloatCtx is the implementation of redis zaddnx command. +func (s *Redis) ZaddnxFloatCtx(ctx context.Context, key string, score float64, value string) ( + val bool, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + v, err := conn.ZAddNX(ctx, key, red.Z{ + Score: score, + Member: value, + }).Result() + if err != nil { + return err + } + + val = v == 1 + return nil + }, acceptable) + + return +} + // Zadds is the implementation of redis zadds command. func (s *Redis) Zadds(key string, ps ...Pair) (int64, error) { return s.ZaddsCtx(context.Background(), key, ps...) diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index b455523c..1515d1cb 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -1584,6 +1584,24 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { }) } +func TestRedis_Zaddnx(t *testing.T) { + runOnRedis(t, func(client *Redis) { + ok, err := client.Zadd("key", 1, "value1") + assert.Nil(t, err) + assert.True(t, ok) + ok, err = client.Zaddnx("key", 2, "value1") + assert.Nil(t, err) + assert.False(t, ok) + + ok, err = client.ZaddFloat("key", 1.1, "value2") + assert.Nil(t, err) + assert.True(t, ok) + ok, err = client.ZaddnxFloat("key", 1.1, "value3") + assert.Nil(t, err) + assert.True(t, ok) + }) +} + func TestRedis_IncrbyFloat(t *testing.T) { runOnRedis(t, func(client *Redis) { incrVal, err := client.IncrbyFloat("key", 0.002) From 8e97c5819fa3768ac81e64b6c21277d9b4ff8439 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 12:22:55 +0800 Subject: [PATCH 18/58] chore: add more tests (#3954) --- core/stores/redis/redis.go | 3 +- core/stores/redis/redis_test.go | 254 ++++++++++++++++---------------- 2 files changed, 133 insertions(+), 124 deletions(-) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 96881115..8cc3f4e7 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -2080,7 +2080,8 @@ func (s *Redis) Zaddnx(key string, score int64, value string) (val bool, err err } // ZaddnxCtx is the implementation of redis zadd nx command. -func (s *Redis) ZaddnxCtx(ctx context.Context, key string, score int64, value string) (val bool, err error) { +func (s *Redis) ZaddnxCtx(ctx context.Context, key string, score int64, value string) ( + val bool, err error) { return s.ZaddnxFloatCtx(ctx, key, float64(score), value) } diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 1515d1cb..a9dd5d66 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -177,7 +177,7 @@ func TestRedis_NonBlock(t *testing.T) { func TestRedis_Decr(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Decr("a") + _, err := newRedis(client.Addr, badType()).Decr("a") assert.NotNil(t, err) val, err := client.Decr("a") assert.Nil(t, err) @@ -190,7 +190,7 @@ func TestRedis_Decr(t *testing.T) { func TestRedis_DecrBy(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Decrby("a", 2) + _, err := newRedis(client.Addr, badType()).Decrby("a", 2) assert.NotNil(t, err) val, err := client.Decrby("a", 2) assert.Nil(t, err) @@ -203,7 +203,7 @@ func TestRedis_DecrBy(t *testing.T) { func TestRedis_Exists(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Exists("a") + _, err := newRedis(client.Addr, badType()).Exists("a") assert.NotNil(t, err) ok, err := client.Exists("a") assert.Nil(t, err) @@ -217,7 +217,7 @@ func TestRedis_Exists(t *testing.T) { func TestRedisTLS_Exists(t *testing.T) { runOnRedisTLS(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Exists("a") + _, err := newRedis(client.Addr, badType()).Exists("a") assert.NotNil(t, err) ok, err := client.Exists("a") assert.NotNil(t, err) @@ -232,7 +232,7 @@ func TestRedisTLS_Exists(t *testing.T) { func TestRedis_ExistsMany(t *testing.T) { runOnRedis(t, func(client *Redis) { // Attempt to create a new Redis instance with an incorrect type and call ExistsMany - _, err := New(client.Addr, badType()).ExistsMany("key1", "key2") + _, err := newRedis(client.Addr, badType()).ExistsMany("key1", "key2") assert.NotNil(t, err) // Check if key1 and key2 exist, expecting that they do not @@ -261,7 +261,7 @@ func TestRedis_ExistsMany(t *testing.T) { func TestRedis_Eval(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"}) + _, err := newRedis(client.Addr, badType()).Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"}) assert.NotNil(t, err) _, err = client.Eval(`redis.call("EXISTS", KEYS[1])`, []string{"notexist"}) assert.Equal(t, Nil, err) @@ -279,7 +279,7 @@ func TestRedis_ScriptRun(t *testing.T) { runOnRedis(t, func(client *Redis) { sc := NewScript(`redis.call("EXISTS", KEYS[1])`) sc2 := NewScript(`return redis.call("EXISTS", KEYS[1])`) - _, err := New(client.Addr, badType()).ScriptRun(sc, []string{"notexist"}) + _, err := newRedis(client.Addr, badType()).ScriptRun(sc, []string{"notexist"}) assert.NotNil(t, err) _, err = client.ScriptRun(sc, []string{"notexist"}) assert.Equal(t, Nil, err) @@ -297,7 +297,7 @@ func TestRedis_GeoHash(t *testing.T) { runOnRedis(t, func(client *Redis) { _, err := client.GeoHash("parent", "child1", "child2") assert.Error(t, err) - _, err = New(client.Addr, badType()).GeoHash("parent", "child1", "child2") + _, err = newRedis(client.Addr, badType()).GeoHash("parent", "child1", "child2") assert.Error(t, err) }) } @@ -306,7 +306,7 @@ func TestRedis_Hgetall(t *testing.T) { runOnRedis(t, func(client *Redis) { assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hgetall("a") + _, err := newRedis(client.Addr, badType()).Hgetall("a") assert.NotNil(t, err) vals, err := client.Hgetall("a") assert.Nil(t, err) @@ -319,10 +319,10 @@ func TestRedis_Hgetall(t *testing.T) { func TestRedis_Hvals(t *testing.T) { runOnRedis(t, func(client *Redis) { - assert.NotNil(t, New(client.Addr, badType()).Hset("a", "aa", "aaa")) + assert.NotNil(t, newRedis(client.Addr, badType()).Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hvals("a") + _, err := newRedis(client.Addr, badType()).Hvals("a") assert.NotNil(t, err) vals, err := client.Hvals("a") assert.Nil(t, err) @@ -334,7 +334,7 @@ func TestRedis_Hsetnx(t *testing.T) { runOnRedis(t, func(client *Redis) { assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hsetnx("a", "bb", "ccc") + _, err := newRedis(client.Addr, badType()).Hsetnx("a", "bb", "ccc") assert.NotNil(t, err) ok, err := client.Hsetnx("a", "bb", "ccc") assert.Nil(t, err) @@ -352,7 +352,7 @@ func TestRedis_HdelHlen(t *testing.T) { runOnRedis(t, func(client *Redis) { assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hlen("a") + _, err := newRedis(client.Addr, badType()).Hlen("a") assert.NotNil(t, err) num, err := client.Hlen("a") assert.Nil(t, err) @@ -368,7 +368,7 @@ func TestRedis_HdelHlen(t *testing.T) { func TestRedis_HIncrBy(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Hincrby("key", "field", 2) + _, err := newRedis(client.Addr, badType()).Hincrby("key", "field", 2) assert.NotNil(t, err) val, err := client.Hincrby("key", "field", 2) assert.Nil(t, err) @@ -383,7 +383,7 @@ func TestRedis_Hkeys(t *testing.T) { runOnRedis(t, func(client *Redis) { assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hkeys("a") + _, err := newRedis(client.Addr, badType()).Hkeys("a") assert.NotNil(t, err) vals, err := client.Hkeys("a") assert.Nil(t, err) @@ -395,7 +395,7 @@ func TestRedis_Hmget(t *testing.T) { runOnRedis(t, func(client *Redis) { assert.Nil(t, client.Hset("a", "aa", "aaa")) assert.Nil(t, client.Hset("a", "bb", "bbb")) - _, err := New(client.Addr, badType()).Hmget("a", "aa", "bb") + _, err := newRedis(client.Addr, badType()).Hmget("a", "aa", "bb") assert.NotNil(t, err) vals, err := client.Hmget("a", "aa", "bb") assert.Nil(t, err) @@ -408,7 +408,7 @@ func TestRedis_Hmget(t *testing.T) { func TestRedis_Hmset(t *testing.T) { runOnRedis(t, func(client *Redis) { - assert.NotNil(t, New(client.Addr, badType()).Hmset("a", nil)) + assert.NotNil(t, newRedis(client.Addr, badType()).Hmset("a", nil)) assert.Nil(t, client.Hmset("a", map[string]string{ "aa": "aaa", "bb": "bbb", @@ -433,7 +433,7 @@ func TestRedis_Hscan(t *testing.T) { var cursor uint64 = 0 sum := 0 for { - _, _, err := New(client.Addr, badType()).Hscan(key, cursor, "*", 100) + _, _, err := newRedis(client.Addr, badType()).Hscan(key, cursor, "*", 100) assert.NotNil(t, err) reMap, next, err := client.Hscan(key, cursor, "*", 100) assert.Nil(t, err) @@ -445,7 +445,7 @@ func TestRedis_Hscan(t *testing.T) { } assert.Equal(t, sum, 3100) - _, err = New(client.Addr, badType()).Del(key) + _, err = newRedis(client.Addr, badType()).Del(key) assert.Error(t, err) _, err = client.Del(key) assert.NoError(t, err) @@ -462,7 +462,7 @@ func TestRedis_Hscan(t *testing.T) { func TestRedis_Incr(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Incr("a") + _, err := newRedis(client.Addr, badType()).Incr("a") assert.NotNil(t, err) val, err := client.Incr("a") assert.Nil(t, err) @@ -475,7 +475,7 @@ func TestRedis_Incr(t *testing.T) { func TestRedis_IncrBy(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Incrby("a", 2) + _, err := newRedis(client.Addr, badType()).Incrby("a", 2) assert.NotNil(t, err) val, err := client.Incrby("a", 2) assert.Nil(t, err) @@ -492,7 +492,7 @@ func TestRedis_Keys(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "value2") assert.Nil(t, err) - _, err = New(client.Addr, badType()).Keys("*") + _, err = newRedis(client.Addr, badType()).Keys("*") assert.NotNil(t, err) keys, err := client.Keys("*") assert.Nil(t, err) @@ -504,13 +504,13 @@ func TestRedis_HyperLogLog(t *testing.T) { t.Run("hyperloglog", func(t *testing.T) { runOnRedis(t, func(client *Redis) { client.Ping() - r := New(client.Addr) - _, err := New(client.Addr, badType()).Pfadd("key1", "val1") + r := newRedis(client.Addr) + _, err := newRedis(client.Addr, badType()).Pfadd("key1", "val1") assert.Error(t, err) ok, err := r.Pfadd("key1", "val1") assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Pfcount("key1") + _, err = newRedis(client.Addr, badType()).Pfcount("key1") assert.Error(t, err) val, err := r.Pfcount("key1") assert.Nil(t, err) @@ -521,7 +521,7 @@ func TestRedis_HyperLogLog(t *testing.T) { val, err = r.Pfcount("key2") assert.Nil(t, err) assert.Equal(t, int64(1), val) - err = New(client.Addr, badType()).Pfmerge("key3", "key1", "key2") + err = newRedis(client.Addr, badType()).Pfmerge("key3", "key1", "key2") assert.Error(t, err) err = r.Pfmerge("key1", "key2") assert.Nil(t, err) @@ -542,22 +542,22 @@ func TestRedis_HyperLogLog(t *testing.T) { func TestRedis_List(t *testing.T) { t.Run("list", func(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Lpush("key", "value1", "value2") + _, err := newRedis(client.Addr, badType()).Lpush("key", "value1", "value2") assert.NotNil(t, err) val, err := client.Lpush("key", "value1", "value2") assert.Nil(t, err) assert.Equal(t, 2, val) - _, err = New(client.Addr, badType()).Rpush("key", "value3", "value4") + _, err = newRedis(client.Addr, badType()).Rpush("key", "value3", "value4") assert.NotNil(t, err) val, err = client.Rpush("key", "value3", "value4") assert.Nil(t, err) assert.Equal(t, 4, val) - _, err = New(client.Addr, badType()).Llen("key") + _, err = newRedis(client.Addr, badType()).Llen("key") assert.NotNil(t, err) val, err = client.Llen("key") assert.Nil(t, err) assert.Equal(t, 4, val) - _, err = New(client.Addr, badType()).Lindex("key", 1) + _, err = newRedis(client.Addr, badType()).Lindex("key", 1) assert.NotNil(t, err) value, err := client.Lindex("key", 0) assert.Nil(t, err) @@ -565,7 +565,7 @@ func TestRedis_List(t *testing.T) { vals, err := client.Lrange("key", 0, 10) assert.Nil(t, err) assert.EqualValues(t, []string{"value2", "value1", "value3", "value4"}, vals) - _, err = New(client.Addr, badType()).Lpop("key") + _, err = newRedis(client.Addr, badType()).Lpop("key") assert.NotNil(t, err) v, err := client.Lpop("key") assert.Nil(t, err) @@ -573,7 +573,7 @@ func TestRedis_List(t *testing.T) { val, err = client.Lpush("key", "value1", "value2") assert.Nil(t, err) assert.Equal(t, 5, val) - _, err = New(client.Addr, badType()).Rpop("key") + _, err = newRedis(client.Addr, badType()).Rpop("key") assert.NotNil(t, err) v, err = client.Rpop("key") assert.Nil(t, err) @@ -581,12 +581,12 @@ func TestRedis_List(t *testing.T) { val, err = client.Rpush("key", "value4", "value3", "value3") assert.Nil(t, err) assert.Equal(t, 7, val) - _, err = New(client.Addr, badType()).Lrem("key", 2, "value1") + _, err = newRedis(client.Addr, badType()).Lrem("key", 2, "value1") assert.NotNil(t, err) n, err := client.Lrem("key", 2, "value1") assert.Nil(t, err) assert.Equal(t, 2, n) - _, err = New(client.Addr, badType()).Lrange("key", 0, 10) + _, err = newRedis(client.Addr, badType()).Lrange("key", 0, 10) assert.NotNil(t, err) vals, err = client.Lrange("key", 0, 10) assert.Nil(t, err) @@ -597,7 +597,7 @@ func TestRedis_List(t *testing.T) { vals, err = client.Lrange("key", 0, 10) assert.Nil(t, err) assert.EqualValues(t, []string{"value2", "value3", "value4"}, vals) - err = New(client.Addr, badType()).Ltrim("key", 0, 1) + err = newRedis(client.Addr, badType()).Ltrim("key", 0, 1) assert.Error(t, err) err = client.Ltrim("key", 0, 1) assert.Nil(t, err) @@ -667,7 +667,7 @@ func TestRedis_Mget(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "value2") assert.Nil(t, err) - _, err = New(client.Addr, badType()).Mget("key1", "key0", "key2", "key3") + _, err = newRedis(client.Addr, badType()).Mget("key1", "key0", "key2", "key3") assert.NotNil(t, err) vals, err := client.Mget("key1", "key0", "key2", "key3") assert.Nil(t, err) @@ -686,7 +686,7 @@ func TestRedis_Mget(t *testing.T) { func TestRedis_SetBit(t *testing.T) { t.Run("setbit", func(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).SetBit("key", 1, 1) + _, err := newRedis(client.Addr, badType()).SetBit("key", 1, 1) assert.Error(t, err) val, err := client.SetBit("key", 1, 1) if assert.NoError(t, err) { @@ -709,7 +709,7 @@ func TestRedis_GetBit(t *testing.T) { val, err := client.SetBit("key", 2, 1) assert.Nil(t, err) assert.Equal(t, 0, val) - _, err = New(client.Addr, badType()).GetBit("key", 2) + _, err = newRedis(client.Addr, badType()).GetBit("key", 2) assert.NotNil(t, err) v, err := client.GetBit("key", 2) assert.Nil(t, err) @@ -733,7 +733,7 @@ func TestRedis_BitCount(t *testing.T) { assert.Equal(t, 0, val) } - _, err := New(client.Addr, badType()).BitCount("key", 0, -1) + _, err := newRedis(client.Addr, badType()).BitCount("key", 0, -1) assert.NotNil(t, err) val, err := client.BitCount("key", 0, -1) assert.Nil(t, err) @@ -763,7 +763,7 @@ func TestRedis_BitOpAnd(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "1") assert.Nil(t, err) - _, err = New(client.Addr, badType()).BitOpAnd("destKey", "key1", "key2") + _, err = newRedis(client.Addr, badType()).BitOpAnd("destKey", "key1", "key2") assert.NotNil(t, err) val, err := client.BitOpAnd("destKey", "key1", "key2") assert.Nil(t, err) @@ -779,7 +779,7 @@ func TestRedis_BitOpNot(t *testing.T) { runOnRedis(t, func(client *Redis) { err := client.Set("key1", "\u0000") assert.Nil(t, err) - _, err = New(client.Addr, badType()).BitOpNot("destKey", "key1") + _, err = newRedis(client.Addr, badType()).BitOpNot("destKey", "key1") assert.NotNil(t, err) val, err := client.BitOpNot("destKey", "key1") assert.Nil(t, err) @@ -796,7 +796,7 @@ func TestRedis_BitOpOr(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "0") assert.Nil(t, err) - _, err = New(client.Addr, badType()).BitOpOr("destKey", "key1", "key2") + _, err = newRedis(client.Addr, badType()).BitOpOr("destKey", "key1", "key2") assert.NotNil(t, err) val, err := client.BitOpOr("destKey", "key1", "key2") assert.Nil(t, err) @@ -813,7 +813,7 @@ func TestRedis_BitOpXor(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "\x0f") assert.Nil(t, err) - _, err = New(client.Addr, badType()).BitOpXor("destKey", "key1", "key2") + _, err = newRedis(client.Addr, badType()).BitOpXor("destKey", "key1", "key2") assert.NotNil(t, err) val, err := client.BitOpXor("destKey", "key1", "key2") assert.Nil(t, err) @@ -830,7 +830,7 @@ func TestRedis_BitPos(t *testing.T) { err := client.Set("key", "\xff\xf0\x00") assert.Nil(t, err) - _, err = New(client.Addr, badType()).BitPos("key", 0, 0, -1) + _, err = newRedis(client.Addr, badType()).BitPos("key", 0, 0, -1) assert.NotNil(t, err) val, err := client.BitPos("key", 0, 0, 2) assert.Nil(t, err) @@ -856,7 +856,7 @@ func TestRedis_BitPos(t *testing.T) { func TestRedis_Persist(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Persist("key") + _, err := newRedis(client.Addr, badType()).Persist("key") assert.NotNil(t, err) ok, err := client.Persist("key") assert.Nil(t, err) @@ -866,14 +866,14 @@ func TestRedis_Persist(t *testing.T) { ok, err = client.Persist("key") assert.Nil(t, err) assert.False(t, ok) - err = New(client.Addr, badType()).Expire("key", 5) + err = newRedis(client.Addr, badType()).Expire("key", 5) assert.NotNil(t, err) err = client.Expire("key", 5) assert.Nil(t, err) ok, err = client.Persist("key") assert.Nil(t, err) assert.True(t, ok) - err = New(client.Addr, badType()).Expireat("key", time.Now().Unix()+5) + err = newRedis(client.Addr, badType()).Expireat("key", time.Now().Unix()+5) assert.NotNil(t, err) err = client.Expireat("key", time.Now().Unix()+5) assert.Nil(t, err) @@ -896,7 +896,7 @@ func TestRedis_Scan(t *testing.T) { assert.Nil(t, err) err = client.Set("key2", "value2") assert.Nil(t, err) - _, _, err = New(client.Addr, badType()).Scan(0, "*", 100) + _, _, err = newRedis(client.Addr, badType()).Scan(0, "*", 100) assert.NotNil(t, err) keys, _, err := client.Scan(0, "*", 100) assert.Nil(t, err) @@ -918,7 +918,7 @@ func TestRedis_Sscan(t *testing.T) { var cursor uint64 = 0 sum := 0 for { - _, _, err := New(client.Addr, badType()).Sscan(key, cursor, "", 100) + _, _, err := newRedis(client.Addr, badType()).Sscan(key, cursor, "", 100) assert.NotNil(t, err) keys, next, err := client.Sscan(key, cursor, "", 100) assert.Nil(t, err) @@ -930,7 +930,7 @@ func TestRedis_Sscan(t *testing.T) { } assert.Equal(t, sum, 1550) - _, err = New(client.Addr, badType()).Del(key) + _, err = newRedis(client.Addr, badType()).Del(key) assert.NotNil(t, err) _, err = client.Del(key) assert.Nil(t, err) @@ -940,48 +940,48 @@ func TestRedis_Sscan(t *testing.T) { func TestRedis_Set(t *testing.T) { t.Run("set", func(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).Sadd("key", 1, 2, 3, 4) + _, err := newRedis(client.Addr, badType()).Sadd("key", 1, 2, 3, 4) assert.NotNil(t, err) num, err := client.Sadd("key", 1, 2, 3, 4) assert.Nil(t, err) assert.Equal(t, 4, num) - _, err = New(client.Addr, badType()).Scard("key") + _, err = newRedis(client.Addr, badType()).Scard("key") assert.NotNil(t, err) val, err := client.Scard("key") assert.Nil(t, err) assert.Equal(t, int64(4), val) - _, err = New(client.Addr, badType()).Sismember("key", 2) + _, err = newRedis(client.Addr, badType()).Sismember("key", 2) assert.NotNil(t, err) ok, err := client.Sismember("key", 2) assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Srem("key", 3, 4) + _, err = newRedis(client.Addr, badType()).Srem("key", 3, 4) assert.NotNil(t, err) num, err = client.Srem("key", 3, 4) assert.Nil(t, err) assert.Equal(t, 2, num) - _, err = New(client.Addr, badType()).Smembers("key") + _, err = newRedis(client.Addr, badType()).Smembers("key") assert.NotNil(t, err) vals, err := client.Smembers("key") assert.Nil(t, err) assert.ElementsMatch(t, []string{"1", "2"}, vals) - _, err = New(client.Addr, badType()).Srandmember("key", 1) + _, err = newRedis(client.Addr, badType()).Srandmember("key", 1) assert.NotNil(t, err) members, err := client.Srandmember("key", 1) assert.Nil(t, err) assert.Len(t, members, 1) assert.Contains(t, []string{"1", "2"}, members[0]) - _, err = New(client.Addr, badType()).Spop("key") + _, err = newRedis(client.Addr, badType()).Spop("key") assert.NotNil(t, err) member, err := client.Spop("key") assert.Nil(t, err) assert.Contains(t, []string{"1", "2"}, member) - _, err = New(client.Addr, badType()).Smembers("key") + _, err = newRedis(client.Addr, badType()).Smembers("key") assert.NotNil(t, err) vals, err = client.Smembers("key") assert.Nil(t, err) assert.NotContains(t, vals, member) - _, err = New(client.Addr, badType()).Sadd("key1", 1, 2, 3, 4) + _, err = newRedis(client.Addr, badType()).Sadd("key1", 1, 2, 3, 4) assert.NotNil(t, err) num, err = client.Sadd("key1", 1, 2, 3, 4) assert.Nil(t, err) @@ -989,32 +989,32 @@ func TestRedis_Set(t *testing.T) { num, err = client.Sadd("key2", 2, 3, 4, 5) assert.Nil(t, err) assert.Equal(t, 4, num) - _, err = New(client.Addr, badType()).Sunion("key1", "key2") + _, err = newRedis(client.Addr, badType()).Sunion("key1", "key2") assert.NotNil(t, err) vals, err = client.Sunion("key1", "key2") assert.Nil(t, err) assert.ElementsMatch(t, []string{"1", "2", "3", "4", "5"}, vals) - _, err = New(client.Addr, badType()).Sunionstore("key3", "key1", "key2") + _, err = newRedis(client.Addr, badType()).Sunionstore("key3", "key1", "key2") assert.NotNil(t, err) num, err = client.Sunionstore("key3", "key1", "key2") assert.Nil(t, err) assert.Equal(t, 5, num) - _, err = New(client.Addr, badType()).Sdiff("key1", "key2") + _, err = newRedis(client.Addr, badType()).Sdiff("key1", "key2") assert.NotNil(t, err) vals, err = client.Sdiff("key1", "key2") assert.Nil(t, err) assert.EqualValues(t, []string{"1"}, vals) - _, err = New(client.Addr, badType()).Sdiffstore("key4", "key1", "key2") + _, err = newRedis(client.Addr, badType()).Sdiffstore("key4", "key1", "key2") assert.NotNil(t, err) num, err = client.Sdiffstore("key4", "key1", "key2") assert.Nil(t, err) assert.Equal(t, 1, num) - _, err = New(client.Addr, badType()).Sinter("key1", "key2") + _, err = newRedis(client.Addr, badType()).Sinter("key1", "key2") assert.NotNil(t, err) vals, err = client.Sinter("key1", "key2") assert.Nil(t, err) assert.ElementsMatch(t, []string{"2", "3", "4"}, vals) - _, err = New(client.Addr, badType()).Sinterstore("key4", "key1", "key2") + _, err = newRedis(client.Addr, badType()).Sinterstore("key4", "key1", "key2") assert.NotNil(t, err) num, err = client.Sinterstore("key4", "key1", "key2") assert.Nil(t, err) @@ -1044,7 +1044,7 @@ func TestRedis_Set(t *testing.T) { func TestRedis_GetSet(t *testing.T) { runOnRedis(t, func(client *Redis) { - _, err := New(client.Addr, badType()).GetSet("hello", "world") + _, err := newRedis(client.Addr, badType()).GetSet("hello", "world") assert.NotNil(t, err) val, err := client.GetSet("hello", "world") assert.Nil(t, err) @@ -1066,11 +1066,11 @@ func TestRedis_GetSet(t *testing.T) { func TestRedis_SetGetDel(t *testing.T) { runOnRedis(t, func(client *Redis) { - err := New(client.Addr, badType()).Set("hello", "world") + err := newRedis(client.Addr, badType()).Set("hello", "world") assert.NotNil(t, err) err = client.Set("hello", "world") assert.Nil(t, err) - _, err = New(client.Addr, badType()).Get("hello") + _, err = newRedis(client.Addr, badType()).Get("hello") assert.NotNil(t, err) val, err := client.Get("hello") assert.Nil(t, err) @@ -1083,11 +1083,11 @@ func TestRedis_SetGetDel(t *testing.T) { func TestRedis_SetExNx(t *testing.T) { runOnRedis(t, func(client *Redis) { - err := New(client.Addr, badType()).Setex("hello", "world", 5) + err := newRedis(client.Addr, badType()).Setex("hello", "world", 5) assert.NotNil(t, err) err = client.Setex("hello", "world", 5) assert.Nil(t, err) - _, err = New(client.Addr, badType()).Setnx("hello", "newworld") + _, err = newRedis(client.Addr, badType()).Setnx("hello", "newworld") assert.NotNil(t, err) ok, err := client.Setnx("hello", "newworld") assert.Nil(t, err) @@ -1104,7 +1104,7 @@ func TestRedis_SetExNx(t *testing.T) { ttl, err := client.Ttl("hello") assert.Nil(t, err) assert.True(t, ttl > 0) - _, err = New(client.Addr, badType()).SetnxEx("newhello", "newworld", 5) + _, err = newRedis(client.Addr, badType()).SetnxEx("newhello", "newworld", 5) assert.NotNil(t, err) ok, err = client.SetnxEx("newhello", "newworld", 5) assert.Nil(t, err) @@ -1126,17 +1126,17 @@ func TestRedis_SetGetDelHashField(t *testing.T) { runOnRedis(t, func(client *Redis) { err := client.Hset("key", "field", "value") assert.Nil(t, err) - _, err = New(client.Addr, badType()).Hget("key", "field") + _, err = newRedis(client.Addr, badType()).Hget("key", "field") assert.NotNil(t, err) val, err := client.Hget("key", "field") assert.Nil(t, err) assert.Equal(t, "value", val) - _, err = New(client.Addr, badType()).Hexists("key", "field") + _, err = newRedis(client.Addr, badType()).Hexists("key", "field") assert.NotNil(t, err) ok, err := client.Hexists("key", "field") assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Hdel("key", "field") + _, err = newRedis(client.Addr, badType()).Hdel("key", "field") assert.NotNil(t, err) ret, err := client.Hdel("key", "field") assert.Nil(t, err) @@ -1179,17 +1179,17 @@ func TestRedis_SortedSet(t *testing.T) { val, err := client.Zscore("key", "value1") assert.Nil(t, err) assert.Equal(t, int64(2), val) - _, err = New(client.Addr, badType()).Zincrby("key", 3, "value1") + _, err = newRedis(client.Addr, badType()).Zincrby("key", 3, "value1") assert.NotNil(t, err) val, err = client.Zincrby("key", 3, "value1") assert.Nil(t, err) assert.Equal(t, int64(5), val) - _, err = New(client.Addr, badType()).Zscore("key", "value1") + _, err = newRedis(client.Addr, badType()).Zscore("key", "value1") assert.NotNil(t, err) val, err = client.Zscore("key", "value1") assert.Nil(t, err) assert.Equal(t, int64(5), val) - _, err = New(client.Addr, badType()).Zadds("key") + _, err = newRedis(client.Addr, badType()).Zadds("key") assert.NotNil(t, err) val, err = client.Zadds("key", Pair{ Key: "value2", @@ -1200,7 +1200,7 @@ func TestRedis_SortedSet(t *testing.T) { }) assert.Nil(t, err) assert.Equal(t, int64(2), val) - _, err = New(client.Addr, badType()).ZRevRangeWithScores("key", 1, 3) + _, err = newRedis(client.Addr, badType()).ZRevRangeWithScores("key", 1, 3) assert.NotNil(t, err) _, err = client.ZRevRangeWithScores("key", 1, 3) assert.Nil(t, err) @@ -1224,11 +1224,11 @@ func TestRedis_SortedSet(t *testing.T) { rank, err = client.Zrevrank("key", "value1") assert.Nil(t, err) assert.Equal(t, int64(2), rank) - _, err = New(client.Addr, badType()).Zrank("key", "value4") + _, err = newRedis(client.Addr, badType()).Zrank("key", "value4") assert.NotNil(t, err) _, err = client.Zrank("key", "value4") assert.Equal(t, Nil, err) - _, err = New(client.Addr, badType()).Zrem("key", "value2", "value3") + _, err = newRedis(client.Addr, badType()).Zrem("key", "value2", "value3") assert.NotNil(t, err) num, err := client.Zrem("key", "value2", "value3") assert.Nil(t, err) @@ -1242,7 +1242,7 @@ func TestRedis_SortedSet(t *testing.T) { ok, err = client.Zadd("key", 8, "value4") assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Zremrangebyscore("key", 6, 7) + _, err = newRedis(client.Addr, badType()).Zremrangebyscore("key", 6, 7) assert.NotNil(t, err) num, err = client.Zremrangebyscore("key", 6, 7) assert.Nil(t, err) @@ -1250,37 +1250,37 @@ func TestRedis_SortedSet(t *testing.T) { ok, err = client.Zadd("key", 6, "value2") assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Zadd("key", 7, "value3") + _, err = newRedis(client.Addr, badType()).Zadd("key", 7, "value3") assert.NotNil(t, err) ok, err = client.Zadd("key", 7, "value3") assert.Nil(t, err) assert.True(t, ok) - _, err = New(client.Addr, badType()).Zcount("key", 6, 7) + _, err = newRedis(client.Addr, badType()).Zcount("key", 6, 7) assert.NotNil(t, err) num, err = client.Zcount("key", 6, 7) assert.Nil(t, err) assert.Equal(t, 2, num) - _, err = New(client.Addr, badType()).Zremrangebyrank("key", 1, 2) + _, err = newRedis(client.Addr, badType()).Zremrangebyrank("key", 1, 2) assert.NotNil(t, err) num, err = client.Zremrangebyrank("key", 1, 2) assert.Nil(t, err) assert.Equal(t, 2, num) - _, err = New(client.Addr, badType()).Zcard("key") + _, err = newRedis(client.Addr, badType()).Zcard("key") assert.NotNil(t, err) card, err := client.Zcard("key") assert.Nil(t, err) assert.Equal(t, 2, card) - _, err = New(client.Addr, badType()).Zrange("key", 0, -1) + _, err = newRedis(client.Addr, badType()).Zrange("key", 0, -1) assert.NotNil(t, err) vals, err := client.Zrange("key", 0, -1) assert.Nil(t, err) assert.EqualValues(t, []string{"value1", "value4"}, vals) - _, err = New(client.Addr, badType()).Zrevrange("key", 0, -1) + _, err = newRedis(client.Addr, badType()).Zrevrange("key", 0, -1) assert.NotNil(t, err) vals, err = client.Zrevrange("key", 0, -1) assert.Nil(t, err) assert.EqualValues(t, []string{"value4", "value1"}, vals) - _, err = New(client.Addr, badType()).ZrangeWithScores("key", 0, -1) + _, err = newRedis(client.Addr, badType()).ZrangeWithScores("key", 0, -1) assert.NotNil(t, err) pairs, err = client.ZrangeWithScores("key", 0, -1) assert.Nil(t, err) @@ -1294,7 +1294,7 @@ func TestRedis_SortedSet(t *testing.T) { Score: 8, }, }, pairs) - _, err = New(client.Addr, badType()).ZrangebyscoreWithScores("key", 5, 8) + _, err = newRedis(client.Addr, badType()).ZrangebyscoreWithScores("key", 5, 8) assert.NotNil(t, err) pairs, err = client.ZrangebyscoreWithScores("key", 5, 8) assert.Nil(t, err) @@ -1308,7 +1308,7 @@ func TestRedis_SortedSet(t *testing.T) { Score: 8, }, }, pairs) - _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresAndLimit( + _, err = newRedis(client.Addr, badType()).ZrangebyscoreWithScoresAndLimit( "key", 5, 8, 1, 1) assert.NotNil(t, err) pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1) @@ -1322,7 +1322,7 @@ func TestRedis_SortedSet(t *testing.T) { pairs, err = client.ZrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0) assert.Nil(t, err) assert.Equal(t, 0, len(pairs)) - _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScores("key", 5, 8) + _, err = newRedis(client.Addr, badType()).ZrevrangebyscoreWithScores("key", 5, 8) assert.NotNil(t, err) pairs, err = client.ZrevrangebyscoreWithScores("key", 5, 8) assert.Nil(t, err) @@ -1336,7 +1336,7 @@ func TestRedis_SortedSet(t *testing.T) { Score: 5, }, }, pairs) - _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresAndLimit( + _, err = newRedis(client.Addr, badType()).ZrevrangebyscoreWithScoresAndLimit( "key", 5, 8, 1, 1) assert.NotNil(t, err) pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 1) @@ -1350,7 +1350,7 @@ func TestRedis_SortedSet(t *testing.T) { pairs, err = client.ZrevrangebyscoreWithScoresAndLimit("key", 5, 8, 1, 0) assert.Nil(t, err) assert.Equal(t, 0, len(pairs)) - _, err = New(client.Addr, badType()).Zrevrank("key", "value") + _, err = newRedis(client.Addr, badType()).Zrevrank("key", "value") assert.NotNil(t, err) _, _ = client.Zadd("second", 2, "aa") _, _ = client.Zadd("third", 3, "bbb") @@ -1361,7 +1361,7 @@ func TestRedis_SortedSet(t *testing.T) { }) assert.Nil(t, err) assert.Equal(t, int64(2), val) - _, err = New(client.Addr, badType()).Zunionstore("union", &ZStore{}) + _, err = newRedis(client.Addr, badType()).Zunionstore("union", &ZStore{}) assert.NotNil(t, err) vals, err = client.Zrange("union", 0, 10000) assert.Nil(t, err) @@ -1488,10 +1488,10 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { val, err := client.ZscoreByFloat("key", "value1") assert.Nil(t, err) assert.Equal(t, 10.345, val) - _, err = New(client.Addr, badType()).ZscoreByFloat("key", "value1") + _, err = newRedis(client.Addr, badType()).ZscoreByFloat("key", "value1") assert.Error(t, err) _, _ = client.ZaddFloat("key", 10.346, "value2") - _, err = New(client.Addr, badType()).ZRevRangeWithScoresByFloat("key", 0, -1) + _, err = newRedis(client.Addr, badType()).ZRevRangeWithScoresByFloat("key", 0, -1) assert.NotNil(t, err) _, err = client.ZRevRangeWithScoresByFloat("key", 0, -1) assert.Nil(t, err) @@ -1510,7 +1510,7 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { }, }, pairs) - _, err = New(client.Addr, badType()).ZrangeWithScoresByFloat("key", 0, -1) + _, err = newRedis(client.Addr, badType()).ZrangeWithScoresByFloat("key", 0, -1) assert.Error(t, err) pairs, err = client.ZrangeWithScoresByFloat("key", 0, -1) @@ -1527,7 +1527,7 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { }, pairs) } - _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresByFloat("key", 0, 20) + _, err = newRedis(client.Addr, badType()).ZrangebyscoreWithScoresByFloat("key", 0, 20) assert.NotNil(t, err) pairs, err = client.ZrangebyscoreWithScoresByFloat("key", 0, 20) assert.Nil(t, err) @@ -1543,7 +1543,7 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { }, pairs) _, err = client.ZrangebyscoreWithScoresByFloatAndLimit("key", 10.1, 12.2, 1, 0) assert.NoError(t, err) - _, err = New(client.Addr, badType()).ZrangebyscoreWithScoresByFloatAndLimit( + _, err = newRedis(client.Addr, badType()).ZrangebyscoreWithScoresByFloatAndLimit( "key", 10.1, 12.2, 1, 1) assert.NotNil(t, err) pairs, err = client.ZrangebyscoreWithScoresByFloatAndLimit("key", 10.1, 12.2, 1, 1) @@ -1554,7 +1554,7 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { Score: 10.346, }, }, pairs) - _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloat("key", 10, 12) + _, err = newRedis(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloat("key", 10, 12) assert.NotNil(t, err) pairs, err = client.ZrevrangebyscoreWithScoresByFloat("key", 10, 12) assert.Nil(t, err) @@ -1570,7 +1570,7 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { }, pairs) _, err = client.ZrevrangebyscoreWithScoresByFloatAndLimit("key", 10, 12, 1, 0) assert.NoError(t, err) - _, err = New(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloatAndLimit( + _, err = newRedis(client.Addr, badType()).ZrevrangebyscoreWithScoresByFloatAndLimit( "key", 10, 12, 1, 1) assert.NotNil(t, err) pairs, err = client.ZrevrangebyscoreWithScoresByFloatAndLimit("key", 10, 12, 1, 1) @@ -1586,19 +1586,27 @@ func TestRedis_SortedSetByFloat64(t *testing.T) { func TestRedis_Zaddnx(t *testing.T) { runOnRedis(t, func(client *Redis) { + _, err := newRedis(client.Addr, badType()).Zaddnx("key", 1, "value1") + assert.Error(t, err) + ok, err := client.Zadd("key", 1, "value1") - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, ok) ok, err = client.Zaddnx("key", 2, "value1") - assert.Nil(t, err) + assert.NoError(t, err) assert.False(t, ok) ok, err = client.ZaddFloat("key", 1.1, "value2") - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, ok) ok, err = client.ZaddnxFloat("key", 1.1, "value3") - assert.Nil(t, err) + assert.NoError(t, err) assert.True(t, ok) + + assert.NoError(t, client.Set("newkey", "value")) + ok, err = client.Zaddnx("newkey", 1, "value") + assert.Error(t, err) + assert.False(t, ok) }) } @@ -1607,12 +1615,12 @@ func TestRedis_IncrbyFloat(t *testing.T) { incrVal, err := client.IncrbyFloat("key", 0.002) assert.Nil(t, err) assert.Equal(t, 0.002, incrVal) - _, err = New(client.Addr, badType()).IncrbyFloat("key", -0.001) + _, err = newRedis(client.Addr, badType()).IncrbyFloat("key", -0.001) assert.Error(t, err) incrVal2, err := client.IncrbyFloat("key", -0.001) assert.Nil(t, err) assert.Equal(t, 0.001, incrVal2) - _, err = New(client.Addr, badType()).HincrbyFloat("hkey", "i", 0.002) + _, err = newRedis(client.Addr, badType()).HincrbyFloat("hkey", "i", 0.002) assert.Error(t, err) hincrVal, err := client.HincrbyFloat("hkey", "i", 0.002) assert.Nil(t, err) @@ -1625,7 +1633,7 @@ func TestRedis_IncrbyFloat(t *testing.T) { func TestRedis_Pipelined(t *testing.T) { runOnRedis(t, func(client *Redis) { - assert.NotNil(t, New(client.Addr, badType()).Pipelined(func(pipeliner Pipeliner) error { + assert.NotNil(t, newRedis(client.Addr, badType()).Pipelined(func(pipeliner Pipeliner) error { return nil })) err := client.Pipelined( @@ -1637,7 +1645,7 @@ func TestRedis_Pipelined(t *testing.T) { }, ) assert.Nil(t, err) - _, err = New(client.Addr, badType()).Ttl("pipelined_counter") + _, err = newRedis(client.Addr, badType()).Ttl("pipelined_counter") assert.NotNil(t, err) ttl, err := client.Ttl("pipelined_counter") assert.Nil(t, err) @@ -1654,17 +1662,17 @@ func TestRedis_Pipelined(t *testing.T) { func TestRedisString(t *testing.T) { runOnRedis(t, func(client *Redis) { client.Ping() - _, err := getRedis(New(client.Addr, Cluster())) + _, err := getRedis(newRedis(client.Addr, Cluster())) assert.Nil(t, err) assert.Equal(t, client.Addr, client.String()) - assert.NotNil(t, New(client.Addr, badType()).Ping()) + assert.NotNil(t, newRedis(client.Addr, badType()).Ping()) }) } func TestRedisScriptLoad(t *testing.T) { runOnRedis(t, func(client *Redis) { client.Ping() - _, err := New(client.Addr, badType()).ScriptLoad("foo") + _, err := newRedis(client.Addr, badType()).ScriptLoad("foo") assert.NotNil(t, err) _, err = client.ScriptLoad("foo") assert.NotNil(t, err) @@ -1676,7 +1684,7 @@ func TestRedisEvalSha(t *testing.T) { client.Ping() scriptHash, err := client.ScriptLoad(`return redis.call("EXISTS", KEYS[1])`) assert.Nil(t, err) - _, err = New(client.Addr, badType()).EvalSha(scriptHash, []string{"key1"}) + _, err = newRedis(client.Addr, badType()).EvalSha(scriptHash, []string{"key1"}) assert.Error(t, err) result, err := client.EvalSha(scriptHash, []string{"key1"}) assert.Nil(t, err) @@ -1759,7 +1767,7 @@ func TestRedis_Zscan(t *testing.T) { var cursor uint64 = 0 sum := 0 for { - _, _, err := New(client.Addr, badType()).Zscan(key, cursor, "value_*", 100) + _, _, err := newRedis(client.Addr, badType()).Zscan(key, cursor, "value_*", 100) assert.NotNil(t, err) keys, next, err := client.Zscan(key, cursor, "value_*", 100) assert.Nil(t, err) @@ -1771,7 +1779,7 @@ func TestRedis_Zscan(t *testing.T) { } assert.Equal(t, sum, 3100) - _, err := New(client.Addr, badType()).Del(key) + _, err := newRedis(client.Addr, badType()).Del(key) assert.NotNil(t, err) _, err = client.Del(key) assert.Nil(t, err) @@ -1827,13 +1835,13 @@ func TestRedisGeo(t *testing.T) { v, err := client.GeoAdd("sicily", geoLocation...) assert.Nil(t, err) assert.Equal(t, int64(2), v) - _, err = New(client.Addr, badType()).GeoDist("sicily", "Palermo", "Catania", "m") + _, err = newRedis(client.Addr, badType()).GeoDist("sicily", "Palermo", "Catania", "m") assert.Error(t, err) v2, err := client.GeoDist("sicily", "Palermo", "Catania", "m") assert.Nil(t, err) assert.Equal(t, 166274, int(v2)) // GeoHash not support - _, err = New(client.Addr, badType()).GeoPos("sicily", "Palermo", "Catania") + _, err = newRedis(client.Addr, badType()).GeoPos("sicily", "Palermo", "Catania") assert.Error(t, err) v3, err := client.GeoPos("sicily", "Palermo", "Catania") assert.Nil(t, err) @@ -1841,7 +1849,7 @@ func TestRedisGeo(t *testing.T) { assert.Equal(t, int64(v3[0].Latitude), int64(38)) assert.Equal(t, int64(v3[1].Longitude), int64(15)) assert.Equal(t, int64(v3[1].Latitude), int64(37)) - _, err = New(client.Addr, badType()).GeoRadius("sicily", 15, 37, + _, err = newRedis(client.Addr, badType()).GeoRadius("sicily", 15, 37, &red.GeoRadiusQuery{WithDist: true, Unit: "km", Radius: 200}) assert.Error(t, err) v4, err := client.GeoRadius("sicily", 15, 37, &red.GeoRadiusQuery{ @@ -1852,12 +1860,12 @@ func TestRedisGeo(t *testing.T) { assert.Equal(t, int64(v4[0].Dist), int64(190)) assert.Equal(t, int64(v4[1].Dist), int64(56)) geoLocation2 := []*GeoLocation{{Longitude: 13.583333, Latitude: 37.316667, Name: "Agrigento"}} - _, err = New(client.Addr, badType()).GeoAdd("sicily", geoLocation2...) + _, err = newRedis(client.Addr, badType()).GeoAdd("sicily", geoLocation2...) assert.Error(t, err) v5, err := client.GeoAdd("sicily", geoLocation2...) assert.Nil(t, err) assert.Equal(t, int64(1), v5) - _, err = New(client.Addr, badType()).GeoRadiusByMember("sicily", "Agrigento", + _, err = newRedis(client.Addr, badType()).GeoRadiusByMember("sicily", "Agrigento", &red.GeoRadiusQuery{Unit: "km", Radius: 100}) assert.Error(t, err) v6, err := client.GeoRadiusByMember("sicily", "Agrigento", @@ -1904,7 +1912,7 @@ func TestSetSlowThreshold(t *testing.T) { func TestRedis_WithPass(t *testing.T) { runOnRedis(t, func(client *Redis) { - err := New(client.Addr, WithPass("any")).Ping() + err := newRedis(client.Addr, WithPass("any")).Ping() assert.NotNil(t, err) }) } @@ -1924,7 +1932,7 @@ func runOnRedisWithError(t *testing.T, fn func(client *Redis)) { s := miniredis.RunT(t) s.SetError("mock error") - fn(New(s.Addr())) + fn(newRedis(s.Addr())) } func runOnRedisTLS(t *testing.T, fn func(client *Redis)) { @@ -1946,7 +1954,7 @@ func runOnRedisTLS(t *testing.T, fn func(client *Redis)) { _ = client.Close() } }() - fn(New(s.Addr(), WithTLS())) + fn(newRedis(s.Addr(), WithTLS())) } func badType() Option { From e38036cea2e0ee6c3fe8c2709e5a4065bb2a7c9f Mon Sep 17 00:00:00 2001 From: fearlessfei <573088370@qq.com> Date: Sat, 2 Mar 2024 18:53:20 +0800 Subject: [PATCH 19/58] feat: retry ignore specified errors (#3808) --- core/fx/retry.go | 20 +++++++++++++++++--- core/fx/retry_test.go | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/core/fx/retry.go b/core/fx/retry.go index e79c9002..1aa002a2 100644 --- a/core/fx/retry.go +++ b/core/fx/retry.go @@ -2,6 +2,7 @@ package fx import ( "context" + "errors" "time" "github.com/zeromicro/go-zero/core/errorx" @@ -14,9 +15,10 @@ type ( RetryOption func(*retryOptions) retryOptions struct { - times int - interval time.Duration - timeout time.Duration + times int + interval time.Duration + timeout time.Duration + IgnoreErrors []error } ) @@ -62,6 +64,11 @@ func retry(ctx context.Context, fn func(errChan chan error, retryCount int), opt select { case err := <-errChan: if err != nil { + for _, ignoreErr := range options.IgnoreErrors { + if errors.Is(err, ignoreErr) { + return nil + } + } berr.Add(err) } else { return nil @@ -103,6 +110,13 @@ func WithTimeout(timeout time.Duration) RetryOption { } } +// WithIgnoreErrors Ignore the specified errors +func WithIgnoreErrors(IgnoreErrors []error) RetryOption { + return func(options *retryOptions) { + options.IgnoreErrors = IgnoreErrors + } +} + func newRetryOptions() *retryOptions { return &retryOptions{ times: defaultRetryTimes, diff --git a/core/fx/retry_test.go b/core/fx/retry_test.go index 045d782a..5a8d06b6 100644 --- a/core/fx/retry_test.go +++ b/core/fx/retry_test.go @@ -97,6 +97,24 @@ func TestRetryWithInterval(t *testing.T) { } +func TestRetryWithWithIgnoreErrors(t *testing.T) { + ignoreErr1 := errors.New("ignore error1") + ignoreErr2 := errors.New("ignore error2") + ignoreErrs := []error{ignoreErr1, ignoreErr2} + + assert.Nil(t, DoWithRetry(func() error { + return ignoreErr1 + }, WithIgnoreErrors(ignoreErrs))) + + assert.Nil(t, DoWithRetry(func() error { + return ignoreErr2 + }, WithIgnoreErrors(ignoreErrs))) + + assert.NotNil(t, DoWithRetry(func() error { + return errors.New("any") + })) +} + func TestRetryCtx(t *testing.T) { t.Run("with timeout", func(t *testing.T) { assert.NotNil(t, DoWithRetryCtx(context.Background(), func(ctx context.Context, retryCount int) error { From 4e3f1776dc94b724a3fc6056d248b05a775f0c90 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 19:09:14 +0800 Subject: [PATCH 20/58] chore: coding style (#3957) --- core/fx/retry.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/fx/retry.go b/core/fx/retry.go index 1aa002a2..836564c7 100644 --- a/core/fx/retry.go +++ b/core/fx/retry.go @@ -18,7 +18,7 @@ type ( times int interval time.Duration timeout time.Duration - IgnoreErrors []error + ignoreErrors []error } ) @@ -64,7 +64,7 @@ func retry(ctx context.Context, fn func(errChan chan error, retryCount int), opt select { case err := <-errChan: if err != nil { - for _, ignoreErr := range options.IgnoreErrors { + for _, ignoreErr := range options.ignoreErrors { if errors.Is(err, ignoreErr) { return nil } @@ -91,29 +91,31 @@ func retry(ctx context.Context, fn func(errChan chan error, retryCount int), opt return berr.Err() } -// WithRetry customize a DoWithRetry call with given retry times. -func WithRetry(times int) RetryOption { +// WithIgnoreErrors Ignore the specified errors +func WithIgnoreErrors(ignoreErrors []error) RetryOption { return func(options *retryOptions) { - options.times = times + options.ignoreErrors = ignoreErrors } } +// WithInterval customizes a DoWithRetry call with given interval. func WithInterval(interval time.Duration) RetryOption { return func(options *retryOptions) { options.interval = interval } } -func WithTimeout(timeout time.Duration) RetryOption { +// WithRetry customizes a DoWithRetry call with given retry times. +func WithRetry(times int) RetryOption { return func(options *retryOptions) { - options.timeout = timeout + options.times = times } } -// WithIgnoreErrors Ignore the specified errors -func WithIgnoreErrors(IgnoreErrors []error) RetryOption { +// WithTimeout customizes a DoWithRetry call with given timeout. +func WithTimeout(timeout time.Duration) RetryOption { return func(options *retryOptions) { - options.IgnoreErrors = IgnoreErrors + options.timeout = timeout } } From 9763c8b143afbf42ed6df988f67a885ddce8bd52 Mon Sep 17 00:00:00 2001 From: Qiu shao Date: Sat, 2 Mar 2024 20:00:25 +0800 Subject: [PATCH 21/58] feat:add redis mset func (#3820) --- core/stores/redis/redis.go | 24 ++++++++++++++++++++++++ core/stores/redis/redis_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 8cc3f4e7..bbad891c 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -1339,6 +1339,30 @@ func (s *Redis) MgetCtx(ctx context.Context, keys ...string) (val []string, err return } +// Mset is the implementation of redis mset command. +func (s *Redis) Mset(fieldsAndValues ...any) (string, error) { + return s.MsetCtx(context.Background(), fieldsAndValues...) +} + +// MsetCtx is the implementation of redis mset command. +func (s *Redis) MsetCtx(ctx context.Context, fieldsAndValues ...any) (val string, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + val, err = conn.MSet(ctx, fieldsAndValues...).Result() + if err != nil { + return err + } + + return nil + }, acceptable) + + return +} + // Persist is the implementation of redis persist command. func (s *Redis) Persist(key string) (bool, error) { return s.PersistCtx(context.Background(), key) diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index a9dd5d66..29cc5417 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -660,6 +660,33 @@ func TestRedis_List(t *testing.T) { }) } +func TestRedis_Mset(t *testing.T) { + t.Run("mset", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + // Attempt to Mget with a bad client type, expecting an error. + _, err := New(client.Addr, badType()).Mset("key1", "value1") + assert.NotNil(t, err) + + // Set multiple key-value pairs using Mset and expect no error. + _, err = client.Mset("key1", "value1", "key2", "value2") + assert.Nil(t, err) + + // Retrieve the values for the keys set above using Mget and expect no error. + vals, err := client.Mget("key1", "key2") + assert.Nil(t, err) + assert.EqualValues(t, []string{"value1", "value2"}, vals) + }) + }) + + // Test case for Mset operation with an incorrect number of arguments, expecting an error. + t.Run("mset error", func(t *testing.T) { + runOnRedisWithError(t, func(client *Redis) { + _, err := client.Mset("key1", "value1", "key2") + assert.Error(t, err) + }) + }) +} + func TestRedis_Mget(t *testing.T) { t.Run("mget", func(t *testing.T) { runOnRedis(t, func(client *Redis) { From a5d2b971a16dc382c8676c7291e1bbfffdb0b684 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 21:58:13 +0800 Subject: [PATCH 22/58] chore: add more tests (#3958) --- core/stores/redis/redis.go | 95 ++++++--------------- core/stores/redis/redis_test.go | 145 +++++++++++++++++++++++++------- 2 files changed, 140 insertions(+), 100 deletions(-) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index bbad891c..8f2ee9f2 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -483,13 +483,8 @@ func (s *Redis) ExistsManyCtx(ctx context.Context, keys ...string) (val int64, e return err } - v, err := conn.Exists(ctx, keys...).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.Exists(ctx, keys...).Result() + return err }, acceptable) return @@ -543,13 +538,8 @@ func (s *Redis) GeoAddCtx(ctx context.Context, key string, geoLocation ...*GeoLo return err } - v, err := conn.GeoAdd(ctx, key, geoLocation...).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoAdd(ctx, key, geoLocation...).Result() + return err }, acceptable) return @@ -569,13 +559,8 @@ func (s *Redis) GeoDistCtx(ctx context.Context, key, member1, member2, unit stri return err } - v, err := conn.GeoDist(ctx, key, member1, member2, unit).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoDist(ctx, key, member1, member2, unit).Result() + return err }, acceptable) return @@ -595,13 +580,8 @@ func (s *Redis) GeoHashCtx(ctx context.Context, key string, members ...string) ( return err } - v, err := conn.GeoHash(ctx, key, members...).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoHash(ctx, key, members...).Result() + return err }, acceptable) return @@ -622,13 +602,8 @@ func (s *Redis) GeoRadiusCtx(ctx context.Context, key string, longitude, latitud return err } - v, err := conn.GeoRadius(ctx, key, longitude, latitude, query).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoRadius(ctx, key, longitude, latitude, query).Result() + return err }, acceptable) return @@ -648,13 +623,8 @@ func (s *Redis) GeoRadiusByMemberCtx(ctx context.Context, key, member string, return err } - v, err := conn.GeoRadiusByMember(ctx, key, member, query).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoRadiusByMember(ctx, key, member, query).Result() + return err }, acceptable) return @@ -674,13 +644,8 @@ func (s *Redis) GeoPosCtx(ctx context.Context, key string, members ...string) ( return err } - v, err := conn.GeoPos(ctx, key, members...).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.GeoPos(ctx, key, members...).Result() + return err }, acceptable) return @@ -699,7 +664,7 @@ func (s *Redis) GetCtx(ctx context.Context, key string) (val string, err error) return err } - if val, err = conn.Get(ctx, key).Result(); err == red.Nil { + if val, err = conn.Get(ctx, key).Result(); errors.Is(err, red.Nil) { return nil } else if err != nil { return err @@ -749,7 +714,7 @@ func (s *Redis) GetSetCtx(ctx context.Context, key, value string) (val string, e return err } - if val, err = conn.GetSet(ctx, key, value).Result(); err == red.Nil { + if val, err = conn.GetSet(ctx, key, value).Result(); errors.Is(err, red.Nil) { return nil } @@ -875,17 +840,16 @@ func (s *Redis) HincrbyFloat(key, field string, increment float64) (float64, err } // HincrbyFloatCtx is the implementation of redis hincrbyfloat command. -func (s *Redis) HincrbyFloatCtx(ctx context.Context, key, field string, increment float64) (val float64, err error) { +func (s *Redis) HincrbyFloatCtx(ctx context.Context, key, field string, increment float64) ( + val float64, err error) { err = s.brk.DoWithAcceptable(func() error { conn, err := getRedis(s) if err != nil { return err } + val, err = conn.HIncrByFloat(ctx, key, field, increment).Result() - if err != nil { - return err - } - return nil + return err }, acceptable) return @@ -1353,11 +1317,7 @@ func (s *Redis) MsetCtx(ctx context.Context, fieldsAndValues ...any) (val string } val, err = conn.MSet(ctx, fieldsAndValues...).Result() - if err != nil { - return err - } - - return nil + return err }, acceptable) return @@ -2052,6 +2012,7 @@ func (s *Redis) TtlCtx(ctx context.Context, key string) (val int, err error) { // -1 means key exists but has no expire val = int(duration) } + return nil }, acceptable) @@ -2157,13 +2118,8 @@ func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (val int64 zs = append(zs, z) } - v, err := conn.ZAdd(ctx, key, zs...).Result() - if err != nil { - return err - } - - val = v - return nil + val, err = conn.ZAdd(ctx, key, zs...).Result() + return err }, acceptable) return @@ -2283,6 +2239,7 @@ func (s *Redis) ZscoreByFloatCtx(ctx context.Context, key, value string) (val fl if err != nil { return err } + val, err = conn.ZScore(ctx, key, value).Result() return err }, acceptable) @@ -2947,7 +2904,7 @@ func withHook(hook red.Hook) Option { } func acceptable(err error) bool { - return err == nil || err == red.Nil || errors.Is(err, context.Canceled) + return err == nil || errors.Is(err, red.Nil) || errors.Is(err, context.Canceled) } func getRedis(r *Redis) (RedisNode, error) { diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 29cc5417..cdb082ab 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -911,9 +911,11 @@ func TestRedis_Persist(t *testing.T) { } func TestRedis_Ping(t *testing.T) { - runOnRedis(t, func(client *Redis) { - ok := client.Ping() - assert.True(t, ok) + t.Run("ping", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + ok := client.Ping() + assert.True(t, ok) + }) }) } @@ -1070,24 +1072,40 @@ func TestRedis_Set(t *testing.T) { } func TestRedis_GetSet(t *testing.T) { - runOnRedis(t, func(client *Redis) { - _, err := newRedis(client.Addr, badType()).GetSet("hello", "world") - assert.NotNil(t, err) - val, err := client.GetSet("hello", "world") - assert.Nil(t, err) - assert.Equal(t, "", val) - val, err = client.Get("hello") - assert.Nil(t, err) - assert.Equal(t, "world", val) - val, err = client.GetSet("hello", "newworld") - assert.Nil(t, err) - assert.Equal(t, "world", val) - val, err = client.Get("hello") - assert.Nil(t, err) - assert.Equal(t, "newworld", val) - ret, err := client.Del("hello") - assert.Nil(t, err) - assert.Equal(t, 1, ret) + t.Run("set_get", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + _, err := newRedis(client.Addr, badType()).GetSet("hello", "world") + assert.NotNil(t, err) + val, err := client.GetSet("hello", "world") + assert.Nil(t, err) + assert.Equal(t, "", val) + val, err = client.Get("hello") + assert.Nil(t, err) + assert.Equal(t, "world", val) + val, err = client.GetSet("hello", "newworld") + assert.Nil(t, err) + assert.Equal(t, "world", val) + val, err = client.Get("hello") + assert.Nil(t, err) + assert.Equal(t, "newworld", val) + ret, err := client.Del("hello") + assert.Nil(t, err) + assert.Equal(t, 1, ret) + }) + }) + + t.Run("set_get with notexists", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + _, err := client.Get("hello") + assert.NoError(t, err) + }) + }) + + t.Run("set_get with error", func(t *testing.T) { + runOnRedisWithError(t, func(client *Redis) { + _, err := client.Get("hello") + assert.Error(t, err) + }) }) } @@ -1823,9 +1841,9 @@ func TestRedisBlpop(t *testing.T) { client.Ping() var node mockedNode _, err := client.Blpop(nil, "foo") - assert.NotNil(t, err) + assert.Error(t, err) _, err = client.Blpop(node, "foo") - assert.NotNil(t, err) + assert.NoError(t, err) }) } @@ -1837,19 +1855,60 @@ func TestRedisBlpopEx(t *testing.T) { _, _, err := client.BlpopEx(nil, "foo") assert.Error(t, err) _, _, err = client.BlpopEx(node, "foo") + assert.NoError(t, err) + }) + }) + + t.Run("blpopex with expire", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + node, err := getRedis(client) + assert.NoError(t, err) + assert.NoError(t, client.Set("foo", "bar")) + _, _, err = client.BlpopEx(node, "foo") + assert.Error(t, err) + }) + }) + + t.Run("blpopex with bad return", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + node := &mockedNode{args: []string{"bar"}} + _, _, err := client.BlpopEx(node, "foo") assert.Error(t, err) }) }) } func TestRedisBlpopWithTimeout(t *testing.T) { - runOnRedis(t, func(client *Redis) { - client.Ping() - var node mockedNode - _, err := client.BlpopWithTimeout(nil, 10*time.Second, "foo") - assert.NotNil(t, err) - _, err = client.BlpopWithTimeout(node, 10*time.Second, "foo") - assert.NotNil(t, err) + t.Run("blpop_withTimeout", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + var node mockedNode + _, err := client.BlpopWithTimeout(nil, 10*time.Second, "foo") + assert.Error(t, err) + _, err = client.BlpopWithTimeout(node, 10*time.Second, "foo") + assert.NoError(t, err) + }) + }) + + t.Run("blpop_withTimeout_error", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + node, err := getRedis(client) + assert.NoError(t, err) + assert.NoError(t, client.Set("foo", "bar")) + _, err = client.BlpopWithTimeout(node, time.Millisecond, "foo") + assert.Error(t, err) + }) + }) + + t.Run("blpop_with_bad_return", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + node := &mockedNode{args: []string{"foo"}} + _, err := client.Blpop(node, "foo") + assert.Error(t, err) + }) }) } @@ -1944,6 +2003,22 @@ func TestRedis_WithPass(t *testing.T) { }) } +func TestRedis_checkConnection(t *testing.T) { + t.Run("checkConnection", func(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + assert.NoError(t, client.checkConnection(time.Millisecond)) + }) + }) + + t.Run("checkConnection error", func(t *testing.T) { + runOnRedisWithError(t, func(client *Redis) { + assert.Error(t, newRedis(client.Addr, badType()).checkConnection(time.Millisecond)) + assert.Error(t, client.checkConnection(time.Millisecond)) + }) + }) +} + func runOnRedis(t *testing.T, fn func(client *Redis)) { logx.Disable() @@ -1992,8 +2067,16 @@ func badType() Option { type mockedNode struct { RedisNode + args []string } func (n mockedNode) BLPop(_ context.Context, _ time.Duration, _ ...string) *red.StringSliceCmd { - return red.NewStringSliceCmd(context.Background(), "foo", "bar") + cmd := red.NewStringSliceCmd(context.Background()) + if len(n.args) == 0 { + cmd.SetVal([]string{"foo", "bar"}) + } else { + cmd.SetVal(n.args) + } + + return cmd } From e08ba2fee80e4f9f12a2d433234d4e668bc77ddc Mon Sep 17 00:00:00 2001 From: kesonan Date: Sat, 2 Mar 2024 22:27:39 +0800 Subject: [PATCH 23/58] (goctl)fix parser issues (#3930) --- tools/goctl/pkg/parser/api/ast/ast.go | 13 ++++ tools/goctl/pkg/parser/api/parser/analyzer.go | 31 +++++++++- .../pkg/parser/api/parser/analyzer_test.go | 33 +++++++++- tools/goctl/pkg/parser/api/parser/filter.go | 14 ++--- tools/goctl/pkg/parser/api/parser/parser.go | 61 +++++++++++++++++-- .../pkg/parser/api/parser/parser_test.go | 7 +++ .../api/parser/testdata/atserver_test.api | 7 ++- .../api/parser/testdata/duplicate_type.api | 8 +++ .../parser/api/parser/testdata/example.api | 14 +++++ .../api/parser/testdata/example_base.api | 3 + .../api/parser/testdata/example_base1.api | 2 + .../api/parser/testdata/example_base2.api | 2 + tools/goctl/rpc/generator/gen_test.go | 8 +-- 13 files changed, 179 insertions(+), 24 deletions(-) create mode 100644 tools/goctl/pkg/parser/api/parser/testdata/duplicate_type.api create mode 100644 tools/goctl/pkg/parser/api/parser/testdata/example_base.api diff --git a/tools/goctl/pkg/parser/api/ast/ast.go b/tools/goctl/pkg/parser/api/ast/ast.go index 40b6bb4a..9b06e14a 100644 --- a/tools/goctl/pkg/parser/api/ast/ast.go +++ b/tools/goctl/pkg/parser/api/ast/ast.go @@ -84,6 +84,19 @@ func (t *TokenNode) SetLeadingCommentGroup(cg CommentGroup) { t.LeadingCommentGroup = cg } +// RawText returns the node's raw text. +func (t *TokenNode) RawText() string { + text := t.Token.Text + if strings.HasPrefix(text, "`") { + text = strings.TrimPrefix(text, "`") + text = strings.TrimSuffix(text, "`") + } else if strings.HasPrefix(text, `"`) { + text = strings.TrimPrefix(text, `"`) + text = strings.TrimSuffix(text, `"`) + } + return text +} + func (t *TokenNode) HasLeadingCommentGroup() bool { return t.LeadingCommentGroup.Valid() || t.leadingFlag } diff --git a/tools/goctl/pkg/parser/api/parser/analyzer.go b/tools/goctl/pkg/parser/api/parser/analyzer.go index a08974a9..35566b93 100644 --- a/tools/goctl/pkg/parser/api/parser/analyzer.go +++ b/tools/goctl/pkg/parser/api/parser/analyzer.go @@ -108,6 +108,8 @@ func (a *Analyzer) astTypeToSpec(in ast.DataType) (spec.Type, error) { } func (a *Analyzer) convert2Spec() error { + a.fillInfo() + if err := a.fillTypes(); err != nil { return err } @@ -128,7 +130,7 @@ func (a *Analyzer) convert2Spec() error { groups = append(groups, v) } sort.SliceStable(groups, func(i, j int) bool { - return groups[i].Annotation.Properties["group"] < groups[j].Annotation.Properties["group"] + return groups[i].Annotation.Properties[groupKeyText] < groups[j].Annotation.Properties[groupKeyText] }) a.spec.Service.Groups = groups @@ -150,7 +152,11 @@ func (a *Analyzer) convertKV(kv []*ast.KVExpr) map[string]string { var ret = map[string]string{} for _, v := range kv { key := strings.TrimSuffix(v.Key.Token.Text, ":") - ret[key] = v.Value.Token.Text + if key == summaryKeyText { + ret[key] = v.Value.RawText() + } else { + ret[key] = v.Value.Token.Text + } } return ret } @@ -270,6 +276,27 @@ func (a *Analyzer) fillService() error { return nil } +func (a *Analyzer) fillInfo() { + properties := make(map[string]string) + if a.api.info != nil { + for _, kv := range a.api.info.Values { + key := kv.Key.Token.Text + properties[strings.TrimSuffix(key, ":")] = kv.Value.RawText() + } + } + a.spec.Info.Properties = properties + infoKeyValue := make(map[string]string) + for key, value := range properties { + titleKey := strings.Title(strings.TrimSuffix(key, ":")) + infoKeyValue[titleKey] = value + } + a.spec.Info.Title = infoKeyValue[infoTitleKey] + a.spec.Info.Desc = infoKeyValue[infoDescKey] + a.spec.Info.Version = infoKeyValue[infoVersionKey] + a.spec.Info.Author = infoKeyValue[infoAuthorKey] + a.spec.Info.Email = infoKeyValue[infoEmailKey] +} + func (a *Analyzer) fillTypes() error { for _, item := range a.api.TypeStmt { switch v := (item).(type) { diff --git a/tools/goctl/pkg/parser/api/parser/analyzer_test.go b/tools/goctl/pkg/parser/api/parser/analyzer_test.go index 5e01d0f4..fa46ecf2 100644 --- a/tools/goctl/pkg/parser/api/parser/analyzer_test.go +++ b/tools/goctl/pkg/parser/api/parser/analyzer_test.go @@ -8,14 +8,40 @@ import ( "strings" "testing" + "github.com/zeromicro/go-zero/tools/goctl/api/spec" + "github.com/stretchr/testify/assert" "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/assertx" ) func Test_Parse(t *testing.T) { t.Run("valid", func(t *testing.T) { - _, err := Parse("./testdata/example.api", nil) + apiSpec, err := Parse("./testdata/example.api", nil) assert.Nil(t, err) + ast := assert.New(t) + ast.Equal(spec.Info{ + Title: "type title here", + Desc: "type desc here", + Version: "type version here", + Author: "type author here", + Email: "type email here", + Properties: map[string]string{ + "title": "type title here", + "desc": "type desc here", + "version": "type version here", + "author": "type author here", + "email": "type email here", + }, + }, apiSpec.Info) + ast.True(func() bool { + for _, group := range apiSpec.Service.Groups { + value, ok := group.Annotation.Properties["summary"] + if ok { + return value == "test" + } + } + return false + }()) }) t.Run("invalid", func(t *testing.T) { data, err := os.ReadFile("./testdata/invalid.api") @@ -46,4 +72,9 @@ func Test_Parse(t *testing.T) { _, err := Parse("./testdata/link_import.api", nil) assert.Nil(t, err) }) + + t.Run("duplicate_types", func(t *testing.T) { + _, err := Parse("./testdata/duplicate_type.api", nil) + assertx.Error(t, err) + }) } diff --git a/tools/goctl/pkg/parser/api/parser/filter.go b/tools/goctl/pkg/parser/api/parser/filter.go index b660f271..88a66b2f 100644 --- a/tools/goctl/pkg/parser/api/parser/filter.go +++ b/tools/goctl/pkg/parser/api/parser/filter.go @@ -4,12 +4,12 @@ import ( "fmt" "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/ast" - "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/placeholder" + "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/token" ) type filterBuilder struct { filename string - m map[string]placeholder.Type + m map[string]token.Position checkExprName string errorManager *errorManager } @@ -17,10 +17,10 @@ type filterBuilder struct { func (b *filterBuilder) check(nodes ...*ast.TokenNode) { for _, node := range nodes { fileNodeText := fmt.Sprintf("%s/%s", b.filename, node.Token.Text) - if _, ok := b.m[fileNodeText]; ok { + if pos, ok := b.m[fileNodeText]; ok && pos != node.Token.Position { b.errorManager.add(ast.DuplicateStmtError(node.Pos(), "duplicate "+b.checkExprName)) } else { - b.m[fileNodeText] = placeholder.PlaceHolder + b.m[fileNodeText] = node.Token.Position } } } @@ -28,10 +28,10 @@ func (b *filterBuilder) check(nodes ...*ast.TokenNode) { func (b *filterBuilder) checkNodeWithPrefix(prefix string, nodes ...*ast.TokenNode) { for _, node := range nodes { joinText := fmt.Sprintf("%s/%s", prefix, node.Token.Text) - if _, ok := b.m[joinText]; ok { + if pos, ok := b.m[joinText]; ok && pos != node.Token.Position { b.errorManager.add(ast.DuplicateStmtError(node.Pos(), "duplicate "+b.checkExprName)) } else { - b.m[joinText] = placeholder.PlaceHolder + b.m[joinText] = node.Token.Position } } } @@ -51,7 +51,7 @@ func newFilter() *filter { func (f *filter) addCheckItem(filename, checkExprName string) *filterBuilder { b := &filterBuilder{ filename: filename, - m: make(map[string]placeholder.Type), + m: make(map[string]token.Position), checkExprName: checkExprName, errorManager: newErrorManager(), } diff --git a/tools/goctl/pkg/parser/api/parser/parser.go b/tools/goctl/pkg/parser/api/parser/parser.go index 77bcd2db..92806d52 100644 --- a/tools/goctl/pkg/parser/api/parser/parser.go +++ b/tools/goctl/pkg/parser/api/parser/parser.go @@ -12,7 +12,17 @@ import ( "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/token" ) -const idAPI = "api" +const ( + idAPI = "api" + summaryKeyExprText = "summary:" + summaryKeyText = "summary" + groupKeyText = "group" + infoTitleKey = "Title" + infoDescKey = "Desc" + infoVersionKey = "Version" + infoAuthorKey = "Author" + infoEmailKey = "Email" +) // Parser is the parser for api file. type Parser struct { @@ -1134,7 +1144,7 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { var valueTok token.Token var leadingCommentGroup ast.CommentGroup - if p.notExpectPeekToken(token.QUO, token.DURATION, token.IDENT, token.INT) { + if p.notExpectPeekToken(token.QUO, token.DURATION, token.IDENT, token.INT, token.STRING) { return nil } @@ -1144,13 +1154,24 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { } slashTok := p.curTok + var pathText = slashTok.Text if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text + if p.peekTokenIs(token.SUB) { // 解析 abc-efg 格式 + if !p.nextToken() { + return nil + } + pathText += p.curTok.Text + if !p.advanceIfPeekTokenIs(token.IDENT) { + return nil + } + pathText += p.curTok.Text + } - idTok := p.curTok valueTok = token.Token{ - Text: slashTok.Text + idTok.Text, + Text: pathText, Position: slashTok.Position, } leadingCommentGroup = p.curTokenNode().LeadingCommentGroup @@ -1170,6 +1191,22 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { return nil } + valueTok = p.curTok + leadingCommentGroup = p.curTokenNode().LeadingCommentGroup + node := ast.NewTokenNode(valueTok) + node.SetLeadingCommentGroup(leadingCommentGroup) + expr.Value = node + return expr + } else if p.peekTokenIs(token.STRING) { + if expr.Key.Token.Text != summaryKeyExprText { + if p.notExpectPeekToken(token.QUO, token.DURATION, token.IDENT, token.INT) { + return nil + } + } + if !p.nextToken() { + return nil + } + valueTok = p.curTok leadingCommentGroup = p.curTokenNode().LeadingCommentGroup node := ast.NewTokenNode(valueTok) @@ -1221,13 +1258,25 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { } slashTok := p.curTok + var pathText = valueTok.Text + pathText += slashTok.Text if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text + if p.peekTokenIs(token.SUB) { // 解析 abc-efg 格式 + if !p.nextToken() { + return nil + } + pathText += p.curTok.Text + if !p.advanceIfPeekTokenIs(token.IDENT) { + return nil + } + pathText += p.curTok.Text + } - idTok := p.curTok valueTok = token.Token{ - Text: valueTok.Text + slashTok.Text + idTok.Text, + Text: pathText, Position: valueTok.Position, } leadingCommentGroup = p.curTokenNode().LeadingCommentGroup diff --git a/tools/goctl/pkg/parser/api/parser/parser_test.go b/tools/goctl/pkg/parser/api/parser/parser_test.go index c37b03a7..e49eb2c6 100644 --- a/tools/goctl/pkg/parser/api/parser/parser_test.go +++ b/tools/goctl/pkg/parser/api/parser/parser_test.go @@ -299,6 +299,11 @@ func TestParser_Parse_atServerStmt(t *testing.T) { "timeout6:": "10ns", "timeout7:": "1h10m10s10ms10µs10ns", "maxBytes:": `1024`, + "prefix:": "/v1", + "prefix1:": "/v1/v2_test/v2-beta", + "prefix2:": "v1/v2_test/v2-beta", + "prefix3:": "v1/v2_", + "summary:": `"test"`, } p := New("foo.api", atServerTestAPI) @@ -349,6 +354,8 @@ func TestParser_Parse_atServerStmt(t *testing.T) { `@server(foo:/v1/v2`, `@server(foo: m1,`, `@server(foo: m1,)`, + `@server(foo: v1/v2-)`, + `@server(foo:"test")`, } for _, v := range testData { p := New("foo.api", v) diff --git a/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api b/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api index c321a031..14b2b4a9 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/atserver_test.api @@ -13,4 +13,9 @@ timeout6: 10ns timeout7: 1h10m10s10ms10µs10ns maxBytes: 1024 -) \ No newline at end of file + prefix: /v1 + prefix1: /v1/v2_test/v2-beta + prefix2: v1/v2_test/v2-beta + prefix3: v1/v2_ + summary:"test" +) diff --git a/tools/goctl/pkg/parser/api/parser/testdata/duplicate_type.api b/tools/goctl/pkg/parser/api/parser/testdata/duplicate_type.api new file mode 100644 index 00000000..381931db --- /dev/null +++ b/tools/goctl/pkg/parser/api/parser/testdata/duplicate_type.api @@ -0,0 +1,8 @@ +syntax = "v1" + +type Example{ + A string +} +type Example{ + B string +} diff --git a/tools/goctl/pkg/parser/api/parser/testdata/example.api b/tools/goctl/pkg/parser/api/parser/testdata/example.api index 97ff1dd8..85cb5173 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/example.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/example.api @@ -188,3 +188,17 @@ service example { post /example/nest2 (NestDemoReq2) returns (NestDemoResp2) } +@server ( + group: /g1/g2_test/g2_beta + prefix: /v1/v2_test/v2-beta + summary: "test" +) +service example { + @handler nestDemo1 + post /a/b_c/d-e/:f/123/g (NestDemoReq1) returns (NestDemoResp1) + + @handler nestDemo2 + post /example/nest2 (NestDemoReq2) returns (NestDemoResp2) +} + + diff --git a/tools/goctl/pkg/parser/api/parser/testdata/example_base.api b/tools/goctl/pkg/parser/api/parser/testdata/example_base.api new file mode 100644 index 00000000..24cfc7e5 --- /dev/null +++ b/tools/goctl/pkg/parser/api/parser/testdata/example_base.api @@ -0,0 +1,3 @@ +syntax = "v1" + +type Base{} diff --git a/tools/goctl/pkg/parser/api/parser/testdata/example_base1.api b/tools/goctl/pkg/parser/api/parser/testdata/example_base1.api index c0bd132b..4b8c71e4 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/example_base1.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/example_base1.api @@ -1,5 +1,7 @@ syntax = "v1" +import "example_base.api" + info( title: "type title here" desc: "type desc here" diff --git a/tools/goctl/pkg/parser/api/parser/testdata/example_base2.api b/tools/goctl/pkg/parser/api/parser/testdata/example_base2.api index ecc07779..cdaf7940 100644 --- a/tools/goctl/pkg/parser/api/parser/testdata/example_base2.api +++ b/tools/goctl/pkg/parser/api/parser/testdata/example_base2.api @@ -1,5 +1,7 @@ syntax = "v1" +import "example_base.api" + info( title: "type title here" desc: "type desc here" diff --git a/tools/goctl/rpc/generator/gen_test.go b/tools/goctl/rpc/generator/gen_test.go index 093d89a0..1c87a1d7 100644 --- a/tools/goctl/rpc/generator/gen_test.go +++ b/tools/goctl/rpc/generator/gen_test.go @@ -5,7 +5,6 @@ import ( "go/build" "os" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" @@ -51,12 +50,7 @@ func TestRpcGenerate(t *testing.T) { err = g.Generate(ctx) assert.Nil(t, err) _, err = execx.Run("go test "+projectName, projectDir) - if err != nil { - assert.True(t, func() bool { - return strings.Contains(err.Error(), - "not in GOROOT") || strings.Contains(err.Error(), "cannot find package") - }()) - } + assert.Error(t, err) }) // case go mod From 45be48a4ee92d151318c9961475fc80fa9a97039 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 2 Mar 2024 22:45:24 +0800 Subject: [PATCH 24/58] chore: coding style (#3959) --- core/mr/mapreduce_fuzz_test.go | 2 +- core/mr/mapreduce_fuzzcase_test.go | 2 +- core/stores/redis/redislock.go | 2 +- core/stringx/node_fuzz_test.go | 2 +- core/threading/stablerunner_test.go | 4 ++-- tools/goctl/api/parser/parser.go | 2 +- tools/goctl/pkg/parser/api/ast/ast.go | 1 + tools/goctl/pkg/parser/api/parser/analyzer.go | 1 + tools/goctl/pkg/parser/api/parser/analyzer_test.go | 8 +++++--- tools/goctl/pkg/parser/api/parser/parser.go | 11 +++++++++-- 10 files changed, 23 insertions(+), 12 deletions(-) diff --git a/core/mr/mapreduce_fuzz_test.go b/core/mr/mapreduce_fuzz_test.go index 936d3623..a275a3ce 100644 --- a/core/mr/mapreduce_fuzz_test.go +++ b/core/mr/mapreduce_fuzz_test.go @@ -13,7 +13,7 @@ import ( ) func FuzzMapReduce(f *testing.F) { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) f.Add(int64(10), runtime.NumCPU()) f.Fuzz(func(t *testing.T, n int64, workers int) { diff --git a/core/mr/mapreduce_fuzzcase_test.go b/core/mr/mapreduce_fuzzcase_test.go index 3b30c31b..ffa3515e 100644 --- a/core/mr/mapreduce_fuzzcase_test.go +++ b/core/mr/mapreduce_fuzzcase_test.go @@ -20,7 +20,7 @@ import ( // If Fuzz stuck, we don't know why, because it only returns hung or unexpected, // so we need to simulate the fuzz test in test mode. func TestMapReduceRandom(t *testing.T) { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) const ( times = 10000 diff --git a/core/stores/redis/redislock.go b/core/stores/redis/redislock.go index 2979ee50..f335d6c8 100644 --- a/core/stores/redis/redislock.go +++ b/core/stores/redis/redislock.go @@ -41,7 +41,7 @@ type RedisLock struct { } func init() { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) } // NewRedisLock returns a RedisLock. diff --git a/core/stringx/node_fuzz_test.go b/core/stringx/node_fuzz_test.go index 6d752100..d256b513 100644 --- a/core/stringx/node_fuzz_test.go +++ b/core/stringx/node_fuzz_test.go @@ -11,7 +11,7 @@ import ( ) func FuzzNodeFind(f *testing.F) { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) f.Add(10) f.Fuzz(func(t *testing.T, keys int) { diff --git a/core/threading/stablerunner_test.go b/core/threading/stablerunner_test.go index b39e81bc..b2da997c 100644 --- a/core/threading/stablerunner_test.go +++ b/core/threading/stablerunner_test.go @@ -12,7 +12,7 @@ import ( func TestStableRunner(t *testing.T) { size := bufSize * 2 - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) runner := NewStableRunner(func(v int) float64 { if v == 0 { time.Sleep(time.Millisecond * 100) @@ -49,7 +49,7 @@ func TestStableRunner(t *testing.T) { } func FuzzStableRunner(f *testing.F) { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) f.Add(uint64(bufSize)) f.Fuzz(func(t *testing.T, n uint64) { runner := NewStableRunner(func(v int) float64 { diff --git a/tools/goctl/api/parser/parser.go b/tools/goctl/api/parser/parser.go index 0eff38fc..d29be54a 100644 --- a/tools/goctl/api/parser/parser.go +++ b/tools/goctl/api/parser/parser.go @@ -17,9 +17,9 @@ type parser struct { spec *spec.ApiSpec } +// Parse parses the api file. // Depreacted: use tools/goctl/pkg/parser/api/parser/parser.go:18 instead, // it will be removed in the future. -// Parse parses the api file. func Parse(filename string) (*spec.ApiSpec, error) { if env.UseExperimental() { return apiParser.Parse(filename, "") diff --git a/tools/goctl/pkg/parser/api/ast/ast.go b/tools/goctl/pkg/parser/api/ast/ast.go index 9b06e14a..b077ab8a 100644 --- a/tools/goctl/pkg/parser/api/ast/ast.go +++ b/tools/goctl/pkg/parser/api/ast/ast.go @@ -94,6 +94,7 @@ func (t *TokenNode) RawText() string { text = strings.TrimPrefix(text, `"`) text = strings.TrimSuffix(text, `"`) } + return text } diff --git a/tools/goctl/pkg/parser/api/parser/analyzer.go b/tools/goctl/pkg/parser/api/parser/analyzer.go index 35566b93..fc90164b 100644 --- a/tools/goctl/pkg/parser/api/parser/analyzer.go +++ b/tools/goctl/pkg/parser/api/parser/analyzer.go @@ -158,6 +158,7 @@ func (a *Analyzer) convertKV(kv []*ast.KVExpr) map[string]string { ret[key] = v.Value.Token.Text } } + return ret } diff --git a/tools/goctl/pkg/parser/api/parser/analyzer_test.go b/tools/goctl/pkg/parser/api/parser/analyzer_test.go index fa46ecf2..9f7976e4 100644 --- a/tools/goctl/pkg/parser/api/parser/analyzer_test.go +++ b/tools/goctl/pkg/parser/api/parser/analyzer_test.go @@ -8,9 +8,8 @@ import ( "strings" "testing" - "github.com/zeromicro/go-zero/tools/goctl/api/spec" - "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/tools/goctl/api/spec" "github.com/zeromicro/go-zero/tools/goctl/pkg/parser/api/assertx" ) @@ -43,6 +42,7 @@ func Test_Parse(t *testing.T) { return false }()) }) + t.Run("invalid", func(t *testing.T) { data, err := os.ReadFile("./testdata/invalid.api") assert.NoError(t, err) @@ -64,15 +64,17 @@ func Test_Parse(t *testing.T) { assertx.Error(t, err) } }) + t.Run("circleImport", func(t *testing.T) { _, err := Parse("./testdata/base.api", nil) assertx.Error(t, err) }) + t.Run("link_import", func(t *testing.T) { _, err := Parse("./testdata/link_import.api", nil) assert.Nil(t, err) }) - + t.Run("duplicate_types", func(t *testing.T) { _, err := Parse("./testdata/duplicate_type.api", nil) assertx.Error(t, err) diff --git a/tools/goctl/pkg/parser/api/parser/parser.go b/tools/goctl/pkg/parser/api/parser/parser.go index 92806d52..2fe60ca6 100644 --- a/tools/goctl/pkg/parser/api/parser/parser.go +++ b/tools/goctl/pkg/parser/api/parser/parser.go @@ -1158,15 +1158,18 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text - if p.peekTokenIs(token.SUB) { // 解析 abc-efg 格式 + if p.peekTokenIs(token.SUB) { // parse abc-efg format if !p.nextToken() { return nil } + pathText += p.curTok.Text if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text } @@ -1203,6 +1206,7 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { return nil } } + if !p.nextToken() { return nil } @@ -1263,15 +1267,18 @@ func (p *Parser) parseAtServerKVExpression() *ast.KVExpr { if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text - if p.peekTokenIs(token.SUB) { // 解析 abc-efg 格式 + if p.peekTokenIs(token.SUB) { // parse abc-efg format if !p.nextToken() { return nil } + pathText += p.curTok.Text if !p.advanceIfPeekTokenIs(token.IDENT) { return nil } + pathText += p.curTok.Text } From be7f93924a5195e64bb944d569e8e6e0aa4483f0 Mon Sep 17 00:00:00 2001 From: POABOB Date: Sat, 2 Mar 2024 23:13:44 +0800 Subject: [PATCH 25/58] feature: add a mongo registry option to convert type easier. (#3780) Co-authored-by: Kevin Wan --- core/stores/mon/options.go | 22 +++++++++++++ core/stores/mon/options_test.go | 57 +++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/core/stores/mon/options.go b/core/stores/mon/options.go index 4097328f..14a6666a 100644 --- a/core/stores/mon/options.go +++ b/core/stores/mon/options.go @@ -1,9 +1,12 @@ package mon import ( + "reflect" "time" "github.com/zeromicro/go-zero/core/syncx" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsoncodec" mopt "go.mongodb.org/mongo-driver/mongo/options" ) @@ -20,6 +23,13 @@ type ( // Option defines the method to customize a mongo model. Option func(opts *options) + + // RegisterType A struct store With custom type and Encoder/Decoder + RegisterType struct { + ValueType reflect.Type + Encoder bsoncodec.ValueEncoder + Decoder bsoncodec.ValueDecoder + } ) // DisableLog disables logging of mongo commands, includes info and slow logs. @@ -50,3 +60,15 @@ func WithTimeout(timeout time.Duration) Option { opts.SetTimeout(timeout) } } + +// WithRegistry set the Registry to convert custom type to mongo primitive type more easily. +func WithRegistry(registerType ...RegisterType) Option { + return func(opts *options) { + registry := bson.NewRegistry() + for _, v := range registerType { + registry.RegisterTypeEncoder(v.ValueType, v.Encoder) + registry.RegisterTypeDecoder(v.ValueType, v.Decoder) + } + opts.SetRegistry(registry) + } +} diff --git a/core/stores/mon/options_test.go b/core/stores/mon/options_test.go index ee944f94..f5a858ad 100644 --- a/core/stores/mon/options_test.go +++ b/core/stores/mon/options_test.go @@ -1,10 +1,14 @@ package mon import ( + "fmt" + "reflect" "testing" "time" "github.com/stretchr/testify/assert" + "go.mongodb.org/mongo-driver/bson/bsoncodec" + "go.mongodb.org/mongo-driver/bson/bsonrw" mopt "go.mongodb.org/mongo-driver/mongo/options" ) @@ -51,3 +55,56 @@ func TestDisableInfoLog(t *testing.T) { assert.False(t, logMon.True()) assert.True(t, logSlowMon.True()) } + +func TestWithRegistryForTimestampRegisterType(t *testing.T) { + opts := mopt.Client() + + // mongoDateTimeEncoder allow user convert time.Time to primitive.DateTime. + var mongoDateTimeEncoder bsoncodec.ValueEncoderFunc = func(ect bsoncodec.EncodeContext, w bsonrw.ValueWriter, value reflect.Value) error { + // Use reflect, determine if it can be converted to time.Time. + dec, ok := value.Interface().(time.Time) + if !ok { + return fmt.Errorf("value %v to encode is not of type time.Time", value) + } + return w.WriteDateTime(dec.Unix()) + } + + // mongoDateTimeEncoder allow user convert primitive.DateTime to time.Time. + var mongoDateTimeDecoder bsoncodec.ValueDecoderFunc = func(ect bsoncodec.DecodeContext, r bsonrw.ValueReader, value reflect.Value) error { + primTime, err := r.ReadDateTime() + if err != nil { + return fmt.Errorf("error reading primitive.DateTime from ValueReader: %v", err) + } + value.Set(reflect.ValueOf(time.Unix(primTime, 0))) + return nil + } + + registerType := []RegisterType{ + { + ValueType: reflect.TypeOf(time.Time{}), + Encoder: mongoDateTimeEncoder, + Decoder: mongoDateTimeDecoder, + }, + } + WithRegistry(registerType...)(opts) + + for _, v := range registerType { + // Validate Encoder + enc, err := opts.Registry.LookupEncoder(v.ValueType) + if err != nil { + t.Fatal(err) + } + if assert.ObjectsAreEqual(v.Encoder, enc) { + t.Errorf("Encoder got from Registry: %v, but want: %v", enc, v.Encoder) + } + + // Validate Decoder + dec, err := opts.Registry.LookupDecoder(v.ValueType) + if err != nil { + t.Fatal(err) + } + if assert.ObjectsAreEqual(v.Decoder, dec) { + t.Errorf("Decoder got from Registry: %v, but want: %v", dec, v.Decoder) + } + } +} From b53ba76a99015800deef74379024ce1f922dfd0b Mon Sep 17 00:00:00 2001 From: Rene Leonhardt <65483435+reneleonhardt@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:40:31 +0100 Subject: [PATCH 26/58] feat: Improve Docker build (#3682) --- .dockerignore | 6 +++++ .github/dependabot.yml | 8 +++++++ .github/workflows/go.yml | 4 ++-- readme-cn.md | 4 ++-- readme.md | 4 ++-- tools/goctl/.dockerignore | 8 +++++++ tools/goctl/Dockerfile | 24 ++++++++++++------- .../test/integration/model/mongo/Dockerfile | 9 ++++--- .../test/integration/model/mongo/mongo.sh | 2 +- 9 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 tools/goctl/.dockerignore diff --git a/.dockerignore b/.dockerignore index f3b64113..af9645a7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,7 @@ **/.git +.dockerignore +Dockerfile +goctl +Makefile +readme.md +readme-cn.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a687e57b..c9454581 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,6 +5,14 @@ version: 2 updates: + - package-ecosystem: "docker" # Update image tags in Dockerfile + directory: "/" + schedule: + interval: "weekly" + - package-ecosystem: "github-actions" # Update GitHub Actions + directory: "/" + schedule: + interval: "weekly" - package-ecosystem: "gomod" # See documentation for possible values directory: "/" # Location of package manifests schedule: diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index f3a3d561..1e866055 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Go 1.x uses: actions/setup-go@v4 with: - go-version: 1.19 + go-version: '1.19' check-latest: true cache: true id: go @@ -53,7 +53,7 @@ jobs: uses: actions/setup-go@v4 with: # use 1.19 to guarantee Go 1.19 compatibility - go-version: 1.19 + go-version: '1.19' check-latest: true cache: true diff --git a/readme-cn.md b/readme-cn.md index 30c5c997..86c7aeac 100644 --- a/readme-cn.md +++ b/readme-cn.md @@ -120,12 +120,12 @@ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro # docker for amd64 architecture docker pull kevinwan/goctl # run goctl like - docker run --rm -it -v `pwd`:/app kevinwan/goctl goctl --help + docker run --rm -it -v `pwd`:/app kevinwan/goctl --help # docker for arm64(Mac) architecture docker pull kevinwan/goctl:latest-arm64 # run goctl like - docker run --rm -it -v `pwd`:/app kevinwan/goctl:latest-arm64 goctl --help + docker run --rm -it -v `pwd`:/app kevinwan/goctl:latest-arm64 --help ``` 确保 goctl 可执行 diff --git a/readme.md b/readme.md index f629149c..8498d835 100644 --- a/readme.md +++ b/readme.md @@ -127,12 +127,12 @@ go get -u github.com/zeromicro/go-zero # docker for amd64 architecture docker pull kevinwan/goctl # run goctl like - docker run --rm -it -v `pwd`:/app kevinwan/goctl goctl --help + docker run --rm -it -v `pwd`:/app kevinwan/goctl --help # docker for arm64(Mac) architecture docker pull kevinwan/goctl:latest-arm64 # run goctl like - docker run --rm -it -v `pwd`:/app kevinwan/goctl:latest-arm64 goctl --help + docker run --rm -it -v `pwd`:/app kevinwan/goctl:latest-arm64 --help ``` make sure goctl is executable. diff --git a/tools/goctl/.dockerignore b/tools/goctl/.dockerignore new file mode 100644 index 00000000..105c6dbd --- /dev/null +++ b/tools/goctl/.dockerignore @@ -0,0 +1,8 @@ +test/ +.dockerignore +.go-version +Dockerfile +goctl +Makefile +readme.md +readme-cn.md diff --git a/tools/goctl/Dockerfile b/tools/goctl/Dockerfile index 44c43af2..10eb9e1d 100644 --- a/tools/goctl/Dockerfile +++ b/tools/goctl/Dockerfile @@ -8,13 +8,12 @@ ENV GOPROXY https://goproxy.cn,direct RUN apk update --no-cache && apk add --no-cache tzdata RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@latest RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest +RUN addgroup -g 1000 -S app && adduser -u 1000 -S app -G app WORKDIR /build -ADD go.mod . -ADD go.sum . -RUN go mod download COPY . . +RUN go mod download RUN go build -ldflags="-s -w" -o /app/goctl ./goctl.go @@ -22,13 +21,20 @@ FROM golang:alpine RUN apk update --no-cache && apk add --no-cache protoc -COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt -COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai -COPY --from=builder /go/bin/protoc-gen-go /usr/bin/protoc-gen-go -COPY --from=builder /go/bin/protoc-gen-go-grpc /usr/bin/protoc-gen-go-grpc +COPY --from=builder /etc/passwd /etc/group /etc/ +COPY --from=builder /usr/share/zoneinfo/ /usr/share/zoneinfo/ +COPY --from=builder --chown=1000:1000 /go/bin/protoc-gen-go* /app/goctl /usr/local/bin/ ENV TZ Asia/Shanghai WORKDIR /app -COPY --from=builder /app/goctl /usr/bin/goctl +USER app -CMD ["goctl"] +LABEL org.opencontainers.image.authors="Kevin Wan" +LABEL org.opencontainers.image.base.name="docker.io/library/golang:alpine" +LABEL org.opencontainers.image.description="A cloud-native Go microservices framework with cli tool for productivity." +LABEL org.opencontainers.image.licenses="MIT" +LABEL org.opencontainers.image.source="https://github.com/zeromicro/go-zero" +LABEL org.opencontainers.image.title="goctl (cli)" +LABEL org.opencontainers.image.version="v1.6.0" + +ENTRYPOINT ["/usr/local/bin/goctl"] diff --git a/tools/goctl/test/integration/model/mongo/Dockerfile b/tools/goctl/test/integration/model/mongo/Dockerfile index 91bce4fc..8d8a2ac9 100644 --- a/tools/goctl/test/integration/model/mongo/Dockerfile +++ b/tools/goctl/test/integration/model/mongo/Dockerfile @@ -1,12 +1,11 @@ -FROM golang:1.19 +FROM golang:1.21-alpine ENV TZ Asia/Shanghai ENV GOPROXY https://goproxy.cn,direct WORKDIR /app -ADD goctl /usr/bin/goctl -ADD cmd.sh . +COPY goctl /usr/bin/ +COPY cmd.sh . -RUN chmod +x /usr/bin/goctl -RUN chmod +x cmd.sh +RUN chmod +x /usr/bin/goctl cmd.sh CMD ["/bin/bash", "cmd.sh"] diff --git a/tools/goctl/test/integration/model/mongo/mongo.sh b/tools/goctl/test/integration/model/mongo/mongo.sh index 73c80ef3..1d580eb0 100644 --- a/tools/goctl/test/integration/model/mongo/mongo.sh +++ b/tools/goctl/test/integration/model/mongo/mongo.sh @@ -25,7 +25,7 @@ fi # run docker image console_step "docker running" -docker run $image +docker run --rm $image if [ $? -ne 0 ]; then rm -f $buildFile console_red "docker run failed" From 708ad207d7fd23c58df81021831c3e941733089e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 2 Mar 2024 23:54:37 +0800 Subject: [PATCH 27/58] chore(deps): bump github/codeql-action from 2 to 3 (#3961) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 2b1ec376..cfb233b7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -39,7 +39,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -50,7 +50,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -64,4 +64,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 From 2629636f648bd829f5643c63b5359292be565eac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:01:14 +0800 Subject: [PATCH 28/58] chore(deps): bump actions/setup-go from 4 to 5 (#3964) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 1e866055..26a99079 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -15,7 +15,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Go 1.x - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: go-version: '1.19' check-latest: true @@ -50,7 +50,7 @@ jobs: uses: actions/checkout@v4 - name: Set up Go 1.x - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: # use 1.19 to guarantee Go 1.19 compatibility go-version: '1.19' From df962622359371348c0c2d2be3f42f2622db6ade Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:06:41 +0800 Subject: [PATCH 29/58] chore(deps): bump codecov/codecov-action from 3 to 4 (#3962) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 26a99079..d2f5af0f 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -40,7 +40,7 @@ jobs: run: go test -race -coverprofile=coverage.txt -covermode=atomic ./... - name: Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 test-win: name: Windows From b624b966f0a3ca6d7fd82af37754ac3f08a63ebe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Mar 2024 00:11:56 +0800 Subject: [PATCH 30/58] chore(deps): bump actions/stale from 8 to 9 (#3963) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/issues.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml index b7727567..5b2d9a28 100644 --- a/.github/workflows/issues.yml +++ b/.github/workflows/issues.yml @@ -7,7 +7,7 @@ jobs: close-issues: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@v9 with: days-before-issue-stale: 365 days-before-issue-close: 90 From 25821bdee67975bf7926aaba07bd67ee74c10842 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sun, 3 Mar 2024 00:17:38 +0800 Subject: [PATCH 31/58] chore: coding style (#3960) --- core/stores/mon/options.go | 26 +++++++++---------- core/stores/mon/options_test.go | 6 ++--- tools/goctl/Dockerfile | 2 +- .../test/integration/model/mongo/Dockerfile | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/core/stores/mon/options.go b/core/stores/mon/options.go index 14a6666a..cebae6f7 100644 --- a/core/stores/mon/options.go +++ b/core/stores/mon/options.go @@ -19,17 +19,17 @@ var ( ) type ( - options = mopt.ClientOptions - // Option defines the method to customize a mongo model. Option func(opts *options) - // RegisterType A struct store With custom type and Encoder/Decoder - RegisterType struct { + // TypeCodec is a struct that stores specific type Encoder/Decoder. + TypeCodec struct { ValueType reflect.Type Encoder bsoncodec.ValueEncoder Decoder bsoncodec.ValueDecoder } + + options = mopt.ClientOptions ) // DisableLog disables logging of mongo commands, includes info and slow logs. @@ -48,12 +48,6 @@ func SetSlowThreshold(threshold time.Duration) { slowThreshold.Set(threshold) } -func defaultTimeoutOption() Option { - return func(opts *options) { - opts.SetTimeout(defaultTimeout) - } -} - // WithTimeout set the mon client operation timeout. func WithTimeout(timeout time.Duration) Option { return func(opts *options) { @@ -61,14 +55,20 @@ func WithTimeout(timeout time.Duration) Option { } } -// WithRegistry set the Registry to convert custom type to mongo primitive type more easily. -func WithRegistry(registerType ...RegisterType) Option { +// WithTypeCodec registers TypeCodecs to convert custom types. +func WithTypeCodec(typeCodecs ...TypeCodec) Option { return func(opts *options) { registry := bson.NewRegistry() - for _, v := range registerType { + for _, v := range typeCodecs { registry.RegisterTypeEncoder(v.ValueType, v.Encoder) registry.RegisterTypeDecoder(v.ValueType, v.Decoder) } opts.SetRegistry(registry) } } + +func defaultTimeoutOption() Option { + return func(opts *options) { + opts.SetTimeout(defaultTimeout) + } +} diff --git a/core/stores/mon/options_test.go b/core/stores/mon/options_test.go index f5a858ad..48024dbd 100644 --- a/core/stores/mon/options_test.go +++ b/core/stores/mon/options_test.go @@ -79,16 +79,16 @@ func TestWithRegistryForTimestampRegisterType(t *testing.T) { return nil } - registerType := []RegisterType{ + codecs := []TypeCodec{ { ValueType: reflect.TypeOf(time.Time{}), Encoder: mongoDateTimeEncoder, Decoder: mongoDateTimeDecoder, }, } - WithRegistry(registerType...)(opts) + WithTypeCodec(codecs...)(opts) - for _, v := range registerType { + for _, v := range codecs { // Validate Encoder enc, err := opts.Registry.LookupEncoder(v.ValueType) if err != nil { diff --git a/tools/goctl/Dockerfile b/tools/goctl/Dockerfile index 10eb9e1d..12489e28 100644 --- a/tools/goctl/Dockerfile +++ b/tools/goctl/Dockerfile @@ -35,6 +35,6 @@ LABEL org.opencontainers.image.description="A cloud-native Go microservices fram LABEL org.opencontainers.image.licenses="MIT" LABEL org.opencontainers.image.source="https://github.com/zeromicro/go-zero" LABEL org.opencontainers.image.title="goctl (cli)" -LABEL org.opencontainers.image.version="v1.6.0" +LABEL org.opencontainers.image.version="v1.6.2" ENTRYPOINT ["/usr/local/bin/goctl"] diff --git a/tools/goctl/test/integration/model/mongo/Dockerfile b/tools/goctl/test/integration/model/mongo/Dockerfile index 8d8a2ac9..fe629b13 100644 --- a/tools/goctl/test/integration/model/mongo/Dockerfile +++ b/tools/goctl/test/integration/model/mongo/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.21-alpine +FROM golang:1.22-alpine ENV TZ Asia/Shanghai ENV GOPROXY https://goproxy.cn,direct From dd01695d4593e085bd9780f801a1373c2509d4fc Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sun, 3 Mar 2024 13:36:35 +0800 Subject: [PATCH 32/58] chore: update goctl version to 1.6.3 (#3965) --- tools/goctl/Dockerfile | 2 +- tools/goctl/go.mod | 18 ++++++------- tools/goctl/go.sum | 36 ++++++++++++------------- tools/goctl/internal/version/version.go | 2 +- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tools/goctl/Dockerfile b/tools/goctl/Dockerfile index 12489e28..ec4e2bda 100644 --- a/tools/goctl/Dockerfile +++ b/tools/goctl/Dockerfile @@ -35,6 +35,6 @@ LABEL org.opencontainers.image.description="A cloud-native Go microservices fram LABEL org.opencontainers.image.licenses="MIT" LABEL org.opencontainers.image.source="https://github.com/zeromicro/go-zero" LABEL org.opencontainers.image.title="goctl (cli)" -LABEL org.opencontainers.image.version="v1.6.2" +LABEL org.opencontainers.image.version="v1.6.3" ENTRYPOINT ["/usr/local/bin/goctl"] diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index a6fcd1f3..ff70ba4d 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -15,7 +15,7 @@ require ( github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 github.com/zeromicro/antlr v0.0.1 github.com/zeromicro/ddl-parser v1.0.5 - github.com/zeromicro/go-zero v1.6.2 + github.com/zeromicro/go-zero v1.6.3 golang.org/x/text v0.14.0 google.golang.org/grpc v1.62.0 google.golang.org/protobuf v1.32.0 @@ -50,7 +50,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.2 // indirect + github.com/jackc/pgx/v5 v5.5.3 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -91,12 +91,12 @@ require ( go.uber.org/automaxprocs v1.5.3 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.16.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.17.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect @@ -105,9 +105,9 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.29.1 // indirect - k8s.io/apimachinery v0.29.1 // indirect - k8s.io/client-go v0.29.1 // indirect + k8s.io/api v0.29.2 // indirect + k8s.io/apimachinery v0.29.2 // indirect + k8s.io/client-go v0.29.2 // indirect k8s.io/klog/v2 v2.110.1 // indirect k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index 8d8ec4c0..c79c1b35 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -90,8 +90,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI 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= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.2 h1:iLlpgp4Cp/gC9Xuscl7lFL1PhhW+ZLtXZcrfCt4C3tA= -github.com/jackc/pgx/v5 v5.5.2/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/pgx/v5 v5.5.3 h1:Ces6/M3wbDXYpM8JyyPD57ivTtJACFZJd885pdIaV2s= +github.com/jackc/pgx/v5 v5.5.3/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -179,8 +179,8 @@ github.com/zeromicro/antlr v0.0.1 h1:CQpIn/dc0pUjgGQ81y98s/NGOm2Hfru2NNio2I9mQgk github.com/zeromicro/antlr v0.0.1/go.mod h1:nfpjEwFR6Q4xGDJMcZnCL9tEfQRgszMwu3rDz2Z+p5M= github.com/zeromicro/ddl-parser v1.0.5 h1:LaVqHdzMTjasua1yYpIYaksxKqRzFrEukj2Wi2EbWaQ= github.com/zeromicro/ddl-parser v1.0.5/go.mod h1:ISU/8NuPyEpl9pa17Py9TBPetMjtsiHrb9f5XGiYbo8= -github.com/zeromicro/go-zero v1.6.2 h1:c1gXp6JTO0e+dtfwNZRE7OZgzjipfW8i1iBMoBnDwBI= -github.com/zeromicro/go-zero v1.6.2/go.mod h1:mQKK/c/er/sbIAo7DWyFBZX8oa0eOkc7QJdG15b2GBw= +github.com/zeromicro/go-zero v1.6.3 h1:OL0NnHD5LdRNDolfcK9vUkJt7K8TcBE3RkzfM8poOVw= +github.com/zeromicro/go-zero v1.6.3/go.mod h1:XZL435ZxVi9MSXXtw2MRQhHgx6OoX3++MRMOE9xU70c= go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c= go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A= @@ -222,8 +222,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -235,8 +235,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -258,12 +258,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= -golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -309,12 +309,12 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw= -k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ= -k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= -k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= -k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A= -k8s.io/client-go v0.29.1/go.mod h1:TDG/psL9hdet0TI9mGyHJSgRkW3H9JZk2dNEUS7bRks= +k8s.io/api v0.29.2 h1:hBC7B9+MU+ptchxEqTNW2DkUosJpp1P+Wn6YncZ474A= +k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= +k8s.io/apimachinery v0.29.2 h1:EWGpfJ856oj11C52NRCHuU7rFDwxev48z+6DSlGNsV8= +k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.29.2 h1:FEg85el1TeZp+/vYJM7hkDlSTFZ+c5nnK44DJ4FyoRg= +k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= diff --git a/tools/goctl/internal/version/version.go b/tools/goctl/internal/version/version.go index 9554de45..90d7b63c 100644 --- a/tools/goctl/internal/version/version.go +++ b/tools/goctl/internal/version/version.go @@ -6,7 +6,7 @@ import ( ) // BuildVersion is the version of goctl. -const BuildVersion = "1.6.2" +const BuildVersion = "1.6.3" var tag = map[string]int{"pre-alpha": 0, "alpha": 1, "pre-bata": 2, "beta": 3, "released": 4, "": 5} From b7be25b98bc44dcd8ec211e6fb09e486e1739c97 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sun, 3 Mar 2024 14:18:27 +0800 Subject: [PATCH 33/58] Update readme-cn.md (#3966) --- readme-cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme-cn.md b/readme-cn.md index 86c7aeac..067e79df 100644 --- a/readme-cn.md +++ b/readme-cn.md @@ -301,6 +301,7 @@ go-zero 已被许多公司用于生产部署,接入场景如在线教育、电 >97. 上海荣时信息科技有限公司 >98. 上海同犀智能科技有限公司 >99. 新华三技术有限公司 +>100. 上海邑脉科技有限公司 如果贵公司也已使用 go-zero,欢迎在 [登记地址](https://github.com/zeromicro/go-zero/issues/602) 登记,仅仅为了推广,不做其它用途。 From bc4187ca90c60d62eb081e18d0e83dde3c4ea359 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Mon, 4 Mar 2024 23:07:54 +0800 Subject: [PATCH 34/58] Create SECURITY.md (#3968) --- SECURITY.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..196c0453 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +## Supported Versions + +We publish releases monthly. + +| Version | Supported | +| ------- | ------------------ | +| >= 1.4.4 | :white_check_mark: | +| < 1.4.4 | :x: | + +## Reporting a Vulnerability + +https://github.com/zeromicro/go-zero/security/advisories + +Accepted vulnerabilities are expected to be fixed within a month. From 2eb2fa26f6ba10e3a5e7f40530720ed786c5d881 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:03:06 +0800 Subject: [PATCH 35/58] chore(deps): bump golang.org/x/sys from 0.17.0 to 0.18.0 (#3971) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0a66df64..e5cd793e 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( go.uber.org/automaxprocs v1.5.3 go.uber.org/goleak v1.2.1 golang.org/x/net v0.21.0 - golang.org/x/sys v0.17.0 + golang.org/x/sys v0.18.0 golang.org/x/time v0.5.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.0 diff --git a/go.sum b/go.sum index 6602d0dd..f14acfb7 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= From 2096cd574932adf371b064b1aeb0ef7799ef20e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 12:09:18 +0800 Subject: [PATCH 36/58] chore(deps): bump github.com/jackc/pgx/v5 from 5.5.3 to 5.5.4 (#3970) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e5cd793e..245513d8 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.5.3 + github.com/jackc/pgx/v5 v5.5.4 github.com/jhump/protoreflect v1.15.6 github.com/olekukonko/tablewriter v0.0.5 github.com/pelletier/go-toml/v2 v2.1.1 diff --git a/go.sum b/go.sum index f14acfb7..dce9e2b2 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI 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= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.3 h1:Ces6/M3wbDXYpM8JyyPD57ivTtJACFZJd885pdIaV2s= -github.com/jackc/pgx/v5 v5.5.3/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= From ba1d6e3664a8f18bf81966116bafad1348542753 Mon Sep 17 00:00:00 2001 From: Alex Last Date: Tue, 5 Mar 2024 04:14:54 +0000 Subject: [PATCH 37/58] fix: only add log middleware to not found handler when enabled (#3969) --- rest/engine.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rest/engine.go b/rest/engine.go index a206b3ce..e57786ca 100644 --- a/rest/engine.go +++ b/rest/engine.go @@ -217,9 +217,12 @@ func (ng *engine) notFoundHandler(next http.Handler) http.Handler { handler.TraceHandler(ng.conf.Name, "", handler.WithTraceIgnorePaths(ng.conf.TraceIgnorePaths)), - ng.getLogHandler(), ) + if ng.conf.Middlewares.Log { + chn = chn.Append(ng.getLogHandler()) + } + var h http.Handler if next != nil { h = chn.Then(next) From 74b87ac9fd042a8187ba97a4e4aa85adf1f4328a Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Tue, 5 Mar 2024 14:40:10 +0800 Subject: [PATCH 38/58] chore: coding style (#3972) --- core/stores/redis/hook.go | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/core/stores/redis/hook.go b/core/stores/redis/hook.go index fca21498..18612b7b 100644 --- a/core/stores/redis/hook.go +++ b/core/stores/redis/hook.go @@ -83,6 +83,33 @@ func (h hook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipel } } +func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) (context.Context, func(err error)) { + tracer := trace.TracerFromContext(ctx) + + ctx, span := tracer.Start(ctx, + spanName, + oteltrace.WithSpanKind(oteltrace.SpanKindClient), + ) + + cmdStrs := make([]string, 0, len(cmds)) + for _, cmd := range cmds { + cmdStrs = append(cmdStrs, cmd.Name()) + } + span.SetAttributes(redisCmdsAttributeKey.StringSlice(cmdStrs)) + + return ctx, func(err error) { + defer span.End() + + if err == nil || errors.Is(err, red.Nil) { + span.SetStatus(codes.Ok, "") + return + } + + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + } +} + func formatError(err error) string { if err == nil || errors.Is(err, red.Nil) { return "" @@ -123,30 +150,3 @@ func logDuration(ctx context.Context, cmds []red.Cmder, duration time.Duration) } logx.WithContext(ctx).WithDuration(duration).Slowf("[REDIS] slowcall on executing: %s", buf.String()) } - -func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) (context.Context, func(err error)) { - tracer := trace.TracerFromContext(ctx) - - ctx, span := tracer.Start(ctx, - spanName, - oteltrace.WithSpanKind(oteltrace.SpanKindClient), - ) - - cmdStrs := make([]string, 0, len(cmds)) - for _, cmd := range cmds { - cmdStrs = append(cmdStrs, cmd.Name()) - } - span.SetAttributes(redisCmdsAttributeKey.StringSlice(cmdStrs)) - - return ctx, func(err error) { - defer span.End() - - if err == nil || errors.Is(err, red.Nil) { - span.SetStatus(codes.Ok, "") - return - } - - span.SetStatus(codes.Error, err.Error()) - span.RecordError(err) - } -} From 3d552ea7a8435315cd70079fd64f9d6f20307557 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 21:33:45 +0800 Subject: [PATCH 39/58] chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 (#3974) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 245513d8..b6b61779 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( golang.org/x/time v0.5.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 google.golang.org/grpc v1.62.0 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/h2non/gock.v1 v1.1.2 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index dce9e2b2..5f51e337 100644 --- a/go.sum +++ b/go.sum @@ -311,8 +311,8 @@ google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 4df10eef5d72590dcf9bd53bf1da2631f2316af3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 23:31:02 +0800 Subject: [PATCH 40/58] chore(deps): bump golang.org/x/net from 0.21.0 to 0.22.0 (#3975) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index b6b61779..2933df7b 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( go.opentelemetry.io/otel/trace v1.19.0 go.uber.org/automaxprocs v1.5.3 go.uber.org/goleak v1.2.1 - golang.org/x/net v0.21.0 + golang.org/x/net v0.22.0 golang.org/x/sys v0.18.0 golang.org/x/time v0.5.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 @@ -104,10 +104,10 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.19.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect - golang.org/x/term v0.17.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect diff --git a/go.sum b/go.sum index 5f51e337..aa8085ee 100644 --- a/go.sum +++ b/go.sum @@ -234,8 +234,8 @@ golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -248,8 +248,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -276,8 +276,8 @@ golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= From 1631aa02ad5391f267e7cdfdb18e1a3f8558fff1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:24:51 +0800 Subject: [PATCH 41/58] chore(deps): bump github.com/golang/protobuf from 1.5.3 to 1.5.4 (#3984) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2933df7b..1acebaa9 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/go-sql-driver/mysql v1.7.1 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang/mock v1.6.0 - github.com/golang/protobuf v1.5.3 + github.com/golang/protobuf v1.5.4 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.5.4 github.com/jhump/protoreflect v1.15.6 diff --git a/go.sum b/go.sum index aa8085ee..febee34b 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= From 2f4c58ed73522c7889e79d90c54399af6e6d022e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:45:19 +0800 Subject: [PATCH 42/58] chore(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 (#3976) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1acebaa9..1865f970 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/sys v0.18.0 golang.org/x/time v0.5.0 google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 - google.golang.org/grpc v1.62.0 + google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.33.0 gopkg.in/cheggaaa/pb.v1 v1.0.28 gopkg.in/h2non/gock.v1 v1.1.2 diff --git a/go.sum b/go.sum index febee34b..93b490a2 100644 --- a/go.sum +++ b/go.sum @@ -307,8 +307,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1: google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= -google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= From 105ab590fff8d9d8187bf2401aba9a6125ca5d5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:01:14 +0800 Subject: [PATCH 43/58] chore(deps): bump google.golang.org/grpc from 1.62.0 to 1.62.1 in /tools/goctl (#3977) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/goctl/go.mod | 2 +- tools/goctl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index ff70ba4d..6ae44246 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -17,7 +17,7 @@ require ( github.com/zeromicro/ddl-parser v1.0.5 github.com/zeromicro/go-zero v1.6.3 golang.org/x/text v0.14.0 - google.golang.org/grpc v1.62.0 + google.golang.org/grpc v1.62.1 google.golang.org/protobuf v1.32.0 ) diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index c79c1b35..38c71d7d 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -291,8 +291,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1: google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= -google.golang.org/grpc v1.62.0 h1:HQKZ/fa1bXkX1oFOvSjmZEUL8wLSaZTjCcLAlmZRtdk= -google.golang.org/grpc v1.62.0/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= From 2207477b60bc911c80ae48863d27c9e010783657 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:15:48 +0800 Subject: [PATCH 44/58] chore(deps): bump google.golang.org/protobuf from 1.32.0 to 1.33.0 in /tools/goctl (#3978) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/goctl/go.mod | 2 +- tools/goctl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index 6ae44246..ca72403d 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -18,7 +18,7 @@ require ( github.com/zeromicro/go-zero v1.6.3 golang.org/x/text v0.14.0 google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/protobuf v1.33.0 ) require ( diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index 38c71d7d..00e88580 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -295,8 +295,8 @@ google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From c7dacb01468bad3a21dc34b18eb8635f875fd29c Mon Sep 17 00:00:00 2001 From: MarkJoyMa <64180138+MarkJoyMa@users.noreply.github.com> Date: Fri, 8 Mar 2024 12:23:41 +0800 Subject: [PATCH 45/58] fix: mysql WithAcceptable bug (#3986) --- core/stores/sqlx/mysql.go | 2 +- core/stores/sqlx/mysql_test.go | 3 +-- core/stores/sqlx/sqlconn.go | 9 ++++++- core/stores/sqlx/sqlconn_test.go | 40 ++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/core/stores/sqlx/mysql.go b/core/stores/sqlx/mysql.go index 3c026921..e7797095 100644 --- a/core/stores/sqlx/mysql.go +++ b/core/stores/sqlx/mysql.go @@ -13,7 +13,7 @@ const ( // NewMysql returns a mysql connection. func NewMysql(datasource string, opts ...SqlOption) SqlConn { - opts = append(opts, withMysqlAcceptable()) + opts = append([]SqlOption{withMysqlAcceptable()}, opts...) return NewSqlConn(mysqlDriverName, datasource, opts...) } diff --git a/core/stores/sqlx/mysql_test.go b/core/stores/sqlx/mysql_test.go index 68698e4b..d343de69 100644 --- a/core/stores/sqlx/mysql_test.go +++ b/core/stores/sqlx/mysql_test.go @@ -2,11 +2,11 @@ package sqlx import ( "errors" - "reflect" "testing" "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stat" @@ -38,7 +38,6 @@ func TestBreakerOnNotHandlingDuplicateEntry(t *testing.T) { func TestMysqlAcceptable(t *testing.T) { conn := NewMysql("nomysql").(*commonSqlConn) withMysqlAcceptable()(conn) - assert.EqualValues(t, reflect.ValueOf(mysqlAcceptable).Pointer(), reflect.ValueOf(conn.accept).Pointer()) assert.True(t, mysqlAcceptable(nil)) assert.False(t, mysqlAcceptable(errors.New("any"))) assert.False(t, mysqlAcceptable(new(mysql.MySQLError))) diff --git a/core/stores/sqlx/sqlconn.go b/core/stores/sqlx/sqlconn.go index 11838056..d6ca746d 100644 --- a/core/stores/sqlx/sqlconn.go +++ b/core/stores/sqlx/sqlconn.go @@ -315,6 +315,13 @@ func (db *commonSqlConn) queryRows(ctx context.Context, scanner func(*sql.Rows) // acceptable is the func to check if the error can be accepted. func WithAcceptable(acceptable func(err error) bool) SqlOption { return func(conn *commonSqlConn) { - conn.accept = acceptable + if conn.accept == nil { + conn.accept = acceptable + } else { + pre := conn.accept + conn.accept = func(err error) bool { + return pre(err) || acceptable(err) + } + } } } diff --git a/core/stores/sqlx/sqlconn_test.go b/core/stores/sqlx/sqlconn_test.go index ab83e2c6..f599bdf2 100644 --- a/core/stores/sqlx/sqlconn_test.go +++ b/core/stores/sqlx/sqlconn_test.go @@ -8,6 +8,7 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/dbtest" @@ -264,6 +265,45 @@ func TestBreakerWithScanError(t *testing.T) { }) } +func TestWithAcceptable(t *testing.T) { + var ( + acceptableErr = errors.New("acceptable") + acceptableErr2 = errors.New("acceptable2") + acceptableErr3 = errors.New("acceptable3") + ) + opts := []SqlOption{ + WithAcceptable(func(err error) bool { + if err == nil { + return true + } + return errors.Is(err, acceptableErr) + }), + WithAcceptable(func(err error) bool { + if err == nil { + return true + } + return errors.Is(err, acceptableErr2) + }), + WithAcceptable(func(err error) bool { + if err == nil { + return true + } + return errors.Is(err, acceptableErr3) + }), + } + + var conn = &commonSqlConn{} + for _, opt := range opts { + opt(conn) + } + + assert.True(t, conn.accept(nil)) + assert.False(t, conn.accept(assert.AnError)) + assert.True(t, conn.accept(acceptableErr)) + assert.True(t, conn.accept(acceptableErr2)) + assert.True(t, conn.accept(acceptableErr3)) +} + func buildConn() (mock sqlmock.Sqlmock, err error) { _, err = connManager.GetResource(mockedDatasource, func() (io.Closer, error) { var db *sql.DB From d184f96b13f98875ef2078c608a835fcfbfede16 Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Fri, 8 Mar 2024 16:11:28 +0800 Subject: [PATCH 46/58] chore: coding style (#3987) --- core/stores/sqlx/mysql_test.go | 1 - core/stores/sqlx/sqlconn_test.go | 1 - 2 files changed, 2 deletions(-) diff --git a/core/stores/sqlx/mysql_test.go b/core/stores/sqlx/mysql_test.go index d343de69..1bf33630 100644 --- a/core/stores/sqlx/mysql_test.go +++ b/core/stores/sqlx/mysql_test.go @@ -6,7 +6,6 @@ import ( "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" - "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stat" diff --git a/core/stores/sqlx/sqlconn_test.go b/core/stores/sqlx/sqlconn_test.go index f599bdf2..53ea0d5a 100644 --- a/core/stores/sqlx/sqlconn_test.go +++ b/core/stores/sqlx/sqlconn_test.go @@ -8,7 +8,6 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/stretchr/testify/assert" - "github.com/zeromicro/go-zero/core/breaker" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/dbtest" From 69bb746a1de7bdc9238efadaa507ab40fb9c6315 Mon Sep 17 00:00:00 2001 From: ansoda Date: Fri, 8 Mar 2024 18:28:23 +0800 Subject: [PATCH 47/58] fix: StopAgent panics when trace agent disabled (#3981) Co-authored-by: ansoda --- core/trace/agent.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/trace/agent.go b/core/trace/agent.go index 2a2e8c37..59e0e23e 100644 --- a/core/trace/agent.go +++ b/core/trace/agent.go @@ -59,7 +59,13 @@ func StartAgent(c Config) { // StopAgent shuts down the span processors in the order they were registered. func StopAgent() { - _ = tp.Shutdown(context.Background()) + lock.Lock() + defer lock.Unlock() + + if tp != nil { + _ = tp.Shutdown(context.Background()) + tp = nil + } } func createExporter(c Config) (sdktrace.SpanExporter, error) { From 159ecb738645592b488b2c2816a438884097cb7e Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Fri, 8 Mar 2024 22:35:17 +0800 Subject: [PATCH 48/58] chore: fix warnings (#3989) --- core/bloom/bloom.go | 4 ++-- core/codec/dh.go | 4 ++-- core/collection/cache.go | 4 ++-- core/conf/config.go | 4 ++-- core/filex/progressscanner.go | 2 +- core/fx/stream.go | 2 +- core/iox/pipe.go | 2 +- core/iox/textfile.go | 2 +- core/iox/textlinescanner.go | 4 ++-- core/limit/tokenlimit.go | 2 +- core/load/adaptiveshedder.go | 10 +++++----- core/load/sheddergroup.go | 2 +- core/logc/logs.go | 13 +++++++------ core/logx/lesslogger.go | 2 +- core/logx/logs.go | 17 +++++++++-------- core/logx/logs_test.go | 2 +- core/logx/rotatelogger.go | 2 +- core/mapping/marshaler.go | 2 +- core/mapping/unmarshaler.go | 6 +++--- core/mapping/unmarshaler_test.go | 2 +- core/mapping/utils.go | 2 +- core/mapping/valuer.go | 4 ++-- core/proc/goroutines_test.go | 2 +- core/queue/queue.go | 4 ++-- core/queue/util_test.go | 2 +- core/stat/metrics_test.go | 2 +- core/stat/task.go | 2 +- core/stores/cache/cacheopt.go | 2 +- core/stores/redis/conf.go | 2 +- core/stores/redis/redislock.go | 3 ++- core/trace/message_test.go | 10 +++++----- core/trace/vars.go | 2 +- 32 files changed, 64 insertions(+), 61 deletions(-) diff --git a/core/bloom/bloom.go b/core/bloom/bloom.go index 897f4bc8..3a72cf84 100644 --- a/core/bloom/bloom.go +++ b/core/bloom/bloom.go @@ -130,7 +130,7 @@ func (r *redisBitSet) check(ctx context.Context, offsets []uint) (bool, error) { } resp, err := r.store.ScriptRunCtx(ctx, testScript, []string{r.key}, args) - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return false, nil } else if err != nil { return false, err @@ -162,7 +162,7 @@ func (r *redisBitSet) set(ctx context.Context, offsets []uint) error { } _, err = r.store.ScriptRunCtx(ctx, setScript, []string{r.key}, args) - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return nil } diff --git a/core/codec/dh.go b/core/codec/dh.go index 49d839b4..63dd2d9c 100644 --- a/core/codec/dh.go +++ b/core/codec/dh.go @@ -23,7 +23,7 @@ var ( zero = big.NewInt(0) ) -// DhKey defines the Diffie Hellman key. +// DhKey defines the Diffie-Hellman key. type DhKey struct { PriKey *big.Int PubKey *big.Int @@ -46,7 +46,7 @@ func ComputeKey(pubKey, priKey *big.Int) (*big.Int, error) { return new(big.Int).Exp(pubKey, priKey, p), nil } -// GenerateKey returns a Diffie Hellman key. +// GenerateKey returns a Diffie-Hellman key. func GenerateKey() (*DhKey, error) { var err error var x *big.Int diff --git a/core/collection/cache.go b/core/collection/cache.go index ace21ece..56b31811 100644 --- a/core/collection/cache.go +++ b/core/collection/cache.go @@ -128,8 +128,8 @@ func (c *Cache) Take(key string, fetch func() (any, error)) (any, error) { var fresh bool val, err := c.barrier.Do(key, func() (any, error) { - // because O(1) on map search in memory, and fetch is an IO query - // so we do double check, cache might be taken by another call + // because O(1) on map search in memory, and fetch is an IO query, + // so we do double-check, cache might be taken by another call if val, ok := c.doGet(key); ok { return val, nil } diff --git a/core/conf/config.go b/core/conf/config.go index 64796ef7..d3795c0a 100644 --- a/core/conf/config.go +++ b/core/conf/config.go @@ -133,7 +133,7 @@ func addOrMergeFields(info *fieldInfo, key string, child *fieldInfo, fullName st return newConflictKeyError(fullName) } - if err := mergeFields(prev, key, child.children, fullName); err != nil { + if err := mergeFields(prev, child.children, fullName); err != nil { return err } } else { @@ -281,7 +281,7 @@ func getTagName(field reflect.StructField) string { return field.Name } -func mergeFields(prev *fieldInfo, key string, children map[string]*fieldInfo, fullName string) error { +func mergeFields(prev *fieldInfo, children map[string]*fieldInfo, fullName string) error { if len(prev.children) == 0 || len(children) == 0 { return newConflictKeyError(fullName) } diff --git a/core/filex/progressscanner.go b/core/filex/progressscanner.go index 11f3c1a5..e4f187f6 100644 --- a/core/filex/progressscanner.go +++ b/core/filex/progressscanner.go @@ -5,7 +5,7 @@ import "gopkg.in/cheggaaa/pb.v1" type ( // A Scanner is used to read lines. Scanner interface { - // Scan checks if has remaining to read. + // Scan checks if it has remaining to read. Scan() bool // Text returns next line. Text() string diff --git a/core/fx/stream.go b/core/fx/stream.go index cebb11e3..e0c3cd28 100644 --- a/core/fx/stream.go +++ b/core/fx/stream.go @@ -352,7 +352,7 @@ func (s Stream) Parallel(fn ParallelFunc, opts ...Option) { }, opts...).Done() } -// Reduce is an utility method to let the caller deal with the underlying channel. +// Reduce is a utility method to let the caller deal with the underlying channel. func (s Stream) Reduce(fn ReduceFunc) (any, error) { return fn(s.source) } diff --git a/core/iox/pipe.go b/core/iox/pipe.go index be36479c..044de380 100644 --- a/core/iox/pipe.go +++ b/core/iox/pipe.go @@ -2,7 +2,7 @@ package iox import "os" -// RedirectInOut redirects stdin to r, stdout to w, and callers need to call restore afterwards. +// RedirectInOut redirects stdin to r, stdout to w, and callers need to call restore afterward. func RedirectInOut() (restore func(), err error) { var r, w *os.File r, w, err = os.Pipe() diff --git a/core/iox/textfile.go b/core/iox/textfile.go index 89083cea..96309716 100644 --- a/core/iox/textfile.go +++ b/core/iox/textfile.go @@ -9,7 +9,7 @@ import ( const bufSize = 32 * 1024 -// CountLines returns the number of lines in file. +// CountLines returns the number of lines in the file. func CountLines(file string) (int, error) { f, err := os.Open(file) if err != nil { diff --git a/core/iox/textlinescanner.go b/core/iox/textlinescanner.go index ec28e27a..afa81652 100644 --- a/core/iox/textlinescanner.go +++ b/core/iox/textlinescanner.go @@ -6,7 +6,7 @@ import ( "strings" ) -// A TextLineScanner is a scanner that can scan lines from given reader. +// A TextLineScanner is a scanner that can scan lines from the given reader. type TextLineScanner struct { reader *bufio.Reader hasNext bool @@ -14,7 +14,7 @@ type TextLineScanner struct { err error } -// NewTextLineScanner returns a TextLineScanner with given reader. +// NewTextLineScanner returns a TextLineScanner with the given reader. func NewTextLineScanner(reader io.Reader) *TextLineScanner { return &TextLineScanner{ reader: bufio.NewReader(reader), diff --git a/core/limit/tokenlimit.go b/core/limit/tokenlimit.go index fe576dd9..e33b4b95 100644 --- a/core/limit/tokenlimit.go +++ b/core/limit/tokenlimit.go @@ -125,7 +125,7 @@ func (lim *TokenLimiter) reserveN(ctx context.Context, now time.Time, n int) boo }) // redis allowed == false // Lua boolean false -> r Nil bulk reply - if err == redis.Nil { + if errors.Is(err, redis.Nil) { return false } if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled) { diff --git a/core/load/adaptiveshedder.go b/core/load/adaptiveshedder.go index a7b6f49d..2afc43a2 100644 --- a/core/load/adaptiveshedder.go +++ b/core/load/adaptiveshedder.go @@ -138,10 +138,10 @@ func (as *adaptiveShedder) Allow() (Promise, error) { func (as *adaptiveShedder) addFlying(delta int64) { flying := atomic.AddInt64(&as.flying, delta) // update avgFlying when the request is finished. - // this strategy makes avgFlying have a little bit lag against flying, and smoother. + // this strategy makes avgFlying have a little bit of lag against flying, and smoother. // when the flying requests increase rapidly, avgFlying increase slower, accept more requests. // when the flying requests drop rapidly, avgFlying drop slower, accept fewer requests. - // it makes the service to serve as more requests as possible. + // it makes the service to serve as many requests as possible. if delta < 0 { as.avgFlyingLock.Lock() as.avgFlying = as.avgFlying*flyingBeta + float64(flying)*(1-flyingBeta) @@ -200,7 +200,7 @@ func (as *adaptiveShedder) minRt() float64 { func (as *adaptiveShedder) overloadFactor() float64 { // as.cpuThreshold must be less than cpuMax factor := (cpuMax - float64(stat.CpuUsage())) / (cpuMax - float64(as.cpuThreshold)) - // at least accept 10% of acceptable requests even cpu is highly overloaded. + // at least accept 10% of acceptable requests, even cpu is highly overloaded. return mathx.Between(factor, overloadFactorLowerBound, 1) } @@ -250,14 +250,14 @@ func (as *adaptiveShedder) systemOverloaded() bool { return true } -// WithBuckets customizes the Shedder with given number of buckets. +// WithBuckets customizes the Shedder with the given number of buckets. func WithBuckets(buckets int) ShedderOption { return func(opts *shedderOptions) { opts.buckets = buckets } } -// WithCpuThreshold customizes the Shedder with given cpu threshold. +// WithCpuThreshold customizes the Shedder with the given cpu threshold. func WithCpuThreshold(threshold int64) ShedderOption { return func(opts *shedderOptions) { opts.cpuThreshold = threshold diff --git a/core/load/sheddergroup.go b/core/load/sheddergroup.go index c3d62402..8cc742f5 100644 --- a/core/load/sheddergroup.go +++ b/core/load/sheddergroup.go @@ -6,7 +6,7 @@ import ( "github.com/zeromicro/go-zero/core/syncx" ) -// A ShedderGroup is a manager to manage key based shedders. +// A ShedderGroup is a manager to manage key-based shedders. type ShedderGroup struct { options []ShedderOption manager *syncx.ResourceManager diff --git a/core/logc/logs.go b/core/logc/logs.go index 71233545..b8343fa2 100644 --- a/core/logc/logs.go +++ b/core/logc/logs.go @@ -42,7 +42,7 @@ func Debugv(ctx context.Context, v interface{}) { getLogger(ctx).Debugv(v) } -// Debugw writes msg along with fields into access log. +// Debugw writes msg along with fields into the access log. func Debugw(ctx context.Context, msg string, fields ...LogField) { getLogger(ctx).Debugw(msg, fields...) } @@ -63,7 +63,7 @@ func Errorv(ctx context.Context, v any) { getLogger(ctx).Errorv(v) } -// Errorw writes msg along with fields into error log. +// Errorw writes msg along with fields into the error log. func Errorw(ctx context.Context, msg string, fields ...LogField) { getLogger(ctx).Errorw(msg, fields...) } @@ -88,7 +88,7 @@ func Infov(ctx context.Context, v any) { getLogger(ctx).Infov(v) } -// Infow writes msg along with fields into access log. +// Infow writes msg along with fields into the access log. func Infow(ctx context.Context, msg string, fields ...LogField) { getLogger(ctx).Infow(msg, fields...) } @@ -108,10 +108,11 @@ func SetLevel(level uint32) { logx.SetLevel(level) } -// SetUp sets up the logx. If already set up, just return nil. -// we allow SetUp to be called multiple times, because for example +// SetUp sets up the logx. +// If already set up, return nil. +// We allow SetUp to be called multiple times, because, for example, // we need to allow different service frameworks to initialize logx respectively. -// the same logic for SetUp +// The same logic for SetUp func SetUp(c LogConf) error { return logx.SetUp(c) } diff --git a/core/logx/lesslogger.go b/core/logx/lesslogger.go index 35ca2051..04113929 100644 --- a/core/logx/lesslogger.go +++ b/core/logx/lesslogger.go @@ -1,6 +1,6 @@ package logx -// A LessLogger is a logger that control to log once during the given duration. +// A LessLogger is a logger that controls to log once during the given duration. type LessLogger struct { *limitedExecutor } diff --git a/core/logx/logs.go b/core/logx/logs.go index 0c049324..780093eb 100644 --- a/core/logx/logs.go +++ b/core/logx/logs.go @@ -86,7 +86,7 @@ func Debugv(v any) { } } -// Debugw writes msg along with fields into access log. +// Debugw writes msg along with fields into the access log. func Debugw(msg string, fields ...LogField) { if shallLog(DebugLevel) { writeDebug(msg, fields...) @@ -142,7 +142,7 @@ func Errorv(v any) { } } -// Errorw writes msg along with fields into error log. +// Errorw writes msg along with fields into the error log. func Errorw(msg string, fields ...LogField) { if shallLog(ErrorLevel) { writeError(msg, fields...) @@ -208,7 +208,7 @@ func Infov(v any) { } } -// Infow writes msg along with fields into access log. +// Infow writes msg along with fields into the access log. func Infow(msg string, fields ...LogField) { if shallLog(InfoLevel) { writeInfo(msg, fields...) @@ -254,11 +254,12 @@ func SetWriter(w Writer) { } } -// SetUp sets up the logx. If already set up, just return nil. -// we allow SetUp to be called multiple times, because for example +// SetUp sets up the logx. +// If already set up, return nil. +// We allow SetUp to be called multiple times, because, for example, // we need to allow different service frameworks to initialize logx respectively. func SetUp(c LogConf) (err error) { - // Just ignore the subsequent SetUp calls. + // Ignore the later SetUp calls. // Because multiple services in one process might call SetUp respectively. // Need to wait for the first caller to complete the execution. setupOnce.Do(func() { @@ -480,7 +481,7 @@ func writeDebug(val any, fields ...LogField) { getWriter().Debug(val, addCaller(fields...)...) } -// writeError writes v into error log. +// writeError writes v into the error log. // Not checking shallLog here is for performance consideration. // If we check shallLog here, the fmt.Sprint might be called even if the log level is not enabled. // The caller should check shallLog before calling this function. @@ -520,7 +521,7 @@ func writeStack(msg string) { getWriter().Stack(fmt.Sprintf("%s\n%s", msg, string(debug.Stack()))) } -// writeStat writes v into stat log. +// writeStat writes v into the stat log. // Not checking shallLog here is for performance consideration. // If we check shallLog here, the fmt.Sprint might be called even if the log level is not enabled. // The caller should check shallLog before calling this function. diff --git a/core/logx/logs_test.go b/core/logx/logs_test.go index 818f459e..3780bc2f 100644 --- a/core/logx/logs_test.go +++ b/core/logx/logs_test.go @@ -570,7 +570,7 @@ func TestErrorfWithWrappedError(t *testing.T) { old := writer.Swap(w) defer writer.Store(old) - Errorf("hello %w", errors.New(message)) + Errorf("hello %s", errors.New(message)) assert.True(t, strings.Contains(w.String(), "hello there")) } diff --git a/core/logx/rotatelogger.go b/core/logx/rotatelogger.go index 4b7f31e7..61f9a9d0 100644 --- a/core/logx/rotatelogger.go +++ b/core/logx/rotatelogger.go @@ -319,7 +319,7 @@ func (l *RotateLogger) maybeCompressFile(file string) { }() if _, err := os.Stat(file); err != nil { - // file not exists or other error, ignore compression + // file doesn't exist or another error, ignore compression return } diff --git a/core/mapping/marshaler.go b/core/mapping/marshaler.go index c54ae747..fbe31a92 100644 --- a/core/mapping/marshaler.go +++ b/core/mapping/marshaler.go @@ -12,7 +12,7 @@ const ( ) // Marshal marshals the given val and returns the map that contains the fields. -// optional=another is not implemented, and it's hard to implement and not common used. +// optional=another is not implemented, and it's hard to implement and not commonly used. func Marshal(val any) (map[string]map[string]any, error) { ret := make(map[string]map[string]any) tp := reflect.TypeOf(val) diff --git a/core/mapping/unmarshaler.go b/core/mapping/unmarshaler.go index fbaeb69a..12cbe46b 100644 --- a/core/mapping/unmarshaler.go +++ b/core/mapping/unmarshaler.go @@ -39,7 +39,7 @@ var ( ) type ( - // Unmarshaler is used to unmarshal with given tag key. + // Unmarshaler is used to unmarshal with the given tag key. Unmarshaler struct { key string opts unmarshalOptions @@ -69,7 +69,7 @@ func NewUnmarshaler(key string, opts ...UnmarshalOption) *Unmarshaler { return &unmarshaler } -// UnmarshalKey unmarshals m into v with tag key. +// UnmarshalKey unmarshals m into v with the tag key. func UnmarshalKey(m map[string]any, v any) error { return keyUnmarshaler.Unmarshal(m, v) } @@ -629,7 +629,7 @@ func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(fieldType reflect.Type return err } - // if value is a pointer, we need to check overflow with the pointer's value. + // if the value is a pointer, we need to check overflow with the pointer's value. derefedValue := value for derefedValue.Type().Kind() == reflect.Ptr { derefedValue = derefedValue.Elem() diff --git a/core/mapping/unmarshaler_test.go b/core/mapping/unmarshaler_test.go index 08a80495..ac5a30c0 100644 --- a/core/mapping/unmarshaler_test.go +++ b/core/mapping/unmarshaler_test.go @@ -5866,7 +5866,7 @@ type mockValuerWithParent struct { ok bool } -func (m mockValuerWithParent) Value(key string) (any, bool) { +func (m mockValuerWithParent) Value(_ string) (any, bool) { return m.value, m.ok } diff --git a/core/mapping/utils.go b/core/mapping/utils.go index d7c84af4..f84167e3 100644 --- a/core/mapping/utils.go +++ b/core/mapping/utils.go @@ -416,7 +416,7 @@ func parseOption(fieldOpts *fieldOptions, fieldName, option string) error { } // parseOptions parses the given options in tag. -// for example: `json:"name,options=foo|bar"` or `json:"name,options=[foo,bar]"` +// for example, `json:"name,options=foo|bar"` or `json:"name,options=[foo,bar]"` func parseOptions(val string) []string { if len(val) == 0 { return nil diff --git a/core/mapping/valuer.go b/core/mapping/valuer.go index 206b1b13..24f6f7f3 100644 --- a/core/mapping/valuer.go +++ b/core/mapping/valuer.go @@ -26,9 +26,9 @@ type ( parent valuerWithParent } - // mapValuer is a type for map to meet the Valuer interface. + // mapValuer is a type for the map to meet the Valuer interface. mapValuer map[string]any - // simpleValuer is a type to get value from current node. + // simpleValuer is a type to get value from the current node. simpleValuer node // recursiveValuer is a type to get the value recursively from current and parent nodes. recursiveValuer node diff --git a/core/proc/goroutines_test.go b/core/proc/goroutines_test.go index 827d0233..4d515462 100644 --- a/core/proc/goroutines_test.go +++ b/core/proc/goroutines_test.go @@ -36,6 +36,6 @@ type fakeCreator struct { err error } -func (fc fakeCreator) Create(name string) (file *os.File, err error) { +func (fc fakeCreator) Create(_ string) (file *os.File, err error) { return fc.file, fc.err } diff --git a/core/queue/queue.go b/core/queue/queue.go index 81aaaae4..5a9fd5c9 100644 --- a/core/queue/queue.go +++ b/core/queue/queue.go @@ -76,7 +76,7 @@ func (q *Queue) AddListener(listener Listener) { q.listeners = append(q.listeners, listener) } -// Broadcast broadcasts message to all event channels. +// Broadcast broadcasts the message to all event channels. func (q *Queue) Broadcast(message any) { go func() { q.eventLock.Lock() @@ -202,7 +202,7 @@ func (q *Queue) produce() { } func (q *Queue) produceOne(producer Producer) (string, bool) { - // avoid panic quit the producer, just log it and continue + // avoid panic quit the producer, log it and continue defer rescue.Recover() return producer.Produce() diff --git a/core/queue/util_test.go b/core/queue/util_test.go index f578c364..eca6b797 100644 --- a/core/queue/util_test.go +++ b/core/queue/util_test.go @@ -67,7 +67,7 @@ func (p *mockedPusher) Name() string { return p.name } -func (p *mockedPusher) Push(s string) error { +func (p *mockedPusher) Push(_ string) error { if proba.TrueOnProba(failProba) { return errors.New("dummy") } diff --git a/core/stat/metrics_test.go b/core/stat/metrics_test.go index 30f8d316..ea686560 100644 --- a/core/stat/metrics_test.go +++ b/core/stat/metrics_test.go @@ -71,6 +71,6 @@ func (m *mockedWriter) Write(report *StatReport) error { type badWriter struct{} -func (b *badWriter) Write(report *StatReport) error { +func (b *badWriter) Write(_ *StatReport) error { return errors.New("bad") } diff --git a/core/stat/task.go b/core/stat/task.go index 637e0b76..203248f2 100644 --- a/core/stat/task.go +++ b/core/stat/task.go @@ -2,7 +2,7 @@ package stat import "time" -// A Task is a task that is reported to Metrics. +// A Task is a task reported to Metrics. type Task struct { Drop bool Duration time.Duration diff --git a/core/stores/cache/cacheopt.go b/core/stores/cache/cacheopt.go index cc8d459d..836c12af 100644 --- a/core/stores/cache/cacheopt.go +++ b/core/stores/cache/cacheopt.go @@ -8,7 +8,7 @@ const ( ) type ( - // An Options is used to store the cache options. + // Options is used to store the cache options. Options struct { Expiry time.Duration NotFoundExpiry time.Duration diff --git a/core/stores/redis/conf.go b/core/stores/redis/conf.go index c5421087..5328757f 100644 --- a/core/stores/redis/conf.go +++ b/core/stores/redis/conf.go @@ -47,7 +47,7 @@ func (rc RedisConf) NewRedis() *Redis { opts = append(opts, WithTLS()) } - return New(rc.Host, opts...) + return newRedis(rc.Host, opts...) } // Validate validates the RedisConf. diff --git a/core/stores/redis/redislock.go b/core/stores/redis/redislock.go index f335d6c8..ab26cc98 100644 --- a/core/stores/redis/redislock.go +++ b/core/stores/redis/redislock.go @@ -2,6 +2,7 @@ package redis import ( "context" + "errors" "math/rand" "strconv" "sync/atomic" @@ -64,7 +65,7 @@ func (rl *RedisLock) AcquireCtx(ctx context.Context) (bool, error) { resp, err := rl.store.ScriptRunCtx(ctx, lockScript, []string{rl.key}, []string{ rl.id, strconv.Itoa(int(seconds)*millisPerSecond + tolerance), }) - if err == red.Nil { + if errors.Is(err, red.Nil) { return false, nil } else if err != nil { logx.Errorf("Error on acquiring lock for %s, %s", rl.key, err.Error()) diff --git a/core/trace/message_test.go b/core/trace/message_test.go index 039a5e76..290158f8 100644 --- a/core/trace/message_test.go +++ b/core/trace/message_test.go @@ -34,7 +34,7 @@ type mockSpan struct { options []trace.EventOption } -func (m *mockSpan) End(options ...trace.SpanEndOption) { +func (m *mockSpan) End(_ ...trace.SpanEndOption) { } func (m *mockSpan) AddEvent(name string, options ...trace.EventOption) { @@ -46,20 +46,20 @@ func (m *mockSpan) IsRecording() bool { return false } -func (m *mockSpan) RecordError(err error, options ...trace.EventOption) { +func (m *mockSpan) RecordError(_ error, _ ...trace.EventOption) { } func (m *mockSpan) SpanContext() trace.SpanContext { panic("implement me") } -func (m *mockSpan) SetStatus(code codes.Code, description string) { +func (m *mockSpan) SetStatus(_ codes.Code, _ string) { } -func (m *mockSpan) SetName(name string) { +func (m *mockSpan) SetName(_ string) { } -func (m *mockSpan) SetAttributes(kv ...attribute.KeyValue) { +func (m *mockSpan) SetAttributes(_ ...attribute.KeyValue) { } func (m *mockSpan) TracerProvider() trace.TracerProvider { diff --git a/core/trace/vars.go b/core/trace/vars.go index d8cee290..33d2e6c9 100644 --- a/core/trace/vars.go +++ b/core/trace/vars.go @@ -4,5 +4,5 @@ import "net/http" // TraceIdKey is the trace id header. // https://www.w3.org/TR/trace-context/#trace-id -// May change it to trace-id afterwards. +// May change it to trace-id afterward. var TraceIdKey = http.CanonicalHeaderKey("x-trace-id") From e9e55125a9083219bf7f0a36069ff2f155fea46c Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Sat, 9 Mar 2024 13:48:11 +0800 Subject: [PATCH 49/58] chore: fix warnings (#3990) --- internal/mock/depositserver.go | 2 +- rest/engine_test.go | 2 +- rest/handler/contentsecurityhandler.go | 3 ++- rest/handler/contentsecurityhandler_test.go | 2 +- rest/handler/cryptionhandler_test.go | 4 ++-- rest/handler/loghandler_test.go | 2 +- rest/httpc/responses_test.go | 2 +- rest/httpx/util.go | 7 +++++-- zrpc/internal/balancer/p2c/p2c_test.go | 2 +- .../clientinterceptors/tracinginterceptor_test.go | 4 ++-- zrpc/internal/rpclogger.go | 12 ++++++------ .../serverinterceptors/authinterceptor_test.go | 10 +++++----- .../serverinterceptors/tracinginterceptor_test.go | 10 +++++----- zrpc/resolver/internal/resolver.go | 2 +- zrpc/resolver/internal/resolver_test.go | 8 ++++---- zrpc/resolver/register.go | 4 +--- 16 files changed, 39 insertions(+), 37 deletions(-) diff --git a/internal/mock/depositserver.go b/internal/mock/depositserver.go index 6f7a6275..d8d6030b 100644 --- a/internal/mock/depositserver.go +++ b/internal/mock/depositserver.go @@ -12,7 +12,7 @@ import ( type DepositServer struct{} // Deposit handles the deposit requests. -func (*DepositServer) Deposit(ctx context.Context, req *DepositRequest) (*DepositResponse, error) { +func (*DepositServer) Deposit(_ context.Context, req *DepositRequest) (*DepositResponse, error) { if req.GetAmount() < 0 { return nil, status.Errorf(codes.InvalidArgument, "cannot deposit %v", req.GetAmount()) } diff --git a/rest/engine_test.go b/rest/engine_test.go index fe5358f1..4f86d217 100644 --- a/rest/engine_test.go +++ b/rest/engine_test.go @@ -435,7 +435,7 @@ type mockedRouter struct { func (m mockedRouter) ServeHTTP(_ http.ResponseWriter, _ *http.Request) { } -func (m mockedRouter) Handle(_, _ string, handler http.Handler) error { +func (m mockedRouter) Handle(_, _ string, _ http.Handler) error { return errors.New("foo") } diff --git a/rest/handler/contentsecurityhandler.go b/rest/handler/contentsecurityhandler.go index a5b9c182..bd095fe9 100644 --- a/rest/handler/contentsecurityhandler.go +++ b/rest/handler/contentsecurityhandler.go @@ -60,7 +60,8 @@ func executeCallbacks(w http.ResponseWriter, r *http.Request, next http.Handler, } } -func handleVerificationFailure(w http.ResponseWriter, r *http.Request, next http.Handler, strict bool, code int) { +func handleVerificationFailure(w http.ResponseWriter, r *http.Request, next http.Handler, + strict bool, _ int) { if strict { w.WriteHeader(http.StatusForbidden) } else { diff --git a/rest/handler/contentsecurityhandler_test.go b/rest/handler/contentsecurityhandler_test.go index dfbcc9db..6da9820c 100644 --- a/rest/handler/contentsecurityhandler_test.go +++ b/rest/handler/contentsecurityhandler_test.go @@ -327,7 +327,7 @@ func buildRequest(rs requestSettings) (*http.Request, error) { query, bodySign, }, "\n") - rs.signature = codec.HmacBase64([]byte(key), contentOfSign) + rs.signature = codec.HmacBase64(key, contentOfSign) } var mode string diff --git a/rest/handler/cryptionhandler_test.go b/rest/handler/cryptionhandler_test.go index b76384d6..f993cac5 100644 --- a/rest/handler/cryptionhandler_test.go +++ b/rest/handler/cryptionhandler_test.go @@ -224,7 +224,7 @@ func (m flushableResponseWriter) Write(p []byte) (int, error) { return m.writer.Write(p) } -func (m flushableResponseWriter) WriteHeader(statusCode int) { +func (m flushableResponseWriter) WriteHeader(_ int) { panic("implement me") } @@ -240,6 +240,6 @@ func (t *halfWriter) Write(p []byte) (n int, err error) { type badWriter struct { } -func (b *badWriter) Write(p []byte) (n int, err error) { +func (b *badWriter) Write(_ []byte) (n int, err error) { return 0, io.ErrClosedPipe } diff --git a/rest/handler/loghandler_test.go b/rest/handler/loghandler_test.go index c5763379..b6f81e1d 100644 --- a/rest/handler/loghandler_test.go +++ b/rest/handler/loghandler_test.go @@ -164,7 +164,7 @@ type mockedReadCloser struct { errMsg string } -func (m mockedReadCloser) Read(p []byte) (n int, err error) { +func (m mockedReadCloser) Read(_ []byte) (n int, err error) { return 0, errors.New(m.errMsg) } diff --git a/rest/httpc/responses_test.go b/rest/httpc/responses_test.go index 31369ee1..c6c7dd3e 100644 --- a/rest/httpc/responses_test.go +++ b/rest/httpc/responses_test.go @@ -175,6 +175,6 @@ func (m mockedReader) Close() error { return nil } -func (m mockedReader) Read(p []byte) (n int, err error) { +func (m mockedReader) Read(_ []byte) (n int, err error) { return 0, errors.New("dummy") } diff --git a/rest/httpx/util.go b/rest/httpx/util.go index 23419614..9623761a 100644 --- a/rest/httpx/util.go +++ b/rest/httpx/util.go @@ -1,6 +1,9 @@ package httpx -import "net/http" +import ( + "errors" + "net/http" +) const xForwardedFor = "X-Forwarded-For" @@ -11,7 +14,7 @@ func GetFormValues(r *http.Request) (map[string]any, error) { } if err := r.ParseMultipartForm(maxMemory); err != nil { - if err != http.ErrNotMultipart { + if !errors.Is(err, http.ErrNotMultipart) { return nil, err } } diff --git a/zrpc/internal/balancer/p2c/p2c_test.go b/zrpc/internal/balancer/p2c/p2c_test.go index 8d423622..8e1ec4b2 100644 --- a/zrpc/internal/balancer/p2c/p2c_test.go +++ b/zrpc/internal/balancer/p2c/p2c_test.go @@ -142,7 +142,7 @@ func (m mockClientConn) GetOrBuildProducer(builder balancer.ProducerBuilder) ( return builder.Build(m) } -func (m mockClientConn) UpdateAddresses(addresses []resolver.Address) { +func (m mockClientConn) UpdateAddresses(_ []resolver.Address) { } func (m mockClientConn) Connect() { diff --git a/zrpc/internal/clientinterceptors/tracinginterceptor_test.go b/zrpc/internal/clientinterceptors/tracinginterceptor_test.go index 91952ef4..3c25d50c 100644 --- a/zrpc/internal/clientinterceptors/tracinginterceptor_test.go +++ b/zrpc/internal/clientinterceptors/tracinginterceptor_test.go @@ -420,10 +420,10 @@ func (m *mockedClientStream) Context() context.Context { return context.Background() } -func (m *mockedClientStream) SendMsg(v any) error { +func (m *mockedClientStream) SendMsg(_ any) error { return m.err } -func (m *mockedClientStream) RecvMsg(v any) error { +func (m *mockedClientStream) RecvMsg(_ any) error { return m.err } diff --git a/zrpc/internal/rpclogger.go b/zrpc/internal/rpclogger.go index d20887a2..e871bb58 100644 --- a/zrpc/internal/rpclogger.go +++ b/zrpc/internal/rpclogger.go @@ -46,17 +46,17 @@ func (l *Logger) Fatalln(args ...any) { } // Info ignores the grpc info logs. -func (l *Logger) Info(args ...any) { +func (l *Logger) Info(_ ...any) { // ignore builtin grpc info } // Infoln ignores the grpc info logs. -func (l *Logger) Infoln(args ...any) { +func (l *Logger) Infoln(_ ...any) { // ignore builtin grpc info } // Infof ignores the grpc info logs. -func (l *Logger) Infof(format string, args ...any) { +func (l *Logger) Infof(_ string, _ ...any) { // ignore builtin grpc info } @@ -66,16 +66,16 @@ func (l *Logger) V(v int) bool { } // Warning ignores the grpc warning logs. -func (l *Logger) Warning(args ...any) { +func (l *Logger) Warning(_ ...any) { // ignore builtin grpc warning } // Warningf ignores the grpc warning logs. -func (l *Logger) Warningf(format string, args ...any) { +func (l *Logger) Warningf(_ string, _ ...any) { // ignore builtin grpc warning } // Warningln ignores the grpc warning logs. -func (l *Logger) Warningln(args ...any) { +func (l *Logger) Warningln(_ ...any) { // ignore builtin grpc warning } diff --git a/zrpc/internal/serverinterceptors/authinterceptor_test.go b/zrpc/internal/serverinterceptors/authinterceptor_test.go index 12d83a09..3b09b7cb 100644 --- a/zrpc/internal/serverinterceptors/authinterceptor_test.go +++ b/zrpc/internal/serverinterceptors/authinterceptor_test.go @@ -169,25 +169,25 @@ type mockedStream struct { ctx context.Context } -func (m mockedStream) SetHeader(md metadata.MD) error { +func (m mockedStream) SetHeader(_ metadata.MD) error { return nil } -func (m mockedStream) SendHeader(md metadata.MD) error { +func (m mockedStream) SendHeader(_ metadata.MD) error { return nil } -func (m mockedStream) SetTrailer(md metadata.MD) { +func (m mockedStream) SetTrailer(_ metadata.MD) { } func (m mockedStream) Context() context.Context { return m.ctx } -func (m mockedStream) SendMsg(v any) error { +func (m mockedStream) SendMsg(_ any) error { return nil } -func (m mockedStream) RecvMsg(v any) error { +func (m mockedStream) RecvMsg(_ any) error { return nil } diff --git a/zrpc/internal/serverinterceptors/tracinginterceptor_test.go b/zrpc/internal/serverinterceptors/tracinginterceptor_test.go index 9fb85a9b..2b3fee86 100644 --- a/zrpc/internal/serverinterceptors/tracinginterceptor_test.go +++ b/zrpc/internal/serverinterceptors/tracinginterceptor_test.go @@ -309,15 +309,15 @@ type mockedServerStream struct { err error } -func (m *mockedServerStream) SetHeader(md metadata.MD) error { +func (m *mockedServerStream) SetHeader(_ metadata.MD) error { panic("implement me") } -func (m *mockedServerStream) SendHeader(md metadata.MD) error { +func (m *mockedServerStream) SendHeader(_ metadata.MD) error { panic("implement me") } -func (m *mockedServerStream) SetTrailer(md metadata.MD) { +func (m *mockedServerStream) SetTrailer(_ metadata.MD) { panic("implement me") } @@ -329,10 +329,10 @@ func (m *mockedServerStream) Context() context.Context { return m.ctx } -func (m *mockedServerStream) SendMsg(v any) error { +func (m *mockedServerStream) SendMsg(_ any) error { return m.err } -func (m *mockedServerStream) RecvMsg(v any) error { +func (m *mockedServerStream) RecvMsg(_ any) error { return m.err } diff --git a/zrpc/resolver/internal/resolver.go b/zrpc/resolver/internal/resolver.go index 37362a07..2d64ccc8 100644 --- a/zrpc/resolver/internal/resolver.go +++ b/zrpc/resolver/internal/resolver.go @@ -46,5 +46,5 @@ type nopResolver struct { func (r *nopResolver) Close() { } -func (r *nopResolver) ResolveNow(options resolver.ResolveNowOptions) { +func (r *nopResolver) ResolveNow(_ resolver.ResolveNowOptions) { } diff --git a/zrpc/resolver/internal/resolver_test.go b/zrpc/resolver/internal/resolver_test.go index 62c82387..7dd10ee7 100644 --- a/zrpc/resolver/internal/resolver_test.go +++ b/zrpc/resolver/internal/resolver_test.go @@ -28,15 +28,15 @@ func (m *mockedClientConn) UpdateState(state resolver.State) error { return m.err } -func (m *mockedClientConn) ReportError(err error) { +func (m *mockedClientConn) ReportError(_ error) { } -func (m *mockedClientConn) NewAddress(addresses []resolver.Address) { +func (m *mockedClientConn) NewAddress(_ []resolver.Address) { } -func (m *mockedClientConn) NewServiceConfig(serviceConfig string) { +func (m *mockedClientConn) NewServiceConfig(_ string) { } -func (m *mockedClientConn) ParseServiceConfig(serviceConfigJSON string) *serviceconfig.ParseResult { +func (m *mockedClientConn) ParseServiceConfig(_ string) *serviceconfig.ParseResult { return nil } diff --git a/zrpc/resolver/register.go b/zrpc/resolver/register.go index 43a1ffd2..cc1d04e6 100644 --- a/zrpc/resolver/register.go +++ b/zrpc/resolver/register.go @@ -1,8 +1,6 @@ package resolver -import ( - "github.com/zeromicro/go-zero/zrpc/resolver/internal" -) +import "github.com/zeromicro/go-zero/zrpc/resolver/internal" // Register registers schemes defined zrpc. // Keep it in a separated package to let third party register manually. From 459d3025c5fcc64a973a0c750155d76f99bc8ee9 Mon Sep 17 00:00:00 2001 From: mongobaba <66656234+mongobaba@users.noreply.github.com> Date: Sat, 9 Mar 2024 20:49:16 +0800 Subject: [PATCH 50/58] optimize: change err == xx to errors.Is(err, xx) (#3991) --- core/iox/textlinescanner.go | 3 ++- core/stores/redis/hook.go | 2 +- tools/goctl/rpc/generator/genpb.go | 3 ++- tools/goctl/util/format/format.go | 2 +- zrpc/internal/clientinterceptors/tracinginterceptor.go | 3 ++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/iox/textlinescanner.go b/core/iox/textlinescanner.go index afa81652..9f20498f 100644 --- a/core/iox/textlinescanner.go +++ b/core/iox/textlinescanner.go @@ -2,6 +2,7 @@ package iox import ( "bufio" + "errors" "io" "strings" ) @@ -30,7 +31,7 @@ func (scanner *TextLineScanner) Scan() bool { line, err := scanner.reader.ReadString('\n') scanner.line = strings.TrimRight(line, "\n") - if err == io.EOF { + if errors.Is(err, io.EOF) { scanner.hasNext = false return true } else if err != nil { diff --git a/core/stores/redis/hook.go b/core/stores/redis/hook.go index 18612b7b..5f09f94a 100644 --- a/core/stores/redis/hook.go +++ b/core/stores/redis/hook.go @@ -122,7 +122,7 @@ func formatError(err error) string { } switch { - case err == io.EOF: + case errors.Is(err, io.EOF): return "eof" case errors.Is(err, context.DeadlineExceeded): return "context deadline" diff --git a/tools/goctl/rpc/generator/genpb.go b/tools/goctl/rpc/generator/genpb.go index 758bc2f6..65761a10 100644 --- a/tools/goctl/rpc/generator/genpb.go +++ b/tools/goctl/rpc/generator/genpb.go @@ -1,6 +1,7 @@ package generator import ( + "errors" "fmt" "io/fs" "os" @@ -86,7 +87,7 @@ func findPbFile(current string, src string, grpc bool) (string, error) { } return nil }) - if err == os.ErrExist { + if errors.Is(err, os.ErrExist) { return filepath.Dir(filepath.Join(current, ret)), nil } return "", err diff --git a/tools/goctl/util/format/format.go b/tools/goctl/util/format/format.go index e69640a3..40284617 100644 --- a/tools/goctl/util/format/format.go +++ b/tools/goctl/util/format/format.go @@ -115,7 +115,7 @@ func split(content string) ([]string, error) { for { r, _, err := reader.ReadRune() if err != nil { - if err == io.EOF { + if errors.Is(err, io.EOF) { if buffer.Len() > 0 { list = append(list, buffer.String()) } diff --git a/zrpc/internal/clientinterceptors/tracinginterceptor.go b/zrpc/internal/clientinterceptors/tracinginterceptor.go index 006c4691..4a7e211e 100644 --- a/zrpc/internal/clientinterceptors/tracinginterceptor.go +++ b/zrpc/internal/clientinterceptors/tracinginterceptor.go @@ -2,6 +2,7 @@ package clientinterceptors import ( "context" + "errors" "io" ztrace "github.com/zeromicro/go-zero/core/trace" @@ -122,7 +123,7 @@ func (w *clientStream) RecvMsg(m any) error { err := w.ClientStream.RecvMsg(m) if err == nil && !w.desc.ServerStreams { w.sendStreamEvent(receiveEndEvent, nil) - } else if err == io.EOF { + } else if errors.Is(err, io.EOF) { w.sendStreamEvent(receiveEndEvent, nil) } else if err != nil { w.sendStreamEvent(errorEvent, err) From f372b98d96f094dd763e7356f9e5d421d7166362 Mon Sep 17 00:00:00 2001 From: Viktor Patchev <59229299+patche-v@users.noreply.github.com> Date: Mon, 11 Mar 2024 06:06:50 +0100 Subject: [PATCH 51/58] Add: Optimize the error log to be more specific (#3994) --- core/discov/internal/registry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/discov/internal/registry.go b/core/discov/internal/registry.go index b354bb2b..462906fc 100644 --- a/core/discov/internal/registry.go +++ b/core/discov/internal/registry.go @@ -222,7 +222,7 @@ func (c *cluster) load(cli EtcdClient, key string) int64 { break } - logx.Error(err) + logx.Errorf("%s, key is %s", err.Error(), key) time.Sleep(coolDownInterval) } From 7d90f906f5a3e0a80db6e79716895b18a3b443b4 Mon Sep 17 00:00:00 2001 From: MarkJoyMa <64180138+MarkJoyMa@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:21:33 +0800 Subject: [PATCH 52/58] feat: migrate redis breaker into hook (#3982) --- core/stores/redis/breakerhook.go | 41 + core/stores/redis/breakerhook_test.go | 135 + .../stores/redis/{hook.go => durationhook.go} | 13 +- .../{hook_test.go => durationhook_test.go} | 12 +- core/stores/redis/redis.go | 2354 +++++++---------- core/stores/redis/redis_test.go | 4 +- core/stores/redis/redisclientmanager.go | 7 +- core/stores/redis/redisclustermanager.go | 7 +- core/stores/redis/redisclustermanager_test.go | 2 +- 9 files changed, 1113 insertions(+), 1462 deletions(-) create mode 100644 core/stores/redis/breakerhook.go create mode 100644 core/stores/redis/breakerhook_test.go rename core/stores/redis/{hook.go => durationhook.go} (88%) rename core/stores/redis/{hook_test.go => durationhook_test.go} (87%) diff --git a/core/stores/redis/breakerhook.go b/core/stores/redis/breakerhook.go new file mode 100644 index 00000000..4d0a1bc0 --- /dev/null +++ b/core/stores/redis/breakerhook.go @@ -0,0 +1,41 @@ +package redis + +import ( + "context" + + red "github.com/redis/go-redis/v9" + "github.com/zeromicro/go-zero/core/breaker" + "github.com/zeromicro/go-zero/core/lang" +) + +var ignoreCmds = map[string]lang.PlaceholderType{ + "blpop": {}, +} + +type breakerHook struct { + brk breaker.Breaker +} + +func (h breakerHook) DialHook(next red.DialHook) red.DialHook { + return next +} + +func (h breakerHook) ProcessHook(next red.ProcessHook) red.ProcessHook { + return func(ctx context.Context, cmd red.Cmder) error { + if _, ok := ignoreCmds[cmd.Name()]; ok { + return next(ctx, cmd) + } + + return h.brk.DoWithAcceptable(func() error { + return next(ctx, cmd) + }, acceptable) + } +} + +func (h breakerHook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipelineHook { + return func(ctx context.Context, cmds []red.Cmder) error { + return h.brk.DoWithAcceptable(func() error { + return next(ctx, cmds) + }, acceptable) + } +} diff --git a/core/stores/redis/breakerhook_test.go b/core/stores/redis/breakerhook_test.go new file mode 100644 index 00000000..ebd41504 --- /dev/null +++ b/core/stores/redis/breakerhook_test.go @@ -0,0 +1,135 @@ +package redis + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/alicebob/miniredis/v2" + "github.com/stretchr/testify/assert" + "github.com/zeromicro/go-zero/core/breaker" +) + +func TestBreakerHook_ProcessHook(t *testing.T) { + t.Run("breakerHookOpen", func(t *testing.T) { + s := miniredis.RunT(t) + + rds := MustNewRedis(RedisConf{ + Host: s.Addr(), + Type: NodeType, + }) + + someError := errors.New("ERR some error") + s.SetError(someError.Error()) + + var err error + for i := 0; i < 1000; i++ { + _, err = rds.Get("key") + if err != nil && err.Error() != someError.Error() { + break + } + } + assert.Equal(t, breaker.ErrServiceUnavailable, err) + }) + + t.Run("breakerHookClose", func(t *testing.T) { + s := miniredis.RunT(t) + + rds := MustNewRedis(RedisConf{ + Host: s.Addr(), + Type: NodeType, + }) + + var err error + for i := 0; i < 1000; i++ { + _, err = rds.Get("key") + if err != nil { + break + } + } + assert.NotEqual(t, breaker.ErrServiceUnavailable, err) + }) + + t.Run("breakerHook_ignoreCmd", func(t *testing.T) { + s := miniredis.RunT(t) + + rds := MustNewRedis(RedisConf{ + Host: s.Addr(), + Type: NodeType, + }) + + someError := errors.New("ERR some error") + s.SetError(someError.Error()) + + var err error + + node, err := getRedis(rds) + assert.NoError(t, err) + + for i := 0; i < 1000; i++ { + _, err = rds.Blpop(node, "key") + if err != nil && err.Error() != someError.Error() { + break + } + } + assert.Equal(t, someError.Error(), err.Error()) + }) +} + +func TestBreakerHook_ProcessPipelineHook(t *testing.T) { + t.Run("breakerPipelineHookOpen", func(t *testing.T) { + s := miniredis.RunT(t) + + rds := MustNewRedis(RedisConf{ + Host: s.Addr(), + Type: NodeType, + }) + + someError := errors.New("ERR some error") + s.SetError(someError.Error()) + + var err error + for i := 0; i < 1000; i++ { + err = rds.Pipelined( + func(pipe Pipeliner) error { + pipe.Incr(context.Background(), "pipelined_counter") + pipe.Expire(context.Background(), "pipelined_counter", time.Hour) + pipe.ZAdd(context.Background(), "zadd", Z{Score: 12, Member: "zadd"}) + return nil + }, + ) + + if err != nil && err.Error() != someError.Error() { + break + } + } + assert.Equal(t, breaker.ErrServiceUnavailable, err) + }) + + t.Run("breakerPipelineHookClose", func(t *testing.T) { + s := miniredis.RunT(t) + + rds := MustNewRedis(RedisConf{ + Host: s.Addr(), + Type: NodeType, + }) + + var err error + for i := 0; i < 1000; i++ { + err = rds.Pipelined( + func(pipe Pipeliner) error { + pipe.Incr(context.Background(), "pipelined_counter") + pipe.Expire(context.Background(), "pipelined_counter", time.Hour) + pipe.ZAdd(context.Background(), "zadd", Z{Score: 12, Member: "zadd"}) + return nil + }, + ) + + if err != nil { + break + } + } + assert.NotEqual(t, breaker.ErrServiceUnavailable, err) + }) +} diff --git a/core/stores/redis/hook.go b/core/stores/redis/durationhook.go similarity index 88% rename from core/stores/redis/hook.go rename to core/stores/redis/durationhook.go index 5f09f94a..d453360a 100644 --- a/core/stores/redis/hook.go +++ b/core/stores/redis/durationhook.go @@ -23,17 +23,18 @@ import ( const spanName = "redis" var ( - durationHook = hook{} + defaultDurationHook = durationHook{} redisCmdsAttributeKey = attribute.Key("redis.cmds") ) -type hook struct{} +type durationHook struct { +} -func (h hook) DialHook(next red.DialHook) red.DialHook { +func (h durationHook) DialHook(next red.DialHook) red.DialHook { return next } -func (h hook) ProcessHook(next red.ProcessHook) red.ProcessHook { +func (h durationHook) ProcessHook(next red.ProcessHook) red.ProcessHook { return func(ctx context.Context, cmd red.Cmder) error { start := timex.Now() ctx, endSpan := h.startSpan(ctx, cmd) @@ -57,7 +58,7 @@ func (h hook) ProcessHook(next red.ProcessHook) red.ProcessHook { } } -func (h hook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipelineHook { +func (h durationHook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipelineHook { return func(ctx context.Context, cmds []red.Cmder) error { if len(cmds) == 0 { return next(ctx, cmds) @@ -83,7 +84,7 @@ func (h hook) ProcessPipelineHook(next red.ProcessPipelineHook) red.ProcessPipel } } -func (h hook) startSpan(ctx context.Context, cmds ...red.Cmder) (context.Context, func(err error)) { +func (h durationHook) startSpan(ctx context.Context, cmds ...red.Cmder) (context.Context, func(err error)) { tracer := trace.TracerFromContext(ctx) ctx, span := tracer.Start(ctx, diff --git a/core/stores/redis/hook_test.go b/core/stores/redis/durationhook_test.go similarity index 87% rename from core/stores/redis/hook_test.go rename to core/stores/redis/durationhook_test.go index 44b2e8fa..37c6eb54 100644 --- a/core/stores/redis/hook_test.go +++ b/core/stores/redis/durationhook_test.go @@ -21,7 +21,7 @@ func TestHookProcessCase1(t *testing.T) { tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - err := durationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { + err := defaultDurationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) return nil })(context.Background(), red.NewCmd(context.Background())) @@ -36,7 +36,7 @@ func TestHookProcessCase2(t *testing.T) { tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - err := durationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { + err := defaultDurationHook.ProcessHook(func(ctx context.Context, cmd red.Cmder) error { assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) time.Sleep(slowThreshold.Load() + time.Millisecond) return nil @@ -54,12 +54,12 @@ func TestHookProcessPipelineCase1(t *testing.T) { tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + err := defaultDurationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { return nil })(context.Background(), nil) assert.NoError(t, err) - err = durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + err = defaultDurationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) return nil })(context.Background(), []red.Cmder{ @@ -74,7 +74,7 @@ func TestHookProcessPipelineCase2(t *testing.T) { tracetest.NewInMemoryExporter(t) w := logtest.NewCollector(t) - err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + err := defaultDurationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) time.Sleep(slowThreshold.Load() + time.Millisecond) return nil @@ -91,7 +91,7 @@ func TestHookProcessPipelineCase2(t *testing.T) { func TestHookProcessPipelineCase3(t *testing.T) { te := tracetest.NewInMemoryExporter(t) - err := durationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { + err := defaultDurationHook.ProcessPipelineHook(func(ctx context.Context, cmds []red.Cmder) error { assert.Equal(t, "redis", tracesdk.SpanFromContext(ctx).(interface{ Name() string }).Name()) return assert.AnError })(context.Background(), []red.Cmder{ diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 8f2ee9f2..3c868534 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -156,21 +156,16 @@ func (s *Redis) BitCount(key string, start, end int64) (int64, error) { } // BitCountCtx is redis bitcount command implementation. -func (s *Redis) BitCountCtx(ctx context.Context, key string, start, end int64) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) BitCountCtx(ctx context.Context, key string, start, end int64) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.BitCount(ctx, key, &red.BitCount{ - Start: start, - End: end, - }).Result() - return err - }, acceptable) - - return + return conn.BitCount(ctx, key, &red.BitCount{ + Start: start, + End: end, + }).Result() } // BitOpAnd is redis bit operation (and) command implementation. @@ -180,16 +175,12 @@ func (s *Redis) BitOpAnd(destKey string, keys ...string) (int64, error) { // BitOpAndCtx is redis bit operation (and) command implementation. func (s *Redis) BitOpAndCtx(ctx context.Context, destKey string, keys ...string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } - - val, err = conn.BitOpAnd(ctx, destKey, keys...).Result() - return err - }, acceptable) + conn, err := getRedis(s) + if err != nil { + return + } + val, err = conn.BitOpAnd(ctx, destKey, keys...).Result() return } @@ -200,16 +191,12 @@ func (s *Redis) BitOpNot(destKey, key string) (int64, error) { // BitOpNotCtx is redis bit operation (not) command implementation. func (s *Redis) BitOpNotCtx(ctx context.Context, destKey, key string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } - - val, err = conn.BitOpNot(ctx, destKey, key).Result() - return err - }, acceptable) + conn, err := getRedis(s) + if err != nil { + return + } + val, err = conn.BitOpNot(ctx, destKey, key).Result() return } @@ -219,18 +206,13 @@ func (s *Redis) BitOpOr(destKey string, keys ...string) (int64, error) { } // BitOpOrCtx is redis bit operation (or) command implementation. -func (s *Redis) BitOpOrCtx(ctx context.Context, destKey string, keys ...string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) BitOpOrCtx(ctx context.Context, destKey string, keys ...string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.BitOpOr(ctx, destKey, keys...).Result() - return err - }, acceptable) - - return + return conn.BitOpOr(ctx, destKey, keys...).Result() } // BitOpXor is redis bit operation (xor) command implementation. @@ -239,18 +221,13 @@ func (s *Redis) BitOpXor(destKey string, keys ...string) (int64, error) { } // BitOpXorCtx is redis bit operation (xor) command implementation. -func (s *Redis) BitOpXorCtx(ctx context.Context, destKey string, keys ...string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) BitOpXorCtx(ctx context.Context, destKey string, keys ...string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.BitOpXor(ctx, destKey, keys...).Result() - return err - }, acceptable) - - return + return conn.BitOpXor(ctx, destKey, keys...).Result() } // BitPos is redis bitpos command implementation. @@ -259,18 +236,13 @@ func (s *Redis) BitPos(key string, bit, start, end int64) (int64, error) { } // BitPosCtx is redis bitpos command implementation. -func (s *Redis) BitPosCtx(ctx context.Context, key string, bit, start, end int64) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) BitPosCtx(ctx context.Context, key string, bit, start, end int64) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.BitPos(ctx, key, bit, start, end).Result() - return err - }, acceptable) - - return + return conn.BitPos(ctx, key, bit, start, end).Result() } // Blpop uses passed in redis connection to execute blocking queries. @@ -342,18 +314,13 @@ func (s *Redis) Decr(key string) (int64, error) { } // DecrCtx is the implementation of redis decr command. -func (s *Redis) DecrCtx(ctx context.Context, key string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) DecrCtx(ctx context.Context, key string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.Decr(ctx, key).Result() - return err - }, acceptable) - - return + return conn.Decr(ctx, key).Result() } // Decrby is the implementation of redis decrby command. @@ -362,18 +329,13 @@ func (s *Redis) Decrby(key string, decrement int64) (int64, error) { } // DecrbyCtx is the implementation of redis decrby command. -func (s *Redis) DecrbyCtx(ctx context.Context, key string, decrement int64) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) DecrbyCtx(ctx context.Context, key string, decrement int64) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.DecrBy(ctx, key, decrement).Result() - return err - }, acceptable) - - return + return conn.DecrBy(ctx, key, decrement).Result() } // Del deletes keys. @@ -382,23 +344,18 @@ func (s *Redis) Del(keys ...string) (int, error) { } // DelCtx deletes keys. -func (s *Redis) DelCtx(ctx context.Context, keys ...string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) DelCtx(ctx context.Context, keys ...string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.Del(ctx, keys...).Result() - if err != nil { - return err - } + v, err := conn.Del(ctx, keys...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Eval is the implementation of redis eval command. @@ -408,18 +365,13 @@ func (s *Redis) Eval(script string, keys []string, args ...any) (any, error) { // EvalCtx is the implementation of redis eval command. func (s *Redis) EvalCtx(ctx context.Context, script string, keys []string, - args ...any) (val any, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + args ...any) (any, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.Eval(ctx, script, keys, args...).Result() - return err - }, acceptable) - - return + return conn.Eval(ctx, script, keys, args...).Result() } // EvalSha is the implementation of redis evalsha command. @@ -429,18 +381,13 @@ func (s *Redis) EvalSha(sha string, keys []string, args ...any) (any, error) { // EvalShaCtx is the implementation of redis evalsha command. func (s *Redis) EvalShaCtx(ctx context.Context, sha string, keys []string, - args ...any) (val any, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + args ...any) (any, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.EvalSha(ctx, sha, keys, args...).Result() - return err - }, acceptable) - - return + return conn.EvalSha(ctx, sha, keys, args...).Result() } // Exists is the implementation of redis exists command. @@ -449,23 +396,18 @@ func (s *Redis) Exists(key string) (bool, error) { } // ExistsCtx is the implementation of redis exists command. -func (s *Redis) ExistsCtx(ctx context.Context, key string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ExistsCtx(ctx context.Context, key string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - v, err := conn.Exists(ctx, key).Result() - if err != nil { - return err - } + v, err := conn.Exists(ctx, key).Result() + if err != nil { + return false, err + } - val = v == 1 - return nil - }, acceptable) - - return + return v == 1, nil } // ExistsMany is the implementation of redis exists command. @@ -476,18 +418,13 @@ func (s *Redis) ExistsMany(keys ...string) (int64, error) { // ExistsManyCtx is the implementation of redis exists command. // checks the existence of multiple keys in Redis using the EXISTS command. -func (s *Redis) ExistsManyCtx(ctx context.Context, keys ...string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ExistsManyCtx(ctx context.Context, keys ...string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.Exists(ctx, keys...).Result() - return err - }, acceptable) - - return + return conn.Exists(ctx, keys...).Result() } // Expire is the implementation of redis expire command. @@ -497,14 +434,12 @@ func (s *Redis) Expire(key string, seconds int) error { // ExpireCtx is the implementation of redis expire command. func (s *Redis) ExpireCtx(ctx context.Context, key string, seconds int) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.Expire(ctx, key, time.Duration(seconds)*time.Second).Err() - }, acceptable) + return conn.Expire(ctx, key, time.Duration(seconds)*time.Second).Err() } // Expireat is the implementation of redis expireat command. @@ -514,14 +449,12 @@ func (s *Redis) Expireat(key string, expireTime int64) error { // ExpireatCtx is the implementation of redis expireat command. func (s *Redis) ExpireatCtx(ctx context.Context, key string, expireTime int64) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.ExpireAt(ctx, key, time.Unix(expireTime, 0)).Err() - }, acceptable) + return conn.ExpireAt(ctx, key, time.Unix(expireTime, 0)).Err() } // GeoAdd is the implementation of redis geoadd command. @@ -530,19 +463,13 @@ func (s *Redis) GeoAdd(key string, geoLocation ...*GeoLocation) (int64, error) { } // GeoAddCtx is the implementation of redis geoadd command. -func (s *Redis) GeoAddCtx(ctx context.Context, key string, geoLocation ...*GeoLocation) ( - val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) GeoAddCtx(ctx context.Context, key string, geoLocation ...*GeoLocation) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.GeoAdd(ctx, key, geoLocation...).Result() - return err - }, acceptable) - - return + return conn.GeoAdd(ctx, key, geoLocation...).Result() } // GeoDist is the implementation of redis geodist command. @@ -551,19 +478,13 @@ func (s *Redis) GeoDist(key, member1, member2, unit string) (float64, error) { } // GeoDistCtx is the implementation of redis geodist command. -func (s *Redis) GeoDistCtx(ctx context.Context, key, member1, member2, unit string) ( - val float64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) GeoDistCtx(ctx context.Context, key, member1, member2, unit string) (float64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.GeoDist(ctx, key, member1, member2, unit).Result() - return err - }, acceptable) - - return + return conn.GeoDist(ctx, key, member1, member2, unit).Result() } // GeoHash is the implementation of redis geohash command. @@ -573,18 +494,13 @@ func (s *Redis) GeoHash(key string, members ...string) ([]string, error) { // GeoHashCtx is the implementation of redis geohash command. func (s *Redis) GeoHashCtx(ctx context.Context, key string, members ...string) ( - val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.GeoHash(ctx, key, members...).Result() - return err - }, acceptable) - - return + return conn.GeoHash(ctx, key, members...).Result() } // GeoRadius is the implementation of redis georadius command. @@ -595,18 +511,13 @@ func (s *Redis) GeoRadius(key string, longitude, latitude float64, query *GeoRad // GeoRadiusCtx is the implementation of redis georadius command. func (s *Redis) GeoRadiusCtx(ctx context.Context, key string, longitude, latitude float64, - query *GeoRadiusQuery) (val []GeoLocation, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + query *GeoRadiusQuery) ([]GeoLocation, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.GeoRadius(ctx, key, longitude, latitude, query).Result() - return err - }, acceptable) - - return + return conn.GeoRadius(ctx, key, longitude, latitude, query).Result() } // GeoRadiusByMember is the implementation of redis georadiusbymember command. @@ -616,18 +527,13 @@ func (s *Redis) GeoRadiusByMember(key, member string, query *GeoRadiusQuery) ([] // GeoRadiusByMemberCtx is the implementation of redis georadiusbymember command. func (s *Redis) GeoRadiusByMemberCtx(ctx context.Context, key, member string, - query *GeoRadiusQuery) (val []GeoLocation, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + query *GeoRadiusQuery) ([]GeoLocation, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.GeoRadiusByMember(ctx, key, member, query).Result() - return err - }, acceptable) - - return + return conn.GeoRadiusByMember(ctx, key, member, query).Result() } // GeoPos is the implementation of redis geopos command. @@ -637,18 +543,13 @@ func (s *Redis) GeoPos(key string, members ...string) ([]*GeoPos, error) { // GeoPosCtx is the implementation of redis geopos command. func (s *Redis) GeoPosCtx(ctx context.Context, key string, members ...string) ( - val []*GeoPos, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []*GeoPos, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.GeoPos(ctx, key, members...).Result() - return err - }, acceptable) - - return + return conn.GeoPos(ctx, key, members...).Result() } // Get is the implementation of redis get command. @@ -657,23 +558,19 @@ func (s *Redis) Get(key string) (string, error) { } // GetCtx is the implementation of redis get command. -func (s *Redis) GetCtx(ctx context.Context, key string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) GetCtx(ctx context.Context, key string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - if val, err = conn.Get(ctx, key).Result(); errors.Is(err, red.Nil) { - return nil - } else if err != nil { - return err - } else { - return nil - } - }, acceptable) - - return + if val, err := conn.Get(ctx, key).Result(); errors.Is(err, red.Nil) { + return "", nil + } else if err != nil { + return "", err + } else { + return val, nil + } } // GetBit is the implementation of redis getbit command. @@ -682,23 +579,18 @@ func (s *Redis) GetBit(key string, offset int64) (int, error) { } // GetBitCtx is the implementation of redis getbit command. -func (s *Redis) GetBitCtx(ctx context.Context, key string, offset int64) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) GetBitCtx(ctx context.Context, key string, offset int64) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.GetBit(ctx, key, offset).Result() - if err != nil { - return err - } + v, err := conn.GetBit(ctx, key, offset).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // GetSet is the implementation of redis getset command. @@ -707,21 +599,18 @@ func (s *Redis) GetSet(key, value string) (string, error) { } // GetSetCtx is the implementation of redis getset command. -func (s *Redis) GetSetCtx(ctx context.Context, key, value string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) GetSetCtx(ctx context.Context, key, value string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - if val, err = conn.GetSet(ctx, key, value).Result(); errors.Is(err, red.Nil) { - return nil - } + val, err := conn.GetSet(ctx, key, value).Result() + if errors.Is(err, red.Nil) { + return "", nil + } - return err - }, acceptable) - - return + return val, err } // Hdel is the implementation of redis hdel command. @@ -730,23 +619,18 @@ func (s *Redis) Hdel(key string, fields ...string) (bool, error) { } // HdelCtx is the implementation of redis hdel command. -func (s *Redis) HdelCtx(ctx context.Context, key string, fields ...string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HdelCtx(ctx context.Context, key string, fields ...string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - v, err := conn.HDel(ctx, key, fields...).Result() - if err != nil { - return err - } + v, err := conn.HDel(ctx, key, fields...).Result() + if err != nil { + return false, err + } - val = v >= 1 - return nil - }, acceptable) - - return + return v >= 1, nil } // Hexists is the implementation of redis hexists command. @@ -755,18 +639,13 @@ func (s *Redis) Hexists(key, field string) (bool, error) { } // HexistsCtx is the implementation of redis hexists command. -func (s *Redis) HexistsCtx(ctx context.Context, key, field string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HexistsCtx(ctx context.Context, key, field string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.HExists(ctx, key, field).Result() - return err - }, acceptable) - - return + return conn.HExists(ctx, key, field).Result() } // Hget is the implementation of redis hget command. @@ -775,18 +654,13 @@ func (s *Redis) Hget(key, field string) (string, error) { } // HgetCtx is the implementation of redis hget command. -func (s *Redis) HgetCtx(ctx context.Context, key, field string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HgetCtx(ctx context.Context, key, field string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.HGet(ctx, key, field).Result() - return err - }, acceptable) - - return + return conn.HGet(ctx, key, field).Result() } // Hgetall is the implementation of redis hgetall command. @@ -795,18 +669,13 @@ func (s *Redis) Hgetall(key string) (map[string]string, error) { } // HgetallCtx is the implementation of redis hgetall command. -func (s *Redis) HgetallCtx(ctx context.Context, key string) (val map[string]string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HgetallCtx(ctx context.Context, key string) (map[string]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.HGetAll(ctx, key).Result() - return err - }, acceptable) - - return + return conn.HGetAll(ctx, key).Result() } // Hincrby is the implementation of redis hincrby command. @@ -815,23 +684,18 @@ func (s *Redis) Hincrby(key, field string, increment int) (int, error) { } // HincrbyCtx is the implementation of redis hincrby command. -func (s *Redis) HincrbyCtx(ctx context.Context, key, field string, increment int) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HincrbyCtx(ctx context.Context, key, field string, increment int) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.HIncrBy(ctx, key, field, int64(increment)).Result() - if err != nil { - return err - } + v, err := conn.HIncrBy(ctx, key, field, int64(increment)).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // HincrbyFloat is the implementation of redis hincrbyfloat command. @@ -841,18 +705,13 @@ func (s *Redis) HincrbyFloat(key, field string, increment float64) (float64, err // HincrbyFloatCtx is the implementation of redis hincrbyfloat command. func (s *Redis) HincrbyFloatCtx(ctx context.Context, key, field string, increment float64) ( - val float64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + float64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.HIncrByFloat(ctx, key, field, increment).Result() - return err - }, acceptable) - - return + return conn.HIncrByFloat(ctx, key, field, increment).Result() } // Hkeys is the implementation of redis hkeys command. @@ -861,18 +720,13 @@ func (s *Redis) Hkeys(key string) ([]string, error) { } // HkeysCtx is the implementation of redis hkeys command. -func (s *Redis) HkeysCtx(ctx context.Context, key string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HkeysCtx(ctx context.Context, key string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.HKeys(ctx, key).Result() - return err - }, acceptable) - - return + return conn.HKeys(ctx, key).Result() } // Hlen is the implementation of redis hlen command. @@ -881,23 +735,18 @@ func (s *Redis) Hlen(key string) (int, error) { } // HlenCtx is the implementation of redis hlen command. -func (s *Redis) HlenCtx(ctx context.Context, key string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HlenCtx(ctx context.Context, key string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.HLen(ctx, key).Result() - if err != nil { - return err - } + v, err := conn.HLen(ctx, key).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Hmget is the implementation of redis hmget command. @@ -906,23 +755,18 @@ func (s *Redis) Hmget(key string, fields ...string) ([]string, error) { } // HmgetCtx is the implementation of redis hmget command. -func (s *Redis) HmgetCtx(ctx context.Context, key string, fields ...string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HmgetCtx(ctx context.Context, key string, fields ...string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.HMGet(ctx, key, fields...).Result() - if err != nil { - return err - } + v, err := conn.HMGet(ctx, key, fields...).Result() + if err != nil { + return nil, err + } - val = toStrings(v) - return nil - }, acceptable) - - return + return toStrings(v), nil } // Hset is the implementation of redis hset command. @@ -932,14 +776,12 @@ func (s *Redis) Hset(key, field, value string) error { // HsetCtx is the implementation of redis hset command. func (s *Redis) HsetCtx(ctx context.Context, key, field, value string) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.HSet(ctx, key, field, value).Err() - }, acceptable) + return conn.HSet(ctx, key, field, value).Err() } // Hsetnx is the implementation of redis hsetnx command. @@ -948,18 +790,13 @@ func (s *Redis) Hsetnx(key, field, value string) (bool, error) { } // HsetnxCtx is the implementation of redis hsetnx command. -func (s *Redis) HsetnxCtx(ctx context.Context, key, field, value string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HsetnxCtx(ctx context.Context, key, field, value string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.HSetNX(ctx, key, field, value).Result() - return err - }, acceptable) - - return + return conn.HSetNX(ctx, key, field, value).Result() } // Hmset is the implementation of redis hmset command. @@ -969,19 +806,17 @@ func (s *Redis) Hmset(key string, fieldsAndValues map[string]string) error { // HmsetCtx is the implementation of redis hmset command. func (s *Redis) HmsetCtx(ctx context.Context, key string, fieldsAndValues map[string]string) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - vals := make(map[string]any, len(fieldsAndValues)) - for k, v := range fieldsAndValues { - vals[k] = v - } + vals := make(map[string]any, len(fieldsAndValues)) + for k, v := range fieldsAndValues { + vals[k] = v + } - return conn.HMSet(ctx, key, vals).Err() - }, acceptable) + return conn.HMSet(ctx, key, vals).Err() } // Hscan is the implementation of redis hscan command. @@ -992,18 +827,13 @@ func (s *Redis) Hscan(key string, cursor uint64, match string, count int64) ( // HscanCtx is the implementation of redis hscan command. func (s *Redis) HscanCtx(ctx context.Context, key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, uint64, error) { + conn, err := getRedis(s) + if err != nil { + return nil, 0, err + } - keys, cur, err = conn.HScan(ctx, key, cursor, match, count).Result() - return err - }, acceptable) - - return + return conn.HScan(ctx, key, cursor, match, count).Result() } // Hvals is the implementation of redis hvals command. @@ -1012,18 +842,13 @@ func (s *Redis) Hvals(key string) ([]string, error) { } // HvalsCtx is the implementation of redis hvals command. -func (s *Redis) HvalsCtx(ctx context.Context, key string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) HvalsCtx(ctx context.Context, key string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.HVals(ctx, key).Result() - return err - }, acceptable) - - return + return conn.HVals(ctx, key).Result() } // Incr is the implementation of redis incr command. @@ -1032,18 +857,13 @@ func (s *Redis) Incr(key string) (int64, error) { } // IncrCtx is the implementation of redis incr command. -func (s *Redis) IncrCtx(ctx context.Context, key string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) IncrCtx(ctx context.Context, key string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.Incr(ctx, key).Result() - return err - }, acceptable) - - return + return conn.Incr(ctx, key).Result() } // Incrby is the implementation of redis incrby command. @@ -1052,18 +872,13 @@ func (s *Redis) Incrby(key string, increment int64) (int64, error) { } // IncrbyCtx is the implementation of redis incrby command. -func (s *Redis) IncrbyCtx(ctx context.Context, key string, increment int64) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) IncrbyCtx(ctx context.Context, key string, increment int64) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.IncrBy(ctx, key, increment).Result() - return err - }, acceptable) - - return + return conn.IncrBy(ctx, key, increment).Result() } // IncrbyFloat is the implementation of redis hincrbyfloat command. @@ -1072,18 +887,13 @@ func (s *Redis) IncrbyFloat(key string, increment float64) (float64, error) { } // IncrbyFloatCtx is the implementation of redis hincrbyfloat command. -func (s *Redis) IncrbyFloatCtx(ctx context.Context, key string, increment float64) (val float64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) IncrbyFloatCtx(ctx context.Context, key string, increment float64) (float64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.IncrByFloat(ctx, key, increment).Result() - return err - }, acceptable) - - return + return conn.IncrByFloat(ctx, key, increment).Result() } // Keys is the implementation of redis keys command. @@ -1092,18 +902,13 @@ func (s *Redis) Keys(pattern string) ([]string, error) { } // KeysCtx is the implementation of redis keys command. -func (s *Redis) KeysCtx(ctx context.Context, pattern string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) KeysCtx(ctx context.Context, pattern string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.Keys(ctx, pattern).Result() - return err - }, acceptable) - - return + return conn.Keys(ctx, pattern).Result() } // Llen is the implementation of redis llen command. @@ -1112,23 +917,18 @@ func (s *Redis) Llen(key string) (int, error) { } // LlenCtx is the implementation of redis llen command. -func (s *Redis) LlenCtx(ctx context.Context, key string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LlenCtx(ctx context.Context, key string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.LLen(ctx, key).Result() - if err != nil { - return err - } + v, err := conn.LLen(ctx, key).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Lindex is the implementation of redis lindex command. @@ -1137,18 +937,13 @@ func (s *Redis) Lindex(key string, index int64) (string, error) { } // LindexCtx is the implementation of redis lindex command. -func (s *Redis) LindexCtx(ctx context.Context, key string, index int64) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LindexCtx(ctx context.Context, key string, index int64) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.LIndex(ctx, key, index).Result() - return err - }, acceptable) - - return + return conn.LIndex(ctx, key, index).Result() } // Lpop is the implementation of redis lpop command. @@ -1157,18 +952,13 @@ func (s *Redis) Lpop(key string) (string, error) { } // LpopCtx is the implementation of redis lpop command. -func (s *Redis) LpopCtx(ctx context.Context, key string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LpopCtx(ctx context.Context, key string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.LPop(ctx, key).Result() - return err - }, acceptable) - - return + return conn.LPop(ctx, key).Result() } // LpopCount is the implementation of redis lpopCount command. @@ -1177,18 +967,13 @@ func (s *Redis) LpopCount(key string, count int) ([]string, error) { } // LpopCountCtx is the implementation of redis lpopCount command. -func (s *Redis) LpopCountCtx(ctx context.Context, key string, count int) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LpopCountCtx(ctx context.Context, key string, count int) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.LPopCount(ctx, key, count).Result() - return err - }, acceptable) - - return + return conn.LPopCount(ctx, key, count).Result() } // Lpush is the implementation of redis lpush command. @@ -1197,23 +982,18 @@ func (s *Redis) Lpush(key string, values ...any) (int, error) { } // LpushCtx is the implementation of redis lpush command. -func (s *Redis) LpushCtx(ctx context.Context, key string, values ...any) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LpushCtx(ctx context.Context, key string, values ...any) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.LPush(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.LPush(ctx, key, values...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Lrange is the implementation of redis lrange command. @@ -1222,18 +1002,13 @@ func (s *Redis) Lrange(key string, start, stop int) ([]string, error) { } // LrangeCtx is the implementation of redis lrange command. -func (s *Redis) LrangeCtx(ctx context.Context, key string, start, stop int) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LrangeCtx(ctx context.Context, key string, start, stop int) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.LRange(ctx, key, int64(start), int64(stop)).Result() - return err - }, acceptable) - - return + return conn.LRange(ctx, key, int64(start), int64(stop)).Result() } // Lrem is the implementation of redis lrem command. @@ -1242,23 +1017,18 @@ func (s *Redis) Lrem(key string, count int, value string) (int, error) { } // LremCtx is the implementation of redis lrem command. -func (s *Redis) LremCtx(ctx context.Context, key string, count int, value string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) LremCtx(ctx context.Context, key string, count int, value string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.LRem(ctx, key, int64(count), value).Result() - if err != nil { - return err - } + v, err := conn.LRem(ctx, key, int64(count), value).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Ltrim is the implementation of redis ltrim command. @@ -1268,14 +1038,12 @@ func (s *Redis) Ltrim(key string, start, stop int64) error { // LtrimCtx is the implementation of redis ltrim command. func (s *Redis) LtrimCtx(ctx context.Context, key string, start, stop int64) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.LTrim(ctx, key, start, stop).Err() - }, acceptable) + return conn.LTrim(ctx, key, start, stop).Err() } // Mget is the implementation of redis mget command. @@ -1284,23 +1052,18 @@ func (s *Redis) Mget(keys ...string) ([]string, error) { } // MgetCtx is the implementation of redis mget command. -func (s *Redis) MgetCtx(ctx context.Context, keys ...string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) MgetCtx(ctx context.Context, keys ...string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.MGet(ctx, keys...).Result() - if err != nil { - return err - } + v, err := conn.MGet(ctx, keys...).Result() + if err != nil { + return nil, err + } - val = toStrings(v) - return nil - }, acceptable) - - return + return toStrings(v), nil } // Mset is the implementation of redis mset command. @@ -1309,18 +1072,13 @@ func (s *Redis) Mset(fieldsAndValues ...any) (string, error) { } // MsetCtx is the implementation of redis mset command. -func (s *Redis) MsetCtx(ctx context.Context, fieldsAndValues ...any) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) MsetCtx(ctx context.Context, fieldsAndValues ...any) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.MSet(ctx, fieldsAndValues...).Result() - return err - }, acceptable) - - return + return conn.MSet(ctx, fieldsAndValues...).Result() } // Persist is the implementation of redis persist command. @@ -1329,18 +1087,13 @@ func (s *Redis) Persist(key string) (bool, error) { } // PersistCtx is the implementation of redis persist command. -func (s *Redis) PersistCtx(ctx context.Context, key string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) PersistCtx(ctx context.Context, key string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.Persist(ctx, key).Result() - return err - }, acceptable) - - return + return conn.Persist(ctx, key).Result() } // Pfadd is the implementation of redis pfadd command. @@ -1349,23 +1102,18 @@ func (s *Redis) Pfadd(key string, values ...any) (bool, error) { } // PfaddCtx is the implementation of redis pfadd command. -func (s *Redis) PfaddCtx(ctx context.Context, key string, values ...any) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) PfaddCtx(ctx context.Context, key string, values ...any) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - v, err := conn.PFAdd(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.PFAdd(ctx, key, values...).Result() + if err != nil { + return false, err + } - val = v >= 1 - return nil - }, acceptable) - - return + return v >= 1, nil } // Pfcount is the implementation of redis pfcount command. @@ -1374,18 +1122,13 @@ func (s *Redis) Pfcount(key string) (int64, error) { } // PfcountCtx is the implementation of redis pfcount command. -func (s *Redis) PfcountCtx(ctx context.Context, key string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) PfcountCtx(ctx context.Context, key string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.PFCount(ctx, key).Result() - return err - }, acceptable) - - return + return conn.PFCount(ctx, key).Result() } // Pfmerge is the implementation of redis pfmerge command. @@ -1395,15 +1138,13 @@ func (s *Redis) Pfmerge(dest string, keys ...string) error { // PfmergeCtx is the implementation of redis pfmerge command. func (s *Redis) PfmergeCtx(ctx context.Context, dest string, keys ...string) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } - - _, err = conn.PFMerge(ctx, dest, keys...).Result() + conn, err := getRedis(s) + if err != nil { return err - }, acceptable) + } + + _, err = conn.PFMerge(ctx, dest, keys...).Result() + return err } // Ping is the implementation of redis ping command. @@ -1412,26 +1153,19 @@ func (s *Redis) Ping() bool { } // PingCtx is the implementation of redis ping command. -func (s *Redis) PingCtx(ctx context.Context) (val bool) { +func (s *Redis) PingCtx(ctx context.Context) bool { // ignore error, error means false - _ = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - val = false - return nil - } + conn, err := getRedis(s) + if err != nil { + return false + } - v, err := conn.Ping(ctx).Result() - if err != nil { - val = false - return nil - } + v, err := conn.Ping(ctx).Result() + if err != nil { + return false + } - val = v == "PONG" - return nil - }, acceptable) - - return + return v == "PONG" } // Pipelined lets fn execute pipelined commands. @@ -1442,15 +1176,13 @@ func (s *Redis) Pipelined(fn func(Pipeliner) error) error { // PipelinedCtx lets fn execute pipelined commands. // Results need to be retrieved by calling Pipeline.Exec() func (s *Redis) PipelinedCtx(ctx context.Context, fn func(Pipeliner) error) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } - - _, err = conn.Pipelined(ctx, fn) + conn, err := getRedis(s) + if err != nil { return err - }, acceptable) + } + + _, err = conn.Pipelined(ctx, fn) + return err } // Rpop is the implementation of redis rpop command. @@ -1459,18 +1191,13 @@ func (s *Redis) Rpop(key string) (string, error) { } // RpopCtx is the implementation of redis rpop command. -func (s *Redis) RpopCtx(ctx context.Context, key string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) RpopCtx(ctx context.Context, key string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.RPop(ctx, key).Result() - return err - }, acceptable) - - return + return conn.RPop(ctx, key).Result() } // RpopCount is the implementation of redis rpopCount command. @@ -1479,18 +1206,13 @@ func (s *Redis) RpopCount(key string, count int) ([]string, error) { } // RpopCountCtx is the implementation of redis rpopCount command. -func (s *Redis) RpopCountCtx(ctx context.Context, key string, count int) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) RpopCountCtx(ctx context.Context, key string, count int) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.RPopCount(ctx, key, count).Result() - return err - }, acceptable) - - return + return conn.RPopCount(ctx, key, count).Result() } // Rpush is the implementation of redis rpush command. @@ -1499,23 +1221,18 @@ func (s *Redis) Rpush(key string, values ...any) (int, error) { } // RpushCtx is the implementation of redis rpush command. -func (s *Redis) RpushCtx(ctx context.Context, key string, values ...any) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) RpushCtx(ctx context.Context, key string, values ...any) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.RPush(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.RPush(ctx, key, values...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Sadd is the implementation of redis sadd command. @@ -1524,23 +1241,18 @@ func (s *Redis) Sadd(key string, values ...any) (int, error) { } // SaddCtx is the implementation of redis sadd command. -func (s *Redis) SaddCtx(ctx context.Context, key string, values ...any) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SaddCtx(ctx context.Context, key string, values ...any) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SAdd(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.SAdd(ctx, key, values...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Scan is the implementation of redis scan command. @@ -1550,18 +1262,13 @@ func (s *Redis) Scan(cursor uint64, match string, count int64) (keys []string, c // ScanCtx is the implementation of redis scan command. func (s *Redis) ScanCtx(ctx context.Context, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, uint64, error) { + conn, err := getRedis(s) + if err != nil { + return nil, 0, err + } - keys, cur, err = conn.Scan(ctx, cursor, match, count).Result() - return err - }, acceptable) - - return + return conn.Scan(ctx, cursor, match, count).Result() } // SetBit is the implementation of redis setbit command. @@ -1570,23 +1277,18 @@ func (s *Redis) SetBit(key string, offset int64, value int) (int, error) { } // SetBitCtx is the implementation of redis setbit command. -func (s *Redis) SetBitCtx(ctx context.Context, key string, offset int64, value int) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SetBitCtx(ctx context.Context, key string, offset int64, value int) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SetBit(ctx, key, offset, value).Result() - if err != nil { - return err - } + v, err := conn.SetBit(ctx, key, offset, value).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Sscan is the implementation of redis sscan command. @@ -1597,18 +1299,13 @@ func (s *Redis) Sscan(key string, cursor uint64, match string, count int64) ( // SscanCtx is the implementation of redis sscan command. func (s *Redis) SscanCtx(ctx context.Context, key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, uint64, error) { + conn, err := getRedis(s) + if err != nil { + return nil, 0, err + } - keys, cur, err = conn.SScan(ctx, key, cursor, match, count).Result() - return err - }, acceptable) - - return + return conn.SScan(ctx, key, cursor, match, count).Result() } // Scard is the implementation of redis scard command. @@ -1617,18 +1314,13 @@ func (s *Redis) Scard(key string) (int64, error) { } // ScardCtx is the implementation of redis scard command. -func (s *Redis) ScardCtx(ctx context.Context, key string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ScardCtx(ctx context.Context, key string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.SCard(ctx, key).Result() - return err - }, acceptable) - - return + return conn.SCard(ctx, key).Result() } // ScriptLoad is the implementation of redis script load command. @@ -1652,17 +1344,13 @@ func (s *Redis) ScriptRun(script *Script, keys []string, args ...any) (any, erro } // ScriptRunCtx is the implementation of *redis.Script run command. -func (s *Redis) ScriptRunCtx(ctx context.Context, script *Script, keys []string, args ...any) (val any, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ScriptRunCtx(ctx context.Context, script *Script, keys []string, args ...any) (any, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = script.Run(ctx, conn, keys, args...).Result() - return err - }, acceptable) - return + return script.Run(ctx, conn, keys, args...).Result() } // Set is the implementation of redis set command. @@ -1672,14 +1360,12 @@ func (s *Redis) Set(key, value string) error { // SetCtx is the implementation of redis set command. func (s *Redis) SetCtx(ctx context.Context, key, value string) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.Set(ctx, key, value, 0).Err() - }, acceptable) + return conn.Set(ctx, key, value, 0).Err() } // Setex is the implementation of redis setex command. @@ -1689,14 +1375,12 @@ func (s *Redis) Setex(key, value string, seconds int) error { // SetexCtx is the implementation of redis setex command. func (s *Redis) SetexCtx(ctx context.Context, key, value string, seconds int) error { - return s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return err + } - return conn.Set(ctx, key, value, time.Duration(seconds)*time.Second).Err() - }, acceptable) + return conn.Set(ctx, key, value, time.Duration(seconds)*time.Second).Err() } // Setnx is the implementation of redis setnx command. @@ -1705,18 +1389,13 @@ func (s *Redis) Setnx(key, value string) (bool, error) { } // SetnxCtx is the implementation of redis setnx command. -func (s *Redis) SetnxCtx(ctx context.Context, key, value string) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SetnxCtx(ctx context.Context, key, value string) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.SetNX(ctx, key, value, 0).Result() - return err - }, acceptable) - - return + return conn.SetNX(ctx, key, value, 0).Result() } // SetnxEx is the implementation of redis setnx command with expire. @@ -1725,18 +1404,13 @@ func (s *Redis) SetnxEx(key, value string, seconds int) (bool, error) { } // SetnxExCtx is the implementation of redis setnx command with expire. -func (s *Redis) SetnxExCtx(ctx context.Context, key, value string, seconds int) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SetnxExCtx(ctx context.Context, key, value string, seconds int) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.SetNX(ctx, key, value, time.Duration(seconds)*time.Second).Result() - return err - }, acceptable) - - return + return conn.SetNX(ctx, key, value, time.Duration(seconds)*time.Second).Result() } // Sismember is the implementation of redis sismember command. @@ -1745,18 +1419,13 @@ func (s *Redis) Sismember(key string, value any) (bool, error) { } // SismemberCtx is the implementation of redis sismember command. -func (s *Redis) SismemberCtx(ctx context.Context, key string, value any) (val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SismemberCtx(ctx context.Context, key string, value any) (bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - val, err = conn.SIsMember(ctx, key, value).Result() - return err - }, acceptable) - - return + return conn.SIsMember(ctx, key, value).Result() } // Smembers is the implementation of redis smembers command. @@ -1765,18 +1434,13 @@ func (s *Redis) Smembers(key string) ([]string, error) { } // SmembersCtx is the implementation of redis smembers command. -func (s *Redis) SmembersCtx(ctx context.Context, key string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SmembersCtx(ctx context.Context, key string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.SMembers(ctx, key).Result() - return err - }, acceptable) - - return + return conn.SMembers(ctx, key).Result() } // Spop is the implementation of redis spop command. @@ -1785,18 +1449,13 @@ func (s *Redis) Spop(key string) (string, error) { } // SpopCtx is the implementation of redis spop command. -func (s *Redis) SpopCtx(ctx context.Context, key string) (val string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SpopCtx(ctx context.Context, key string) (string, error) { + conn, err := getRedis(s) + if err != nil { + return "", err + } - val, err = conn.SPop(ctx, key).Result() - return err - }, acceptable) - - return + return conn.SPop(ctx, key).Result() } // Srandmember is the implementation of redis srandmember command. @@ -1805,18 +1464,13 @@ func (s *Redis) Srandmember(key string, count int) ([]string, error) { } // SrandmemberCtx is the implementation of redis srandmember command. -func (s *Redis) SrandmemberCtx(ctx context.Context, key string, count int) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SrandmemberCtx(ctx context.Context, key string, count int) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.SRandMemberN(ctx, key, int64(count)).Result() - return err - }, acceptable) - - return + return conn.SRandMemberN(ctx, key, int64(count)).Result() } // Srem is the implementation of redis srem command. @@ -1825,23 +1479,18 @@ func (s *Redis) Srem(key string, values ...any) (int, error) { } // SremCtx is the implementation of redis srem command. -func (s *Redis) SremCtx(ctx context.Context, key string, values ...any) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SremCtx(ctx context.Context, key string, values ...any) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SRem(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.SRem(ctx, key, values...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // String returns the string representation of s. @@ -1855,18 +1504,13 @@ func (s *Redis) Sunion(keys ...string) ([]string, error) { } // SunionCtx is the implementation of redis sunion command. -func (s *Redis) SunionCtx(ctx context.Context, keys ...string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SunionCtx(ctx context.Context, keys ...string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.SUnion(ctx, keys...).Result() - return err - }, acceptable) - - return + return conn.SUnion(ctx, keys...).Result() } // Sunionstore is the implementation of redis sunionstore command. @@ -1876,23 +1520,18 @@ func (s *Redis) Sunionstore(destination string, keys ...string) (int, error) { // SunionstoreCtx is the implementation of redis sunionstore command. func (s *Redis) SunionstoreCtx(ctx context.Context, destination string, keys ...string) ( - val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SUnionStore(ctx, destination, keys...).Result() - if err != nil { - return err - } + v, err := conn.SUnionStore(ctx, destination, keys...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Sdiff is the implementation of redis sdiff command. @@ -1901,18 +1540,13 @@ func (s *Redis) Sdiff(keys ...string) ([]string, error) { } // SdiffCtx is the implementation of redis sdiff command. -func (s *Redis) SdiffCtx(ctx context.Context, keys ...string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SdiffCtx(ctx context.Context, keys ...string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.SDiff(ctx, keys...).Result() - return err - }, acceptable) - - return + return conn.SDiff(ctx, keys...).Result() } // Sdiffstore is the implementation of redis sdiffstore command. @@ -1922,23 +1556,18 @@ func (s *Redis) Sdiffstore(destination string, keys ...string) (int, error) { // SdiffstoreCtx is the implementation of redis sdiffstore command. func (s *Redis) SdiffstoreCtx(ctx context.Context, destination string, keys ...string) ( - val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SDiffStore(ctx, destination, keys...).Result() - if err != nil { - return err - } + v, err := conn.SDiffStore(ctx, destination, keys...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Sinter is the implementation of redis sinter command. @@ -1947,18 +1576,13 @@ func (s *Redis) Sinter(keys ...string) ([]string, error) { } // SinterCtx is the implementation of redis sinter command. -func (s *Redis) SinterCtx(ctx context.Context, keys ...string) (val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) SinterCtx(ctx context.Context, keys ...string) ([]string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.SInter(ctx, keys...).Result() - return err - }, acceptable) - - return + return conn.SInter(ctx, keys...).Result() } // Sinterstore is the implementation of redis sinterstore command. @@ -1968,23 +1592,18 @@ func (s *Redis) Sinterstore(destination string, keys ...string) (int, error) { // SinterstoreCtx is the implementation of redis sinterstore command. func (s *Redis) SinterstoreCtx(ctx context.Context, destination string, keys ...string) ( - val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.SInterStore(ctx, destination, keys...).Result() - if err != nil { - return err - } + v, err := conn.SInterStore(ctx, destination, keys...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Ttl is the implementation of redis ttl command. @@ -1993,30 +1612,24 @@ func (s *Redis) Ttl(key string) (int, error) { } // TtlCtx is the implementation of redis ttl command. -func (s *Redis) TtlCtx(ctx context.Context, key string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) TtlCtx(ctx context.Context, key string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - duration, err := conn.TTL(ctx, key).Result() - if err != nil { - return err - } + duration, err := conn.TTL(ctx, key).Result() + if err != nil { + return 0, err + } - if duration >= 0 { - val = int(duration / time.Second) - } else { - // -2 means key does not exist - // -1 means key exists but has no expire - val = int(duration) - } + if duration >= 0 { + return int(duration / time.Second), nil + } - return nil - }, acceptable) - - return + // -2 means key does not exist + // -1 means key exists but has no expire + return int(duration), nil } // Zadd is the implementation of redis zadd command. @@ -2037,26 +1650,21 @@ func (s *Redis) ZaddFloat(key string, score float64, value string) (bool, error) // ZaddFloatCtx is the implementation of redis zadd command. func (s *Redis) ZaddFloatCtx(ctx context.Context, key string, score float64, value string) ( - val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - v, err := conn.ZAdd(ctx, key, red.Z{ - Score: score, - Member: value, - }).Result() - if err != nil { - return err - } + v, err := conn.ZAdd(ctx, key, red.Z{ + Score: score, + Member: value, + }).Result() + if err != nil { + return false, err + } - val = v == 1 - return nil - }, acceptable) - - return + return v == 1, nil } // Zaddnx is the implementation of redis zadd nx command. @@ -2077,26 +1685,21 @@ func (s *Redis) ZaddnxFloat(key string, score float64, value string) (bool, erro // ZaddnxFloatCtx is the implementation of redis zaddnx command. func (s *Redis) ZaddnxFloatCtx(ctx context.Context, key string, score float64, value string) ( - val bool, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + bool, error) { + conn, err := getRedis(s) + if err != nil { + return false, err + } - v, err := conn.ZAddNX(ctx, key, red.Z{ - Score: score, - Member: value, - }).Result() - if err != nil { - return err - } + v, err := conn.ZAddNX(ctx, key, red.Z{ + Score: score, + Member: value, + }).Result() + if err != nil { + return false, err + } - val = v == 1 - return nil - }, acceptable) - - return + return v == 1, nil } // Zadds is the implementation of redis zadds command. @@ -2105,24 +1708,19 @@ func (s *Redis) Zadds(key string, ps ...Pair) (int64, error) { } // ZaddsCtx is the implementation of redis zadds command. -func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZaddsCtx(ctx context.Context, key string, ps ...Pair) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - var zs []red.Z - for _, p := range ps { - z := red.Z{Score: float64(p.Score), Member: p.Key} - zs = append(zs, z) - } + var zs []red.Z + for _, p := range ps { + z := red.Z{Score: float64(p.Score), Member: p.Key} + zs = append(zs, z) + } - val, err = conn.ZAdd(ctx, key, zs...).Result() - return err - }, acceptable) - - return + return conn.ZAdd(ctx, key, zs...).Result() } // Zcard is the implementation of redis zcard command. @@ -2131,23 +1729,18 @@ func (s *Redis) Zcard(key string) (int, error) { } // ZcardCtx is the implementation of redis zcard command. -func (s *Redis) ZcardCtx(ctx context.Context, key string) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZcardCtx(ctx context.Context, key string) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZCard(ctx, key).Result() - if err != nil { - return err - } + v, err := conn.ZCard(ctx, key).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Zcount is the implementation of redis zcount command. @@ -2156,24 +1749,19 @@ func (s *Redis) Zcount(key string, start, stop int64) (int, error) { } // ZcountCtx is the implementation of redis zcount command. -func (s *Redis) ZcountCtx(ctx context.Context, key string, start, stop int64) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZcountCtx(ctx context.Context, key string, start, stop int64) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZCount(ctx, key, strconv.FormatInt(start, 10), - strconv.FormatInt(stop, 10)).Result() - if err != nil { - return err - } + v, err := conn.ZCount(ctx, key, strconv.FormatInt(start, 10), + strconv.FormatInt(stop, 10)).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Zincrby is the implementation of redis zincrby command. @@ -2183,23 +1771,18 @@ func (s *Redis) Zincrby(key string, increment int64, field string) (int64, error // ZincrbyCtx is the implementation of redis zincrby command. func (s *Redis) ZincrbyCtx(ctx context.Context, key string, increment int64, field string) ( - val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZIncrBy(ctx, key, float64(increment), field).Result() - if err != nil { - return err - } + v, err := conn.ZIncrBy(ctx, key, float64(increment), field).Result() + if err != nil { + return 0, err + } - val = int64(v) - return nil - }, acceptable) - - return + return int64(v), nil } // Zscore is the implementation of redis zscore command. @@ -2208,23 +1791,18 @@ func (s *Redis) Zscore(key, value string) (int64, error) { } // ZscoreCtx is the implementation of redis zscore command. -func (s *Redis) ZscoreCtx(ctx context.Context, key, value string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZscoreCtx(ctx context.Context, key, value string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZScore(ctx, key, value).Result() - if err != nil { - return err - } + v, err := conn.ZScore(ctx, key, value).Result() + if err != nil { + return 0, err + } - val = int64(v) - return nil - }, acceptable) - - return + return int64(v), nil } // ZscoreByFloat is the implementation of redis zscore command score by float. @@ -2233,18 +1811,13 @@ func (s *Redis) ZscoreByFloat(key, value string) (float64, error) { } // ZscoreByFloatCtx is the implementation of redis zscore command score by float. -func (s *Redis) ZscoreByFloatCtx(ctx context.Context, key, value string) (val float64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZscoreByFloatCtx(ctx context.Context, key, value string) (float64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.ZScore(ctx, key, value).Result() - return err - }, acceptable) - - return + return conn.ZScore(ctx, key, value).Result() } // Zscan is the implementation of redis zscan command. @@ -2255,18 +1828,13 @@ func (s *Redis) Zscan(key string, cursor uint64, match string, count int64) ( // ZscanCtx is the implementation of redis zscan command. func (s *Redis) ZscanCtx(ctx context.Context, key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, uint64, error) { + conn, err := getRedis(s) + if err != nil { + return nil, 0, err + } - keys, cur, err = conn.ZScan(ctx, key, cursor, match, count).Result() - return err - }, acceptable) - - return + return conn.ZScan(ctx, key, cursor, match, count).Result() } // Zrank is the implementation of redis zrank command. @@ -2275,18 +1843,13 @@ func (s *Redis) Zrank(key, field string) (int64, error) { } // ZrankCtx is the implementation of redis zrank command. -func (s *Redis) ZrankCtx(ctx context.Context, key, field string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZrankCtx(ctx context.Context, key, field string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.ZRank(ctx, key, field).Result() - return err - }, acceptable) - - return + return conn.ZRank(ctx, key, field).Result() } // Zrem is the implementation of redis zrem command. @@ -2295,23 +1858,18 @@ func (s *Redis) Zrem(key string, values ...any) (int, error) { } // ZremCtx is the implementation of redis zrem command. -func (s *Redis) ZremCtx(ctx context.Context, key string, values ...any) (val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZremCtx(ctx context.Context, key string, values ...any) (int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZRem(ctx, key, values...).Result() - if err != nil { - return err - } + v, err := conn.ZRem(ctx, key, values...).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Zremrangebyscore is the implementation of redis zremrangebyscore command. @@ -2321,24 +1879,19 @@ func (s *Redis) Zremrangebyscore(key string, start, stop int64) (int, error) { // ZremrangebyscoreCtx is the implementation of redis zremrangebyscore command. func (s *Redis) ZremrangebyscoreCtx(ctx context.Context, key string, start, stop int64) ( - val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZRemRangeByScore(ctx, key, strconv.FormatInt(start, 10), - strconv.FormatInt(stop, 10)).Result() - if err != nil { - return err - } + v, err := conn.ZRemRangeByScore(ctx, key, strconv.FormatInt(start, 10), + strconv.FormatInt(stop, 10)).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Zremrangebyrank is the implementation of redis zremrangebyrank command. @@ -2348,23 +1901,18 @@ func (s *Redis) Zremrangebyrank(key string, start, stop int64) (int, error) { // ZremrangebyrankCtx is the implementation of redis zremrangebyrank command. func (s *Redis) ZremrangebyrankCtx(ctx context.Context, key string, start, stop int64) ( - val int, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - v, err := conn.ZRemRangeByRank(ctx, key, start, stop).Result() - if err != nil { - return err - } + v, err := conn.ZRemRangeByRank(ctx, key, start, stop).Result() + if err != nil { + return 0, err + } - val = int(v) - return nil - }, acceptable) - - return + return int(v), nil } // Zrange is the implementation of redis zrange command. @@ -2374,18 +1922,13 @@ func (s *Redis) Zrange(key string, start, stop int64) ([]string, error) { // ZrangeCtx is the implementation of redis zrange command. func (s *Redis) ZrangeCtx(ctx context.Context, key string, start, stop int64) ( - val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.ZRange(ctx, key, start, stop).Result() - return err - }, acceptable) - - return + return conn.ZRange(ctx, key, start, stop).Result() } // ZrangeWithScores is the implementation of redis zrange command with scores. @@ -2395,23 +1938,18 @@ func (s *Redis) ZrangeWithScores(key string, start, stop int64) ([]Pair, error) // ZrangeWithScoresCtx is the implementation of redis zrange command with scores. func (s *Redis) ZrangeWithScoresCtx(ctx context.Context, key string, start, stop int64) ( - val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []Pair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeWithScores(ctx, key, start, stop).Result() - if err != nil { - return err - } + v, err := conn.ZRangeWithScores(ctx, key, start, stop).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZrangeWithScoresByFloat is the implementation of redis zrange command with scores by float64. @@ -2421,23 +1959,18 @@ func (s *Redis) ZrangeWithScoresByFloat(key string, start, stop int64) ([]FloatP // ZrangeWithScoresByFloatCtx is the implementation of redis zrange command with scores by float64. func (s *Redis) ZrangeWithScoresByFloatCtx(ctx context.Context, key string, start, stop int64) ( - val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []FloatPair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeWithScores(ctx, key, start, stop).Result() - if err != nil { - return err - } + v, err := conn.ZRangeWithScores(ctx, key, start, stop).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // ZRevRangeWithScores is the implementation of redis zrevrange command with scores. @@ -2460,23 +1993,18 @@ func (s *Redis) ZRevRangeWithScoresCtx(ctx context.Context, key string, start, s // ZrevrangeWithScoresCtx is the implementation of redis zrevrange command with scores. func (s *Redis) ZrevrangeWithScoresCtx(ctx context.Context, key string, start, stop int64) ( - val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []Pair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeWithScores(ctx, key, start, stop).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeWithScores(ctx, key, start, stop).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZRevRangeWithScoresByFloat is the implementation of redis zrevrange command with scores by float. @@ -2499,23 +2027,18 @@ func (s *Redis) ZRevRangeWithScoresByFloatCtx(ctx context.Context, key string, s // ZrevrangeWithScoresByFloatCtx is the implementation of redis zrevrange command with scores by float. func (s *Redis) ZrevrangeWithScoresByFloatCtx(ctx context.Context, key string, start, stop int64) ( - val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []FloatPair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeWithScores(ctx, key, start, stop).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeWithScores(ctx, key, start, stop).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // ZrangebyscoreWithScores is the implementation of redis zrangebyscore command with scores. @@ -2525,26 +2048,21 @@ func (s *Redis) ZrangebyscoreWithScores(key string, start, stop int64) ([]Pair, // ZrangebyscoreWithScoresCtx is the implementation of redis zrangebyscore command with scores. func (s *Redis) ZrangebyscoreWithScoresCtx(ctx context.Context, key string, start, stop int64) ( - val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []Pair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatInt(start, 10), - Max: strconv.FormatInt(stop, 10), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatInt(start, 10), + Max: strconv.FormatInt(stop, 10), + }).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZrangebyscoreWithScoresByFloat is the implementation of redis zrangebyscore command with scores by float. @@ -2554,26 +2072,21 @@ func (s *Redis) ZrangebyscoreWithScoresByFloat(key string, start, stop float64) // ZrangebyscoreWithScoresByFloatCtx is the implementation of redis zrangebyscore command with scores by float. func (s *Redis) ZrangebyscoreWithScoresByFloatCtx(ctx context.Context, key string, start, stop float64) ( - val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []FloatPair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatFloat(start, 'f', -1, 64), - Max: strconv.FormatFloat(stop, 'f', -1, 64), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatFloat(start, 'f', -1, 64), + Max: strconv.FormatFloat(stop, 'f', -1, 64), + }).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // ZrangebyscoreWithScoresAndLimit is the implementation of redis zrangebyscore command @@ -2586,32 +2099,27 @@ func (s *Redis) ZrangebyscoreWithScoresAndLimit(key string, start, stop int64, // ZrangebyscoreWithScoresAndLimitCtx is the implementation of redis zrangebyscore command // with scores and limit. func (s *Redis) ZrangebyscoreWithScoresAndLimitCtx(ctx context.Context, key string, start, - stop int64, page, size int) (val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - if size <= 0 { - return nil - } + stop int64, page, size int) ([]Pair, error) { + if size <= 0 { + return nil, nil + } - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatInt(start, 10), - Max: strconv.FormatInt(stop, 10), - Offset: int64(page * size), - Count: int64(size), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatInt(start, 10), + Max: strconv.FormatInt(stop, 10), + Offset: int64(page * size), + Count: int64(size), + }).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZrangebyscoreWithScoresByFloatAndLimit is the implementation of redis zrangebyscore command @@ -2625,32 +2133,27 @@ func (s *Redis) ZrangebyscoreWithScoresByFloatAndLimit(key string, start, stop f // ZrangebyscoreWithScoresByFloatAndLimitCtx is the implementation of redis zrangebyscore command // with scores by float and limit. func (s *Redis) ZrangebyscoreWithScoresByFloatAndLimitCtx(ctx context.Context, key string, start, - stop float64, page, size int) (val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - if size <= 0 { - return nil - } + stop float64, page, size int) ([]FloatPair, error) { + if size <= 0 { + return nil, nil + } - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatFloat(start, 'f', -1, 64), - Max: strconv.FormatFloat(stop, 'f', -1, 64), - Offset: int64(page * size), - Count: int64(size), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatFloat(start, 'f', -1, 64), + Max: strconv.FormatFloat(stop, 'f', -1, 64), + Offset: int64(page * size), + Count: int64(size), + }).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // Zrevrange is the implementation of redis zrevrange command. @@ -2660,18 +2163,13 @@ func (s *Redis) Zrevrange(key string, start, stop int64) ([]string, error) { // ZrevrangeCtx is the implementation of redis zrevrange command. func (s *Redis) ZrevrangeCtx(ctx context.Context, key string, start, stop int64) ( - val []string, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []string, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - val, err = conn.ZRevRange(ctx, key, start, stop).Result() - return err - }, acceptable) - - return + return conn.ZRevRange(ctx, key, start, stop).Result() } // ZrevrangebyscoreWithScores is the implementation of redis zrevrangebyscore command with scores. @@ -2681,26 +2179,21 @@ func (s *Redis) ZrevrangebyscoreWithScores(key string, start, stop int64) ([]Pai // ZrevrangebyscoreWithScoresCtx is the implementation of redis zrevrangebyscore command with scores. func (s *Redis) ZrevrangebyscoreWithScoresCtx(ctx context.Context, key string, start, stop int64) ( - val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + []Pair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatInt(start, 10), - Max: strconv.FormatInt(stop, 10), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatInt(start, 10), + Max: strconv.FormatInt(stop, 10), + }).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZrevrangebyscoreWithScoresByFloat is the implementation of redis zrevrangebyscore command with scores by float. @@ -2711,26 +2204,21 @@ func (s *Redis) ZrevrangebyscoreWithScoresByFloat(key string, start, stop float6 // ZrevrangebyscoreWithScoresByFloatCtx is the implementation of redis zrevrangebyscore command with scores by float. func (s *Redis) ZrevrangebyscoreWithScoresByFloatCtx(ctx context.Context, key string, - start, stop float64) (val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + start, stop float64) ([]FloatPair, error) { + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatFloat(start, 'f', -1, 64), - Max: strconv.FormatFloat(stop, 'f', -1, 64), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatFloat(start, 'f', -1, 64), + Max: strconv.FormatFloat(stop, 'f', -1, 64), + }).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // ZrevrangebyscoreWithScoresAndLimit is the implementation of redis zrevrangebyscore command @@ -2744,32 +2232,27 @@ func (s *Redis) ZrevrangebyscoreWithScoresAndLimit(key string, start, stop int64 // ZrevrangebyscoreWithScoresAndLimitCtx is the implementation of redis zrevrangebyscore command // with scores and limit. func (s *Redis) ZrevrangebyscoreWithScoresAndLimitCtx(ctx context.Context, key string, - start, stop int64, page, size int) (val []Pair, err error) { - err = s.brk.DoWithAcceptable(func() error { - if size <= 0 { - return nil - } + start, stop int64, page, size int) ([]Pair, error) { + if size <= 0 { + return nil, nil + } - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatInt(start, 10), - Max: strconv.FormatInt(stop, 10), - Offset: int64(page * size), - Count: int64(size), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatInt(start, 10), + Max: strconv.FormatInt(stop, 10), + Offset: int64(page * size), + Count: int64(size), + }).Result() + if err != nil { + return nil, err + } - val = toPairs(v) - return nil - }, acceptable) - - return + return toPairs(v), nil } // ZrevrangebyscoreWithScoresByFloatAndLimit is the implementation of redis zrevrangebyscore command @@ -2783,32 +2266,27 @@ func (s *Redis) ZrevrangebyscoreWithScoresByFloatAndLimit(key string, start, sto // ZrevrangebyscoreWithScoresByFloatAndLimitCtx is the implementation of redis zrevrangebyscore command // with scores by float and limit. func (s *Redis) ZrevrangebyscoreWithScoresByFloatAndLimitCtx(ctx context.Context, key string, - start, stop float64, page, size int) (val []FloatPair, err error) { - err = s.brk.DoWithAcceptable(func() error { - if size <= 0 { - return nil - } + start, stop float64, page, size int) ([]FloatPair, error) { + if size <= 0 { + return nil, nil + } - conn, err := getRedis(s) - if err != nil { - return err - } + conn, err := getRedis(s) + if err != nil { + return nil, err + } - v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ - Min: strconv.FormatFloat(start, 'f', -1, 64), - Max: strconv.FormatFloat(stop, 'f', -1, 64), - Offset: int64(page * size), - Count: int64(size), - }).Result() - if err != nil { - return err - } + v, err := conn.ZRevRangeByScoreWithScores(ctx, key, &red.ZRangeBy{ + Min: strconv.FormatFloat(start, 'f', -1, 64), + Max: strconv.FormatFloat(stop, 'f', -1, 64), + Offset: int64(page * size), + Count: int64(size), + }).Result() + if err != nil { + return nil, err + } - val = toFloatPairs(v) - return nil - }, acceptable) - - return + return toFloatPairs(v), nil } // Zrevrank is the implementation of redis zrevrank command. @@ -2817,18 +2295,13 @@ func (s *Redis) Zrevrank(key, field string) (int64, error) { } // ZrevrankCtx is the implementation of redis zrevrank command. -func (s *Redis) ZrevrankCtx(ctx context.Context, key, field string) (val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } +func (s *Redis) ZrevrankCtx(ctx context.Context, key, field string) (int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.ZRevRank(ctx, key, field).Result() - return err - }, acceptable) - - return + return conn.ZRevRank(ctx, key, field).Result() } // Zunionstore is the implementation of redis zunionstore command. @@ -2838,18 +2311,13 @@ func (s *Redis) Zunionstore(dest string, store *ZStore) (int64, error) { // ZunionstoreCtx is the implementation of redis zunionstore command. func (s *Redis) ZunionstoreCtx(ctx context.Context, dest string, store *ZStore) ( - val int64, err error) { - err = s.brk.DoWithAcceptable(func() error { - conn, err := getRedis(s) - if err != nil { - return err - } + int64, error) { + conn, err := getRedis(s) + if err != nil { + return 0, err + } - val, err = conn.ZUnionStore(ctx, dest, store).Result() - return err - }, acceptable) - - return + return conn.ZUnionStore(ctx, dest, store).Result() } func (s *Redis) checkConnection(pingTimeout time.Duration) error { @@ -2895,7 +2363,7 @@ func WithTLS() Option { } } -// withHook customizes the given Redis with given hook, only for private use now, +// withHook customizes the given Redis with given durationHook, only for private use now, // maybe expose later. func withHook(hook red.Hook) Option { return func(r *Redis) { diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index cdb082ab..4ddd2bfd 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -36,7 +36,7 @@ func (m myHook) ProcessHook(next red.ProcessHook) red.ProcessHook { if cmd.Name() == "ping" && !m.includePing { return next(ctx, cmd) } - return errors.New("hook error") + return errors.New("durationHook error") } } @@ -155,7 +155,7 @@ func TestRedis_NonBlock(t *testing.T) { t.Run("nonBlock true", func(t *testing.T) { s := miniredis.RunT(t) - // use hook to simulate redis ping error + // use durationHook to simulate redis ping error _, err := NewRedis(RedisConf{ Host: s.Addr(), NonBlock: true, diff --git a/core/stores/redis/redisclientmanager.go b/core/stores/redis/redisclientmanager.go index e2e1ad5f..14e60871 100644 --- a/core/stores/redis/redisclientmanager.go +++ b/core/stores/redis/redisclientmanager.go @@ -37,8 +37,11 @@ func getClient(r *Redis) (*red.Client, error) { MinIdleConns: idleConns, TLSConfig: tlsConfig, }) - store.AddHook(durationHook) - for _, hook := range r.hooks { + + hooks := append([]red.Hook{defaultDurationHook, breakerHook{ + brk: r.brk, + }}, r.hooks...) + for _, hook := range hooks { store.AddHook(hook) } diff --git a/core/stores/redis/redisclustermanager.go b/core/stores/redis/redisclustermanager.go index e361a577..5013de83 100644 --- a/core/stores/redis/redisclustermanager.go +++ b/core/stores/redis/redisclustermanager.go @@ -33,8 +33,11 @@ func getCluster(r *Redis) (*red.ClusterClient, error) { MinIdleConns: idleConns, TLSConfig: tlsConfig, }) - store.AddHook(durationHook) - for _, hook := range r.hooks { + + hooks := append([]red.Hook{defaultDurationHook, breakerHook{ + brk: r.brk, + }}, r.hooks...) + for _, hook := range hooks { store.AddHook(hook) } diff --git a/core/stores/redis/redisclustermanager_test.go b/core/stores/redis/redisclustermanager_test.go index ac31517e..ad418558 100644 --- a/core/stores/redis/redisclustermanager_test.go +++ b/core/stores/redis/redisclustermanager_test.go @@ -51,7 +51,7 @@ func TestGetCluster(t *testing.T) { Addr: r.Addr(), Type: ClusterType, tls: true, - hooks: []red.Hook{durationHook}, + hooks: []red.Hook{defaultDurationHook}, }) if assert.NoError(t, err) { assert.NotNil(t, c) From 94fa12560c260f24d5f9f4b2cd2f0bfc785e3b37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:28:28 +0800 Subject: [PATCH 53/58] chore(deps): bump github.com/jackc/pgx/v5 from 5.5.4 to 5.5.5 (#3999) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1865f970..d2608f0c 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 github.com/google/uuid v1.6.0 - github.com/jackc/pgx/v5 v5.5.4 + github.com/jackc/pgx/v5 v5.5.5 github.com/jhump/protoreflect v1.15.6 github.com/olekukonko/tablewriter v0.0.5 github.com/pelletier/go-toml/v2 v2.1.1 diff --git a/go.sum b/go.sum index 93b490a2..e3ccdac3 100644 --- a/go.sum +++ b/go.sum @@ -88,8 +88,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI 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= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= -github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw= +github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= From c233a6660149cf0be1642e0dd36058431801da00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:56:41 +0800 Subject: [PATCH 54/58] chore(deps): bump github.com/go-sql-driver/mysql from 1.7.1 to 1.8.0 (#3998) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 3 ++- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d2608f0c..64d07718 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/alicebob/miniredis/v2 v2.31.1 github.com/fatih/color v1.16.0 github.com/fullstorydev/grpcurl v1.8.9 - github.com/go-sql-driver/mysql v1.7.1 + github.com/go-sql-driver/mysql v1.8.0 github.com/golang-jwt/jwt/v4 v4.5.0 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.4 @@ -49,6 +49,7 @@ require ( ) require ( + filippo.io/edwards25519 v1.1.0 // indirect github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bufbuild/protocompile v0.8.0 // indirect diff --git a/go.sum b/go.sum index e3ccdac3..b7649231 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= @@ -48,8 +50,8 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -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-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4= +github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= From 09d7af76af3bb0c62c866e0cf8fb3876362224d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 13:28:27 +0800 Subject: [PATCH 55/58] chore(deps): bump github.com/go-sql-driver/mysql from 1.7.1 to 1.8.0 in /tools/goctl (#3997) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/goctl/go.mod | 3 ++- tools/goctl/go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index ca72403d..81438674 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -6,7 +6,7 @@ require ( github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/emicklei/proto v1.13.2 github.com/fatih/structtag v1.2.0 - github.com/go-sql-driver/mysql v1.7.1 + github.com/go-sql-driver/mysql v1.8.0 github.com/gookit/color v1.5.4 github.com/iancoleman/strcase v0.3.0 github.com/spf13/cobra v1.8.0 @@ -22,6 +22,7 @@ require ( ) require ( + filippo.io/edwards25519 v1.1.0 // indirect github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect github.com/alicebob/miniredis/v2 v2.31.1 // indirect github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210521184019-c5ad59b459ec // indirect diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index 00e88580..c41c933e 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -1,3 +1,5 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= @@ -51,8 +53,8 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -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-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4= +github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= From cc2a7e97f9d6abee217e437bd17fe6400adacc0a Mon Sep 17 00:00:00 2001 From: Kevin Wan Date: Wed, 13 Mar 2024 20:00:35 +0800 Subject: [PATCH 56/58] chore: coding style, add code for prometheus (#4002) --- core/stores/redis/redis.go | 46 +++++++++++++++---------------- rest/handler/prometheushandler.go | 9 +++--- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 3c868534..adce614a 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -174,14 +174,13 @@ func (s *Redis) BitOpAnd(destKey string, keys ...string) (int64, error) { } // BitOpAndCtx is redis bit operation (and) command implementation. -func (s *Redis) BitOpAndCtx(ctx context.Context, destKey string, keys ...string) (val int64, err error) { +func (s *Redis) BitOpAndCtx(ctx context.Context, destKey string, keys ...string) (int64, error) { conn, err := getRedis(s) if err != nil { - return + return 0, err } - val, err = conn.BitOpAnd(ctx, destKey, keys...).Result() - return + return conn.BitOpAnd(ctx, destKey, keys...).Result() } // BitOpNot is redis bit operation (not) command implementation. @@ -190,14 +189,13 @@ func (s *Redis) BitOpNot(destKey, key string) (int64, error) { } // BitOpNotCtx is redis bit operation (not) command implementation. -func (s *Redis) BitOpNotCtx(ctx context.Context, destKey, key string) (val int64, err error) { +func (s *Redis) BitOpNotCtx(ctx context.Context, destKey, key string) (int64, error) { conn, err := getRedis(s) if err != nil { - return + return 0, err } - val, err = conn.BitOpNot(ctx, destKey, key).Result() - return + return conn.BitOpNot(ctx, destKey, key).Result() } // BitOpOr is redis bit operation (or) command implementation. @@ -463,7 +461,8 @@ func (s *Redis) GeoAdd(key string, geoLocation ...*GeoLocation) (int64, error) { } // GeoAddCtx is the implementation of redis geoadd command. -func (s *Redis) GeoAddCtx(ctx context.Context, key string, geoLocation ...*GeoLocation) (int64, error) { +func (s *Redis) GeoAddCtx(ctx context.Context, key string, geoLocation ...*GeoLocation) ( + int64, error) { conn, err := getRedis(s) if err != nil { return 0, err @@ -478,7 +477,8 @@ func (s *Redis) GeoDist(key, member1, member2, unit string) (float64, error) { } // GeoDistCtx is the implementation of redis geodist command. -func (s *Redis) GeoDistCtx(ctx context.Context, key, member1, member2, unit string) (float64, error) { +func (s *Redis) GeoDistCtx(ctx context.Context, key, member1, member2, unit string) ( + float64, error) { conn, err := getRedis(s) if err != nil { return 0, err @@ -821,7 +821,7 @@ func (s *Redis) HmsetCtx(ctx context.Context, key string, fieldsAndValues map[st // Hscan is the implementation of redis hscan command. func (s *Redis) Hscan(key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { + []string, uint64, error) { return s.HscanCtx(context.Background(), key, cursor, match, count) } @@ -1256,7 +1256,7 @@ func (s *Redis) SaddCtx(ctx context.Context, key string, values ...any) (int, er } // Scan is the implementation of redis scan command. -func (s *Redis) Scan(cursor uint64, match string, count int64) (keys []string, cur uint64, err error) { +func (s *Redis) Scan(cursor uint64, match string, count int64) ([]string, uint64, error) { return s.ScanCtx(context.Background(), cursor, match, count) } @@ -1293,7 +1293,7 @@ func (s *Redis) SetBitCtx(ctx context.Context, key string, offset int64, value i // Sscan is the implementation of redis sscan command. func (s *Redis) Sscan(key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { + []string, uint64, error) { return s.SscanCtx(context.Background(), key, cursor, match, count) } @@ -1344,7 +1344,8 @@ func (s *Redis) ScriptRun(script *Script, keys []string, args ...any) (any, erro } // ScriptRunCtx is the implementation of *redis.Script run command. -func (s *Redis) ScriptRunCtx(ctx context.Context, script *Script, keys []string, args ...any) (any, error) { +func (s *Redis) ScriptRunCtx(ctx context.Context, script *Script, keys []string, + args ...any) (any, error) { conn, err := getRedis(s) if err != nil { return nil, err @@ -1638,8 +1639,7 @@ func (s *Redis) Zadd(key string, score int64, value string) (bool, error) { } // ZaddCtx is the implementation of redis zadd command. -func (s *Redis) ZaddCtx(ctx context.Context, key string, score int64, value string) ( - val bool, err error) { +func (s *Redis) ZaddCtx(ctx context.Context, key string, score int64, value string) (bool, error) { return s.ZaddFloatCtx(ctx, key, float64(score), value) } @@ -1668,13 +1668,12 @@ func (s *Redis) ZaddFloatCtx(ctx context.Context, key string, score float64, val } // Zaddnx is the implementation of redis zadd nx command. -func (s *Redis) Zaddnx(key string, score int64, value string) (val bool, err error) { +func (s *Redis) Zaddnx(key string, score int64, value string) (bool, error) { return s.ZaddnxCtx(context.Background(), key, score, value) } // ZaddnxCtx is the implementation of redis zadd nx command. -func (s *Redis) ZaddnxCtx(ctx context.Context, key string, score int64, value string) ( - val bool, err error) { +func (s *Redis) ZaddnxCtx(ctx context.Context, key string, score int64, value string) (bool, error) { return s.ZaddnxFloatCtx(ctx, key, float64(score), value) } @@ -1822,7 +1821,7 @@ func (s *Redis) ZscoreByFloatCtx(ctx context.Context, key, value string) (float6 // Zscan is the implementation of redis zscan command. func (s *Redis) Zscan(key string, cursor uint64, match string, count int64) ( - keys []string, cur uint64, err error) { + []string, uint64, error) { return s.ZscanCtx(context.Background(), key, cursor, match, count) } @@ -1987,7 +1986,7 @@ func (s *Redis) ZrevrangeWithScores(key string, start, stop int64) ([]Pair, erro // ZRevRangeWithScoresCtx is the implementation of redis zrevrange command with scores. // Deprecated: use ZrevrangeWithScoresCtx instead. func (s *Redis) ZRevRangeWithScoresCtx(ctx context.Context, key string, start, stop int64) ( - val []Pair, err error) { + []Pair, error) { return s.ZrevrangeWithScoresCtx(ctx, key, start, stop) } @@ -2021,7 +2020,7 @@ func (s *Redis) ZrevrangeWithScoresByFloat(key string, start, stop int64) ([]Flo // ZRevRangeWithScoresByFloatCtx is the implementation of redis zrevrange command with scores by float. // Deprecated: use ZrevrangeWithScoresByFloatCtx instead. func (s *Redis) ZRevRangeWithScoresByFloatCtx(ctx context.Context, key string, start, stop int64) ( - val []FloatPair, err error) { + []FloatPair, error) { return s.ZrevrangeWithScoresByFloatCtx(ctx, key, start, stop) } @@ -2066,7 +2065,8 @@ func (s *Redis) ZrangebyscoreWithScoresCtx(ctx context.Context, key string, star } // ZrangebyscoreWithScoresByFloat is the implementation of redis zrangebyscore command with scores by float. -func (s *Redis) ZrangebyscoreWithScoresByFloat(key string, start, stop float64) ([]FloatPair, error) { +func (s *Redis) ZrangebyscoreWithScoresByFloat(key string, start, stop float64) ( + []FloatPair, error) { return s.ZrangebyscoreWithScoresByFloatCtx(context.Background(), key, start, stop) } diff --git a/rest/handler/prometheushandler.go b/rest/handler/prometheushandler.go index 6abf4dee..173c3619 100644 --- a/rest/handler/prometheushandler.go +++ b/rest/handler/prometheushandler.go @@ -17,7 +17,7 @@ var ( Subsystem: "requests", Name: "duration_ms", Help: "http server requests duration(ms).", - Labels: []string{"path", "method"}, + Labels: []string{"path", "method", "code"}, Buckets: []float64{5, 10, 25, 50, 100, 250, 500, 750, 1000}, }) @@ -26,7 +26,7 @@ var ( Subsystem: "requests", Name: "code_total", Help: "http server requests error count.", - Labels: []string{"path", "code", "method"}, + Labels: []string{"path", "method", "code"}, }) ) @@ -37,8 +37,9 @@ func PrometheusHandler(path, method string) func(http.Handler) http.Handler { startTime := timex.Now() cw := response.NewWithCodeResponseWriter(w) defer func() { - metricServerReqDur.Observe(timex.Since(startTime).Milliseconds(), path, method) - metricServerReqCodeTotal.Inc(path, strconv.Itoa(cw.Code), method) + code := strconv.Itoa(cw.Code) + metricServerReqDur.Observe(timex.Since(startTime).Milliseconds(), path, method, code) + metricServerReqCodeTotal.Inc(path, method, code) }() next.ServeHTTP(cw, r) From 9f9a12ea57110f970bf1797abc3272d20a30698f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 11:19:44 +0800 Subject: [PATCH 57/58] chore(deps): bump github.com/alicebob/miniredis/v2 from 2.31.1 to 2.32.1 (#4003) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 64d07718..c6b2b990 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 - github.com/alicebob/miniredis/v2 v2.31.1 + github.com/alicebob/miniredis/v2 v2.32.1 github.com/fatih/color v1.16.0 github.com/fullstorydev/grpcurl v1.8.9 github.com/go-sql-driver/mysql v1.8.0 @@ -97,7 +97,7 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - github.com/yuin/gopher-lua v1.1.0 // indirect + github.com/yuin/gopher-lua v1.1.1 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.12 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect diff --git a/go.sum b/go.sum index b7649231..2fe71e18 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,11 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis/v2 v2.31.1 h1:7XAt0uUg3DtwEKW5ZAGa+K7FZV2DdKQo5K/6TTnfX8Y= -github.com/alicebob/miniredis/v2 v2.31.1/go.mod h1:UB/T2Uztp7MlFSDakaX1sTXUv5CASoprx0wulRT6HBg= +github.com/alicebob/miniredis/v2 v2.32.1 h1:Bz7CciDnYSaa0mX5xODh6GUITRSx+cVhjNoOR4JssBo= +github.com/alicebob/miniredis/v2 v2.32.1/go.mod h1:AqkLNAfUm0K07J28hnAyyQKf/x0YkCY/g5DCtuL01Mw= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -59,7 +58,6 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -188,8 +186,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= -github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= go.etcd.io/etcd/api/v3 v3.5.12 h1:W4sw5ZoU2Juc9gBWuLk5U6fHfNVyY1WC5g9uiXZio/c= go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= go.etcd.io/etcd/client/pkg/v3 v3.5.12 h1:EYDL6pWwyOsylrQyLp2w+HkQ46ATiOvoEdMarindU2A= From 0449450c64ba295291ff71bf8d4690f9da3e2d66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 12:55:57 +0800 Subject: [PATCH 58/58] chore(deps): bump github.com/jackc/pgx/v5 from 5.5.3 to 5.5.4 in /tools/goctl (#4007) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/goctl/go.mod | 2 +- tools/goctl/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/goctl/go.mod b/tools/goctl/go.mod index 81438674..59dbb430 100644 --- a/tools/goctl/go.mod +++ b/tools/goctl/go.mod @@ -51,7 +51,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.3 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect diff --git a/tools/goctl/go.sum b/tools/goctl/go.sum index c41c933e..bd85ce8a 100644 --- a/tools/goctl/go.sum +++ b/tools/goctl/go.sum @@ -92,8 +92,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI 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= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.5.3 h1:Ces6/M3wbDXYpM8JyyPD57ivTtJACFZJd885pdIaV2s= -github.com/jackc/pgx/v5 v5.5.3/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=