You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by av...@apache.org on 2021/04/07 08:31:57 UTC

[ignite] branch ignite-ducktape updated: IGNITE-14483 Ignite_app and ignite clean_up (#8975)

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

av pushed a commit to branch ignite-ducktape
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/ignite-ducktape by this push:
     new 0d84263  IGNITE-14483 Ignite_app and ignite clean_up (#8975)
0d84263 is described below

commit 0d84263007828ca1ba70bd6aa1c3a921e42061ce
Author: Anton Vinogradov <av...@apache.org>
AuthorDate: Wed Apr 7 11:31:35 2021 +0300

    IGNITE-14483 Ignite_app and ignite clean_up (#8975)
---
 .gitignore                                         |  1 +
 .../ducktests/tests/ignitetest/services/ignite.py  | 48 +---------------------
 .../tests/ignitetest/services/ignite_app.py        | 19 ++-------
 .../ducktests/tests/ignitetest/services/spark.py   |  2 +-
 .../ignitetest/services/utils/ignite_aware.py      | 45 ++++++++++++++++----
 .../tests/ignitetest/services/utils/ignite_spec.py | 12 +++---
 .../tests/ignitetest/tests/discovery_test.py       | 10 +++--
 .../tests/ignitetest/tests/rebalance/__init__.py   |  9 ++--
 8 files changed, 60 insertions(+), 86 deletions(-)

diff --git a/.gitignore b/.gitignore
index 804707e..dca4d45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -95,3 +95,4 @@ packages
 modules/ducktests/tests/docker/build/**
 modules/ducktests/tests/.tox
 modules/ducktests/tests/certs/*
+modules/ducktests/tests/ignitetest.egg-info/**
diff --git a/modules/ducktests/tests/ignitetest/services/ignite.py b/modules/ducktests/tests/ignitetest/services/ignite.py
index f4da888..659739c 100644
--- a/modules/ducktests/tests/ignitetest/services/ignite.py
+++ b/modules/ducktests/tests/ignitetest/services/ignite.py
@@ -17,10 +17,6 @@
 This module contains class to start ignite cluster node.
 """
 
-import signal
-
-from ducktape.cluster.remoteaccount import RemoteCommandError
-
 from ignitetest.services.utils.ignite_aware import IgniteAwareService
 
 
@@ -33,45 +29,5 @@ class IgniteService(IgniteAwareService):
     # pylint: disable=R0913
     def __init__(self, context, config, num_nodes, jvm_opts=None, full_jvm_opts=None, startup_timeout_sec=60,
                  shutdown_timeout_sec=10, modules=None):
-        super().__init__(context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, modules=modules,
-                         jvm_opts=jvm_opts, full_jvm_opts=full_jvm_opts)
-
-    def thread_dump(self, node):
-        """
-        Generate thread dump on node.
-        :param node: Ignite service node.
-        """
-        for pid in self.pids(node):
-            try:
-                node.account.signal(pid, signal.SIGQUIT, allow_fail=True)
-            except RemoteCommandError:
-                self.logger.warn("Could not dump threads on node")
-
-    def pids(self, node):
-        try:
-            cmd = "jcmd | grep -e %s | awk '{print $1}'" % self.APP_SERVICE_CLASS
-            pid_arr = list(node.account.ssh_capture(cmd, allow_fail=True, callback=int))
-            return pid_arr
-        except (RemoteCommandError, ValueError):
-            return []
-
-
-def node_failed_event_pattern(failed_node_id=None):
-    """Failed node pattern in log."""
-    return "Node FAILED: .\\{1,\\}Node \\[id=" + (failed_node_id if failed_node_id else "") + \
-           ".\\{1,\\}\\(isClient\\|client\\)=false"
-
-
-def get_event_time(service, log_node, log_pattern, from_the_beginning=True, timeout=15):
-    """
-    Extracts event time from ignite log by pattern .
-    :param service: ducktape service (ignite service) responsible to search log.
-    :param log_node: ducktape node to search ignite log on.
-    :param log_pattern: pattern to search ignite log for.
-    :param from_the_beginning: switches searching log from its beginning.
-    :param timeout: timeout to wait for the patters in the log.
-    """
-    service.await_event_on_node(log_pattern, log_node, timeout, from_the_beginning=from_the_beginning,
-                                backoff_sec=0.3)
-
-    return IgniteAwareService.event_time(log_pattern, log_node)
+        super().__init__(context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, self.APP_SERVICE_CLASS,
+                         modules=modules, jvm_opts=jvm_opts, full_jvm_opts=full_jvm_opts)
diff --git a/modules/ducktests/tests/ignitetest/services/ignite_app.py b/modules/ducktests/tests/ignitetest/services/ignite_app.py
index 689ce53..e3c4885 100644
--- a/modules/ducktests/tests/ignitetest/services/ignite_app.py
+++ b/modules/ducktests/tests/ignitetest/services/ignite_app.py
@@ -37,13 +37,12 @@ class IgniteApplicationService(IgniteAwareService):
 
     # pylint: disable=R0913
     def __init__(self, context, config, java_class_name, num_nodes=1, params="", startup_timeout_sec=60,
-                 shutdown_timeout_sec=10, modules=None, servicejava_class_name=SERVICE_JAVA_CLASS_NAME, jvm_opts=None,
+                 shutdown_timeout_sec=10, modules=None, main_java_class=SERVICE_JAVA_CLASS_NAME, jvm_opts=None,
                  full_jvm_opts=None, start_ignite=True):
-        super().__init__(context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, modules=modules,
-                         servicejava_class_name=servicejava_class_name, java_class_name=java_class_name, params=params,
+        super().__init__(context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, main_java_class,
+                         modules=modules, java_class_name=java_class_name, params=params,
                          jvm_opts=jvm_opts, full_jvm_opts=full_jvm_opts, start_ignite=start_ignite)
 
-        self.servicejava_class_name = servicejava_class_name
         self.java_class_name = java_class_name
         self.params = params
 
@@ -87,18 +86,6 @@ class IgniteApplicationService(IgniteAwareService):
         """
         return self.get_event_time(self.APP_FINISH_EVT_MSG, selector=selector)
 
-    def clean_node(self, node, **kwargs):
-        if self.alive(node):
-            self.logger.warn("%s %s was still alive at cleanup time. Killing forcefully..." %
-                             (self.__class__.__name__, node.account))
-
-        node.account.kill_java_processes(self.servicejava_class_name, clean_shutdown=False, allow_fail=True)
-
-        node.account.ssh("rm -rf -- %s" % self.persistent_root, allow_fail=False)
-
-    def pids(self, node):
-        return node.account.java_pids(self.servicejava_class_name)
-
     def extract_result(self, name):
         """
         :param name: Result parameter's name.
diff --git a/modules/ducktests/tests/ignitetest/services/spark.py b/modules/ducktests/tests/ignitetest/services/spark.py
index af0c09b..83cfdfb 100644
--- a/modules/ducktests/tests/ignitetest/services/spark.py
+++ b/modules/ducktests/tests/ignitetest/services/spark.py
@@ -115,7 +115,7 @@ class SparkService(DucktestsService, PathAware):
         timeout_sec = 30
         with monitor_log(node, log_file) as monitor:
             node.account.ssh(cmd)
-            monitor.wait_until(log_msg, timeout_sec=timeout_sec, backoff_sec=5,
+            monitor.wait_until(log_msg, timeout_sec=timeout_sec, backoff_sec=.1,
                                err_msg="Spark doesn't start at %d seconds" % timeout_sec)
 
         if len(self.pids(node)) == 0:
diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
index 24c22d2..a2089df 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_aware.py
@@ -22,11 +22,12 @@ import signal
 import socket
 import sys
 import time
-from abc import abstractmethod, ABCMeta
+from abc import ABCMeta
 from datetime import datetime
 from enum import IntEnum
 from threading import Thread
 
+from ducktape.cluster.remoteaccount import RemoteCommandError
 from ducktape.utils.util import wait_until
 
 from ignitetest.services.utils.background_thread import BackgroundThreadService
@@ -56,7 +57,8 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
         ALL = 2
 
     # pylint: disable=R0913
-    def __init__(self, context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, **kwargs):
+    def __init__(self, context, config, num_nodes, startup_timeout_sec, shutdown_timeout_sec, main_java_class,
+                 **kwargs):
         """
         **kwargs are params that passed to IgniteSpec
         """
@@ -67,10 +69,11 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
         self.log_level = "DEBUG"
 
         self.config = config
+        self.main_java_class = main_java_class
         self.startup_timeout_sec = startup_timeout_sec
         self.shutdown_timeout_sec = shutdown_timeout_sec
 
-        self.spec = resolve_spec(self, context, config, **kwargs)
+        self.spec = resolve_spec(self, context, config, main_java_class, **kwargs)
         self.init_logs_attribute()
 
         self.disconnected_nodes = []
@@ -208,13 +211,12 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
 
         return node_config
 
-    @abstractmethod
     def pids(self, node):
         """
         :param node: Ignite service node.
         :return: List of service's pids.
         """
-        raise NotImplementedError
+        return node.account.java_pids(self.main_java_class)
 
     # pylint: disable=W0613
     def worker(self, idx, node, **kwargs):
@@ -232,7 +234,7 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
         return len(self.pids(node)) > 0
 
     @staticmethod
-    def await_event_on_node(evt_message, node, timeout_sec, from_the_beginning=False, backoff_sec=5):
+    def await_event_on_node(evt_message, node, timeout_sec, from_the_beginning=False, backoff_sec=.1):
         """
         Await for specific event message in a node's log file.
         :param evt_message: Event message.
@@ -247,7 +249,7 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
                                err_msg="Event [%s] was not triggered on '%s' in %d seconds" % (evt_message, node.name,
                                                                                                timeout_sec))
 
-    def await_event(self, evt_message, timeout_sec, from_the_beginning=False, backoff_sec=5):
+    def await_event(self, evt_message, timeout_sec, from_the_beginning=False, backoff_sec=.1):
         """
         Await for specific event messages on all nodes.
         :param evt_message: Event message.
@@ -274,6 +276,18 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
 
         return datetime.strptime(match.group(), "[%Y-%m-%d %H:%M:%S,%f]") if match else None
 
+    def get_event_time_on_node(self, node, log_pattern, from_the_beginning=True, timeout=15):
+        """
+        Extracts event time from ignite log by pattern .
+        :param node: ducktape node to search ignite log on.
+        :param log_pattern: pattern to search ignite log for.
+        :param from_the_beginning: switches searching log from its beginning.
+        :param timeout: timeout to wait for the patters in the log.
+        """
+        self.await_event_on_node(log_pattern, node, timeout, from_the_beginning=from_the_beginning, backoff_sec=0)
+
+        return self.event_time(log_pattern, node)
+
     def get_event_time(self, evt_message, selector=max):
         """
         Gets the time of the specific event from all nodes, using selector.
@@ -481,6 +495,17 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
 
         return out
 
+    def thread_dump(self, node):
+        """
+        Generate thread dump on node.
+        :param node: Ignite service node.
+        """
+        for pid in self.pids(node):
+            try:
+                node.account.signal(pid, signal.SIGQUIT, allow_fail=True)
+            except RemoteCommandError:
+                self.logger.warn("Could not dump threads on node")
+
     @staticmethod
     def node_id(node):
         """
@@ -504,3 +529,9 @@ class IgniteAwareService(BackgroundThreadService, IgnitePathAware, metaclass=ABC
 
             node.account.ssh(f'rm -rf {self.database_dir}', allow_fail=False)
             node.account.ssh(f'cp -r {snapshot_db} {self.work_dir}', allow_fail=False)
+
+
+def node_failed_event_pattern(failed_node_id=None):
+    """Failed node pattern in log."""
+    return "Node FAILED: .\\{1,\\}Node \\[id=" + (failed_node_id if failed_node_id else "") + \
+           ".\\{1,\\}\\(isClient\\|client\\)=false"
diff --git a/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py b/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
index c03de9e..35c28a3 100644
--- a/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
+++ b/modules/ducktests/tests/ignitetest/services/utils/ignite_spec.py
@@ -24,12 +24,12 @@ import os
 from abc import ABCMeta, abstractmethod
 
 from ignitetest.services.utils.config_template import IgniteClientConfigTemplate, IgniteServerConfigTemplate
+from ignitetest.services.utils.jvm_utils import create_jvm_settings, merge_jvm_settings
 from ignitetest.services.utils.path import get_home_dir, get_module_path
 from ignitetest.utils.version import DEV_BRANCH
-from ignitetest.services.utils.jvm_utils import create_jvm_settings, merge_jvm_settings
 
 
-def resolve_spec(service, context, config, **kwargs):
+def resolve_spec(service, context, config, main_java_class, **kwargs):
     """
     Resolve Spec classes for IgniteService and IgniteApplicationService
     """
@@ -51,8 +51,8 @@ def resolve_spec(service, context, config, **kwargs):
                                                                **kwargs)
 
     if is_impl("IgniteApplicationService"):
-        return _resolve_spec("AppSpec", ApacheIgniteApplicationSpec)(path_aware=service, context=context,
-                                                                     config=config, **kwargs)
+        return _resolve_spec("AppSpec", ApacheIgniteApplicationSpec)(path_aware=service, context=context, config=config,
+                                                                     main_java_class=main_java_class, **kwargs)
 
     raise Exception("There is no specification for class %s" % type(service))
 
@@ -197,7 +197,7 @@ class ApacheIgniteApplicationSpec(IgniteApplicationSpec):
     Implementation IgniteApplicationSpec for Apache Ignite project
     """
     # pylint: disable=too-many-arguments
-    def __init__(self, context, modules, servicejava_class_name, java_class_name, params, start_ignite, **kwargs):
+    def __init__(self, context, modules, main_java_class, java_class_name, params, start_ignite, **kwargs):
         super().__init__(project=context.globals.get("project", "ignite"), **kwargs)
         self.context = context
 
@@ -209,7 +209,7 @@ class ApacheIgniteApplicationSpec(IgniteApplicationSpec):
         libs.extend(self.__jackson())
 
         self.envs = {
-            "MAIN_CLASS": servicejava_class_name,
+            "MAIN_CLASS": main_java_class,
             "EXCLUDE_TEST_CLASSES": "true",
             "IGNITE_LOG_DIR": self.path_aware.persistent_root,
             "USER_LIBS": ":".join(libs)
diff --git a/modules/ducktests/tests/ignitetest/tests/discovery_test.py b/modules/ducktests/tests/ignitetest/tests/discovery_test.py
index 903be40..0d7d594 100644
--- a/modules/ducktests/tests/ignitetest/tests/discovery_test.py
+++ b/modules/ducktests/tests/ignitetest/tests/discovery_test.py
@@ -24,8 +24,10 @@ from time import monotonic
 from typing import NamedTuple
 
 from ducktape.mark import matrix
-from ignitetest.services.ignite import IgniteAwareService, IgniteService, get_event_time, node_failed_event_pattern
+
+from ignitetest.services.ignite import IgniteAwareService, IgniteService
 from ignitetest.services.ignite_app import IgniteApplicationService
+from ignitetest.services.utils.ignite_aware import node_failed_event_pattern
 from ignitetest.services.utils.ignite_configuration import IgniteConfiguration
 from ignitetest.services.utils.ignite_configuration.cache import CacheConfiguration
 from ignitetest.services.utils.ignite_configuration.discovery import from_zookeeper_cluster, from_ignite_cluster, \
@@ -33,9 +35,9 @@ from ignitetest.services.utils.ignite_configuration.discovery import from_zookee
 from ignitetest.services.utils.time_utils import epoch_mills
 from ignitetest.services.zk.zookeeper import ZookeeperService, ZookeeperSettings
 from ignitetest.utils import ignite_versions, ignore_if, cluster
+from ignitetest.utils.enum import constructible
 from ignitetest.utils.ignite_test import IgniteTest
 from ignitetest.utils.version import DEV_BRANCH, LATEST, LATEST_2_7, V_2_8_0, V_2_9_0, IgniteVersion
-from ignitetest.utils.enum import constructible
 
 
 @constructible
@@ -267,8 +269,8 @@ class DiscoveryTest(IgniteTest):
 
         for survivor in [n for n in servers.nodes if n not in failed_nodes]:
             for failed_id in ids_to_wait:
-                logged_timestamps.append(get_event_time(servers, survivor, node_failed_event_pattern(failed_id),
-                                                        timeout=event_timeout_sec))
+                logged_timestamps.append(servers.get_event_time_on_node(survivor, node_failed_event_pattern(failed_id),
+                                                                        timeout=event_timeout_sec))
 
             self._check_failed_number(failed_nodes, survivor)
 
diff --git a/modules/ducktests/tests/ignitetest/tests/rebalance/__init__.py b/modules/ducktests/tests/ignitetest/tests/rebalance/__init__.py
index 92cfb6e..e09f728 100644
--- a/modules/ducktests/tests/ignitetest/tests/rebalance/__init__.py
+++ b/modules/ducktests/tests/ignitetest/tests/rebalance/__init__.py
@@ -22,7 +22,6 @@ from typing import NamedTuple
 # pylint: disable=W0622
 from ducktape.errors import TimeoutError
 
-from ignitetest.services.ignite import get_event_time
 from ignitetest.services.ignite_app import IgniteApplicationService
 
 
@@ -93,9 +92,8 @@ def await_rebalance_start(ignite, timeout=1):
     """
     for node in ignite.nodes:
         try:
-            rebalance_start_time = get_event_time(
-                ignite, node,
-                "Starting rebalance routine \\[test-cache-",
+            rebalance_start_time = ignite.get_event_time_on_node(
+                node, "Starting rebalance routine \\[test-cache-",
                 timeout=timeout)
         except TimeoutError:
             continue
@@ -117,8 +115,7 @@ def await_rebalance_complete(ignite, node=None, cache_count=1, timeout=300):
     rebalance_complete_times = []
 
     for cache_idx in range(cache_count):
-        rebalance_complete_times.append(get_event_time(
-            ignite,
+        rebalance_complete_times.append(ignite.get_event_time_on_node(
             node if node else ignite.nodes[0],
             "Completed rebalance future: RebalanceFuture \\[%s \\[grp=test-cache-%d" %
             ("state=STARTED, grp=CacheGroupContext", cache_idx + 1),