17
17
*/
18
18
package com .tc .config ;
19
19
20
-
21
20
import com .tc .classloader .ServiceLocator ;
22
21
import com .tc .productinfo .ProductInfo ;
23
22
import com .tc .properties .TCPropertiesImpl ;
28
27
import java .io .ByteArrayInputStream ;
29
28
import java .io .InputStream ;
30
29
import java .nio .charset .StandardCharsets ;
31
- import java .util .Collection ;
32
30
import java .util .Collections ;
33
31
import java .util .HashMap ;
34
32
import java .util .Map ;
35
33
import java .util .Objects ;
36
34
import java .util .Properties ;
37
35
import org .terracotta .configuration .ConfigurationException ;
38
36
import com .tc .text .PrettyPrintable ;
37
+ import java .io .File ;
38
+ import java .net .InetSocketAddress ;
39
39
import java .util .List ;
40
+ import java .util .concurrent .locks .Lock ;
41
+ import java .util .concurrent .locks .ReentrantLock ;
42
+ import java .util .stream .Collectors ;
43
+ import org .slf4j .Logger ;
44
+ import org .slf4j .LoggerFactory ;
40
45
41
46
public class ServerConfigurationManager implements PrettyPrintable {
42
47
43
- private final ConfigurationProvider configurationProvider ;
48
+ private final Logger LOGGER = LoggerFactory .getLogger (ServerConfigurationManager .class );
49
+ private final CachingConfigurationProvider configurationProvider ;
50
+ private ServerConfiguration thisServer ;
44
51
private final ServiceLocator serviceLocator ;
45
52
private final List <String > startUpArgs ;
46
53
private final ProductInfo productInfo ;
47
54
48
- private Configuration configuration ;
49
- private ServerConfiguration serverConfiguration ;
50
-
51
55
public ServerConfigurationManager (ConfigurationProvider configurationProvider ,
52
- ServiceLocator classLoader ,
53
- List <String > startUpArgs ) {
56
+ ServiceLocator classLoader ,
57
+ List <String > startUpArgs ) {
54
58
Objects .requireNonNull (configurationProvider );
55
59
Objects .requireNonNull (classLoader );
56
60
Objects .requireNonNull (startUpArgs );
57
61
58
- this .configurationProvider = configurationProvider ;
62
+ this .configurationProvider = new CachingConfigurationProvider ( configurationProvider ) ;
59
63
this .serviceLocator = classLoader ;
60
64
this .startUpArgs = startUpArgs ;
61
65
this .productInfo = generateProductInfo (serviceLocator );
@@ -70,18 +74,24 @@ public ProductInfo getProductInfo() {
70
74
}
71
75
72
76
public void initialize () throws ConfigurationException {
73
- this .configurationProvider .initialize (this .startUpArgs );
74
-
75
- this .configuration = configurationProvider .getConfiguration ();
76
- if (this .configuration == null ) {
77
- throw new ConfigurationException ("unable to determine server configuration" );
78
- }
77
+ Lock lock = this .configurationProvider .lockAndInitialize (this .startUpArgs );
79
78
80
- this .serverConfiguration = this .configuration .getServerConfiguration ();
81
- if (this .serverConfiguration == null ) {
82
- throw new ConfigurationException ("unable to determine server configuration" );
79
+ try {
80
+ Configuration configuration = configurationProvider .getConfiguration ();
81
+ if (configuration == null ) {
82
+ throw new ConfigurationException ("unable to determine server configuration" );
83
+ }
84
+
85
+ ServerConfiguration base = configuration .getServerConfiguration ();
86
+ if (base == null ) {
87
+ throw new ConfigurationException ("unable to determine server configuration" );
88
+ }
89
+ thisServer = new StableServerConfiguration (base );
90
+
91
+ processTcProperties (configuration .getTcProperties ());
92
+ } finally {
93
+ lock .unlock ();
83
94
}
84
- processTcProperties (configuration .getTcProperties ());
85
95
}
86
96
87
97
public void close () {
@@ -93,69 +103,165 @@ public String[] getProcessArguments() {
93
103
}
94
104
95
105
public ServerConfiguration getServerConfiguration () {
96
- return this . serverConfiguration ;
106
+ return thisServer ;
97
107
}
98
108
99
109
public GroupConfiguration getGroupConfiguration () {
100
- List <ServerConfiguration > serverConfigurationMap = configuration .getServerConfigurations ();
101
- return new GroupConfiguration (serverConfigurationMap , this . serverConfiguration .getName ());
110
+ List <ServerConfiguration > serverConfigurationMap = getConfiguration () .getServerConfigurations (). stream (). map ( StableServerConfiguration :: new ). collect ( Collectors . toList () );
111
+ return new GroupConfiguration (serverConfigurationMap , getServerConfiguration () .getName ());
102
112
}
103
-
113
+
104
114
public InputStream rawConfigFile () {
105
- String text = configuration .getRawConfiguration ();
115
+ String text = getConfiguration () .getRawConfiguration ();
106
116
return new ByteArrayInputStream (text .getBytes (StandardCharsets .UTF_8 ));
107
117
}
108
118
109
119
public String rawConfigString () {
110
- return configuration .getRawConfiguration ();
120
+ return getConfiguration () .getRawConfiguration ();
111
121
}
112
122
113
123
public String [] allCurrentlyKnownServers () {
114
124
return getGroupConfiguration ().getMembers ();
115
125
}
116
126
117
127
public boolean isPartialConfiguration () {
118
- return this . configuration .isPartialConfiguration ();
128
+ return getConfiguration () .isPartialConfiguration ();
119
129
}
120
130
121
131
public ServiceLocator getServiceLocator () {
122
132
return this .serviceLocator ;
123
133
}
124
134
125
135
public Configuration getConfiguration () {
126
- return configuration ;
136
+ return configurationProvider . getConfiguration () ;
127
137
}
128
138
129
139
public ConfigurationProvider getConfigurationProvider () {
130
- return configurationProvider ;
131
- }
132
-
133
- private Map <String , ServerConfiguration > getServerConfigurationMap (Collection <ServerConfiguration > servers ) {
134
- Map <String , ServerConfiguration > serverConfigurationMap = new HashMap <>();
135
- for (ServerConfiguration server : servers ) {
136
- if (server .getName () != null ) {
137
- serverConfigurationMap .put (server .getName (), server );
138
- }
139
- }
140
- return serverConfigurationMap ;
140
+ return configurationProvider .delegateProvider ;
141
141
}
142
142
143
143
private static void processTcProperties (Properties tcProperties ) {
144
144
Map <String , String > propMap = new HashMap <>();
145
145
146
146
if (tcProperties != null ) {
147
- tcProperties .forEach ((k , v )-> propMap .put (k .toString ().trim (), v .toString ().trim ()));
147
+ tcProperties .forEach ((k , v ) -> propMap .put (k .toString ().trim (), v .toString ().trim ()));
148
148
}
149
149
150
150
TCPropertiesImpl .getProperties ().overwriteTcPropertiesFromConfig (propMap );
151
151
}
152
152
153
153
@ Override
154
154
public Map <String , ?> getStateMap () {
155
- if (configuration instanceof PrettyPrintable ) {
156
- return ((PrettyPrintable )configuration ).getStateMap ();
155
+ Configuration config = getConfiguration ();
156
+ if (config instanceof PrettyPrintable ) {
157
+ return ((PrettyPrintable ) config ).getStateMap ();
157
158
} else {
158
159
return Collections .emptyMap ();
159
160
}
160
161
}
162
+
163
+ private static final class CachingConfigurationProvider implements ConfigurationProvider {
164
+
165
+ private final ConfigurationProvider delegateProvider ;
166
+ private final Lock lock = new ReentrantLock ();
167
+
168
+ public CachingConfigurationProvider (ConfigurationProvider delegateProvider ) {
169
+ this .delegateProvider = delegateProvider ;
170
+ }
171
+
172
+ Lock lockAndInitialize (List <String > configurationParams ) throws ConfigurationException {
173
+ lock .lock ();
174
+ initialize (configurationParams );
175
+ return lock ;
176
+ }
177
+
178
+ @ Override
179
+ public void initialize (List <String > configurationParams ) throws ConfigurationException {
180
+ delegateProvider .initialize (configurationParams );
181
+ }
182
+
183
+ @ Override
184
+ public Configuration getConfiguration () {
185
+ lock .lock ();
186
+ try {
187
+ return delegateProvider .getConfiguration ();
188
+ } finally {
189
+ lock .unlock ();
190
+ }
191
+ }
192
+
193
+ @ Override
194
+ public String getConfigurationParamsDescription () {
195
+ return delegateProvider .getConfigurationParamsDescription ();
196
+ }
197
+
198
+ @ Override
199
+ public void close () {
200
+ delegateProvider .close ();
201
+ }
202
+
203
+ @ Override
204
+ public byte [] getSyncData () {
205
+ return delegateProvider .getSyncData ();
206
+ }
207
+
208
+ @ Override
209
+ public void sync (byte [] syncData ) {
210
+ lock .lock ();
211
+ try {
212
+ delegateProvider .sync (syncData );
213
+ } finally {
214
+ lock .unlock ();
215
+ }
216
+ }
217
+ }
218
+
219
+ private static class StableServerConfiguration implements ServerConfiguration {
220
+
221
+ private final InetSocketAddress tsaPort ;
222
+ private final InetSocketAddress groupPort ;
223
+ private final String host ;
224
+ private final String name ;
225
+ private final int reconnectWindow ;
226
+ private final File logDir ;
227
+
228
+ public StableServerConfiguration (ServerConfiguration base ) {
229
+ tsaPort = base .getTsaPort ();
230
+ groupPort = base .getGroupPort ();
231
+ host = base .getHost ();
232
+ name = base .getName ();
233
+ reconnectWindow = base .getClientReconnectWindow ();
234
+ logDir = base .getLogsLocation ();
235
+ }
236
+
237
+ @ Override
238
+ public InetSocketAddress getTsaPort () {
239
+ return tsaPort ;
240
+ }
241
+
242
+ @ Override
243
+ public InetSocketAddress getGroupPort () {
244
+ return groupPort ;
245
+ }
246
+
247
+ @ Override
248
+ public String getHost () {
249
+ return host ;
250
+ }
251
+
252
+ @ Override
253
+ public String getName () {
254
+ return name ;
255
+ }
256
+
257
+ @ Override
258
+ public int getClientReconnectWindow () {
259
+ return reconnectWindow ;
260
+ }
261
+
262
+ @ Override
263
+ public File getLogsLocation () {
264
+ return logDir ;
265
+ }
266
+ }
161
267
}
0 commit comments