Icinga2 segfault

Today, I have noticed that some checks show were outdated/overdue but I didn’t really see why. Eventually, I have rebooted first the second server then the first icinga2 server and now the second server crashes with a segfault 1-2 minutes after starting.

# fgrep segfault /var/log/messages
Jan 25 08:54:00 icinga2-ha2 kernel: icinga2[3192]: segfault at 48 ip 00000000009e4cee sp 00007f530a3ed5e0 error 4 in icinga2[400000+df9000]
Jan 25 08:56:47 icinga2-ha2 kernel: icinga2[8850]: segfault at 48 ip 00000000009e4cee sp 00007f433c48d5e0 error 4 in icinga2[400000+df9000]
Jan 25 09:00:01 icinga2-ha2 kernel: icinga2[11760]: segfault at 48 ip 00000000009e4cee sp 00007f55490fd5e0 error 4 in icinga2[400000+df9000]
Jan 25 09:03:36 icinga2-ha2 kernel: icinga2[16139]: segfault at 48 ip 00000000009e4cee sp 00007f31816ae5e0 error 4 in icinga2[400000+df9000]
Jan 25 09:04:26 icinga2-ha2 kernel: icinga2[16989]: segfault at 48 ip 00000000009e4cee sp 00007f1a854175e0 error 4 in icinga2[400000+df9000]
Jan 25 09:13:33 icinga2-ha2 kernel: icinga2[28574]: segfault at 48 ip 00000000009e4cee sp 00007fc1e010d5e0 error 4 in icinga2[400000+df9000]

We didn’t really do anything nor changed any configuration for a couple of days now.

  • Version used 2.13.2-1
icinga2-2.13.2-1.el7.icinga.x86_64
icinga2-bin-2.13.2-1.el7.icinga.x86_64
icinga2-common-2.13.2-1.el7.icinga.x86_64
icinga2-ido-mysql-2.13.2-1.el7.icinga.x86_64
icinga2-selinux-2.13.2-1.el7.icinga.x86_64
  • Operating System and version: CentOS Linux release 7.9.2009 (Core)
  • Enabled features: api checker command ido-mysql mainlog notification
  • Icinga Web 2 version and modules 2.9.5
  • Config validation (icinga2 daemon -C)
# icinga2 daemon -C
[2022-01-25 09:27:03 +0100] information/cli: Icinga application loader (version: 2.13.2-1)
[2022-01-25 09:27:03 +0100] information/cli: Loading configuration file(s).
[2022-01-25 09:27:03 +0100] information/ConfigItem: Committing config item(s).
[2022-01-25 09:27:03 +0100] information/ApiListener: My API identity: icinga2-ha2.example.com
[2022-01-25 09:27:05 +0100] warning/ApplyRule: Apply rule 'swift-cluster-' (in /var/lib/icinga2/api/zones/master/_etc/services.conf: 1189:1-1189:103) for type 'Dependency' does not match anywhere!
[2022-01-25 09:27:05 +0100] warning/ApplyRule: Apply rule 'sms-host-rufbereitschaft' (in /var/lib/icinga2/api/zones/master/_etc/notifications-rufbereitschaft.conf: 49:1-49:53) for type 'Notification' does not match anywhere!
[2022-01-25 09:27:05 +0100] warning/ApplyRule: Apply rule 'sms-host' (in /var/lib/icinga2/api/zones/master/_etc/notifications.conf: 133:1-133:37) for type 'Notification' does not match anywhere!
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 NotificationComponent.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 IdoMysqlConnection.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 ExternalCommandListener.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 CheckerComponent.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 54 Users.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 29 UserGroups.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 17 ServiceGroups.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 13 TimePeriods.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 4391 Services.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 8 Zones.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 4787 ScheduledDowntimes.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 4 NotificationCommands.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 69 HostGroups.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 4880 Notifications.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 8 Downtimes.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 2898 Dependencies.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 396 Hosts.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 7 Endpoints.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 12 Comments.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 FileLogger.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 7 ApiUsers.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 338 CheckCommands.
[2022-01-25 09:27:05 +0100] information/ConfigItem: Instantiated 1 ApiListener.
[2022-01-25 09:27:05 +0100] information/ScriptGlobal: Dumping variables to file '/var/cache/icinga2/icinga2.vars'
[2022-01-25 09:27:05 +0100] information/cli: Finished validating the configuration file(s).
  • If you run multiple Icinga 2 instances, the zones.conf file (or icinga2 object list --type Endpoint and icinga2 object list --type Zone) from all affected nodes
    zones.conf from both instances is identical:
/*
 * Generated by Icinga 2 node setup commands
 * on 2018-01-11 09:00:01 +0100
 */

object Endpoint "icinga2-ha1.example.com" {
        host = "icinga2-ha1.example.com"
}

object Endpoint "icinga2-ha2.example.com" {
        host = "icinga2-ha2.example.com"
}

object Zone "master" {
        endpoints = [ "icinga2-ha1.example.com", "icinga2-ha2.example.com" ]
}

