From b40f64492f69fc45e30eb02ba742e63af1c04f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Wed, 29 Apr 2026 14:04:12 +0200 Subject: [PATCH] yangerd: Send sighup to yangerd on config change This is to force yangerd to repoll polled things --- package/yangerd/yangerd.conf | 2 +- src/confd/src/core.c | 9 +++++++++ src/yangerd/internal/collector/collector.go | 10 +++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/package/yangerd/yangerd.conf b/package/yangerd/yangerd.conf index 8041dca5..0eba1cf2 100644 --- a/package/yangerd/yangerd.conf +++ b/package/yangerd/yangerd.conf @@ -1,3 +1,3 @@ -service name:yangerd log:prio:daemon.notice,tag:yangerd \ +service <> name:yangerd log:prio:daemon.notice,tag:yangerd \ env:-/etc/default/yangerd \ [S12345] yangerd -- Operational data daemon diff --git a/src/confd/src/core.c b/src/confd/src/core.c index ea6bd8a9..ff2dcef4 100644 --- a/src/confd/src/core.c +++ b/src/confd/src/core.c @@ -674,6 +674,15 @@ static int change_cb(sr_session_ctx_t *session, uint32_t sub_id, const char *mod return SR_ERR_SYS; } + /* + Send sighup to yangerd to trigger a poll of polled values. + This will make sure that there is no stale data. + */ + if (systemf("initctl -b reload yangerd")) { + EMERG("Failed reloading yangerd"); + return SR_ERR_SYS; + } + AUDIT("The new configuration has been applied."); } diff --git a/src/yangerd/internal/collector/collector.go b/src/yangerd/internal/collector/collector.go index 6c59e382..8dc2abb2 100644 --- a/src/yangerd/internal/collector/collector.go +++ b/src/yangerd/internal/collector/collector.go @@ -21,14 +21,14 @@ type Collector interface { // RunAll starts one goroutine per Collector, each ticking at the // collector's configured interval. A failed Collect is logged and // retried on the next tick. All goroutines exit when ctx is cancelled. -func RunAll(ctx context.Context, wg *sync.WaitGroup, t *tree.Tree, collectors []Collector) { +func RunAll(ctx context.Context, wg *sync.WaitGroup, t *tree.Tree, collectors []Collector, pokeCh <-chan struct{}) { for _, c := range collectors { wg.Add(1) - go runOne(ctx, wg, t, c) + go runOne(ctx, wg, t, c, pokeCh) } } -func runOne(ctx context.Context, wg *sync.WaitGroup, t *tree.Tree, c Collector) { +func runOne(ctx context.Context, wg *sync.WaitGroup, t *tree.Tree, c Collector, pokeCh <-chan struct{}) { defer wg.Done() if err := c.Collect(ctx, t); err != nil { @@ -46,6 +46,10 @@ func runOne(ctx context.Context, wg *sync.WaitGroup, t *tree.Tree, c Collector) if err := c.Collect(ctx, t); err != nil { log.Printf("collector %s: %v", c.Name(), err) } + case <-pokeCh: + if err := c.Collect(ctx, t); err != nil { + log.Printf("collector %s: poke: %v", c.Name(), err) + } } } }