3030import com .tencent .polaris .configuration .api .core .ConfigFileMetadata ;
3131import com .tencent .polaris .configuration .client .util .ConfigFileUtils ;
3232
33+ import java .util .HashSet ;
34+ import java .util .Set ;
3335import java .util .concurrent .*;
3436import java .util .concurrent .atomic .AtomicLong ;
3537import 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