Commit 2f620e6f by 张乐 Committed by GitHub

Merge pull request #298 from nobodyiam/client-local-config

adjust local cache directory logic
parents 43db6322 51363619
...@@ -25,6 +25,8 @@ import java.io.IOException; ...@@ -25,6 +25,8 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties; import java.util.Properties;
/** /**
...@@ -55,15 +57,29 @@ public class LocalFileConfigRepository extends AbstractConfigRepository ...@@ -55,15 +57,29 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
Cat.logError(ex); Cat.logError(ex);
throw new ApolloConfigException("Unable to load component!", ex); throw new ApolloConfigException("Unable to load component!", ex);
} }
this.initialize(new File(ClassLoaderUtil.getClassPath() + CONFIG_DIR)); this.setLocalCacheDir(findLocalCacheDir());
} }
void initialize(File baseDir) { void setLocalCacheDir(File baseDir) {
m_baseDir = baseDir; m_baseDir = baseDir;
this.checkLocalConfigCacheDir(m_baseDir); this.checkLocalConfigCacheDir(m_baseDir);
this.trySync(); this.trySync();
} }
private File findLocalCacheDir() {
try {
String defaultCacheDir = m_configUtil.getDefaultLocalCacheDir();
Path path = Paths.get(defaultCacheDir);
if (Files.exists(path) && Files.isWritable(path)) {
return new File(defaultCacheDir, CONFIG_DIR);
}
} catch (Throwable ex) {
//ignore
}
return new File(ClassLoaderUtil.getClassPath(), CONFIG_DIR);
}
@Override @Override
public Properties getConfig() { public Properties getConfig() {
if (m_fileProperties == null) { if (m_fileProperties == null) {
...@@ -98,6 +114,13 @@ public class LocalFileConfigRepository extends AbstractConfigRepository ...@@ -98,6 +114,13 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
@Override @Override
protected void sync() { protected void sync() {
//sync with upstream immediately
boolean syncFromUpstreamResultSuccess = trySyncFromUpstream();
if (syncFromUpstreamResultSuccess) {
return;
}
Transaction transaction = Cat.newTransaction("Apollo.ConfigService", "syncLocalConfig"); Transaction transaction = Cat.newTransaction("Apollo.ConfigService", "syncLocalConfig");
Throwable exception = null; Throwable exception = null;
try { try {
...@@ -113,28 +136,27 @@ public class LocalFileConfigRepository extends AbstractConfigRepository ...@@ -113,28 +136,27 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
transaction.complete(); transaction.complete();
} }
//sync with fallback immediately
trySyncFromUpstream();
if (m_fileProperties == null) { if (m_fileProperties == null) {
throw new ApolloConfigException( throw new ApolloConfigException(
"Load config from local config failed!", exception); "Load config from local config failed!", exception);
} }
} }
private void trySyncFromUpstream() { private boolean trySyncFromUpstream() {
if (m_upstream == null) { if (m_upstream == null) {
return; return false;
} }
try { try {
Properties properties = m_upstream.getConfig(); Properties properties = m_upstream.getConfig();
updateFileProperties(properties); updateFileProperties(properties);
return true;
} catch (Throwable ex) { } catch (Throwable ex) {
Cat.logError(ex); Cat.logError(ex);
logger logger
.warn("Sync config from upstream repository {} failed, reason: {}", m_upstream.getClass(), .warn("Sync config from upstream repository {} failed, reason: {}", m_upstream.getClass(),
ExceptionUtil.getDetailMessage(ex)); ExceptionUtil.getDetailMessage(ex));
} }
return false;
} }
private synchronized void updateFileProperties(Properties newProperties) { private synchronized void updateFileProperties(Properties newProperties) {
......
...@@ -179,4 +179,9 @@ public class ConfigUtil { ...@@ -179,4 +179,9 @@ public class ConfigUtil {
public int getLongPollQPS() { public int getLongPollQPS() {
return longPollQPS; return longPollQPS;
} }
public String getDefaultLocalCacheDir() {
//TODO call Framework Foundation to get the default local cache dir
return String.format("/opt/data/%s", getAppId());
}
} }
...@@ -93,7 +93,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -93,7 +93,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
createLocalCachePropertyFile(someProperties); createLocalCachePropertyFile(someProperties);
LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace); LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir); localRepo.setLocalCacheDir(someBaseDir);
Properties properties = localRepo.getConfig(); Properties properties = localRepo.getConfig();
assertEquals(someValue, properties.getProperty(someKey)); assertEquals(someValue, properties.getProperty(someKey));
...@@ -109,7 +109,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -109,7 +109,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
Files.write(defaultKey + "=" + someValue, file, Charsets.UTF_8); Files.write(defaultKey + "=" + someValue, file, Charsets.UTF_8);
LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace); LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir); localRepo.setLocalCacheDir(someBaseDir);
//when fallback is set, it will try to sync from it //when fallback is set, it will try to sync from it
localRepo.setUpstreamRepository(fallbackRepo); localRepo.setUpstreamRepository(fallbackRepo);
...@@ -124,7 +124,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -124,7 +124,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository LocalFileConfigRepository
localFileConfigRepository = localFileConfigRepository =
new LocalFileConfigRepository(someNamespace); new LocalFileConfigRepository(someNamespace);
localFileConfigRepository.initialize(someBaseDir); localFileConfigRepository.setLocalCacheDir(someBaseDir);
localFileConfigRepository.setUpstreamRepository(fallbackRepo); localFileConfigRepository.setUpstreamRepository(fallbackRepo);
...@@ -139,7 +139,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -139,7 +139,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
public void testLoadConfigWithNoLocalFileMultipleTimes() throws Exception { public void testLoadConfigWithNoLocalFileMultipleTimes() throws Exception {
LocalFileConfigRepository localRepo = LocalFileConfigRepository localRepo =
new LocalFileConfigRepository(someNamespace); new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir); localRepo.setLocalCacheDir(someBaseDir);
localRepo.setUpstreamRepository(fallbackRepo); localRepo.setUpstreamRepository(fallbackRepo);
...@@ -148,7 +148,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -148,7 +148,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository LocalFileConfigRepository
anotherLocalRepoWithNoFallback = anotherLocalRepoWithNoFallback =
new LocalFileConfigRepository(someNamespace); new LocalFileConfigRepository(someNamespace);
anotherLocalRepoWithNoFallback.initialize(someBaseDir); anotherLocalRepoWithNoFallback.setLocalCacheDir(someBaseDir);
Properties anotherProperties = anotherLocalRepoWithNoFallback.getConfig(); Properties anotherProperties = anotherLocalRepoWithNoFallback.getConfig();
...@@ -164,7 +164,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase { ...@@ -164,7 +164,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository localFileConfigRepository = LocalFileConfigRepository localFileConfigRepository =
new LocalFileConfigRepository(someNamespace); new LocalFileConfigRepository(someNamespace);
localFileConfigRepository.initialize(someBaseDir); localFileConfigRepository.setLocalCacheDir(someBaseDir);
localFileConfigRepository.setUpstreamRepository(fallbackRepo); localFileConfigRepository.setUpstreamRepository(fallbackRepo);
localFileConfigRepository.addChangeListener(someListener); localFileConfigRepository.addChangeListener(someListener);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment