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:
-rw-r--r--ChangeLog.d/feature/ZBXNEXT-39401
-rw-r--r--include/common.h2
-rw-r--r--man/zabbix_proxy.man5
-rw-r--r--man/zabbix_server.man5
-rw-r--r--src/libs/zbxnix/control.c12
-rw-r--r--src/libs/zbxnix/daemon.c5
-rw-r--r--src/zabbix_proxy/proxy.c1
-rw-r--r--src/zabbix_server/poller/checks_snmp.c6
-rw-r--r--src/zabbix_server/poller/checks_snmp.h1
-rw-r--r--src/zabbix_server/poller/poller.c12
-rw-r--r--src/zabbix_server/server.c1
11 files changed, 50 insertions, 1 deletions
diff --git a/ChangeLog.d/feature/ZBXNEXT-3940 b/ChangeLog.d/feature/ZBXNEXT-3940
new file mode 100644
index 00000000000..f1a903f322d
--- /dev/null
+++ b/ChangeLog.d/feature/ZBXNEXT-3940
@@ -0,0 +1 @@
+.......PS. [ZBXNEXT-3940] Provide a way to flush SNMP cache (arimdjonoks)
diff --git a/include/common.h b/include/common.h
index f229b4803a5..21e5b057264 100644
--- a/include/common.h
+++ b/include/common.h
@@ -431,6 +431,7 @@ zbx_graph_yaxis_types_t;
#define ZBX_HOUSEKEEPER_EXECUTE "housekeeper_execute"
#define ZBX_LOG_LEVEL_INCREASE "log_level_increase"
#define ZBX_LOG_LEVEL_DECREASE "log_level_decrease"
+#define ZBX_SNMP_CACHE_RELOAD "snmp_cache_reload"
/* value for not supported items */
#define ZBX_NOTSUPPORTED "ZBX_NOTSUPPORTED"
@@ -899,6 +900,7 @@ zbx_task_t;
#define ZBX_RTC_LOG_LEVEL_DECREASE 2
#define ZBX_RTC_HOUSEKEEPER_EXECUTE 3
#define ZBX_RTC_CONFIG_CACHE_RELOAD 8
+#define ZBX_RTC_SNMP_CACHE_RELOAD 9
typedef enum
{
diff --git a/man/zabbix_proxy.man b/man/zabbix_proxy.man
index 837bed87a7d..1d022a69660 100644
--- a/man/zabbix_proxy.man
+++ b/man/zabbix_proxy.man
@@ -73,6 +73,11 @@ Default configuration file (unless \fB\-c\fR option is specified) will be used t
.RE
.RS 4
.TP 4
+.B snmp_cache_reload
+Clear snmp cache.
+.RE
+.RS 4
+.TP 4
.B housekeeper_execute
Execute the housekeeper.
Ignored if housekeeper is being currently executed.
diff --git a/man/zabbix_server.man b/man/zabbix_server.man
index 8b12525f358..889f7727502 100644
--- a/man/zabbix_server.man
+++ b/man/zabbix_server.man
@@ -72,6 +72,11 @@ Default configuration file (unless \fB\-c\fR option is specified) will be used t
.RE
.RS 4
.TP 4
+.B snmp_cache_reload
+Clear snmp cache.
+.RE
+.RS 4
+.TP 4
.B housekeeper_execute
Execute the housekeeper.
Ignored if housekeeper is being currently executed.
diff --git a/src/libs/zbxnix/control.c b/src/libs/zbxnix/control.c
index 34dd390ef2f..581d3e36e7e 100644
--- a/src/libs/zbxnix/control.c
+++ b/src/libs/zbxnix/control.c
@@ -154,6 +154,18 @@ int parse_rtc_options(const char *opt, unsigned char program_type, int *message)
scope = 0;
data = 0;
}
+ else if (0 != (program_type & (ZBX_PROGRAM_TYPE_SERVER | ZBX_PROGRAM_TYPE_PROXY)) &&
+ 0 == strcmp(opt, ZBX_SNMP_CACHE_RELOAD))
+ {
+#ifdef HAVE_NETSNMP
+ command = ZBX_RTC_SNMP_CACHE_RELOAD;
+ scope = ZBX_PROCESS_TYPE_POLLER;
+ data = 0;
+#else
+ zbx_error("invalid runtime control option: no SNMP support enabled");
+ return FAIL;
+#endif
+ }
else
{
zbx_error("invalid runtime control option: %s", opt);
diff --git a/src/libs/zbxnix/daemon.c b/src/libs/zbxnix/daemon.c
index 6fa9253f7d9..d7f82b7edb8 100644
--- a/src/libs/zbxnix/daemon.c
+++ b/src/libs/zbxnix/daemon.c
@@ -227,13 +227,16 @@ static void user1_signal_handler(int sig, siginfo_t *siginfo, void *context)
case ZBX_RTC_HOUSEKEEPER_EXECUTE:
zbx_signal_process_by_type(ZBX_PROCESS_TYPE_HOUSEKEEPER, 1, flags);
break;
- case ZBX_RTC_LOG_LEVEL_INCREASE:
+ case ZBX_RTC_LOG_LEVEL_INCREASE:
case ZBX_RTC_LOG_LEVEL_DECREASE:
if ((ZBX_RTC_LOG_SCOPE_FLAG | ZBX_RTC_LOG_SCOPE_PID) == ZBX_RTC_GET_SCOPE(flags))
zbx_signal_process_by_pid(ZBX_RTC_GET_DATA(flags), flags);
else
zbx_signal_process_by_type(ZBX_RTC_GET_SCOPE(flags), ZBX_RTC_GET_DATA(flags), flags);
break;
+ case ZBX_RTC_SNMP_CACHE_RELOAD:
+ zbx_signal_process_by_type(ZBX_RTC_GET_SCOPE(flags), ZBX_RTC_GET_DATA(flags), flags);
+ break;
}
#endif
}
diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c
index f2128a24538..1314f2192fb 100644
--- a/src/zabbix_proxy/proxy.c
+++ b/src/zabbix_proxy/proxy.c
@@ -93,6 +93,7 @@ const char *help_message[] = {
" target is not specified",
" " ZBX_LOG_LEVEL_DECREASE "=target Decrease log level, affects all processes if",
" target is not specified",
+ " " ZBX_SNMP_CACHE_RELOAD " Reload SNMP cache",
"",
" Log level control targets:",
" process-type All processes of specified type",
diff --git a/src/zabbix_server/poller/checks_snmp.c b/src/zabbix_server/poller/checks_snmp.c
index 32c6155f2ec..13471da5705 100644
--- a/src/zabbix_server/poller/checks_snmp.c
+++ b/src/zabbix_server/poller/checks_snmp.c
@@ -2129,4 +2129,10 @@ void zbx_init_snmp(void)
sigprocmask(SIG_SETMASK, &orig_mask, NULL);
}
+void zbx_clear_cache_snmp(void)
+{
+ free_etimelist();
+ clear_user_list();
+}
+
#endif /* HAVE_NETSNMP */
diff --git a/src/zabbix_server/poller/checks_snmp.h b/src/zabbix_server/poller/checks_snmp.h
index f81963e9fa3..4917c775a11 100644
--- a/src/zabbix_server/poller/checks_snmp.h
+++ b/src/zabbix_server/poller/checks_snmp.h
@@ -32,6 +32,7 @@ extern int CONFIG_TIMEOUT;
void zbx_init_snmp(void);
int get_value_snmp(const DC_ITEM *item, AGENT_RESULT *result);
void get_values_snmp(const DC_ITEM *items, AGENT_RESULT *results, int *errcodes, int num);
+void zbx_clear_cache_snmp(void);
#endif
#endif
diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c
index 33bcfdbf4cf..96aebfb7ad8 100644
--- a/src/zabbix_server/poller/poller.c
+++ b/src/zabbix_server/poller/poller.c
@@ -874,6 +874,16 @@ exit:
return num;
}
+static void zbx_poller_sigusr_handler(int flags)
+{
+#ifdef HAVE_NETSNMP
+ if (ZBX_RTC_SNMP_CACHE_RELOAD == ZBX_RTC_GET_MSG(flags))
+ {
+ zbx_clear_cache_snmp();
+ }
+#endif
+}
+
ZBX_THREAD_ENTRY(poller_thread, args)
{
int nextcheck, sleeptime = -1, processed = 0, old_processed = 0;
@@ -905,6 +915,8 @@ ZBX_THREAD_ENTRY(poller_thread, args)
DBconnect(ZBX_DB_CONNECT_NORMAL);
+ zbx_set_sigusr_handler(zbx_poller_sigusr_handler);
+
while (ZBX_IS_RUNNING())
{
sec = zbx_time();
diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c
index d423140a2e1..5d01b1ebd84 100644
--- a/src/zabbix_server/server.c
+++ b/src/zabbix_server/server.c
@@ -104,6 +104,7 @@ const char *help_message[] = {
" target is not specified",
" " ZBX_LOG_LEVEL_DECREASE "=target Decrease log level, affects all processes if",
" target is not specified",
+ " " ZBX_SNMP_CACHE_RELOAD " Reload SNMP cache",
"",
" Log level control targets:",
" process-type All processes of specified type",