Skip to content

Commit b7e3da0

Browse files
roycaihwk8s-publishing-bot
authored andcommitted
don't cache transports for incomparable configs
Co-authored-by: Jordan Liggitt <liggitt@google.com> Kubernetes-commit: a5ad745376432db81491de7e9a6102e74ba45c26
1 parent 92dd56d commit b7e3da0

File tree

2 files changed

+47
-25
lines changed

2 files changed

+47
-25
lines changed

transport/cache.go

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,8 @@ type tlsCacheKey struct {
4444
caData string
4545
certData string
4646
keyData string
47-
getCert string
4847
serverName string
4948
nextProtos string
50-
dial string
5149
disableCompression bool
5250
}
5351

@@ -56,22 +54,24 @@ func (t tlsCacheKey) String() string {
5654
if len(t.keyData) > 0 {
5755
keyText = "<redacted>"
5856
}
59-
return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, getCert: %s, serverName:%s, dial:%s disableCompression:%t", t.insecure, t.caData, t.certData, keyText, t.getCert, t.serverName, t.dial, t.disableCompression)
57+
return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, serverName:%s, disableCompression:%t", t.insecure, t.caData, t.certData, keyText, t.serverName, t.disableCompression)
6058
}
6159

6260
func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) {
63-
key, err := tlsConfigKey(config)
61+
key, canCache, err := tlsConfigKey(config)
6462
if err != nil {
6563
return nil, err
6664
}
6765

68-
// Ensure we only create a single transport for the given TLS options
69-
c.mu.Lock()
70-
defer c.mu.Unlock()
66+
if canCache {
67+
// Ensure we only create a single transport for the given TLS options
68+
c.mu.Lock()
69+
defer c.mu.Unlock()
7170

72-
// See if we already have a custom transport for this config
73-
if t, ok := c.transports[key]; ok {
74-
return t, nil
71+
// See if we already have a custom transport for this config
72+
if t, ok := c.transports[key]; ok {
73+
return t, nil
74+
}
7575
}
7676

7777
// Get the TLS options for this client config
@@ -91,33 +91,42 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) {
9191
KeepAlive: 30 * time.Second,
9292
}).DialContext
9393
}
94-
// Cache a single transport for these options
95-
c.transports[key] = utilnet.SetTransportDefaults(&http.Transport{
94+
transport := utilnet.SetTransportDefaults(&http.Transport{
9695
Proxy: http.ProxyFromEnvironment,
9796
TLSHandshakeTimeout: 10 * time.Second,
9897
TLSClientConfig: tlsConfig,
9998
MaxIdleConnsPerHost: idleConnsPerHost,
10099
DialContext: dial,
101100
DisableCompression: config.DisableCompression,
102101
})
103-
return c.transports[key], nil
102+
103+
if canCache {
104+
// Cache a single transport for these options
105+
c.transports[key] = transport
106+
}
107+
108+
return transport, nil
104109
}
105110

106111
// tlsConfigKey returns a unique key for tls.Config objects returned from TLSConfigFor
107-
func tlsConfigKey(c *Config) (tlsCacheKey, error) {
112+
func tlsConfigKey(c *Config) (tlsCacheKey, bool, error) {
108113
// Make sure ca/key/cert content is loaded
109114
if err := loadTLSFiles(c); err != nil {
110-
return tlsCacheKey{}, err
115+
return tlsCacheKey{}, false, err
111116
}
117+
118+
if c.TLS.GetCert != nil || c.Dial != nil {
119+
// cannot determine equality for functions
120+
return tlsCacheKey{}, false, nil
121+
}
122+
112123
return tlsCacheKey{
113124
insecure: c.TLS.Insecure,
114125
caData: string(c.TLS.CAData),
115126
certData: string(c.TLS.CertData),
116127
keyData: string(c.TLS.KeyData),
117-
getCert: fmt.Sprintf("%p", c.TLS.GetCert),
118128
serverName: c.TLS.ServerName,
119129
nextProtos: strings.Join(c.TLS.NextProtos, ","),
120-
dial: fmt.Sprintf("%p", c.Dial),
121130
disableCompression: c.DisableCompression,
122-
}, nil
131+
}, true, nil
123132
}

transport/cache_test.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,24 @@ func TestTLSConfigKey(t *testing.T) {
3636
}
3737
for nameA, valueA := range identicalConfigurations {
3838
for nameB, valueB := range identicalConfigurations {
39-
keyA, err := tlsConfigKey(valueA)
39+
keyA, canCache, err := tlsConfigKey(valueA)
4040
if err != nil {
4141
t.Errorf("Unexpected error for %q: %v", nameA, err)
4242
continue
4343
}
44-
keyB, err := tlsConfigKey(valueB)
44+
if !canCache {
45+
t.Errorf("Unexpected canCache=false")
46+
continue
47+
}
48+
keyB, canCache, err := tlsConfigKey(valueB)
4549
if err != nil {
4650
t.Errorf("Unexpected error for %q: %v", nameB, err)
4751
continue
4852
}
53+
if !canCache {
54+
t.Errorf("Unexpected canCache=false")
55+
continue
56+
}
4957
if keyA != keyB {
5058
t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB)
5159
continue
@@ -131,12 +139,12 @@ func TestTLSConfigKey(t *testing.T) {
131139
}
132140
for nameA, valueA := range uniqueConfigurations {
133141
for nameB, valueB := range uniqueConfigurations {
134-
keyA, err := tlsConfigKey(valueA)
142+
keyA, canCacheA, err := tlsConfigKey(valueA)
135143
if err != nil {
136144
t.Errorf("Unexpected error for %q: %v", nameA, err)
137145
continue
138146
}
139-
keyB, err := tlsConfigKey(valueB)
147+
keyB, canCacheB, err := tlsConfigKey(valueB)
140148
if err != nil {
141149
t.Errorf("Unexpected error for %q: %v", nameB, err)
142150
continue
@@ -147,12 +155,17 @@ func TestTLSConfigKey(t *testing.T) {
147155
if keyA != keyB {
148156
t.Errorf("Expected identical cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB)
149157
}
158+
if canCacheA != canCacheB {
159+
t.Errorf("Expected identical canCache %q and %q, got:\n\t%v\n\t%v", nameA, nameB, canCacheA, canCacheB)
160+
}
150161
continue
151162
}
152163

153-
if keyA == keyB {
154-
t.Errorf("Expected unique cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB)
155-
continue
164+
if canCacheA && canCacheB {
165+
if keyA == keyB {
166+
t.Errorf("Expected unique cache keys for %q and %q, got:\n\t%s\n\t%s", nameA, nameB, keyA, keyB)
167+
continue
168+
}
156169
}
157170
}
158171
}

0 commit comments

Comments
 (0)