You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by sm...@apache.org on 2023/05/05 15:38:49 UTC
[knox] branch master updated: KNOX-2907 - PollingConfigurationAnalyzer ignores services without service model generator (#755)
This is an automated email from the ASF dual-hosted git repository.
smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 82d6d6039 KNOX-2907 - PollingConfigurationAnalyzer ignores services without service model generator (#755)
82d6d6039 is described below
commit 82d6d603933fd012ad692c7cce729f9b03db1208
Author: Sandor Molnar <sm...@apache.org>
AuthorDate: Fri May 5 17:38:43 2023 +0200
KNOX-2907 - PollingConfigurationAnalyzer ignores services without service model generator (#755)
---
.../cm/ClouderaManagerServiceDiscovery.java | 15 +------
.../ClouderaManagerServiceDiscoveryMessages.java | 4 +-
.../discovery/cm/ServiceModelGeneratorsHolder.java | 46 ++++++++++++++++++++++
.../cm/monitor/PollingConfigurationAnalyzer.java | 20 +++++++---
.../monitor/PollingConfigurationAnalyzerTest.java | 8 ++--
5 files changed, 69 insertions(+), 24 deletions(-)
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
index f25683b74..016b9467a 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
@@ -45,12 +45,9 @@ import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
-import java.util.Map;
-import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
@@ -78,15 +75,7 @@ public class ClouderaManagerServiceDiscovery implements ServiceDiscovery, Cluste
public static final String CM_SERVICE_TYPE = "CM";
public static final String CM_ROLE_TYPE = "CM_SERVER";
- private static Map<String, List<ServiceModelGenerator>> serviceModelGenerators = new HashMap<>();
- static {
- ServiceLoader<ServiceModelGenerator> loader = ServiceLoader.load(ServiceModelGenerator.class);
- for (ServiceModelGenerator serviceModelGenerator : loader) {
- List<ServiceModelGenerator> smgList =
- serviceModelGenerators.computeIfAbsent(serviceModelGenerator.getServiceType(), k -> new ArrayList<>());
- smgList.add(serviceModelGenerator);
- }
- }
+ private ServiceModelGeneratorsHolder serviceModelGeneratorsHolder = ServiceModelGeneratorsHolder.getInstance();
private boolean debug;
@@ -277,7 +266,7 @@ public class ClouderaManagerServiceDiscovery implements ServiceDiscovery, Cluste
serviceList.add(cmService);
for (ApiService service : serviceList) {
- final List<ServiceModelGenerator> modelGenerators = serviceModelGenerators.get(service.getType());
+ final List<ServiceModelGenerator> modelGenerators = serviceModelGeneratorsHolder.getServiceModelGenerators(service.getType());
if (shouldSkipServiceDiscovery(modelGenerators, includedServices)) {
//log.skipServiceDiscovery(service.getName(), service.getType());
//continue;
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
index cd4a1f2f3..06f6f7ff2 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryMessages.java
@@ -196,8 +196,8 @@ public interface ClouderaManagerServiceDiscoveryMessages {
@Message(level = MessageLevel.DEBUG, text = "There is no any activation event found within the given time period")
void noActivationEventFound();
- @Message(level = MessageLevel.DEBUG, text = "Activation event relevance: {0} = {1}")
- void activationEventRelevance(String eventId, String relevance);
+ @Message(level = MessageLevel.DEBUG, text = "Activation event relevance: {0} = {1} ({2} / {3} / {4} / {5})")
+ void activationEventRelevance(String eventId, String relevance, String command, String status, String serviceType, boolean serviceModelGeneratorExists);
@Message(level = MessageLevel.DEBUG, text = "Activation event - {0} - has already been processed, skipping ...")
void activationEventAlreadyProcessed(String eventId);
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java
new file mode 100644
index 000000000..315f80e88
--- /dev/null
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGeneratorsHolder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.knox.gateway.topology.discovery.cm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+public class ServiceModelGeneratorsHolder {
+
+ private static final ServiceModelGeneratorsHolder INSTANCE = new ServiceModelGeneratorsHolder();
+ private final Map<String, List<ServiceModelGenerator>> serviceModelGenerators = new HashMap<>();
+
+ private ServiceModelGeneratorsHolder() {
+ final ServiceLoader<ServiceModelGenerator> loader = ServiceLoader.load(ServiceModelGenerator.class);
+ for (ServiceModelGenerator serviceModelGenerator : loader) {
+ List<ServiceModelGenerator> smgList = serviceModelGenerators.computeIfAbsent(serviceModelGenerator.getServiceType(), k -> new ArrayList<>());
+ smgList.add(serviceModelGenerator);
+ }
+ }
+
+ public static ServiceModelGeneratorsHolder getInstance() {
+ return INSTANCE;
+ }
+
+ public List<ServiceModelGenerator> getServiceModelGenerators(String serviceType) {
+ return serviceModelGenerators.get(serviceType);
+ }
+
+}
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
index 121b764e5..1c0374d81 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzer.java
@@ -46,6 +46,7 @@ import org.apache.knox.gateway.topology.ClusterConfigurationMonitorService;
import org.apache.knox.gateway.topology.discovery.ServiceDiscoveryConfig;
import org.apache.knox.gateway.topology.discovery.cm.ClouderaManagerServiceDiscoveryMessages;
import org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient;
+import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGeneratorsHolder;
import org.apache.knox.gateway.topology.simple.SimpleDescriptor;
import org.apache.knox.gateway.topology.simple.SimpleDescriptorFactory;
@@ -141,6 +142,8 @@ public class PollingConfigurationAnalyzer implements Runnable {
// The amount of time before "now" to will check for start events the first time
private long eventQueryDefaultTimestampOffset = DEFAULT_EVENT_QUERY_DEFAULT_TIMESTAMP_OFFSET;
+ private ServiceModelGeneratorsHolder serviceModelGeneratorsHolder = ServiceModelGeneratorsHolder.getInstance();
+
private boolean isActive;
private final GatewayConfig gatewayConfig;
@@ -455,11 +458,18 @@ public class PollingConfigurationAnalyzer implements Runnable {
@SuppressWarnings("unchecked")
private boolean isRelevantEvent(ApiEvent event) {
final Map<String, Object> attributeMap = getAttributeMap(event.getAttributes());
- final String command =
- attributeMap.containsKey(COMMAND) ? ((List<String>) attributeMap.get(COMMAND)).get(0) : "";
- final String status =
- attributeMap.containsKey(COMMAND_STATUS) ? ((List<String>) attributeMap.get(COMMAND_STATUS)).get(0) : "";
- return (ACTIVATION_COMMANDS.contains(command) && SUCCEEDED_STATUS.equals(status));
+ final String command = getAttribute(attributeMap, COMMAND);
+ final String status = getAttribute(attributeMap, COMMAND_STATUS);
+ final String serviceType = getAttribute(attributeMap, StartEvent.ATTR_SERVICE_TYPE);
+ final boolean serviceModelGeneratorExists = serviceModelGeneratorsHolder.getServiceModelGenerators(serviceType) != null;
+ final boolean relevant = ACTIVATION_COMMANDS.contains(command) && SUCCEEDED_STATUS.equals(status) && serviceModelGeneratorExists;
+ log.activationEventRelevance(event.getId(), String.valueOf(relevant), command, status, serviceType, serviceModelGeneratorExists);
+ return relevant;
+ }
+
+ @SuppressWarnings("unchecked")
+ private String getAttribute( Map<String, Object> attributeMap, String attributeName) {
+ return attributeMap.containsKey(attributeName) ? ((List<String>) attributeMap.get(attributeName)).get(0) : "";
}
private Map<String, Object> getAttributeMap(List<ApiEventAttribute> attributes) {
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
index f2df7224d..33f5e8f93 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/monitor/PollingConfigurationAnalyzerTest.java
@@ -221,8 +221,8 @@ public class PollingConfigurationAnalyzerTest {
// Simulate a successful rolling cluster restart event
ApiEvent rollingRestartEvent = createApiEvent(clusterName,
- PollingConfigurationAnalyzer.CM_SERVICE_TYPE,
- PollingConfigurationAnalyzer.CM_SERVICE,
+ HiveOnTezServiceModelGenerator.SERVICE_TYPE,
+ HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.ROLLING_RESTART_COMMAND,
PollingConfigurationAnalyzer.SUCCEEDED_STATUS,
"EV_CLUSTER_ROLLING_RESTARTED");
@@ -241,7 +241,7 @@ public class PollingConfigurationAnalyzerTest {
final String clusterName = "Cluster 8";
// Simulate a successful restart waiting for staleness event
- final ApiEvent rollingRestartEvent = createApiEvent(clusterName, PollingConfigurationAnalyzer.CM_SERVICE_TYPE, PollingConfigurationAnalyzer.CM_SERVICE,
+ final ApiEvent rollingRestartEvent = createApiEvent(clusterName, HiveOnTezServiceModelGenerator.SERVICE_TYPE, HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.RESTART_WAITING_FOR_STALENESS_SUCCESS_COMMAND, PollingConfigurationAnalyzer.SUCCEEDED_STATUS, "EV_CLUSTER_RESTARTED");
final ChangeListener listener = doTestEvent(rollingRestartEvent, address, clusterName, Collections.emptyMap(), Collections.emptyMap());
@@ -254,7 +254,7 @@ public class PollingConfigurationAnalyzerTest {
final String clusterName = "Cluster 9";
// Simulate a successful restart waiting for staleness event with id = 123
- final ApiEvent rollingRestartEvent = createApiEvent(clusterName, PollingConfigurationAnalyzer.CM_SERVICE_TYPE, PollingConfigurationAnalyzer.CM_SERVICE,
+ final ApiEvent rollingRestartEvent = createApiEvent(clusterName, HiveOnTezServiceModelGenerator.SERVICE_TYPE, HiveOnTezServiceModelGenerator.SERVICE,
PollingConfigurationAnalyzer.RESTART_WAITING_FOR_STALENESS_SUCCESS_COMMAND, PollingConfigurationAnalyzer.SUCCEEDED_STATUS, "EV_CLUSTER_RESTARTED",
"123");