Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
Kea
Commits
615df6d2
Commit
615df6d2
authored
Sep 02, 2014
by
Marcin Siodelski
Browse files
[3534] Commit and rollback the staging configuration.
parent
117561c3
Changes
6
Hide whitespace changes
Inline
Side-by-side
src/bin/dhcp4/ctrl_dhcp4_srv.cc
View file @
615df6d2
...
...
@@ -145,19 +145,16 @@ ControlledDhcpv4Srv::processConfig(isc::data::ConstElementPtr config) {
}
// Configuration may change active interfaces. Therefore, we have to reopen
// sockets according to new configuration. This operation is not exception
// safe and we really don't want to emit exceptions to whoever called this
// method. Instead, catch an exception and create appropriate answer.
try
{
CfgMgr
::
instance
().
getCurrentCfg
()
->
getCfgIface
()
.
openSockets
(
CfgIface
::
V4
,
srv
->
getPort
(),
getInstance
()
->
useBroadcast
());
// sockets according to new configuration. It is possible that this
// operation will fail for some interfaces but the openSockets function
// guards against exceptions and invokes a callback function to
// log warnings. Since we allow that this fails for some interfaces there
// is no need to rollback configuration if socket fails to open on any
// of the interfaces.
CfgMgr
::
instance
().
getStagingCfg
()
->
getCfgIface
().
openSockets
(
CfgIface
::
V4
,
srv
->
getPort
(),
getInstance
()
->
useBroadcast
());
}
catch
(
std
::
exception
&
ex
)
{
err
<<
"failed to open sockets after server reconfiguration: "
<<
ex
.
what
();
answer
=
isc
::
config
::
createAnswer
(
1
,
err
.
str
());
}
return
(
answer
);
}
...
...
@@ -177,7 +174,7 @@ void ControlledDhcpv4Srv::shutdown() {
ControlledDhcpv4Srv
::~
ControlledDhcpv4Srv
()
{
cleanup
();
server_
=
NULL
;
// forget this instance. Noone should call any handlers at
// this stage.
}
...
...
src/bin/dhcp4/json_config_parser.cc
View file @
615df6d2
...
...
@@ -648,7 +648,6 @@ configureDhcp4Server(Dhcpv4Srv&, isc::data::ConstElementPtr config_set) {
// Rollback changes as the configuration parsing failed.
if
(
rollback
)
{
globalContext
().
reset
(
new
ParserContext
(
original_context
));
CfgMgr
::
instance
().
rollback
();
return
(
answer
);
}
...
...
src/bin/dhcp4/kea_controller.cc
View file @
615df6d2
...
...
@@ -102,7 +102,14 @@ void configure(const std::string& file_name) {
isc_throw
(
isc
::
BadValue
,
reason
);
}
// Configuration successful.
CfgMgr
::
instance
().
commit
();
}
catch
(
const
std
::
exception
&
ex
)
{
// If configuration failed at any stage, we drop the staging
// configuration and continue to use the previous one.
CfgMgr
::
instance
().
rollback
();
LOG_ERROR
(
dhcp4_logger
,
DHCP4_CONFIG_LOAD_FAIL
)
.
arg
(
file_name
).
arg
(
ex
.
what
());
isc_throw
(
isc
::
BadValue
,
"configuration error using file '"
...
...
src/bin/dhcp6/ctrl_dhcp6_srv.cc
View file @
615df6d2
...
...
@@ -140,19 +140,14 @@ ControlledDhcpv6Srv::processConfig(isc::data::ConstElementPtr config) {
}
// Configuration may change active interfaces. Therefore, we have to reopen
// sockets according to new configuration. This operation is not exception
// safe and we really don't want to emit exceptions to the callback caller.
// Instead, catch an exception and create appropriate answer.
try
{
CfgMgr
::
instance
().
getCurrentCfg
()
->
getCfgIface
()
.
openSockets
(
CfgIface
::
V6
,
srv
->
getPort
());
}
catch
(
const
std
::
exception
&
ex
)
{
std
::
ostringstream
err
;
err
<<
"failed to open sockets after server reconfiguration: "
<<
ex
.
what
();
answer
=
isc
::
config
::
createAnswer
(
1
,
err
.
str
());
}
// sockets according to new configuration. It is possible that this
// operation will fail for some interfaces but the openSockets function
// guards against exceptions and invokes a callback function to
// log warnings. Since we allow that this fails for some interfaces there
// is no need to rollback configuration if socket fails to open on any
// of the interfaces.
CfgMgr
::
instance
().
getStagingCfg
()
->
getCfgIface
().
openSockets
(
CfgIface
::
V6
,
srv
->
getPort
());
return
(
answer
);
}
...
...
src/bin/dhcp6/json_config_parser.cc
View file @
615df6d2
...
...
@@ -849,7 +849,6 @@ configureDhcp6Server(Dhcpv6Srv&, isc::data::ConstElementPtr config_set) {
// Rollback changes as the configuration parsing failed.
if
(
rollback
)
{
globalContext
().
reset
(
new
ParserContext
(
original_context
));
CfgMgr
::
instance
().
rollback
();
return
(
answer
);
}
...
...
src/bin/dhcp6/kea_controller.cc
View file @
615df6d2
...
...
@@ -106,7 +106,14 @@ void configure(const std::string& file_name) {
isc_throw
(
isc
::
BadValue
,
reason
);
}
// Configuration successful.
CfgMgr
::
instance
().
commit
();
}
catch
(
const
std
::
exception
&
ex
)
{
// If configuration failed at any stage, we drop the staging
// configuration and continue to use the previous one.
CfgMgr
::
instance
().
rollback
();
LOG_ERROR
(
dhcp6_logger
,
DHCP6_CONFIG_LOAD_FAIL
)
.
arg
(
file_name
).
arg
(
ex
.
what
());
isc_throw
(
isc
::
BadValue
,
"configuration error using file '"
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment