16
16
17
17
package io .grpc .xds .internal ;
18
18
19
+ import com .google .common .collect .ImmutableList ;
19
20
import com .google .protobuf .Duration ;
20
21
import com .google .protobuf .util .Durations ;
21
22
import io .grpc .ChannelCredentials ;
23
+ import io .grpc .ResourceAllocatingChannelCredentials ;
22
24
import io .grpc .TlsChannelCredentials ;
23
25
import io .grpc .internal .GrpcUtil ;
24
26
import io .grpc .internal .JsonUtil ;
25
27
import io .grpc .util .AdvancedTlsX509KeyManager ;
26
28
import io .grpc .util .AdvancedTlsX509TrustManager ;
27
29
import io .grpc .xds .XdsCredentialsProvider ;
30
+ import java .io .Closeable ;
28
31
import java .io .File ;
29
32
import java .text .ParseException ;
30
33
import java .util .Map ;
@@ -51,10 +54,10 @@ public final class TlsXdsCredentialsProvider extends XdsCredentialsProvider {
51
54
52
55
@ Override
53
56
protected ChannelCredentials newChannelCredentials (Map <String , ?> jsonConfig ) {
54
- TlsChannelCredentials .Builder builder = TlsChannelCredentials .newBuilder ();
57
+ TlsChannelCredentials .Builder tlsChannelCredsBuilder = TlsChannelCredentials .newBuilder ();
55
58
56
59
if (jsonConfig == null ) {
57
- return builder .build ();
60
+ return tlsChannelCredsBuilder .build ();
58
61
}
59
62
60
63
// use refresh interval from bootstrap config if provided; else defaults to 600s
@@ -70,17 +73,22 @@ protected ChannelCredentials newChannelCredentials(Map<String, ?> jsonConfig) {
70
73
}
71
74
}
72
75
76
+ ImmutableList .Builder <Closeable > resourcesBuilder = ImmutableList .builder ();
77
+ ScheduledExecutorService scheduledExecutorService = null ;
78
+
73
79
// use trust certificate file path from bootstrap config if provided; else use system default
74
80
String rootCertPath = JsonUtil .getString (jsonConfig , ROOT_FILE_KEY );
75
81
if (rootCertPath != null ) {
76
82
try {
83
+ scheduledExecutorService = scheduledExecutorServiceFactory .create ();
77
84
AdvancedTlsX509TrustManager trustManager = AdvancedTlsX509TrustManager .newBuilder ().build ();
78
- trustManager .updateTrustCredentials (
85
+ Closeable trustManagerFuture = trustManager .updateTrustCredentials (
79
86
new File (rootCertPath ),
80
87
refreshIntervalSeconds ,
81
88
TimeUnit .SECONDS ,
82
- scheduledExecutorServiceFactory .create ());
83
- builder .trustManager (trustManager );
89
+ scheduledExecutorService );
90
+ resourcesBuilder .add (trustManagerFuture );
91
+ tlsChannelCredsBuilder .trustManager (trustManager );
84
92
} catch (Exception e ) {
85
93
logger .log (Level .WARNING , "Unable to read root certificates" , e );
86
94
return null ;
@@ -93,14 +101,18 @@ protected ChannelCredentials newChannelCredentials(Map<String, ?> jsonConfig) {
93
101
String privateKeyPath = JsonUtil .getString (jsonConfig , KEY_FILE_KEY );
94
102
if (certChainPath != null && privateKeyPath != null ) {
95
103
try {
104
+ if (scheduledExecutorService == null ) {
105
+ scheduledExecutorService = scheduledExecutorServiceFactory .create ();
106
+ }
96
107
AdvancedTlsX509KeyManager keyManager = new AdvancedTlsX509KeyManager ();
97
- keyManager .updateIdentityCredentials (
108
+ Closeable keyManagerFuture = keyManager .updateIdentityCredentials (
98
109
new File (certChainPath ),
99
110
new File (privateKeyPath ),
100
111
refreshIntervalSeconds ,
101
112
TimeUnit .SECONDS ,
102
- scheduledExecutorServiceFactory .create ());
103
- builder .keyManager (keyManager );
113
+ scheduledExecutorService );
114
+ resourcesBuilder .add (keyManagerFuture );
115
+ tlsChannelCredsBuilder .keyManager (keyManager );
104
116
} catch (Exception e ) {
105
117
logger .log (Level .WARNING , "Unable to read certificate chain or private key" , e );
106
118
return null ;
@@ -110,7 +122,17 @@ protected ChannelCredentials newChannelCredentials(Map<String, ?> jsonConfig) {
110
122
return null ;
111
123
}
112
124
113
- return builder .build ();
125
+ // if executor was initialized, add it to allocated resource list
126
+ if (scheduledExecutorService != null ) {
127
+ resourcesBuilder .add (asCloseable (scheduledExecutorService ));
128
+ }
129
+
130
+ return ResourceAllocatingChannelCredentials .create (
131
+ tlsChannelCredsBuilder .build (), resourcesBuilder .build ());
132
+ }
133
+
134
+ private static Closeable asCloseable (ScheduledExecutorService scheduledExecutorService ) {
135
+ return () -> scheduledExecutorService .shutdownNow ();
114
136
}
115
137
116
138
@ Override
0 commit comments