Skip to content

Commit 7e1165d

Browse files
roycaihwk8s-publishing-bot
authored andcommitted
don't cache transports for incomparable configs
Co-authored-by: Jordan Liggitt <[email protected]> Kubernetes-commit: 20b77693a2d12f7f8e75c66b7a751fd0613ca465
1 parent 4c2c810 commit 7e1165d

File tree

2 files changed

+47
-25
lines changed

2 files changed

+47
-25
lines changed

transport/cache.go

+27-18
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ type tlsCacheKey struct {
4747
keyData string
4848
certFile string
4949
keyFile string
50-
getCert string
5150
serverName string
5251
nextProtos string
53-
dial string
5452
disableCompression bool
5553
}
5654

@@ -59,22 +57,24 @@ func (t tlsCacheKey) String() string {
5957
if len(t.keyData) > 0 {
6058
keyText = "<redacted>"
6159
}
62-
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)
60+
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)
6361
}
6462

6563
func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) {
66-
key, err := tlsConfigKey(config)
64+
key, canCache, err := tlsConfigKey(config)
6765
if err != nil {
6866
return nil, err
6967
}
7068

71-
// Ensure we only create a single transport for the given TLS options
72-
c.mu.Lock()
73-
defer c.mu.Unlock()
69+
if canCache {
70+
// Ensure we only create a single transport for the given TLS options
71+
c.mu.Lock()
72+
defer c.mu.Unlock()
7473

75-
// See if we already have a custom transport for this config
76-
if t, ok := c.transports[key]; ok {
77-
return t, nil
74+
// See if we already have a custom transport for this config
75+
if t, ok := c.transports[key]; ok {
76+
return t, nil
77+
}
7878
}
7979

8080
// Get the TLS options for this client config
@@ -104,31 +104,40 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) {
104104
go dynamicCertDialer.Run(wait.NeverStop)
105105
}
106106

107-
// Cache a single transport for these options
108-
c.transports[key] = utilnet.SetTransportDefaults(&http.Transport{
107+
transport := utilnet.SetTransportDefaults(&http.Transport{
109108
Proxy: http.ProxyFromEnvironment,
110109
TLSHandshakeTimeout: 10 * time.Second,
111110
TLSClientConfig: tlsConfig,
112111
MaxIdleConnsPerHost: idleConnsPerHost,
113112
DialContext: dial,
114113
DisableCompression: config.DisableCompression,
115114
})
116-
return c.transports[key], nil
115+
116+
if canCache {
117+
// Cache a single transport for these options
118+
c.transports[key] = transport
119+
}
120+
121+
return transport, nil
117122
}
118123

119124
// tlsConfigKey returns a unique key for tls.Config objects returned from TLSConfigFor
120-
func tlsConfigKey(c *Config) (tlsCacheKey, error) {
125+
func tlsConfigKey(c *Config) (tlsCacheKey, bool, error) {
121126
// Make sure ca/key/cert content is loaded
122127
if err := loadTLSFiles(c); err != nil {
123-
return tlsCacheKey{}, err
128+
return tlsCacheKey{}, false, err
124129
}
130+
131+
if c.TLS.GetCert != nil || c.Dial != nil {
132+
// cannot determine equality for functions
133+
return tlsCacheKey{}, false, nil
134+
}
135+
125136
k := tlsCacheKey{
126137
insecure: c.TLS.Insecure,
127138
caData: string(c.TLS.CAData),
128-
getCert: fmt.Sprintf("%p", c.TLS.GetCert),
129139
serverName: c.TLS.ServerName,
130140
nextProtos: strings.Join(c.TLS.NextProtos, ","),
131-
dial: fmt.Sprintf("%p", c.Dial),
132141
disableCompression: c.DisableCompression,
133142
}
134143

@@ -140,5 +149,5 @@ func tlsConfigKey(c *Config) (tlsCacheKey, error) {
140149
k.keyData = string(c.TLS.KeyData)
141150
}
142151

143-
return k, nil
152+
return k, true, nil
144153
}

transport/cache_test.go

+20-7
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)