1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-08-08 14:22:09 +03:00

Restore edits after cherry-pick

This commit is contained in:
Alexander Presnyakov
2025-04-23 21:49:23 +00:00
parent 7199c974c9
commit ff25d4e35c
8 changed files with 33 additions and 39 deletions

View File

@@ -77,17 +77,17 @@ class ProgInfo(NamedTuple):
# on top level of process handling
# mcs-storagemanager starts conditionally inside mcs-loadbrm, but should be
# stopped using cmapi
ALL_MCS_PROGS: dict[str, ProgInfo] = {
ALL_MCS_PROGS: dict[MCSProgs, ProgInfo] = {
# workernode starts on primary and non primary node with 1 or 2 added
# to subcommand (DBRM_Worker1 - on primary, DBRM_Worker2 - non primary)
MCSProgs.STORAGE_MANAGER.value: ProgInfo(15, 'mcs-storagemanager', '', False, 1),
MCSProgs.WORKER_NODE.value: ProgInfo(13, 'mcs-workernode', 'DBRM_Worker{}', False, 1),
MCSProgs.CONTROLLER_NODE.value: ProgInfo(11, 'mcs-controllernode', 'fg', True),
MCSProgs.PRIM_PROC.value: ProgInfo(5, 'mcs-primproc', '', False, 1),
MCSProgs.EXE_MGR.value: ProgInfo(9, 'mcs-exemgr', '', False, 1),
MCSProgs.WRITE_ENGINE_SERVER.value: ProgInfo(7, 'mcs-writeengineserver', '', False, 3),
MCSProgs.DML_PROC.value: ProgInfo(3, 'mcs-dmlproc', '', False),
MCSProgs.DDL_PROC.value: ProgInfo(1, 'mcs-ddlproc', '', False),
MCSProgs.STORAGE_MANAGER: ProgInfo(15, 'mcs-storagemanager', '', False, 1),
MCSProgs.WORKER_NODE: ProgInfo(13, 'mcs-workernode', 'DBRM_Worker{}', False, 1),
MCSProgs.CONTROLLER_NODE: ProgInfo(11, 'mcs-controllernode', 'fg', True),
MCSProgs.PRIM_PROC: ProgInfo(5, 'mcs-primproc', '', False, 1),
MCSProgs.EXE_MGR: ProgInfo(9, 'mcs-exemgr', '', False, 1),
MCSProgs.WRITE_ENGINE_SERVER: ProgInfo(7, 'mcs-writeengineserver', '', False, 3),
MCSProgs.DML_PROC: ProgInfo(3, 'mcs-dmlproc', '', False),
MCSProgs.DDL_PROC: ProgInfo(1, 'mcs-ddlproc', '', False),
}
# constants for docker container dispatcher

View File

@@ -435,7 +435,6 @@ class ConfigController:
is_primary=node_config.is_primary_node(),
use_sudo=use_sudo,
timeout=request_timeout,
is_read_only=node_config.is_read_only(),
)
except CMAPIBasicError as err:
raise_422_error(
@@ -705,7 +704,6 @@ class ShutdownController:
is_primary=node_config.is_primary_node(),
use_sudo=use_sudo,
timeout=timeout,
is_read_only=node_config.is_read_only(),
)
except CMAPIBasicError as err:
raise_422_error(

View File

@@ -97,7 +97,6 @@ class FailoverAgent(AgentBase):
if not test_mode:
MCSProcessManager.stop_node(
is_primary=nc.is_primary_node(),
is_read_only=nc.is_read_only(),
)
logger.info(
'FA.enterStandbyMode(): successfully stopped node.'

View File

@@ -540,11 +540,6 @@ def get_desired_nodes(config=DEFAULT_MCS_CONF_PATH):
return [ node.text for node in nodes ]
def get_read_only_nodes(root) -> list[str]:
"""Get names of read only nodes from config"""
return [node.text for node in root.findall('./ReadOnlyNodes/Node')]
def in_maintenance_state(config=DEFAULT_MCS_CONF_PATH):
nc = NodeConfig()
root = nc.get_current_config_root(config, upgrade=False)

View File

@@ -7,7 +7,7 @@ from time import sleep
import psutil
from cmapi_server.exceptions import CMAPIBasicError
from cmapi_server.constants import MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs
from cmapi_server.constants import MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs, ProgInfo
from cmapi_server.process_dispatchers.base import BaseDispatcher
from cmapi_server.process_dispatchers.systemd import SystemdDispatcher
from cmapi_server.process_dispatchers.container import (
@@ -33,7 +33,7 @@ class MCSProcessManager:
e.g. re/-start or stop systemd services, run executable.
"""
CONTROLLER_MAX_RETRY = 30
mcs_progs = {}
mcs_progs: dict[str, ProgInfo] = {}
mcs_version_info = None
dispatcher_name = None
process_dispatcher: BaseDispatcher = None
@@ -48,7 +48,7 @@ class MCSProcessManager:
:rtype: str
"""
if cls.dispatcher_name == 'systemd':
prog = MCSProgs[name]
prog = MCSProgs(name)
return ALL_MCS_PROGS[prog].service_name
return name
@@ -98,7 +98,8 @@ class MCSProcessManager:
if cls.mcs_progs:
logging.warning('Mcs ProcessHandler already detected processes.')
for prog_name, prog_info in ALL_MCS_PROGS.items():
for prog, prog_info in ALL_MCS_PROGS.items():
prog_name = prog.value
if os.path.exists(os.path.join(MCS_INSTALL_BIN, prog_name)):
cls.mcs_progs[prog_name] = prog_info
@@ -454,7 +455,6 @@ class MCSProcessManager:
is_primary: bool,
use_sudo: bool = True,
timeout: int = 10,
is_read_only: bool = False,
):
"""Stop mcs node processes.
@@ -464,8 +464,6 @@ class MCSProcessManager:
:type use_sudo: bool, optional
:param timeout: timeout for DMLProc gracefully stop using DBRM, seconds
:type timeout: int
:param is_read_only: if true, doesn't stop WriteEngine
:type is_read_only: bool, optional
:raises CMAPIBasicError: immediately if one mcs process not stopped
"""
# Every time try to stop all processes no matter primary it or slave,
@@ -481,5 +479,5 @@ class MCSProcessManager:
def restart_node(cls, is_primary: bool, use_sudo: bool, is_read_only: bool = False):
"""TODO: For next releases."""
if cls.get_running_mcs_procs():
cls.stop_node(is_primary, use_sudo, is_read_only)
cls.stop_node(is_primary, use_sudo)
cls.start_node(is_primary, use_sudo, is_read_only)

View File

@@ -11,7 +11,7 @@ from time import sleep
import psutil
from cmapi_server.constants import (
IFLAG, LIBJEMALLOC_DEFAULT_PATH, MCS_INSTALL_BIN, ALL_MCS_PROGS
IFLAG, LIBJEMALLOC_DEFAULT_PATH, MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs
)
from cmapi_server.exceptions import CMAPIBasicError
from cmapi_server.process_dispatchers.base import BaseDispatcher
@@ -126,7 +126,8 @@ class ContainerDispatcher(BaseDispatcher):
:return: command with arguments if needed
:rtype: str
"""
service_info = ALL_MCS_PROGS[service]
prog = MCSProgs(service)
service_info = ALL_MCS_PROGS[prog]
command = os.path.join(MCS_INSTALL_BIN, service)
if service_info.subcommand:
@@ -188,7 +189,8 @@ class ContainerDispatcher(BaseDispatcher):
env=env_vars
)
# TODO: any other way to detect service finished its initialisation?
sleep(ALL_MCS_PROGS[service].delay)
prog = MCSProgs(service)
sleep(ALL_MCS_PROGS[prog].delay)
logger.debug(f'Started "{service}".')
if is_primary and service == 'DDLProc':

View File

@@ -7,7 +7,6 @@ from lxml import etree
from cmapi_server import node_manipulation
from cmapi_server.constants import MCS_DATA_PATH
from cmapi_server.helpers import get_read_only_nodes
from cmapi_server.node_manipulation import add_dbroots_of_other_nodes, remove_dbroots_of_node
from cmapi_server.test.unittest_global import BaseNodeManipTestCase, tmp_mcs_config_filename
from mcs_node_control.models.node_config import NodeConfig

View File

@@ -4,7 +4,7 @@ import logging
import pwd
import re
import socket
from os import mkdir, replace, chown
from os import chown, mkdir, replace
from pathlib import Path
from shutil import copyfile
from xml.dom import minidom # to pick up pretty printing functionality
@@ -12,15 +12,14 @@ from xml.dom import minidom # to pick up pretty printing functionality
from lxml import etree
from cmapi_server.constants import (
DEFAULT_MCS_CONF_PATH, DEFAULT_SM_CONF_PATH,
DEFAULT_MCS_CONF_PATH,
DEFAULT_SM_CONF_PATH,
MCS_MODULE_FILE_PATH,
)
# from cmapi_server.managers.process import MCSProcessManager
from mcs_node_control.models.misc import (
read_module_id, get_dbroots_list
)
from mcs_node_control.models.network_ifaces import get_network_interfaces
# from cmapi_server.managers.process import MCSProcessManager
from mcs_node_control.models.misc import get_dbroots_list, read_module_id
from mcs_node_control.models.network_ifaces import get_network_interfaces
module_logger = logging.getLogger()
@@ -569,11 +568,15 @@ has dbroot {subel.text}')
return dbroots
def get_read_only_nodes(self, root=None) -> list[str]:
"""Get names of read only nodes from config"""
root = root or self.get_current_config_root()
return [node.text for node in root.findall('./ReadOnlyNodes/Node')]
def is_read_only(self, root=None) -> bool:
"""Checks if this node is in read-only mode"""
from cmapi_server.helpers import get_read_only_nodes # Avoid circular import
root = root or self.get_current_config_root()
read_only_nodes = set(get_read_only_nodes(root))
read_only_nodes = set(self.get_read_only_nodes(root))
my_names = set(self.get_network_addresses_and_names())
return bool(read_only_nodes.intersection(my_names))