Skip to content

Commit 2e21f5d

Browse files
committed
feat:support config empty protection.
1 parent 97a6744 commit 2e21f5d

File tree

1 file changed

+32
-3
lines changed
  • polaris-configuration/polaris-configuration-client/src/main/java/com/tencent/polaris/configuration/client/internal

1 file changed

+32
-3
lines changed

polaris-configuration/polaris-configuration-client/src/main/java/com/tencent/polaris/configuration/client/internal/RemoteConfigFileRepo.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.tencent.polaris.configuration.api.core.ConfigFileMetadata;
3131
import com.tencent.polaris.configuration.client.util.ConfigFileUtils;
3232

33+
import java.util.HashSet;
34+
import java.util.Set;
3335
import java.util.concurrent.*;
3436
import java.util.concurrent.atomic.AtomicLong;
3537
import java.util.concurrent.atomic.AtomicReference;
@@ -46,6 +48,8 @@ public class RemoteConfigFileRepo extends AbstractConfigFileRepo {
4648

4749
private static ScheduledExecutorService pullExecutorService;
4850

51+
private static Set<String> configFileInitSet = new HashSet<>();
52+
4953
private final AtomicReference<ConfigFile> remoteConfigFile;
5054
//服务端通知的版本号,此版本号有可能落后于服务端
5155
private final AtomicLong notifiedVersion;
@@ -188,6 +192,7 @@ protected void doPull() {
188192
};
189193
if (shouldUpdateLocalCache && checkEmptyProtect(response)) {
190194
shouldUpdateLocalCache = false;
195+
fallbackIfNecessaryWhenStartingUp(pullConfigFileReq);
191196
submitEmptyProtectionExpireTask(runnable);
192197
}
193198
if (shouldUpdateLocalCache) {
@@ -214,6 +219,7 @@ protected void doPull() {
214219
}
215220
};
216221
if (checkEmptyProtect(response)) {
222+
fallbackIfNecessaryWhenStartingUp(pullConfigFileReq);
217223
submitEmptyProtectionExpireTask(runnable);
218224
} else {
219225
LOGGER.warn("[Config] config file not found, please check whether config file released. {}",
@@ -243,16 +249,39 @@ protected void doPull() {
243249
}
244250

245251
private void fallbackIfNecessary(final int retryTimes, ConfigFile configFileReq) {
246-
if (retryTimes >= PULL_CONFIG_RETRY_TIMES && fallbackToLocalCache) {
252+
if (retryTimes >= PULL_CONFIG_RETRY_TIMES) {
253+
LOGGER.info("[Config] failed to pull config file from remote.");
254+
//重试次数超过上限,从本地缓存拉取
255+
loadLocalCache(configFileReq);
256+
}
257+
}
258+
259+
private void fallbackIfNecessaryWhenStartingUp(ConfigFile configFileReq) {
260+
String identifier = getIdentifier();
261+
boolean initFlag = false;
262+
if (configFileInitSet.contains(identifier)) {
263+
initFlag = true;
264+
} else {
265+
configFileInitSet.add(identifier);
266+
}
267+
if (!initFlag) {
268+
// 第一次启动的时候,如果拉取到空配置,则尝试从缓存中获取
269+
LOGGER.info("[Config] load local cache because of empty config when starting up.");
270+
loadLocalCache(configFileReq);
271+
}
272+
}
273+
274+
private void loadLocalCache(ConfigFile configFileReq) {
275+
if (fallbackToLocalCache) {
247276
ConfigFile configFileRes = configFilePersistHandler.loadPersistedConfigFile(configFileReq);
248277
if (configFileRes != null) {
249-
LOGGER.info("[Config] failed to pull config file from remote,fallback to local cache success.{}.", configFileRes);
278+
LOGGER.info("[Config] load local cache success.{}.", configFileRes);
250279
remoteConfigFile.set(configFileRes);
251280
//配置有更新,触发回调
252281
fireChangeEvent(configFileRes);
253282
return;
254283
}
255-
LOGGER.info("[Config] failed to pull config file from remote,fallback to local cache fail.{}.", configFileReq);
284+
LOGGER.info("[Config] load local cache fail.{}.", configFileReq);
256285
}
257286
}
258287

0 commit comments

Comments
 (0)