You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/05/03 04:49:53 UTC
[shardingsphere] branch master updated: Add unit test for ClusterContextManagerCoordinator.triggerShowProcessList(final ShowProcessListTriggerEvent event) (#17279)
This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 02a6fe57c51 Add unit test for ClusterContextManagerCoordinator.triggerShowProcessList(final ShowProcessListTriggerEvent event) (#17279)
02a6fe57c51 is described below
commit 02a6fe57c51f6ed923b99543767a6af6cd6a916f
Author: iisheng <op...@gmail.com>
AuthorDate: Tue May 3 12:49:35 2022 +0800
Add unit test for ClusterContextManagerCoordinator.triggerShowProcessList(final ShowProcessListTriggerEvent event) (#17279)
---
.../ClusterContextManagerCoordinatorTest.java | 32 ++++-
.../cluster/coordinator/util/ReflectionUtil.java | 133 +++++++++++++++++++++
2 files changed, 164 insertions(+), 1 deletion(-)
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
index 703d4cdae6e..90b7f568b8f 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinatorTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.mode.manager.cluster.coordinator;
+import lombok.SneakyThrows;
import org.apache.shardingsphere.authority.config.AuthorityRuleConfiguration;
import org.apache.shardingsphere.authority.rule.AuthorityRule;
import org.apache.shardingsphere.infra.config.RuleConfiguration;
@@ -30,6 +31,9 @@ import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
+import org.apache.shardingsphere.infra.executor.sql.process.model.ExecuteProcessContext;
+import org.apache.shardingsphere.infra.executor.sql.process.model.yaml.BatchYamlExecuteProcessContext;
+import org.apache.shardingsphere.infra.executor.sql.process.model.yaml.YamlExecuteProcessContext;
import org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
@@ -48,6 +52,7 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
import org.apache.shardingsphere.infra.rule.identifier.type.StatusContainedRule;
import org.apache.shardingsphere.infra.state.StateType;
+import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
import org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder;
@@ -61,17 +66,22 @@ import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metad
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.ShowProcessListManager;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.lock.ShowProcessListSimpleLock;
+import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.node.ProcessNode;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.InstanceOfflineEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.InstanceOnlineEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.LabelsEvent;
+import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.ShowProcessListTriggerEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.ShowProcessListUnitCompleteEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.StateEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.WorkerIdEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.XaRecoveryIdEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.DisabledStateChangedEvent;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.event.PrimaryStateChangedEvent;
+import org.apache.shardingsphere.mode.manager.cluster.coordinator.util.ReflectionUtil;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.mode.metadata.persist.node.ComputeNode;
+import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositoryConfiguration;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
import org.apache.shardingsphere.test.mock.MockedDataSource;
@@ -137,7 +147,7 @@ public final class ClusterContextManagerCoordinatorTest {
contextManager.renewMetaDataContexts(new MetaDataContexts(contextManager.getMetaDataContexts().getMetaDataPersistService().get(), createMetaDataMap(), globalRuleMetaData,
mock(ExecutorEngine.class), createOptimizerContext(), new ConfigurationProperties(new Properties())));
contextManager.renewTransactionContexts(mock(TransactionContexts.class, RETURNS_DEEP_STUBS));
- coordinator = new ClusterContextManagerCoordinator(metaDataPersistService, contextManager, mock(RegistryCenter.class));
+ coordinator = new ClusterContextManagerCoordinator(metaDataPersistService, contextManager, new RegistryCenter(mock(ClusterPersistRepository.class)));
}
private Map<String, ShardingSphereMetaData> createMetaDataMap() {
@@ -359,6 +369,26 @@ public final class ClusterContextManagerCoordinatorTest {
ShowProcessListManager.getInstance().getLocks().remove(showProcessListId);
}
+ @Test
+ @SneakyThrows
+ public void assertTriggerShowProcessList() {
+ InstanceDefinition instanceDefinition = contextManager.getInstanceContext().getInstance().getInstanceDefinition();
+ String showProcessListId = "foo_process_id";
+ ShowProcessListTriggerEvent showProcessListTriggerEvent = new ShowProcessListTriggerEvent(instanceDefinition, showProcessListId);
+ ShowProcessListManager.getInstance().putProcessContext("foo_execution_id", new YamlExecuteProcessContext(mock(ExecuteProcessContext.class)));
+ coordinator.triggerShowProcessList(showProcessListTriggerEvent);
+ RegistryCenter registryCenter = ReflectionUtil.getFieldValue(coordinator, "registryCenter", RegistryCenter.class);
+ ClusterPersistRepository repository = registryCenter.getRepository();
+ Collection<YamlExecuteProcessContext> processContexts = ShowProcessListManager.getInstance().getAllProcessContext();
+ if (!processContexts.isEmpty()) {
+ verify(repository).persist(ProcessNode.getShowProcessListInstancePath(showProcessListId,
+ instanceDefinition.getInstanceType().name().toLowerCase() + "_" + instanceDefinition.getInstanceId().getId()),
+ YamlEngine.marshal(new BatchYamlExecuteProcessContext(new LinkedList<>(processContexts))));
+ }
+ verify(repository).delete(ComputeNode
+ .getProcessTriggerInstanceIdNodePath(instanceDefinition.getInstanceId().getId(), instanceDefinition.getInstanceType(), showProcessListId));
+ }
+
private void lockAndAwaitDefaultTime(final ShowProcessListSimpleLock lock) {
lock.lock();
try {
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/util/ReflectionUtil.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/util/ReflectionUtil.java
new file mode 100644
index 00000000000..a171e8b589a
--- /dev/null
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/util/ReflectionUtil.java
@@ -0,0 +1,133 @@
+/*
+ * 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.shardingsphere.mode.manager.cluster.coordinator.util;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * Reflection utils.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ReflectionUtil {
+
+ /**
+ * Set value into target object field.
+ *
+ * @param target target object
+ * @param fieldName field name
+ * @param value new value
+ * @throws NoSuchFieldException no such field exception
+ * @throws IllegalAccessException illegal access exception
+ */
+ public static void setFieldValue(final Object target, final String fieldName, final Object value) throws NoSuchFieldException, IllegalAccessException {
+ Field field = getField(target.getClass(), fieldName, true);
+ field.set(target, value);
+ }
+
+ /**
+ * Get field value from instance target object.
+ *
+ * @param target target object
+ * @param fieldName field name
+ * @param valueClass expected value class
+ * @param <T> expected value class
+ * @return target filed value
+ * @throws NoSuchFieldException no such field exception
+ * @throws IllegalAccessException illegal access exception
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T getFieldValue(final Object target, final String fieldName, final Class<T> valueClass) throws NoSuchFieldException, IllegalAccessException {
+ Field field = getField(target.getClass(), fieldName, true);
+ Object value = field.get(target);
+ if (null == value) {
+ return null;
+ }
+ if (valueClass.isAssignableFrom(value.getClass())) {
+ return (T) value;
+ }
+ throw new ClassCastException("field " + fieldName + " is " + value.getClass().getName() + " can cast to " + valueClass.getName());
+ }
+
+ /**
+ * Get static field value.
+ *
+ * @param targetClass target class
+ * @param fieldName field name
+ * @param valueClass expected value class
+ * @param <T> expected value class
+ * @return target filed value
+ * @throws NoSuchFieldException no such field exception
+ * @throws IllegalAccessException illegal access exception
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T getStaticFieldValue(final Class<?> targetClass, final String fieldName, final Class<T> valueClass) throws NoSuchFieldException, IllegalAccessException {
+ Field field = getField(targetClass, fieldName, true);
+ Object value = field.get(null);
+ if (null == value) {
+ return null;
+ }
+ if (valueClass.isAssignableFrom(value.getClass())) {
+ return (T) value;
+ }
+ throw new ClassCastException("field " + fieldName + " is " + value.getClass().getName() + " can cast to " + valueClass.getName());
+ }
+
+ /**
+ * Get field from class.
+ *
+ * @param targetClass target class
+ * @param fieldName field name
+ * @param isDeclared is declared
+ * @return {@link Field}
+ * @throws NoSuchFieldException no such field exception
+ */
+ public static Field getField(final Class<?> targetClass, final String fieldName, final boolean isDeclared) throws NoSuchFieldException {
+ Field result;
+ if (isDeclared) {
+ result = targetClass.getDeclaredField(fieldName);
+ } else {
+ result = targetClass.getField(fieldName);
+ }
+ result.setAccessible(true);
+ return result;
+ }
+
+ /**
+ * Invoke method.
+ *
+ * @param target target object
+ * @param methodName method name
+ * @param parameterTypes parameter types
+ * @param parameterValues parameter values
+ * @return invoke method result.
+ * @throws NoSuchMethodException no such field exception
+ * @throws InvocationTargetException invocation target exception
+ * @throws IllegalAccessException illegal access exception
+ */
+ public static Object invokeMethod(final Object target, final String methodName, final Class<?>[] parameterTypes,
+ final Object[] parameterValues) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ Method method = target.getClass().getDeclaredMethod(methodName, parameterTypes);
+ method.setAccessible(true);
+ return method.invoke(target, parameterValues);
+ }
+}