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;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
/**
......@@ -55,15 +57,29 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
Cat.logError(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;
this.checkLocalConfigCacheDir(m_baseDir);
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
public Properties getConfig() {
if (m_fileProperties == null) {
......@@ -98,6 +114,13 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
@Override
protected void sync() {
//sync with upstream immediately
boolean syncFromUpstreamResultSuccess = trySyncFromUpstream();
if (syncFromUpstreamResultSuccess) {
return;
}
Transaction transaction = Cat.newTransaction("Apollo.ConfigService", "syncLocalConfig");
Throwable exception = null;
try {
......@@ -113,28 +136,27 @@ public class LocalFileConfigRepository extends AbstractConfigRepository
transaction.complete();
}
//sync with fallback immediately
trySyncFromUpstream();
if (m_fileProperties == null) {
throw new ApolloConfigException(
"Load config from local config failed!", exception);
}
}
private void trySyncFromUpstream() {
private boolean trySyncFromUpstream() {
if (m_upstream == null) {
return;
return false;
}
try {
Properties properties = m_upstream.getConfig();
updateFileProperties(properties);
return true;
} catch (Throwable ex) {
Cat.logError(ex);
logger
.warn("Sync config from upstream repository {} failed, reason: {}", m_upstream.getClass(),
ExceptionUtil.getDetailMessage(ex));
}
return false;
}
private synchronized void updateFileProperties(Properties newProperties) {
......
......@@ -179,4 +179,9 @@ public class ConfigUtil {
public int getLongPollQPS() {
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 {
createLocalCachePropertyFile(someProperties);
LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir);
localRepo.setLocalCacheDir(someBaseDir);
Properties properties = localRepo.getConfig();
assertEquals(someValue, properties.getProperty(someKey));
......@@ -109,7 +109,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
Files.write(defaultKey + "=" + someValue, file, Charsets.UTF_8);
LocalFileConfigRepository localRepo = new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir);
localRepo.setLocalCacheDir(someBaseDir);
//when fallback is set, it will try to sync from it
localRepo.setUpstreamRepository(fallbackRepo);
......@@ -124,7 +124,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository
localFileConfigRepository =
new LocalFileConfigRepository(someNamespace);
localFileConfigRepository.initialize(someBaseDir);
localFileConfigRepository.setLocalCacheDir(someBaseDir);
localFileConfigRepository.setUpstreamRepository(fallbackRepo);
......@@ -139,7 +139,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
public void testLoadConfigWithNoLocalFileMultipleTimes() throws Exception {
LocalFileConfigRepository localRepo =
new LocalFileConfigRepository(someNamespace);
localRepo.initialize(someBaseDir);
localRepo.setLocalCacheDir(someBaseDir);
localRepo.setUpstreamRepository(fallbackRepo);
......@@ -148,7 +148,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository
anotherLocalRepoWithNoFallback =
new LocalFileConfigRepository(someNamespace);
anotherLocalRepoWithNoFallback.initialize(someBaseDir);
anotherLocalRepoWithNoFallback.setLocalCacheDir(someBaseDir);
Properties anotherProperties = anotherLocalRepoWithNoFallback.getConfig();
......@@ -164,7 +164,7 @@ public class LocalFileConfigRepositoryTest extends ComponentTestCase {
LocalFileConfigRepository localFileConfigRepository =
new LocalFileConfigRepository(someNamespace);
localFileConfigRepository.initialize(someBaseDir);
localFileConfigRepository.setLocalCacheDir(someBaseDir);
localFileConfigRepository.setUpstreamRepository(fallbackRepo);
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