Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Forbid dependency cycles #8389

Merged
merged 1 commit into from
Feb 10, 2023
Merged

Forbid dependency cycles #8389

merged 1 commit into from
Feb 10, 2023

Conversation

Al2Klimov
Copy link
Member

@Al2Klimov Al2Klimov commented Oct 20, 2020

... at config loading time.

$ icinga2 daemon -C -c just-dc1.conf
[2023-02-06 11:11:48 +0100] information/cli: Icinga application loader (version: v2.13.0-500-ga7ce8e1e5; debug)
[2023-02-06 11:11:48 +0100] information/cli: Loading configuration file(s).
[2023-02-06 11:11:48 +0100] information/ConfigItem: Committing config item(s).
[2023-02-06 11:11:48 +0100] information/ConfigItem: Instantiated 2 CheckCommands.
[2023-02-06 11:11:48 +0100] information/ConfigItem: Instantiated 1 Host.
[2023-02-06 11:11:48 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2023-02-06 11:11:48 +0100] information/ConfigItem: Instantiated 1 Dependency.
[2023-02-06 11:11:48 +0100] critical/config: Error: Dependency cycle:
Host 'h1'
-> Dependency 'h1!h1'
-> Host 'h1'
[2023-02-06 11:11:48 +0100] critical/cli: Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config.
$ curl -ksSu root:123456 -H 'Accept: application/json' -X PUT -d '{"attrs":{"parent_host_name":"a","child_host_name":"b","vars":{"lolcat":"mew"}}}' https://127.0.0.1:5665/v1/objects/dependencies/'b!a';echo
{"results":[{"code":500,"errors":["Error: Dependency cycle:\nHost 'a'\n-> Dependency 'a!b'\n-> Host 'b'\n-> Dependency 'b!a'\n-> Host 'a'\n"],"status":"Object could not be created."}]}

@Al2Klimov Al2Klimov self-assigned this Oct 20, 2020
@icinga-probot icinga-probot bot added this to the 2.13.0 milestone Oct 20, 2020
@Al2Klimov
Copy link
Member Author

➜  icinga2 git:(d0ac25cbc) cat just-dc1.conf
object CheckCommand "dummy" {
	import "dummy-check-command"

	vars.dummy_state = 0
	vars.dummy_text = "Check was successful."
}

object CheckCommand "passive" {
	import "dummy"

	vars.dummy_state = 3
	vars.dummy_text = "No Passive Check Result Received."
}

object Host "h1" {
	check_command = "passive"
}

object Dependency "h1" {
	parent_host_name = "h1"
	child_host_name = "h1"
}
➜  icinga2 git:(d0ac25cbc) cat just-dc2.conf
object CheckCommand "dummy" {
	import "dummy-check-command"

	vars.dummy_state = 0
	vars.dummy_text = "Check was successful."
}

object CheckCommand "passive" {
	import "dummy"

	vars.dummy_state = 3
	vars.dummy_text = "No Passive Check Result Received."
}

object Host "h1" {
	check_command = "passive"
}

object Host "h2" {
	check_command = "passive"
}

object Dependency "h1" {
	parent_host_name = "h1"
	child_host_name = "h2"
}

object Dependency "h2" {
	parent_host_name = "h2"
	child_host_name = "h1"
}
➜  icinga2 git:(d0ac25cbc) cat just-dc3.conf
object CheckCommand "dummy" {
	import "dummy-check-command"

	vars.dummy_state = 0
	vars.dummy_text = "Check was successful."
}

object CheckCommand "passive" {
	import "dummy"

	vars.dummy_state = 3
	vars.dummy_text = "No Passive Check Result Received."
}

object Host "h1" {
	check_command = "passive"
}

object Service "s1" {
	host_name = "h1"
	check_command = "passive"
}

object Dependency "s1" {
	parent_host_name = "h1"
	parent_service_name = "s1"
	child_host_name = "h1"
}
➜  icinga2 git:(d0ac25cbc) cat just-dc4.conf
object CheckCommand "dummy" {
	import "dummy-check-command"

	vars.dummy_state = 0
	vars.dummy_text = "Check was successful."
}

object CheckCommand "passive" {
	import "dummy"

	vars.dummy_state = 3
	vars.dummy_text = "No Passive Check Result Received."
}

object Host "h1" {
	check_command = "passive"
}

object Host "h2" {
	check_command = "passive"
}

object Dependency "h1" {
	parent_host_name = "h1"
	child_host_name = "h2"
}
➜  icinga2 git:(d0ac25cbc) prefix/sbin/icinga2 daemon -C -c just-dc1.conf
[2020-10-20 12:29:03 +0200] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-10-20 12:29:03 +0200] information/cli: Loading configuration file(s).
[2020-10-20 12:29:03 +0200] information/ConfigItem: Committing config item(s).
[2020-10-20 12:29:03 +0200] information/ConfigItem: Instantiated 2 CheckCommands.
[2020-10-20 12:29:03 +0200] information/ConfigItem: Instantiated 1 Dependency.
[2020-10-20 12:29:03 +0200] information/ConfigItem: Instantiated 1 Host.
[2020-10-20 12:29:03 +0200] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-10-20 12:29:03 +0200] critical/config: Error: Dependency cycle: Host 'h1' -> Dependency 'h1!h1' -> Host 'h1'

