confd: optimize, skip dagger generation when no change

Save a few CPU cycles by skipping a new dagger generation when no
interfaces have been modified/added/deleted.

Uses d->next_fp as the sentinel: NULL means no claim was made for this
transaction.  dagger_evolve() and dagger_abandon() now NULL it after
fclose, so subsequent unclaimed transactions also get the clean early
return.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg
2026-03-20 16:18:12 +01:00
parent 7f2fbc8bbf
commit 0884227afa
3 changed files with 18 additions and 4 deletions
+9 -1
View File
@@ -124,8 +124,12 @@ int dagger_abandon(struct dagger *d)
{
int exitcode;
if (!d->next_fp)
return 0;
fprintf(d->next_fp, "%d\n", d->next);
fclose(d->next_fp);
d->next_fp = NULL;
exitcode = systemf("dagger -C %s abandon", d->path);
DEBUG("dagger(%d->%d): abandon: exitcode=%d\n",
@@ -134,12 +138,13 @@ int dagger_abandon(struct dagger *d)
return exitcode;
}
int dagger_evolve(struct dagger *d)
static int dagger_evolve(struct dagger *d)
{
int exitcode;
fprintf(d->next_fp, "%d\n", d->next);
fclose(d->next_fp);
d->next_fp = NULL;
exitcode = systemf("dagger -C %s evolve", d->path);
DEBUG("dagger(%d->%d): evolve: exitcode=%d\n",
@@ -163,6 +168,9 @@ int dagger_evolve_or_abandon(struct dagger *d)
{
int exitcode, err;
if (!d->next_fp)
return 0;
exitcode = dagger_evolve(d);
dagger_prune(d);
if (!exitcode)
-1
View File
@@ -24,7 +24,6 @@ FILE *dagger_fopen_current(struct dagger *d, const char *action, const char *nod
int dagger_add_dep(const struct dagger *d, const char *depender, const char *dependee);
int dagger_add_node(struct dagger *d, const char *node);
int dagger_abandon(struct dagger *d);
int dagger_evolve(struct dagger *d);
int dagger_evolve_or_abandon(struct dagger *d);
int dagger_is_bootstrap(struct dagger *d);
+9 -2
View File
@@ -774,7 +774,8 @@ static sr_error_t ifchange_post(sr_session_ctx_t *session, struct dagger *net,
return err ? SR_ERR_INTERNAL : SR_ERR_OK;
}
int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff, sr_event_t event, struct confd *confd)
int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct lyd_node *diff,
sr_event_t event, struct confd *confd)
{
struct lyd_node *cifs, *difs, *cif, *dif;
sr_error_t err;
@@ -794,12 +795,18 @@ int interfaces_change(sr_session_ctx_t *session, struct lyd_node *config, struct
return SR_ERR_OK;
}
difs = lydx_get_descendant(diff, "interfaces", "interface", NULL);
if (!difs) {
/* No interface changes, skip to prevent another dagger generation */
return SR_ERR_OK;
}
err = dagger_claim(&confd->netdag, "/run/net");
if (err)
return err;
cifs = lydx_get_descendant(config, "interfaces", "interface", NULL);
difs = lydx_get_descendant(diff, "interfaces", "interface", NULL);
err = netdag_init(session, &confd->netdag, cifs, difs);
if (err)
goto err_out;