mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
resolve: do not re-read settings from networkd if link state file is unmodified
If many interface creation/deletion occurs continuously, then resolved becomes easily busy. Let's slightly optimize the event triggered by sd-network.
This commit is contained in:
parent
8e0bacab6e
commit
214db8eb5d
@ -16,6 +16,7 @@
|
||||
#include "resolved-llmnr.h"
|
||||
#include "resolved-mdns.h"
|
||||
#include "socket-netlink.h"
|
||||
#include "stat-util.h"
|
||||
#include "string-util.h"
|
||||
#include "strv.h"
|
||||
#include "tmpfile-util.h"
|
||||
@ -568,27 +569,42 @@ static int link_is_managed(Link *l) {
|
||||
return !STR_IN_SET(state, "pending", "initialized", "unmanaged");
|
||||
}
|
||||
|
||||
static void link_enter_unmanaged(Link *l) {
|
||||
assert(l);
|
||||
|
||||
/* If this link used to be managed, but is now unmanaged, flush all our settings — but only once. */
|
||||
if (l->is_managed)
|
||||
link_flush_settings(l);
|
||||
|
||||
l->is_managed = false;
|
||||
}
|
||||
|
||||
static void link_read_settings(Link *l) {
|
||||
struct stat st;
|
||||
int r;
|
||||
|
||||
assert(l);
|
||||
|
||||
/* Read settings from networkd, except when networkd is not managing this interface. */
|
||||
|
||||
r = sd_network_link_get_stat(l->ifindex, &st);
|
||||
if (r == -ENOENT)
|
||||
return link_enter_unmanaged(l);
|
||||
if (r < 0)
|
||||
return (void) log_link_warning_errno(l, r, "Failed to stat() networkd's link state file, ignoring: %m");
|
||||
|
||||
if (stat_inode_unmodified(&l->networkd_state_file_stat, &st))
|
||||
/* The state file is unmodified. Not necessary to re-read settings. */
|
||||
return;
|
||||
|
||||
/* Save the new stat for the next event. */
|
||||
l->networkd_state_file_stat = st;
|
||||
|
||||
r = link_is_managed(l);
|
||||
if (r < 0) {
|
||||
log_link_warning_errno(l, r, "Failed to determine whether the interface is managed: %m");
|
||||
return;
|
||||
}
|
||||
if (r == 0) {
|
||||
|
||||
/* If this link used to be managed, but is now unmanaged, flush all our settings — but only once. */
|
||||
if (l->is_managed)
|
||||
link_flush_settings(l);
|
||||
|
||||
l->is_managed = false;
|
||||
return;
|
||||
}
|
||||
if (r < 0)
|
||||
return (void) log_link_warning_errno(l, r, "Failed to determine whether the interface is managed, ignoring: %m");
|
||||
if (r == 0)
|
||||
return link_enter_unmanaged(l);
|
||||
|
||||
l->is_managed = true;
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "sd-netlink.h"
|
||||
|
||||
#include "in-addr-util.h"
|
||||
@ -65,6 +67,7 @@ struct Link {
|
||||
DnsScope *mdns_ipv4_scope;
|
||||
DnsScope *mdns_ipv6_scope;
|
||||
|
||||
struct stat networkd_state_file_stat;
|
||||
bool is_managed;
|
||||
|
||||
char *ifname;
|
||||
|
Loading…
Reference in New Issue
Block a user