From 76c6e40171b2f032913549c95396cd8d44fbd7f5 Mon Sep 17 00:00:00 2001 From: Cody Oss <6331106+codyoss@users.noreply.github.com> Date: Thu, 3 Feb 2022 09:50:09 -0700 Subject: [PATCH] fix(compute/metadata): init a HTTP client in OnGCE check (#5439) Initalize a resolver and http.Client locally in function to force GC to cleanup background resources such as cached connections. This can falsely report as leaked goroutines otherwise. This kind of issue will still persist for calling methods like ProjectID, but we are intentionally caching a client and its connections for these occations today. If this ends up causing users issues in the fututure we can reevaluate at that time. Fixes: #5430 --- compute/metadata/metadata.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/compute/metadata/metadata.go b/compute/metadata/metadata.go index 5dbe77cc79c..111309f3d8b 100644 --- a/compute/metadata/metadata.go +++ b/compute/metadata/metadata.go @@ -61,14 +61,18 @@ var ( instID = &cachedValue{k: "instance/id", trim: true} ) -var defaultClient = &Client{hc: &http.Client{ - Transport: &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 2 * time.Second, - KeepAlive: 30 * time.Second, - }).Dial, - }, -}} +var defaultClient = &Client{hc: newDefaultHTTPClient()} + +func newDefaultHTTPClient() *http.Client { + return &http.Client{ + Transport: &http.Transport{ + Dial: (&net.Dialer{ + Timeout: 2 * time.Second, + KeepAlive: 30 * time.Second, + }).Dial, + }, + } +} // NotDefinedError is returned when requested metadata is not defined. // @@ -130,7 +134,7 @@ func testOnGCE() bool { go func() { req, _ := http.NewRequest("GET", "http://"+metadataIP, nil) req.Header.Set("User-Agent", userAgent) - res, err := defaultClient.hc.Do(req.WithContext(ctx)) + res, err := newDefaultHTTPClient().Do(req.WithContext(ctx)) if err != nil { resc <- false return @@ -140,7 +144,8 @@ func testOnGCE() bool { }() go func() { - addrs, err := net.DefaultResolver.LookupHost(ctx, "metadata.google.internal") + resolver := &net.Resolver{} + addrs, err := resolver.LookupHost(ctx, "metadata.google.internal") if err != nil || len(addrs) == 0 { resc <- false return