Conf: Free stored old config before parsing new one

BIRD keeps a previous (old) configuration for the purpose of undo. The
existing code frees it after a new configuration is successfully parsed
during reconfiguration. That causes memory usage spikes as there are
temporarily three configurations (old, current, and new). The patch
changes it to free the old one before parsing the new one (as user
already requested a new config). The disadvantage is that undo is
not available after failed reconfiguration.
This commit is contained in:
Ondrej Zajicek 2022-11-09 21:09:16 +01:00
parent 84545a26cc
commit 371eb49043
4 changed files with 27 additions and 0 deletions

View file

@ -201,6 +201,23 @@ config_free(struct config *c)
rfree(c->pool); rfree(c->pool);
} }
/**
* config_free_old - free stored old configuration
*
* This function frees the old configuration (%old_config) that is saved for the
* purpose of undo. It is useful before parsing a new config when reconfig is
* requested, to avoid keeping three (perhaps memory-heavy) configs together.
*/
void
config_free_old(void)
{
tm_stop(config_timer);
undo_available = 0;
config_free(old_config);
old_config = NULL;
}
void void
config_add_obstacle(struct config *c) config_add_obstacle(struct config *c)
{ {

View file

@ -70,6 +70,7 @@ struct config *config_alloc(const char *name);
int config_parse(struct config *); int config_parse(struct config *);
int cli_parse(struct config *); int cli_parse(struct config *);
void config_free(struct config *); void config_free(struct config *);
void config_free_old(void);
int config_commit(struct config *, int type, uint timeout); int config_commit(struct config *, int type, uint timeout);
int config_confirm(void); int config_confirm(void);
int config_undo(void); int config_undo(void);

View file

@ -1173,6 +1173,11 @@ This argument can be omitted if there exists only a single instance.
restarted otherwise. Changes in filters usually lead to restart of restarted otherwise. Changes in filters usually lead to restart of
affected protocols. affected protocols.
The previous configuration is saved and the user can switch back to it
with <ref id="cli-configure-undo" name="configure undo"> command. The
old saved configuration is released (even if the reconfiguration attempt
fails due to e.g. a syntax error).
If <cf/soft/ option is used, changes in filters does not cause BIRD to If <cf/soft/ option is used, changes in filters does not cause BIRD to
restart affected protocols, therefore already accepted routes (according restart affected protocols, therefore already accepted routes (according
to old filters) would be still propagated, but new routes would be to old filters) would be still propagated, but new routes would be

View file

@ -242,6 +242,8 @@ async_config(void)
{ {
struct config *conf; struct config *conf;
config_free_old();
log(L_INFO "Reconfiguration requested by SIGHUP"); log(L_INFO "Reconfiguration requested by SIGHUP");
if (!unix_read_config(&conf, config_name)) if (!unix_read_config(&conf, config_name))
{ {
@ -324,6 +326,8 @@ cmd_reconfig(const char *name, int type, uint timeout)
if (cli_access_restricted()) if (cli_access_restricted())
return; return;
config_free_old();
struct config *conf = cmd_read_config(name); struct config *conf = cmd_read_config(name);
if (!conf) if (!conf)
return; return;