[2020-10-20 12:29:03 +0200] critical/cli: Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config.
➜  icinga2 git:(d0ac25cbc) prefix/sbin/icinga2 daemon -C -c just-dc2.conf
[2020-10-20 12:29:12 +0200] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-10-20 12:29:12 +0200] information/cli: Loading configuration file(s).
[2020-10-20 12:29:12 +0200] information/ConfigItem: Committing config item(s).
[2020-10-20 12:29:12 +0200] information/ConfigItem: Instantiated 2 CheckCommands.
[2020-10-20 12:29:12 +0200] information/ConfigItem: Instantiated 2 Dependencies.
[2020-10-20 12:29:12 +0200] information/ConfigItem: Instantiated 2 Hosts.
[2020-10-20 12:29:12 +0200] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-10-20 12:29:12 +0200] critical/config: Error: Dependency cycle: Host 'h2' -> Dependency 'h2!h1' -> Host 'h1' -> Dependency 'h1!h2' -> Host 'h2'

[2020-10-20 12:29:12 +0200] critical/cli: Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config.
➜  icinga2 git:(d0ac25cbc) prefix/sbin/icinga2 daemon -C -c just-dc3.conf
[2020-10-20 12:29:28 +0200] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-10-20 12:29:28 +0200] information/cli: Loading configuration file(s).
[2020-10-20 12:29:28 +0200] information/ConfigItem: Committing config item(s).
[2020-10-20 12:29:28 +0200] information/ConfigItem: Instantiated 2 CheckCommands.
[2020-10-20 12:29:28 +0200] information/ConfigItem: Instantiated 1 Dependency.
[2020-10-20 12:29:28 +0200] information/ConfigItem: Instantiated 1 Host.
[2020-10-20 12:29:28 +0200] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-10-20 12:29:28 +0200] information/ConfigItem: Instantiated 1 Service.
[2020-10-20 12:29:28 +0200] critical/config: Error: Dependency cycle: Host 'h1' -> Dependency 'h1!s1' -> Service 'h1!s1' -> Host 'h1'

[2020-10-20 12:29:28 +0200] critical/cli: Config validation failed. Re-run with 'icinga2 daemon -C' after fixing the config.
➜  icinga2 git:(d0ac25cbc) prefix/sbin/icinga2 daemon -C -c just-dc4.conf
[2020-10-20 12:30:41 +0200] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-10-20 12:30:41 +0200] information/cli: Loading configuration file(s).
[2020-10-20 12:30:41 +0200] information/ConfigItem: Committing config item(s).
[2020-10-20 12:30:41 +0200] information/ConfigItem: Instantiated 2 CheckCommands.
[2020-10-20 12:30:41 +0200] information/ConfigItem: Instantiated 1 Dependency.
[2020-10-20 12:30:41 +0200] information/ConfigItem: Instantiated 2 Hosts.
[2020-10-20 12:30:41 +0200] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-10-20 12:30:41 +0200] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-10-20 12:30:41 +0200] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(d0ac25cbc)

@Al2Klimov Al2Klimov added this to To review in v2.13.0 merge window via automation Oct 20, 2020
@Al2Klimov Al2Klimov added area/runtime Downtimes, comments, dependencies, events enhancement New feature or request labels Oct 20, 2020
@Al2Klimov Al2Klimov removed their assignment Oct 20, 2020
@Al2Klimov Al2Klimov marked this pull request as ready for review October 20, 2020 10:35
@lippserd
Copy link
Member

I'd like to postpone this PR. I can imagine that the performance will suffer for configurations with many dependencies with this PR . @N-o-X @Al2Klimov Any objections?

@lippserd lippserd added the needs feedback We'll only proceed once we hear from you again label Nov 10, 2020
@Al2Klimov
Copy link
Member Author

You seem to be wrong.

v2.12.0