object Endpoint "status.example.com" {
        host = "status.example.com"
}

object Endpoint "status-test.example.com" {
        host = "status-test.example.com"
}

object Zone "status" {
        endpoints = [ "status.example.com" ]
        parent = "master"
}

object Zone "status-test" {
        endpoints = [ "status-test.example.com" ]
        parent = "master"
}

object Zone "global-templates" {
        global = true
}

object Zone "director-global" {
        global = true
}

O.K. With some effort I have managed to generate a core dump and read it into gdb:

# gdb /usr/lib64/icinga2/sbin/icinga2 /var/lib/cores/core.icinga2.2220 
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/lib64/icinga2/sbin/icinga2...Reading symbols from /usr/lib/debug/usr/lib64/icinga2/sbin/icinga2.debug...done.
done.
[New LWP 2227]
[New LWP 2228]
[New LWP 2256]
[New LWP 2257]
[New LWP 2259]
[New LWP 2260]
[New LWP 2254]
[New LWP 2266]
[New LWP 2253]
[New LWP 2220]
[New LWP 2255]
[New LWP 2223]
[New LWP 2262]
[New LWP 2224]
[New LWP 2261]
[New LWP 2251]
[New LWP 2222]
[New LWP 2226]
[New LWP 2225]
[New LWP 2263]
[New LWP 2230]
[New LWP 2264]
[New LWP 2221]
[New LWP 2276]
[New LWP 2267]
[New LWP 2265]
[New LWP 2258]
[New LWP 2252]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Core was generated by `/usr/lib64/icinga2/sbin/icinga2 --no-stack-rlimit daemon --close-stdio -e /var/'.
Program terminated with signal 11, Segmentation fault.

#0  std::_Rb_tree<icinga::String, std::pair<icinga::String const, icinga::Value>, std::_Select1st<std::pair<icinga::String const, icinga::Value> >, std::less<icinga::String>, std::allocator<std::pair<icinga::String const, icinga::Value> > >::find (this=this@entry=0x38, __k=...) at /usr/include/c++/4.8.2/bits/stl_tree.h:1805
1805	/usr/include/c++/4.8.2/bits/stl_tree.h: No such file or directory.
(gdb) 
(gdb) bt
#0  std::_Rb_tree<icinga::String, std::pair<icinga::String const, icinga::Value>, std::_Select1st<std::pair<icinga::String const, icinga::Value> >, std::less<icinga::String>, std::allocator<std::pair<icinga::String const, icinga::Value> > >::find (this=this@entry=0x38, __k=...) at /usr/include/c++/4.8.2/bits/stl_tree.h:1805
#1  0x000000000095cd60 in find (__x=..., this=0x38) at /usr/include/c++/4.8.2/bits/stl_map.h:837
#2  icinga::Dictionary::Get (this=0x0, key=...) at ../base/dictionary.cpp:42
#3  0x0000000000e8b7c6 in icinga::NotificationComponent::NotificationTimerHandler (this=0x7f130c000cd0) at ../notification/notificationcomponent.cpp:197
#4  0x0000000000a3b05c in operator() (a0=<optimized out>, this=<optimized out>) at /usr/include/boost169/boost/function/function_template.hpp:764
#5  m_invoke<boost::function<void(const icinga::Timer* const&)>, 0u, const icinga::Timer* const&> (args=..., func=..., this=<optimized out>) at /usr/include/boost169/boost/signals2/detail/variadic_slot_invoker.hpp:105
#6  operator()<boost::function<void(const icinga::Timer* const&)>, const icinga::Timer* const&, 1ul> (args=..., func=..., this=<optimized out>) at /usr/include/boost169/boost/signals2/detail/variadic_slot_invoker.hpp:90
#7  operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > > (connectionBody=..., this=<optimized out>) at /usr/include/boost169/boost/signals2/detail/variadic_slot_invoker.hpp:134
#8  dereference (this=0x7f13242c6750) at /usr/include/boost169/boost/signals2/detail/slot_call_iterator.hpp:110
#9  dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, const icinga::Timer* const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > > (f=...)
    at /usr/include/boost169/boost/iterator/iterator_facade.hpp:550
#10 operator* (this=0x7f13242c6750) at /usr/include/boost169/boost/iterator/iterator_facade.hpp:656
#11 operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, const icinga::Timer* const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > > (last=..., 
    first=..., this=<optimized out>) at /usr/include/boost169/boost/signals2/optional_last_value.hpp:57
#12 operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, const icinga::Timer* const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void(const icinga::Timer* const&), boost::function<void(const icinga::Timer* const&)> >, boost::signals2::mutex> > > (last=..., first=..., combiner=..., this=<optimized out>) at /usr/include/boost169/boost/signals2/detail/result_type_wrapper.hpp:64
#13 boost::signals2::detail::signal_impl<void (icinga::Timer const* const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (icinga::Timer const* const&)>, boost::function<void (boost::signals2::connection const&, icinga::Timer const* const&)>, boost::signals2::mutex>::operator()(icinga::Timer const* const&) (this=<optimized out>, args#0=@0x7f13242c69a0: 0x2be3af0) at /usr/include/boost169/boost/signals2/detail/signal_template.hpp:247
#14 0x00000000009c6f68 in operator() (args#0=@0x7f13242c69a0: 0x2be3af0, this=0x2be3b28) at /usr/include/boost169/boost/signals2/detail/signal_template.hpp:722
#15 icinga::Timer::Call (this=0x2be3af0) at ../base/timer.cpp:117
#16 0x0000000000a1c793 in bool icinga::ThreadPool::Post<std::function<void ()> >(std::function<void ()>, icinga::SchedulerPolicy)::{lambda()#1}::operator()() const (__closure=__closure@entry=0x7f13242c69c0) at ../base/threadpool.hpp:63
#17 0x0000000000a1c793 in bool icinga::ThreadPool::Post<std::function<void ()> >(std::function<void ()>, icinga::SchedulerPolicy)::{lambda()#1}::operator()() const ()
#18 0x0000000000a1ca86 in asio_handler_invoke<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2> (function=...) at /usr/include/boost169/boost/asio/handler_invoke_hook.hpp:69
---Type <return> to continue, or q <return> to quit---
#19 invoke<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2, icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2> (context=..., function=...)
    at /usr/include/boost169/boost/asio/detail/handler_invoke_helpers.hpp:37
#20 dispatch<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2, std::allocator<void> > (this=<optimized out>, 
    f=<unknown type in /usr/lib/debug/usr/lib64/icinga2/sbin/icinga2.debug, CU 0xaac4f, DIE 0x29fc99>) at /usr/include/boost169/boost/asio/impl/system_executor.hpp:39
#21 operator() (this=0x7f13242c6bc0) at /usr/include/boost169/boost/asio/detail/work_dispatcher.hpp:58
#22 asio_handler_invoke<boost::asio::detail::work_dispatcher<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2> > (function=...) at /usr/include/boost169/boost/asio/handler_invoke_hook.hpp:69
#23 invoke<boost::asio::detail::work_dispatcher<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2>, boost::asio::detail::work_dispatcher<icinga::ThreadPool::Post(T, icinga::SchedulerPolicy) [with T = std::function<void()>]::__lambda2> > (context=..., function=...) at /usr/include/boost169/boost/asio/detail/handler_invoke_helpers.hpp:37
#24 boost::asio::detail::executor_op<boost::asio::detail::work_dispatcher<bool icinga::ThreadPool::Post<std::function<void ()> >(std::function<void ()>, icinga::SchedulerPolicy)::{lambda()#1}>, std::allocator<void>, boost::asio::detail::scheduler_operation>::do_complete(void*, std::allocator<void>*, boost::system::error_code const&, unsigned long) (owner=0x163f8b0, base=<optimized out>) at /usr/include/boost169/boost/asio/detail/executor_op.hpp:70
#25 0x00000000009db4a4 in complete (bytes_transferred=<optimized out>, ec=..., owner=0x163f8b0, this=<optimized out>) at /usr/include/boost169/boost/asio/detail/scheduler_operation.hpp:40
#26 do_run_one (ec=..., this_thread=..., lock=..., this=0x163f8b0) at /usr/include/boost169/boost/asio/detail/impl/scheduler.ipp:401
#27 boost::asio::detail::scheduler::run (this=0x163f8b0, ec=...) at /usr/include/boost169/boost/asio/detail/impl/scheduler.ipp:154
#28 0x00000000009db662 in operator() (this=0x163fa58) at /usr/include/boost169/boost/asio/impl/thread_pool.ipp:33
#29 boost::asio::detail::posix_thread::func<boost::asio::thread_pool::thread_function>::run (this=0x163fa50) at /usr/include/boost169/boost/asio/detail/posix_thread.hpp:86
#30 0x00000000009cb35f in boost::asio::detail::boost_asio_detail_posix_thread_function (arg=0x163fa50) at /usr/include/boost169/boost/asio/detail/impl/posix_thread.ipp:74
#31 0x00007f13216f5ea5 in start_thread (arg=0x7f13242c7700) at pthread_create.c:307
#32 0x00007f132141eb0d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

A known problem, will be fixed in 2.13.3.

O.K. I guess you mean Icinga2 crashes when sending notifications · Issue #8186 · Icinga/icinga2 · GitHub

Found this in icinga2.state: "stashed_notifications":[null,null,null,{"author":"nagiostrap",...

How do I get this safely removed without breaking everything? I don’t have director, thus the fix from arjanoosting Icinga2 crashes when sending notifications · Issue #8186 · Icinga/icinga2 · GitHub doesn’t work for me.

If I remove the three null from the stashed_notifications in icinga2.stage and start it, should that work? Or better clear out the complete stashed_notifications array there?

Remove as you wish, BUT don’t forget to adjust the JSON length, i.e.:

-18:{"stashed":[null]},
+14:{"stashed":[]},

NOT

-18:{"stashed":[null]},
+18:{"stashed":[]},