Skip to content

Commit 7edafd8

Browse files
author
Myron Scott
committed
Simplify and synchronized the way config is updated or checked
1 parent 0786582 commit 7edafd8

File tree

1 file changed

+150
-41
lines changed

1 file changed

+150
-41
lines changed

tc-server/src/main/java/com/tc/config/ServerConfigurationManager.java

Lines changed: 150 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
*/
1818
package com.tc.config;
1919

20-
2120
import com.tc.classloader.ServiceLocator;
2221
import com.tc.productinfo.ProductInfo;
2322
import com.tc.properties.TCPropertiesImpl;
@@ -28,34 +27,40 @@
2827
import java.io.ByteArrayInputStream;
2928
import java.io.InputStream;
3029
import java.nio.charset.StandardCharsets;
31-
import java.util.Collection;
3230
import java.util.Collections;
3331
import java.util.HashMap;
3432
import java.util.Map;
3533
import java.util.Objects;
3634
import java.util.Properties;
3735
import org.terracotta.configuration.ConfigurationException;
3836
import com.tc.text.PrettyPrintable;
37+
import java.io.File;
38+
import java.net.InetSocketAddress;
3939
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;
4045

4146
public class ServerConfigurationManager implements PrettyPrintable {
4247

43-
private final ConfigurationProvider configurationProvider;
48+
private final Logger LOGGER = LoggerFactory.getLogger(ServerConfigurationManager.class);
49+
private final CachingConfigurationProvider configurationProvider;
50+
private ServerConfiguration thisServer;
51+
private GroupConfiguration groupConfig;
4452
private final ServiceLocator serviceLocator;
4553
private final List<String> startUpArgs;
4654
private final ProductInfo productInfo;
4755

48-
private Configuration configuration;
49-
private ServerConfiguration serverConfiguration;
50-
5156
public ServerConfigurationManager(ConfigurationProvider configurationProvider,
52-
ServiceLocator classLoader,
53-
List<String> startUpArgs) {
57+
ServiceLocator classLoader,
58+
List<String> startUpArgs) {
5459
Objects.requireNonNull(configurationProvider);
5560
Objects.requireNonNull(classLoader);
5661
Objects.requireNonNull(startUpArgs);
5762

58-
this.configurationProvider = configurationProvider;
63+
this.configurationProvider = new CachingConfigurationProvider(configurationProvider);
5964
this.serviceLocator = classLoader;
6065
this.startUpArgs = startUpArgs;
6166
this.productInfo = generateProductInfo(serviceLocator);
@@ -70,18 +75,27 @@ public ProductInfo getProductInfo() {
7075
}
7176

7277
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-
}
78+
Lock lock = this.configurationProvider.lockAndInitialize(this.startUpArgs);
79+
80+
try {
81+
Configuration configuration = configurationProvider.getConfiguration();
82+
if (configuration == null) {
83+
throw new ConfigurationException("unable to determine server configuration");
84+
}
85+
86+
ServerConfiguration base = configuration.getServerConfiguration();
87+
if (base == null) {
88+
throw new ConfigurationException("unable to determine server configuration");
89+
}
90+
thisServer = new StableServerConfiguration(base);
91+
92+
List<ServerConfiguration> serverConfigurationMap = getConfiguration().getServerConfigurations().stream().map(StableServerConfiguration::new).collect(Collectors.toList());
93+
groupConfig = new GroupConfiguration(serverConfigurationMap, getServerConfiguration().getName());
7994

80-
this.serverConfiguration = this.configuration.getServerConfiguration();
81-
if (this.serverConfiguration == null) {
82-
throw new ConfigurationException("unable to determine server configuration");
95+
processTcProperties(configuration.getTcProperties());
96+
} finally {
97+
lock.unlock();
8398
}
84-
processTcProperties(configuration.getTcProperties());
8599
}
86100

87101
public void close() {
@@ -93,69 +107,164 @@ public String[] getProcessArguments() {
93107
}
94108

95109
public ServerConfiguration getServerConfiguration() {
96-
return this.serverConfiguration;
110+
return thisServer;
97111
}
98112

99113
public GroupConfiguration getGroupConfiguration() {
100-
List<ServerConfiguration> serverConfigurationMap = configuration.getServerConfigurations();
101-
return new GroupConfiguration(serverConfigurationMap, this.serverConfiguration.getName());
114+
return groupConfig;
102115
}
103-
116+
104117
public InputStream rawConfigFile() {
105-
String text = configuration.getRawConfiguration();
118+
String text = getConfiguration().getRawConfiguration();
106119
return new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
107120
}
108121

109122
public String rawConfigString() {
110-
return configuration.getRawConfiguration();
123+
return getConfiguration().getRawConfiguration();
111124
}
112125

113126
public String[] allCurrentlyKnownServers() {
114127
return getGroupConfiguration().getMembers();
115128
}
116129

117130
public boolean isPartialConfiguration() {
118-
return this.configuration.isPartialConfiguration();
131+
return getConfiguration().isPartialConfiguration();
119132
}
120133

121134
public ServiceLocator getServiceLocator() {
122135
return this.serviceLocator;
123136
}
124137

125138
public Configuration getConfiguration() {
126-
return configuration;
139+
return configurationProvider.getConfiguration();
127140
}
128141

129142
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;
143+
return configurationProvider.delegateProvider;
141144
}
142145

143146
private static void processTcProperties(Properties tcProperties) {
144147
Map<String, String> propMap = new HashMap<>();
145148

146149
if (tcProperties != null) {
147-
tcProperties.forEach((k, v)->propMap.put(k.toString().trim(), v.toString().trim()));
150+
tcProperties.forEach((k, v) -> propMap.put(k.toString().trim(), v.toString().trim()));
148151
}
149152

150153
TCPropertiesImpl.getProperties().overwriteTcPropertiesFromConfig(propMap);
151154
}
152155

153156
@Override
154157
public Map<String, ?> getStateMap() {
155-
if (configuration instanceof PrettyPrintable) {
156-
return ((PrettyPrintable)configuration).getStateMap();
158+
Configuration config = getConfiguration();
159+
if (config instanceof PrettyPrintable) {
160+
return ((PrettyPrintable) config).getStateMap();
157161
} else {
158162
return Collections.emptyMap();
159163
}
160164
}
165+
166+
private static final class CachingConfigurationProvider implements ConfigurationProvider {
167+
168+
private final ConfigurationProvider delegateProvider;
169+
private final Lock lock = new ReentrantLock();
170+
171+
public CachingConfigurationProvider(ConfigurationProvider delegateProvider) {
172+
this.delegateProvider = delegateProvider;
173+
}
174+
175+
Lock lockAndInitialize(List<String> configurationParams) throws ConfigurationException {
176+
lock.lock();
177+
initialize(configurationParams);
178+
return lock;
179+
}
180+
181+
@Override
182+
public void initialize(List<String> configurationParams) throws ConfigurationException {
183+
delegateProvider.initialize(configurationParams);
184+
}
185+
186+
@Override
187+
public Configuration getConfiguration() {
188+
lock.lock();
189+
try {
190+
return delegateProvider.getConfiguration();
191+
} finally {
192+
lock.unlock();
193+
}
194+
}
195+
196+
@Override
197+
public String getConfigurationParamsDescription() {
198+
return delegateProvider.getConfigurationParamsDescription();
199+
}
200+
201+
@Override
202+
public void close() {
203+
delegateProvider.close();
204+
}
205+
206+
@Override
207+
public byte[] getSyncData() {
208+
return delegateProvider.getSyncData();
209+
}
210+
211+
@Override
212+
public void sync(byte[] syncData) {
213+
lock.lock();
214+
try {
215+
delegateProvider.sync(syncData);
216+
} finally {
217+
lock.unlock();
218+
}
219+
}
220+
}
221+
222+
private static class StableServerConfiguration implements ServerConfiguration {
223+
224+
private final InetSocketAddress tsaPort;
225+
private final InetSocketAddress groupPort;
226+
private final String host;
227+
private final String name;
228+
private final int reconnectWindow;
229+
private final File logDir;
230+
231+
public StableServerConfiguration(ServerConfiguration base) {
232+
tsaPort = base.getTsaPort();
233+
groupPort = base.getGroupPort();
234+
host = base.getHost();
235+
name = base.getName();
236+
reconnectWindow = base.getClientReconnectWindow();
237+
logDir = base.getLogsLocation();
238+
}
239+
240+
@Override
241+
public InetSocketAddress getTsaPort() {
242+
return tsaPort;
243+
}
244+
245+
@Override
246+
public InetSocketAddress getGroupPort() {
247+
return groupPort;
248+
}
249+
250+
@Override
251+
public String getHost() {
252+
return host;
253+
}
254+
255+
@Override
256+
public String getName() {
257+
return name;
258+
}
259+
260+
@Override
261+
public int getClientReconnectWindow() {
262+
return reconnectWindow;
263+
}
264+
265+
@Override
266+
public File getLogsLocation() {
267+
return logDir;
268+
}
269+
}
161270
}

0 commit comments

Comments
 (0)