From: Ondrej Zajicek Date: Wed, 9 Nov 2022 20:09:16 +0000 (+0100) Subject: Conf: Free stored old config before parsing new one X-Git-Tag: v2.0.11~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=371eb49043d225d2bab8149187b813a14b4b86d2;p=thirdparty%2Fbird.git 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. --- diff --git a/conf/conf.c b/conf/conf.c index 11c136e77..4e31de293 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -201,6 +201,23 @@ config_free(struct config *c) 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 config_add_obstacle(struct config *c) { diff --git a/conf/conf.h b/conf/conf.h index 5ec924b02..b409750e7 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -70,6 +70,7 @@ struct config *config_alloc(const char *name); int config_parse(struct config *); int cli_parse(struct config *); void config_free(struct config *); +void config_free_old(void); int config_commit(struct config *, int type, uint timeout); int config_confirm(void); int config_undo(void); diff --git a/doc/bird.sgml b/doc/bird.sgml index c78b83007..47848f826 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -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 affected protocols. + The previous configuration is saved and the user can switch back to it + with command. The + old saved configuration is released (even if the reconfiguration attempt + fails due to e.g. a syntax error). + If