➜  icinga2 git:(338d0aaa8) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:14:09 +0100] information/cli: Icinga application loader (version: v2.12.0)
[2020-11-10 12:14:09 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:14:10 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:14:20 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 11.3333/s (680/min 680/5min 680/15min);
[2020-11-10 12:17:55 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:17:55 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:17:55 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:17:55 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:17:55 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:17:55 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:17:55 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(338d0aaa8) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:18:25 +0100] information/cli: Icinga application loader (version: v2.12.0)
[2020-11-10 12:18:25 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:18:25 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:18:35 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 16/s (960/min 960/5min 960/15min);
[2020-11-10 12:21:52 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:21:52 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:21:52 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:21:52 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:21:52 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:21:52 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:21:52 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(338d0aaa8) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:23:00 +0100] information/cli: Icinga application loader (version: v2.12.0)
[2020-11-10 12:23:00 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:23:01 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:23:11 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 16/s (960/min 960/5min 960/15min);
[2020-11-10 12:26:19 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:26:19 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:26:19 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:26:19 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:26:19 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:26:19 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:26:19 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(338d0aaa8)

#8389

➜  icinga2 git:(feature/forbid-dep-cycles) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:39:29 +0100] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-11-10 12:39:29 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:39:30 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:39:40 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 16/s (960/min 960/5min 960/15min);
[2020-11-10 12:41:30 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 1, rate: 10/s (600/min 1920/5min 1920/15min);
[2020-11-10 12:42:48 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:42:48 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:42:48 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:42:48 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:42:48 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:42:52 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:42:52 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(feature/forbid-dep-cycles) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:43:22 +0100] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-11-10 12:43:22 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:43:23 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:43:33 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 16/s (960/min 960/5min 960/15min);
[2020-11-10 12:46:59 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:46:59 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:46:59 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:46:59 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:46:59 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:47:03 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:47:03 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(feature/forbid-dep-cycles) prefix/sbin/icinga2 daemon -C -c 8389.conf
[2020-11-10 12:47:19 +0100] information/cli: Icinga application loader (version: v2.12.0-2-gd0ac25cbc)
[2020-11-10 12:47:19 +0100] information/cli: Loading configuration file(s).
[2020-11-10 12:47:19 +0100] information/ConfigItem: Committing config item(s).
[2020-11-10 12:47:29 +0100] information/WorkQueue: #4 (DaemonUtility::LoadConfigFiles) items: 0, rate: 16/s (960/min 960/5min 960/15min);
[2020-11-10 12:50:37 +0100] information/ConfigItem: Instantiated 1 CheckCommand.
[2020-11-10 12:50:37 +0100] information/ConfigItem: Instantiated 900000 Dependencies.
[2020-11-10 12:50:37 +0100] information/ConfigItem: Instantiated 100000 Hosts.
[2020-11-10 12:50:37 +0100] information/ConfigItem: Instantiated 1 IcingaApplication.
[2020-11-10 12:50:37 +0100] information/ConfigItem: Instantiated 1000000 Services.
[2020-11-10 12:50:41 +0100] information/ScriptGlobal: Dumping variables to file '/Users/aklimov/NET/WS/icinga2/prefix/var/cache/icinga2/icinga2.vars'
[2020-11-10 12:50:41 +0100] information/cli: Finished validating the configuration file(s).
➜  icinga2 git:(feature/forbid-dep-cycles)

@Al2Klimov Al2Klimov removed their assignment Nov 10, 2020
@lippserd
Copy link
Member

You seem to be wrong.

I am glad I am 😆

lippserd
lippserd previously approved these changes Nov 10, 2020
v2.13.0 merge window automation moved this from To review to Approved Nov 10, 2020
@Al2Klimov Al2Klimov moved this from Approved to To review in v2.13.0 merge window Nov 10, 2020
@Al2Klimov Al2Klimov modified the milestones: 2.13.0, 2.14.0 Jun 2, 2021
@Al2Klimov
Copy link
Member Author

@cla-bot check

@cla-bot cla-bot bot added the cla/signed label Aug 4, 2021
@Al2Klimov Al2Klimov added this to unsorted in 42 quadrillions PRs Aug 10, 2021
@Al2Klimov Al2Klimov moved this from unsorted to awaits implementation detail review in 42 quadrillions PRs Aug 10, 2021
@N-o-X N-o-X removed their assignment Dec 6, 2021
@julianbrost julianbrost self-requested a review January 12, 2023 12:27
Copy link
Contributor

@julianbrost julianbrost left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks useful in general, but I'd change a few things:

  1. Don't use signals, just call the functions directly. I don't see a benefit in using them here, it just adds another indirection.
  2. Error message could be changed to a multi-line format. This should make it more readable in case of longer cycles.
  3. Also check for newly introduces cycles when adding dependencies via the API.

lib/icinga/dependency.cpp Outdated Show resolved Hide resolved
42 quadrillions PRs automation moved this from awaits implementation detail review to awaits action from OP Jan 17, 2023
@Al2Klimov Al2Klimov moved this from awaits action from OP to awaits implementation detail review in 42 quadrillions PRs Jan 31, 2023
Copy link
Contributor

@julianbrost julianbrost left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please include an up-to-date example in the description of how the error messages look like now, including how it looks like when attempting to add a cycle at runtime.

lib/icinga/dependency.cpp Outdated Show resolved Hide resolved
@julianbrost julianbrost merged commit 213f3f9 into master Feb 10, 2023
42 quadrillions PRs automation moved this from awaits implementation detail review to done Feb 10, 2023
@icinga-probot icinga-probot bot deleted the feature/forbid-dep-cycles branch February 10, 2023 16:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/runtime Downtimes, comments, dependencies, events cla/signed enhancement New feature or request needs feedback We'll only proceed once we hear from you again
Projects
v2.13.0 merge window
  
To review
Development

Successfully merging this pull request may close these issues.

None yet

4 participants