Skip to content

Commit 5f8c103

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

File tree

1 file changed

+147
-41
lines changed

1 file changed

+147
-41
lines changed

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

Lines changed: 147 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,39 @@
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;
4451
private final ServiceLocator serviceLocator;
4552
private final List<String> startUpArgs;
4653
private final ProductInfo productInfo;
4754

48-
private Configuration configuration;
49-
private ServerConfiguration serverConfiguration;
50-
5155
public ServerConfigurationManager(ConfigurationProvider configurationProvider,
52-
ServiceLocator classLoader,
53-
List<String> startUpArgs) {
56+
ServiceLocator classLoader,
57+
List<String> startUpArgs) {
5458
Objects.requireNonNull(configurationProvider);
5559
Objects.requireNonNull(classLoader);
5660
Objects.requireNonNull(startUpArgs);
5761

58-
this.configurationProvider = configurationProvider;
62+
this.configurationProvider = new CachingConfigurationProvider(configurationProvider);
5963
this.serviceLocator = classLoader;
6064
this.startUpArgs = startUpArgs;
6165
this.productInfo = generateProductInfo(serviceLocator);
@@ -70,18 +74,24 @@ public ProductInfo getProductInfo() {
7074
}
7175

7276
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);
7978

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();
8394
}
84-
processTcProperties(configuration.getTcProperties());
8595
}
8696

8797
public void close() {
@@ -93,69 +103,165 @@ public String[] getProcessArguments() {
93103
}
94104

95105
public ServerConfiguration getServerConfiguration() {
96-
return this.serverConfiguration;
106+
return thisServer;
97107
}
98108

99109
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());
102112
}
103-
113+
104114
public InputStream rawConfigFile() {
105-
String text = configuration.getRawConfiguration();
115+
String text = getConfiguration().getRawConfiguration();
106116
return new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8));
107117
}
108118

109119
public String rawConfigString() {
110-
return configuration.getRawConfiguration();
120+
return getConfiguration().getRawConfiguration();
111121
}
112122

113123
public String[] allCurrentlyKnownServers() {
114124
return getGroupConfiguration().getMembers();
115125
}
116126

117127
public boolean isPartialConfiguration() {
118-
return this.configuration.isPartialConfiguration();
128+
return getConfiguration().isPartialConfiguration();
119129
}
120130

121131
public ServiceLocator getServiceLocator() {
122132
return this.serviceLocator;
123133
}
124134

125135
public Configuration getConfiguration() {
126-
return configuration;
136+
return configurationProvider.getConfiguration();
127137
}
128138

129139
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;
141141
}
142142

143143
private static void processTcProperties(Properties tcProperties) {
144144
Map<String, String> propMap = new HashMap<>();
145145

146146
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()));
148148
}
149149

150150
TCPropertiesImpl.getProperties().overwriteTcPropertiesFromConfig(propMap);
151151
}
152152

153153
@Override
154154
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();
157158
} else {
158159
return Collections.emptyMap();
159160
}
160161
}
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+
}
161267
}

0 commit comments

Comments
 (0)