From 01012f282a8a7f9e9f1631c90c5522b75a8dd3f5 Mon Sep 17 00:00:00 2001 From: Glenn Kim Date: Thu, 13 Jul 2023 11:38:17 +0900 Subject: [PATCH] Limit resolving concurrency (#4) * early return when ResolveNow is already resolving in another goroutine * fix broken test --- resolver.go | 7 +++++-- target_test.go | 39 ++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/resolver.go b/resolver.go index f854523..1c1c5d1 100644 --- a/resolver.go +++ b/resolver.go @@ -32,8 +32,11 @@ type resolver struct { } func (c *resolver) ResolveNow(grpcresolver.ResolveNowOptions) { - c.mu.RLock() - defer c.mu.RUnlock() + locked := c.mu.TryLock() + if !locked { // already resolving + return + } + defer c.mu.Unlock() if c.isClosed { return diff --git a/target_test.go b/target_test.go index c4e2bc2..21d53cc 100644 --- a/target_test.go +++ b/target_test.go @@ -1,6 +1,7 @@ package cloudmap import ( + "net/url" "reflect" "testing" @@ -65,7 +66,9 @@ func Test_parseTarget(t *testing.T) { name: "unexpected scheme", args: args{ t: grpcresolver.Target{ - Scheme: "https", + URL: url.URL{ + Scheme: "https", + }, }, }, wantErr: true, @@ -74,7 +77,9 @@ func Test_parseTarget(t *testing.T) { name: "empty namespace", args: args{ t: grpcresolver.Target{ - Scheme: "https", + URL: url.URL{ + Scheme: Scheme, + }, }, }, wantErr: true, @@ -83,8 +88,10 @@ func Test_parseTarget(t *testing.T) { name: "empty service", args: args{ t: grpcresolver.Target{ - Scheme: Scheme, - Authority: "test-namespace", + URL: url.URL{ + Scheme: Scheme, + Host: "test-namespace", + }, }, }, wantErr: true, @@ -93,9 +100,11 @@ func Test_parseTarget(t *testing.T) { name: "normal", args: args{ t: grpcresolver.Target{ - Scheme: Scheme, - Authority: "test-namespace", - Endpoint: "test-service", + URL: url.URL{ + Scheme: Scheme, + Host: "test-namespace", + Path: "test-service", + }, }, }, want: &target{ @@ -107,9 +116,11 @@ func Test_parseTarget(t *testing.T) { name: "with slash", args: args{ t: grpcresolver.Target{ - Scheme: Scheme, - Authority: "test-namespace", - Endpoint: "test/service", + URL: url.URL{ + Scheme: Scheme, + Host: "test-namespace", + Path: "test/service", + }, }, }, want: &target{ @@ -121,9 +132,11 @@ func Test_parseTarget(t *testing.T) { name: "with whitespace", args: args{ t: grpcresolver.Target{ - Scheme: Scheme, - Authority: "test-namespace", - Endpoint: "test%20service", + URL: url.URL{ + Scheme: Scheme, + Host: "test-namespace", + Path: "test%20service", + }, }, }, want: &target{