This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 52c438b  Fix that the dynamic configuration is deleted on the server 
side but does not take effect on the agent. (#6255)
52c438b is described below

commit 52c438b9c3c6e998e912dbaa76ff0d598f202330
Author: zifeihan <[email protected]>
AuthorDate: Mon Jan 25 23:24:33 2021 +0800

    Fix that the dynamic configuration is deleted on the server side but does 
not take effect on the agent. (#6255)
    
    Co-authored-by: 吴晟 Wu Sheng <[email protected]>
---
 .../dynamic/ConfigurationDiscoveryService.java     | 34 +++++++++++++++++++++-
 .../discovery/AgentConfigurationsWatcher.java      | 24 +++++++++++++--
 2 files changed, 55 insertions(+), 3 deletions(-)

diff --git 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/ConfigurationDiscoveryService.java
 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/ConfigurationDiscoveryService.java
index 37df968..963d0b6 100644
--- 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/ConfigurationDiscoveryService.java
+++ 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/ConfigurationDiscoveryService.java
@@ -18,15 +18,18 @@
 
 package org.apache.skywalking.apm.agent.core.conf.dynamic;
 
+import com.google.common.collect.Lists;
 import io.grpc.Channel;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import lombok.Getter;
 import org.apache.skywalking.apm.agent.core.boot.BootService;
@@ -128,12 +131,13 @@ public class ConfigurationDiscoveryService implements 
BootService, GRPCChannelLi
      */
     public void 
handleConfigurationDiscoveryCommand(ConfigurationDiscoveryCommand 
configurationDiscoveryCommand) {
         final String responseUuid = configurationDiscoveryCommand.getUuid();
-        final List<KeyStringValuePair> config = 
configurationDiscoveryCommand.getConfig();
 
         if (responseUuid != null && Objects.equals(this.uuid, responseUuid)) {
             return;
         }
 
+        List<KeyStringValuePair> config = 
readConfig(configurationDiscoveryCommand);
+
         config.forEach(property -> {
             String propertyKey = property.getKey();
             WatcherHolder holder = register.get(propertyKey);
@@ -169,6 +173,30 @@ public class ConfigurationDiscoveryService implements 
BootService, GRPCChannelLi
     }
 
     /**
+     * Read the registered dynamic configuration, compare it with the dynamic 
configuration information returned by the
+     * service, and complete the dynamic configuration that has been deleted 
on the OAP.
+     *
+     * @param configurationDiscoveryCommand Describe dynamic configuration 
information
+     * @return Adapted dynamic configuration information
+     */
+    private List<KeyStringValuePair> readConfig(ConfigurationDiscoveryCommand 
configurationDiscoveryCommand) {
+        Map<String, KeyStringValuePair> commandConfigs = 
configurationDiscoveryCommand.getConfig()
+                                                                               
       .stream()
+                                                                               
       .collect(Collectors.toMap(
+                                                                               
           KeyStringValuePair::getKey,
+                                                                               
           Function.identity()
+                                                                               
       ));
+        List<KeyStringValuePair> configList = Lists.newArrayList();
+        for (final String name : register.keys()) {
+            KeyStringValuePair command = commandConfigs.getOrDefault(name, 
KeyStringValuePair.newBuilder()
+                                                                               
              .setKey(name)
+                                                                               
              .build());
+            configList.add(command);
+        }
+        return configList;
+    }
+
+    /**
      * get agent dynamic config through gRPC.
      */
     private void getAgentDynamicConfig() {
@@ -213,6 +241,10 @@ public class ConfigurationDiscoveryService implements 
BootService, GRPCChannelLi
             return register.get(name);
         }
 
+        public Set<String> keys() {
+            return register.keySet();
+        }
+
         @Override
         public String toString() {
             ArrayList<String> registerTableDescription = new 
ArrayList<>(register.size());
diff --git 
a/oap-server/server-receiver-plugin/configuration-discovery-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/recevier/configuration/discovery/AgentConfigurationsWatcher.java
 
b/oap-server/server-receiver-plugin/configuration-discovery-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/recevier/configuration/discovery/AgentConfigurationsWatcher.java
index a7d95e9..a84bd54 100644
--- 
a/oap-server/server-receiver-plugin/configuration-discovery-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/recevier/configuration/discovery/AgentConfigurationsWatcher.java
+++ 
b/oap-server/server-receiver-plugin/configuration-discovery-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/recevier/configuration/discovery/AgentConfigurationsWatcher.java
@@ -18,22 +18,29 @@
 
 package org.apache.skywalking.oap.server.recevier.configuration.discovery;
 
-import java.io.StringReader;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.library.module.ModuleProvider;
 
+import java.io.StringReader;
+import java.util.HashMap;
+
 /**
  * AgentConfigurationsWatcher used to handle dynamic configuration changes.
  */
 public class AgentConfigurationsWatcher extends ConfigChangeWatcher {
     private volatile String settingsString;
     private volatile AgentConfigurationsTable agentConfigurationsTable;
+    private final AgentConfigurations emptyAgentConfigurations;
 
     public AgentConfigurationsWatcher(ModuleProvider provider) {
         super(ConfigurationDiscoveryModule.NAME, provider, 
"agentConfigurations");
         this.settingsString = Const.EMPTY_STRING;
         this.agentConfigurationsTable = new AgentConfigurationsTable();
+        this.emptyAgentConfigurations = new AgentConfigurations(
+            null, new HashMap<>(), DigestUtils.sha512Hex("EMPTY")
+        );
     }
 
     @Override
@@ -54,7 +61,20 @@ public class AgentConfigurationsWatcher extends 
ConfigChangeWatcher {
         return settingsString;
     }
 
+    /**
+     * Get service dynamic configuration information, if there is no dynamic 
configuration information, return to empty
+     * dynamic configuration to prevent the server from deleted the dynamic 
configuration, but it does not take effect
+     * on the agent side.
+     *
+     * @param service Service name to be queried
+     * @return Service dynamic configuration information
+     */
     public AgentConfigurations getAgentConfigurations(String service) {
-        return 
agentConfigurationsTable.getAgentConfigurationsCache().get(service);
+        AgentConfigurations agentConfigurations = 
agentConfigurationsTable.getAgentConfigurationsCache().get(service);
+        if (null == agentConfigurations) {
+            return emptyAgentConfigurations;
+        } else {
+            return agentConfigurations;
+        }
     }
 }

Reply via email to