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),