Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2021-06-19 11:03:52 +0300
committerVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2021-06-19 11:03:52 +0300
commit62a9b7b14f1cefcf3c8c66ba481d322937dc849e (patch)
tree33301c05538bb294c716b7a0d84326f4575bc120
parentdfde3f52cd4cc7b96326e69c5935d2c5db4a6711 (diff)
........S. [ZBXNEXT-6674] added processes exit priorities to handle process dependency from one to another
-rw-r--r--include/threads.h7
-rw-r--r--src/libs/zbxsys/threads.c35
-rw-r--r--src/zabbix_proxy/proxy.c4
-rw-r--r--src/zabbix_server/server.c4
4 files changed, 32 insertions, 18 deletions
diff --git a/include/threads.h b/include/threads.h
index 00edd79ac7b..a926cd8c9d3 100644
--- a/include/threads.h
+++ b/include/threads.h
@@ -31,8 +31,6 @@
#define ZBX_THREAD_HANDLE HANDLE
#define ZBX_THREAD_HANDLE_NULL NULL
- #define ZBX_THREAD_WAIT_EXIT 1
-
#define ZBX_THREAD_ENTRY_POINTER(pointer_name) \
unsigned (__stdcall *pointer_name)(void *)
@@ -57,7 +55,10 @@
#define ZBX_THREAD_HANDLE pid_t
#define ZBX_THREAD_HANDLE_NULL 0
- #define ZBX_THREAD_WAIT_EXIT 1
+ #define ZBX_THREAD_PRIORITY_NONE 0
+ #define ZBX_THREAD_PRIORITY_FIRST 1
+ #define ZBX_THREAD_PRIORITY_SECOND 2
+ #define ZBX_THREAD_PRIORITY_COUNT 3
#define ZBX_THREAD_ENTRY_POINTER(pointer_name) \
unsigned (* pointer_name)(void *)
diff --git a/src/libs/zbxsys/threads.c b/src/libs/zbxsys/threads.c
index f9e59941a53..81fdd59345c 100644
--- a/src/libs/zbxsys/threads.c
+++ b/src/libs/zbxsys/threads.c
@@ -221,7 +221,8 @@ int zbx_thread_wait(ZBX_THREAD_HANDLE thread)
* threads to exit immediately on FAIL *
* *
******************************************************************************/
-static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, int ret)
+static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, const int *threads_flags, int priority,
+ int ret)
{
int i;
@@ -231,9 +232,15 @@ static void threads_kill(ZBX_THREAD_HANDLE *threads, int threads_num, int ret)
continue;
if (SUCCEED != ret)
+ {
zbx_thread_kill_fatal(threads[i]);
- else
- zbx_thread_kill(threads[i]);
+ continue;
+ }
+
+ if (priority != threads_flags[i])
+ continue;
+
+ zbx_thread_kill(threads[i]);
}
}
@@ -252,27 +259,33 @@ void zbx_threads_wait(ZBX_THREAD_HANDLE *threads, const int *threads_flags, int
int i;
#if !defined(_WINDOWS) && !defined(__MINGW32__)
sigset_t set;
+ int j;
/* ignore SIGCHLD signals in order for zbx_sleep() to work */
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, NULL);
- /* signal all threads to go into idle state and wait for flagged threads to exit */
- threads_kill(threads, threads_num, ret);
+ /* signal all threads to go into idle state and wait for threads with higher priority to exit */
+ threads_kill(threads, threads_num, threads_flags, ZBX_THREAD_PRIORITY_NONE, ret);
- for (i = 0; i < threads_num; i++)
+ for (j = ZBX_THREAD_PRIORITY_FIRST; j < ZBX_THREAD_PRIORITY_COUNT; j++)
{
- if (!threads[i] || ZBX_THREAD_WAIT_EXIT != threads_flags[i])
- continue;
+ threads_kill(threads, threads_num, threads_flags, j, ret);
- zbx_thread_wait(threads[i]);
+ for (i = 0; i < threads_num; i++)
+ {
+ if (!threads[i] || j != threads_flags[i])
+ continue;
- threads[i] = ZBX_THREAD_HANDLE_NULL;
+ zbx_thread_wait(threads[i]);
+
+ threads[i] = ZBX_THREAD_HANDLE_NULL;
+ }
}
/* signal idle threads to exit */
- threads_kill(threads, threads_num, FAIL);
+ threads_kill(threads, threads_num, threads_flags, ZBX_THREAD_PRIORITY_NONE, FAIL);
#else
/* wait for threads to finish first. although listener threads will never end */
WaitForMultipleObjectsEx(threads_num, threads, TRUE, 1000, FALSE);
diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c
index f6ce0cae3d9..45bb59e0c5a 100644
--- a/src/zabbix_proxy/proxy.c
+++ b/src/zabbix_proxy/proxy.c
@@ -1271,7 +1271,7 @@ int MAIN_ZABBIX_ENTRY(int flags)
zbx_thread_start(discoverer_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_HISTSYNCER:
- threads_flags[i] = ZBX_THREAD_WAIT_EXIT;
+ threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST;
zbx_thread_start(dbsyncer_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_JAVAPOLLER:
@@ -1311,7 +1311,7 @@ int MAIN_ZABBIX_ENTRY(int flags)
zbx_thread_start(poller_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_AVAILMAN:
- threads_flags[i] = ZBX_THREAD_WAIT_EXIT;
+ threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST;
zbx_thread_start(availability_manager_thread, &thread_args, &threads[i]);
break;
}
diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c
index d92e7d055a6..2a9da70893c 100644
--- a/src/zabbix_server/server.c
+++ b/src/zabbix_server/server.c
@@ -1346,7 +1346,7 @@ int MAIN_ZABBIX_ENTRY(int flags)
switch (thread_args.process_type)
{
case ZBX_PROCESS_TYPE_SERVICEMAN:
- threads_flags[i] = ZBX_THREAD_WAIT_EXIT;
+ threads_flags[i] = ZBX_THREAD_PRIORITY_SECOND;
zbx_thread_start(service_manager_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_CONFSYNCER:
@@ -1403,7 +1403,7 @@ int MAIN_ZABBIX_ENTRY(int flags)
zbx_thread_start(discoverer_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_HISTSYNCER:
- threads_flags[i] = ZBX_THREAD_WAIT_EXIT;
+ threads_flags[i] = ZBX_THREAD_PRIORITY_FIRST;
zbx_thread_start(dbsyncer_thread, &thread_args, &threads[i]);
break;
case ZBX_PROCESS_TYPE_ESCALATOR: